diff --git a/DEPS b/DEPS index 1ecb475a..57decd58 100644 --- a/DEPS +++ b/DEPS
@@ -209,11 +209,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '7f17d36c2c7b8ba7bdb6eade58fb114f5b2fffe6', + 'skia_revision': '4987c4af499d712fcc9ad4a816f939d9da2b6a9a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '329091a1ea44e643cc946d0f3c96e05072753950', + 'v8_revision': '18f678862cf43f1312bbd0cf9314bd95f322ce36', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -221,7 +221,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': '75b9ac3084a94c85d465da78735a4f9b18f430b6', + 'angle_revision': 'efd8da4dfa6581f2394cc4e040c6c52b591be1ef', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -280,7 +280,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '9c5e41e7872db9471693953b10c99c4a0b241141', + 'catapult_revision': '74a278f9bb47d71f8850e6aa94021612fab22997', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -288,7 +288,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'c3472f4064f8b4977dd0bdea81738cfbc0782d3a', + 'devtools_frontend_revision': '54728dd97bd237c30557246dc901d226a1031bb1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -328,11 +328,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '10a7f78815e2c838d6f79982a619aa43807034ce', + 'dawn_revision': 'e2f39f8361fb70f2bde9bc64bdc771e2d4911e2a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '38ba3e4c8ebdd7f7605e9f6f3d7e3c41e2c593c4', + 'quiche_revision': 'ce1c3ade2bcd5857c469c8f3a1d536ce894724a5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -372,7 +372,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libcxxabi_revision': '8b015a79820b89c26297264e3bc3ec409567ae65', + 'libcxxabi_revision': 'da3e6cbc62dd1e3df45f522ba313d1c581867094', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -573,7 +573,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'ddb161b1691443763d83506fccefd582056531d9', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '8ebb509555666645a4bc7b64e5c83408be80fe2e', 'condition': 'checkout_ios', }, @@ -966,7 +966,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7fc02e848aaadc5750286aaac421c2bbe358de36', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '6d45691f606fd3cc6464da44fe872c3b337ba4c3', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1349,7 +1349,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '70fc3006adbce543ead4e3c85cadd6bb1e65d044', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '78af063a636c83fbaafa05a1af2b6a41dc6bc40e', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1571,10 +1571,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a0b8774ce8cec1dc8f4308810bf05eb8867c62de', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0c95613c1111e1e8e7f5aba23343ff552d26352b', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '43c0f51e87ddec8a014a48428e485b07a3be46f2', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '2ab4764b9e305b7427b97e1c4a30d73975fc19e7', + Var('webrtc_git') + '/src.git' + '@' + '238da9a57eb9eb45c8ee356d4f334fe797fcaa42', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1635,7 +1635,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f91bc3e41f7edb924fce097bf81cc34c5e14c94b', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bb24cd045259da27a6141140d58245512f73d65b', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java index fbe7645..45a4293 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -15,6 +15,7 @@ import android.content.Context; import android.graphics.Matrix; import android.graphics.Rect; +import android.net.Uri; import android.os.Build; import android.os.Build.VERSION; import android.os.Bundle; @@ -2764,6 +2765,144 @@ assertEquals("\"password\"", value1); } + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testFrameDetachedOnFormSubmission() throws Throwable { + final String mainFrame = "<html><body>" + + "<script>" + + "function receiveMessage(event) {" + + " var address_iframe = document.getElementById('address_iframe');" + + " address_iframe.parentNode.removeChild(address_iframe);" + + " setTimeout(delayedUpload, 0);" + + "}" + + "window.addEventListener('message', receiveMessage, false);" + + "</script>" + + "<iframe src='inner_frame_address_form.html' id='address_iframe'" + + " name='address_iframe'>" + + "</iframe>" + + "</body></html>"; + final String url = mWebServer.setResponse(FILE, mainFrame, null); + final String subFrame = "<html><body>" + + "<script>" + + "function send_post() {" + + " window.parent.postMessage('SubmitComplete', '*');" + + "}" + + "</script>" + + "<form action='inner_frame_address_form.html' id='deleting_form'" + + " onsubmit='send_post(); return false;'>" + + " <input type='text' id='address_field' name='address' autocomplete='on'>" + + " <input type='submit' id='submit_button' name='submit_button'>" + + "</form>" + + "</body></html>"; + final String subFrameURL = + mWebServer.setResponse("/inner_frame_address_form.html", subFrame, null); + assertTrue(Uri.parse(subFrameURL).getPath().equals("/inner_frame_address_form.html")); + int cnt = 0; + loadUrlSync(url); + pollJavascriptResult("var iframe = document.getElementById('address_iframe');" + + "var frame_doc = iframe.contentDocument;" + + "frame_doc.getElementById('address_field').focus();" + + "frame_doc.activeElement.id;", + "\"address_field\""); + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_A); + cnt += waitForCallbackAndVerifyTypes(cnt, + new Integer[] {AUTOFILL_CANCEL, AUTOFILL_VIEW_ENTERED, AUTOFILL_SESSION_STARTED, + AUTOFILL_VALUE_CHANGED}); + executeJavaScriptAndWaitForResult("var iframe = document.getElementById('address_iframe');" + + "var frame_doc = iframe.contentDocument;" + + "frame_doc.getElementById('submit_button').click();"); + waitForCallbackAndVerifyTypes(cnt, new Integer[] {AUTOFILL_VALUE_CHANGED, AUTOFILL_COMMIT}); + assertEquals(SubmissionSource.FORM_SUBMISSION, mSubmissionSource); + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testFrameDetachedOnFormlessSubmission() throws Throwable { + final String mainFrame = "<html><body>" + + "<script>" + + "function receiveMessage(event) {" + + " var address_iframe = document.getElementById('address_iframe');" + + " address_iframe.parentNode.removeChild(address_iframe);" + + "}" + + "window.addEventListener('message', receiveMessage, false);" + + "</script>" + + "<iframe src='inner_frame_address_formless.html' id='address_iframe'" + + " name='address_iframe'>" + + "</iframe>" + + "</body></html>"; + final String url = mWebServer.setResponse(FILE, mainFrame, null); + final String subFrame = "<html><body>" + + "<script>" + + "function send_post() {" + + " window.parent.postMessage('SubmitComplete', '*');" + + "}" + + "</script>" + + "<input type='text' id='address_field' name='address' autocomplete='on'>" + + "<input type='button' id='submit_button' name='submit_button'" + + " onclick='send_post()'>" + + "</body></html>"; + final String subFrameURL = + mWebServer.setResponse("/inner_frame_address_formless.html", subFrame, null); + assertTrue(Uri.parse(subFrameURL).getPath().equals("/inner_frame_address_formless.html")); + int cnt = 0; + loadUrlSync(url); + pollJavascriptResult("var iframe = document.getElementById('address_iframe');" + + "var frame_doc = iframe.contentDocument;" + + "frame_doc.getElementById('address_field').focus();" + + "frame_doc.activeElement.id;", + "\"address_field\""); + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_A); + cnt += waitForCallbackAndVerifyTypes(cnt, + new Integer[] {AUTOFILL_CANCEL, AUTOFILL_VIEW_ENTERED, AUTOFILL_SESSION_STARTED, + AUTOFILL_VALUE_CHANGED}); + executeJavaScriptAndWaitForResult("var iframe = document.getElementById('address_iframe');" + + "var frame_doc = iframe.contentDocument;" + + "frame_doc.getElementById('submit_button').click();"); + // The additional AUTOFILL_VIEW_EXITED event caused by 'click' of the button. + waitForCallbackAndVerifyTypes( + cnt, new Integer[] {AUTOFILL_VIEW_EXITED, AUTOFILL_VALUE_CHANGED, AUTOFILL_COMMIT}); + assertEquals(SubmissionSource.FRAME_DETACHED, mSubmissionSource); + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testLabelChange() throws Throwable { + final String data = "<html><head></head><body>" + + "<form action='a.html'>" + + "<label id='label_id'> Address </label>" + + "<input type='text' id='address' name='address' autocomplete='on'/>" + + "<p id='p_id'>Address 1</p>" + + "<input type='text' name='address1' autocomplete='on'/>" + + "<input type='submit' id='submit_button' name='submit_button'/>" + + "</form>" + + "</body></html>"; + int cnt = 0; + final String url = mWebServer.setResponse(FILE, data, null); + loadUrlSync(url); + executeJavaScriptAndWaitForResult("document.getElementById('address').focus();"); + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_A); + cnt += waitForCallbackAndVerifyTypes(cnt, + new Integer[] {AUTOFILL_CANCEL, AUTOFILL_VIEW_ENTERED, AUTOFILL_SESSION_STARTED, + AUTOFILL_VALUE_CHANGED}); + // Verify label change shall trigger new session. + executeJavaScriptAndWaitForResult( + "document.getElementById('label_id').innerHTML='address change';"); + executeJavaScriptAndWaitForResult("document.getElementById('address').focus();"); + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_B); + cnt += waitForCallbackAndVerifyTypes(cnt, + new Integer[] {AUTOFILL_VIEW_EXITED, AUTOFILL_CANCEL, AUTOFILL_VIEW_ENTERED, + AUTOFILL_SESSION_STARTED, AUTOFILL_VALUE_CHANGED}); + // Verify inferred label change won't trigger new session. + executeJavaScriptAndWaitForResult( + "document.getElementById('p_id').innerHTML='address change';"); + executeJavaScriptAndWaitForResult("document.getElementById('address').focus();"); + dispatchDownAndUpKeyEvents(KeyEvent.KEYCODE_B); + cnt += waitForCallbackAndVerifyTypes(cnt, new Integer[] {AUTOFILL_VALUE_CHANGED}); + } + private void pollJavascriptResult(String script, String expectedResult) throws Throwable { AwActivityTestRule.pollInstrumentationThread(() -> { try {
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc index e1060ce..f8dc1d8 100644 --- a/ash/app_list/app_list_controller_impl_unittest.cc +++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -502,8 +502,9 @@ // Verifiy that when showing the launcher, the virtual keyboard dismissed before // will not show automatically due to the feature called "transient blur" (see // https://crbug.com/1057320). +// Disabled for flaky timeouts. https://crbug.com/1213226 TEST_F(AppListControllerImplTest, - TransientBlurIsNotTriggeredWhenShowingLauncher) { + DISABLED_TransientBlurIsNotTriggeredWhenShowingLauncher) { // Enable animation. ui::ScopedAnimationDurationScaleMode non_zero_duration( ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
diff --git a/ash/components/os_feedback_ui/OWNERS b/ash/components/os_feedback_ui/OWNERS index 220e699..17b2f60 100644 --- a/ash/components/os_feedback_ui/OWNERS +++ b/ash/components/os_feedback_ui/OWNERS
@@ -1 +1,6 @@ -file://components/feedback/OWNERS +# Primary OWNERS +jimmyxgong@chromium.org +joonbug@chromium.org + +# Backup OWNERS +zentaro@chromium.org
diff --git a/ash/public/cpp/wallpaper_controller.h b/ash/public/cpp/wallpaper_controller.h index 863505f..a7bb193 100644 --- a/ash/public/cpp/wallpaper_controller.h +++ b/ash/public/cpp/wallpaper_controller.h
@@ -61,17 +61,18 @@ const gfx::ImageSkia& image, bool preview_mode) = 0; - // Sets the wallpaper at |url| as the active wallpaper for the user at - // |account_id|. The first time this is called, will download the wallpaper - // and cache on disk. Subsequent calls with the same url will use the stored - // wallpaper. If |preview_mode| is true, the visible background wallpaper will - // change, but that change will not be persisted in preferences. Call - // |ConfirmPreviewMode| or |CancelPreviewMode| to finalize. |callback| is - // required and will be called after the image is fetched (from network or - // disk) and decoded. + // Sets the wallpaper at |url| and |collection_id| as the active wallpaper for + // the user at |account_id|. The first time this is called, will download the + // wallpaper and cache on disk. Subsequent calls with the same url will use + // the stored wallpaper. If |preview_mode| is true, the visible background + // wallpaper will change, but that change will not be persisted in + // preferences. Call |ConfirmPreviewMode| or |CancelPreviewMode| to finalize. + // |callback| is required and will be called after the image is fetched (from + // network or disk) and decoded. using SetOnlineWallpaperCallback = base::OnceCallback<void(bool success)>; virtual void SetOnlineWallpaper(const AccountId& account_id, const GURL& url, + const std::string& collection_id, WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) = 0; @@ -84,6 +85,7 @@ // returns true and sets wallpaper for the user, otherwise returns false. // |account_id|: The user's account id. // |url|: The wallpaper url. + // |collection_id|: The wallpaper collection id .e.g. city_for_chromebook. // |layout|: The layout of the wallpaper, used for wallpaper resizing. // |preview_mode|: If true, show the wallpaper immediately but doesn't change // the user wallpaper info until |ConfirmPreviewWallpaper| is @@ -92,6 +94,7 @@ virtual void SetOnlineWallpaperIfExists( const AccountId& account_id, const std::string& url, + const std::string& collection_id, WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) = 0;
diff --git a/ash/services/recording/recording_service.cc b/ash/services/recording/recording_service.cc index f98205a..36fc860 100644 --- a/ash/services/recording/recording_service.cc +++ b/ash/services/recording/recording_service.cc
@@ -362,8 +362,10 @@ std::move(audio_data), audio_capture_time)); } -void RecordingService::OnCaptureError(const std::string& message) { - LOG(ERROR) << message; +void RecordingService::OnCaptureError( + media::AudioCapturerSource::ErrorCode code, + const std::string& message) { + LOG(ERROR) << static_cast<uint32_t>(code) << ", " << message; } void RecordingService::OnCaptureMuted(bool is_muted) {}
diff --git a/ash/services/recording/recording_service.h b/ash/services/recording/recording_service.h index b1ab8ae6..77c542cc 100644 --- a/ash/services/recording/recording_service.h +++ b/ash/services/recording/recording_service.h
@@ -97,7 +97,8 @@ base::TimeTicks audio_capture_time, double volume, bool key_pressed) override; - void OnCaptureError(const std::string& message) override; + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) override; void OnCaptureMuted(bool is_muted) override; private:
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc index 2c3fcb6..7cbde90 100644 --- a/ash/shelf/shelf_layout_manager_unittest.cc +++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -73,6 +73,7 @@ #include "base/containers/contains.h" #include "base/i18n/rtl.h" #include "base/run_loop.h" +#include "base/test/icu_test_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/user_action_tester.h" #include "chromeos/ui/base/window_properties.h" @@ -3910,69 +3911,6 @@ EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->GetAutoHideState()); } -TEST_F(ShelfLayoutManagerTest, VerifyHomeButtonBounds) { - Shell::Get() - ->accessibility_controller() - ->SetTabletModeShelfNavigationButtonsEnabled(true); - TabletModeControllerTestApi().EnterTabletMode(); - - ASSERT_EQ(HotseatState::kShownHomeLauncher, - GetShelfLayoutManager()->hotseat_state()); - - const gfx::Rect display_bounds = GetPrimaryDisplay().bounds(); - Shelf* shelf = GetPrimaryShelf(); - ShelfNavigationWidget* navigation_widget = shelf->navigation_widget(); - const gfx::Size widget_size_in_home_launcher = - navigation_widget->GetWindowBoundsInScreen().size(); - - auto fetch_home_button_screen_bounds = - [](const ShelfNavigationWidget* navigation_widget) -> gfx::Rect { - gfx::Rect home_button_bounds_in_screen = - navigation_widget->bounds_animator_for_test()->GetTargetBounds( - navigation_widget->GetHomeButton()); - const gfx::Rect navigation_widget_bounds_in_screen = - navigation_widget->GetWindowBoundsInScreen(); - home_button_bounds_in_screen.Offset( - navigation_widget_bounds_in_screen.OffsetFromOrigin()); - return home_button_bounds_in_screen; - }; - - // Verify home button bounds in home launcher. - { - const gfx::Rect home_button_bounds_in_screen = - fetch_home_button_screen_bounds(navigation_widget); - const int horizontal_edge_spacing = - ShelfConfig::Get()->control_button_edge_spacing( - /*is_primary_axis_edge=*/true); - EXPECT_EQ(horizontal_edge_spacing, home_button_bounds_in_screen.x()); - const int vertical_edge_spacing = - ShelfConfig::Get()->control_button_edge_spacing( - /*is_primary_axis_edge=*/false); - EXPECT_EQ(display_bounds.bottom(), - home_button_bounds_in_screen.bottom() + vertical_edge_spacing); - } - - // Activate a window and wait for the navigation widget animation to finish. - views::WidgetAnimationWaiter waiter(shelf->navigation_widget()); - std::unique_ptr<aura::Window> window = - AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400)); - wm::ActivateWindow(window.get()); - waiter.WaitForAnimation(); - - ASSERT_EQ(HotseatState::kHidden, GetShelfLayoutManager()->hotseat_state()); - - const gfx::Size widget_size_in_hidden_state = - navigation_widget->GetWindowBoundsInScreen().size(); - EXPECT_EQ(widget_size_in_home_launcher, widget_size_in_hidden_state); - - // Verify home button bounds in the hidden state. - { - const gfx::Rect home_button_bounds_in_screen = - fetch_home_button_screen_bounds(navigation_widget); - EXPECT_EQ(display_bounds.bottom(), home_button_bounds_in_screen.bottom()); - } -} - // Tests that pinned app icons are visible on non-primary displays. TEST_F(ShelfLayoutManagerTest, ShelfShowsPinnedAppsOnOtherDisplays) { // Create three displays. @@ -4494,4 +4432,114 @@ ASSERT_FALSE(ShelfDimmed()); } +class NavigationWidgetRTLTest + : public ShelfLayoutManagerTest, + public testing::WithParamInterface< + std::tuple</*in_tablet=*/bool, /*in_rtl=*/bool>> { + public: + NavigationWidgetRTLTest() + : in_tablet_(std::get<0>(GetParam())), + in_rtl_(std::get<1>(GetParam())), + scoped_locale_(in_rtl_ ? "ar" : "") {} + ~NavigationWidgetRTLTest() override = default; + + // Indicates whether the test should run in the tablet mode. + const bool in_tablet_; + + // Indicates whether the test should run under RTL. + const bool in_rtl_; + + base::test::ScopedRestoreICUDefaultLocale scoped_locale_; +}; + +INSTANTIATE_TEST_SUITE_P(ALL, + NavigationWidgetRTLTest, + testing::Combine(testing::Bool(), testing::Bool())); + +TEST_P(NavigationWidgetRTLTest, VerifyHomeButtonBounds) { + if (in_tablet_) { + Shell::Get() + ->accessibility_controller() + ->SetTabletModeShelfNavigationButtonsEnabled(true); + TabletModeControllerTestApi().EnterTabletMode(); + ASSERT_EQ(HotseatState::kShownHomeLauncher, + GetShelfLayoutManager()->hotseat_state()); + } else { + ASSERT_EQ(HotseatState::kShownClamshell, + GetShelfLayoutManager()->hotseat_state()); + } + + const gfx::Rect display_bounds = GetPrimaryDisplay().bounds(); + Shelf* shelf = GetPrimaryShelf(); + ShelfNavigationWidget* navigation_widget = shelf->navigation_widget(); + const gfx::Size widget_size_in_home_launcher = + navigation_widget->GetWindowBoundsInScreen().size(); + + auto fetch_home_button_screen_bounds = + [](const ShelfNavigationWidget* navigation_widget, + bool in_rtl) -> gfx::Rect { + gfx::Rect home_button_bounds_in_widget = + navigation_widget->bounds_animator_for_test()->GetTargetBounds( + navigation_widget->GetHomeButton()); + if (in_rtl) { + home_button_bounds_in_widget = + navigation_widget->GetRootView()->GetMirroredRect( + home_button_bounds_in_widget); + } + gfx::Rect home_button_bounds_in_screen = home_button_bounds_in_widget; + home_button_bounds_in_screen.Offset( + navigation_widget->GetWindowBoundsInScreen().OffsetFromOrigin()); + return home_button_bounds_in_screen; + }; + + // Verify home button bounds in home launcher. + { + const gfx::Rect home_button_bounds_in_screen = + fetch_home_button_screen_bounds(navigation_widget, in_rtl_); + const int horizontal_edge_spacing = + ShelfConfig::Get()->control_button_edge_spacing( + /*is_primary_axis_edge=*/true); + EXPECT_EQ( + horizontal_edge_spacing, + in_rtl_ ? display_bounds.right() - home_button_bounds_in_screen.right() + : home_button_bounds_in_screen.x()); + const int vertical_edge_spacing = + ShelfConfig::Get()->control_button_edge_spacing( + /*is_primary_axis_edge=*/false); + EXPECT_EQ(display_bounds.bottom(), + home_button_bounds_in_screen.bottom() + vertical_edge_spacing); + + auto* home_button = navigation_widget->GetHomeButton(); + ASSERT_EQ(views::Button::STATE_NORMAL, home_button->GetState()); + GetEventGenerator()->MoveMouseTo( + home_button_bounds_in_screen.CenterPoint()); + EXPECT_EQ(views::Button::STATE_HOVERED, home_button->GetState()); + } + + if (!in_tablet_) + return; + + // The test code below is only for the tablet mode. + + // Activate a window and wait for the navigation widget animation to finish. + views::WidgetAnimationWaiter waiter(shelf->navigation_widget()); + std::unique_ptr<aura::Window> window = + AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400)); + wm::ActivateWindow(window.get()); + waiter.WaitForAnimation(); + + ASSERT_EQ(HotseatState::kHidden, GetShelfLayoutManager()->hotseat_state()); + + const gfx::Size widget_size_in_hidden_state = + navigation_widget->GetWindowBoundsInScreen().size(); + EXPECT_EQ(widget_size_in_home_launcher, widget_size_in_hidden_state); + + // Verify home button bounds in the hidden state. + { + const gfx::Rect home_button_bounds_in_screen = + fetch_home_button_screen_bounds(navigation_widget, in_rtl_); + EXPECT_EQ(display_bounds.bottom(), home_button_bounds_in_screen.bottom()); + } +} + } // namespace ash
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc index 792d444..79d5fcc 100644 --- a/ash/shelf/shelf_navigation_widget.cc +++ b/ash/shelf/shelf_navigation_widget.cc
@@ -531,7 +531,7 @@ nav_size.width()); } target_bounds_ = gfx::Rect(nav_origin, nav_size); - clip_rect_ = CalculateClipRect(); + clip_rect_after_rtl_ = CalculateClipRectAfterRTL(); } gfx::Rect ShelfNavigationWidget::GetTargetBounds() const { @@ -599,7 +599,7 @@ } if (update_bounds) - GetLayer()->SetClipRect(clip_rect_); + GetLayer()->SetClipRect(clip_rect_after_rtl_); views::View* const back_button = delegate_->back_button(); UpdateButtonVisibility(back_button, back_button_shown, animate, @@ -657,7 +657,7 @@ } gfx::Rect ShelfNavigationWidget::GetVisibleBounds() const { - return gfx::Rect(target_bounds_.origin(), clip_rect_.size()); + return gfx::Rect(target_bounds_.origin(), clip_rect_after_rtl_.size()); } void ShelfNavigationWidget::PrepareForGettingFocus(bool last_element) { @@ -716,11 +716,16 @@ button->layer()->SetOpacity(visible ? 1.0f : 0.0f); } -gfx::Rect ShelfNavigationWidget::CalculateClipRect() const { - if (Shell::Get()->IsInTabletMode()) - return gfx::Rect(CalculateIdealSize(/*only_visible_area=*/true)); +gfx::Rect ShelfNavigationWidget::CalculateClipRectAfterRTL() const { + gfx::Rect bounds_before_rtl; + if (Shell::Get()->IsInTabletMode()) { + bounds_before_rtl = + gfx::Rect(CalculateIdealSize(/*only_visible_area=*/true)); + } else { + bounds_before_rtl = gfx::Rect(target_bounds_.size()); + } - return gfx::Rect(target_bounds_.size()); + return GetRootView()->GetMirroredRect(bounds_before_rtl); } gfx::Size ShelfNavigationWidget::CalculateIdealSize(
diff --git a/ash/shelf/shelf_navigation_widget.h b/ash/shelf/shelf_navigation_widget.h index af6c1b2..9b2ce490 100644 --- a/ash/shelf/shelf_navigation_widget.h +++ b/ash/shelf/shelf_navigation_widget.h
@@ -105,8 +105,9 @@ NavigationButtonAnimationMetricsReporter* metrics_reporter, HotseatState target_hotseat_state); - // Returns the clip rectangle. - gfx::Rect CalculateClipRect() const; + // Returns the clip rectangle in the shelf navigation widget's coordinates. + // The returned rectangle is mirrored under RTL. + gfx::Rect CalculateClipRectAfterRTL() const; // Returns the ideal size of the whole widget or the visible area only when // |only_visible_area| is true. @@ -118,9 +119,11 @@ Shelf* shelf_ = nullptr; Delegate* delegate_ = nullptr; - // In tablet mode with hotseat enabled, |clip_rect_| is used to hide the - // invisible widget part. - gfx::Rect clip_rect_; + // In tablet mode with hotseat enabled, `clip_rect_after_rtl_` is used to hide + // the invisible widget part. We try best to avoid changing the widget's + // bounds and use layer clip instead. `clip_rect_after_rtl_` is mirrored under + // RTL. + gfx::Rect clip_rect_after_rtl_; // The target widget bounds in screen coordinates. gfx::Rect target_bounds_;
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc index e204f3a..82ed7e1 100644 --- a/ash/wallpaper/wallpaper_controller_impl.cc +++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -41,7 +41,9 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted_memory.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/metrics_hashes.h" #include "base/no_destructor.h" #include "base/numerics/safe_conversions.h" #include "base/path_service.h" @@ -1011,12 +1013,13 @@ void WallpaperControllerImpl::SetOnlineWallpaper( const AccountId& account_id, const GURL& url, + const std::string& collection_id, WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) { DCHECK(callback); SetOnlineWallpaperIfExists( - account_id, url.spec(), layout, preview_mode, + account_id, url.spec(), collection_id, layout, preview_mode, base::BindOnce(&WallpaperControllerImpl::OnAttemptSetOnlineWallpaper, weak_factory_.GetWeakPtr(), account_id, url, layout, preview_mode, std::move(callback))); @@ -1025,12 +1028,22 @@ void WallpaperControllerImpl::SetOnlineWallpaperIfExists( const AccountId& account_id, const std::string& url, + const std::string& collection_id, WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) { DCHECK(Shell::Get()->session_controller()->IsActiveUserSessionStarted()); DCHECK(CanSetUserWallpaper(account_id)); + // |collection_id| is empty when the wallpaper is automatically set with + // daily refresh. + if (!collection_id.empty()) { + const int collection_id_hash = base::PersistentHash(collection_id); + base::UmaHistogramSparse("Ash.Wallpaper.Collection", collection_id_hash); + DVLOG(1) << "SetOnlineWallpaperIfExists: collection_id=" << collection_id + << " collection_id_hash=" << collection_id_hash; + } + const OnlineWallpaperParams params = {account_id, url, layout, preview_mode}; base::PostTaskAndReplyWithResult( sequenced_task_runner_.get(), FROM_HERE, @@ -2296,7 +2309,10 @@ break; case DAILY: case ONLINE: - SetOnlineWallpaper(account_id, GURL(info.location), info.layout, + // Skip setting collection id when wallpaper is synced acrossed devices. + // We don't want to log a collection impression when wallpaper is synced. + SetOnlineWallpaper(account_id, GURL(info.location), + /*collection_id=*/std::string(), info.layout, /*preview_mode=*/false, base::DoNothing()); break; case POLICY:
diff --git a/ash/wallpaper/wallpaper_controller_impl.h b/ash/wallpaper/wallpaper_controller_impl.h index 6caf848..207e4ec7 100644 --- a/ash/wallpaper/wallpaper_controller_impl.h +++ b/ash/wallpaper/wallpaper_controller_impl.h
@@ -239,11 +239,13 @@ bool preview_mode) override; void SetOnlineWallpaper(const AccountId& account_id, const GURL& url, + const std::string& collection_id, WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) override; void SetOnlineWallpaperIfExists(const AccountId& account_id, const std::string& url, + const std::string& collection_id, WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) override;
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc index 7174e14b..be0bf37 100644 --- a/ash/wallpaper/wallpaper_controller_unittest.cc +++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -32,6 +32,7 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/metrics/metrics_hashes.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/task/current_thread.h" @@ -39,6 +40,7 @@ #include "base/task/task_observer.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "base/time/time_override.h" @@ -112,6 +114,8 @@ const std::string kDummyUrl = "https://best_wallpaper/1"; const std::string kDummyUrl2 = "https://best_wallpaper/2"; +const std::string kDummyCollectionId = "testCollectionId"; + // Creates an image of size |size|. gfx::ImageSkia CreateImage(int width, int height, SkColor color) { SkBitmap bitmap; @@ -539,6 +543,7 @@ const AccountId& account_id, const gfx::ImageSkia& image, const std::string& url, + const std::string& collection_id, WallpaperLayout layout, bool save_file, bool preview_mode, @@ -585,12 +590,17 @@ return controller_->GetWallpaperContainerId(controller_->locked_); } + const base::HistogramTester& histogram_tester() const { + return histogram_tester_; + } + WallpaperControllerImpl* controller_ = nullptr; // Not owned. base::ScopedTempDir user_data_dir_; base::ScopedTempDir online_wallpaper_dir_; base::ScopedTempDir custom_wallpaper_dir_; base::ScopedTempDir default_wallpaper_dir_; + base::HistogramTester histogram_tester_; user_manager::FakeUserManager* fake_user_manager_ = nullptr; std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; @@ -983,7 +993,8 @@ std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); ClearWallpaperCount(); controller_->SetOnlineWallpaperIfExists( - account_id_1, kDummyUrl, layout, /*preview_mode=*/false, + account_id_1, kDummyUrl, kDummyCollectionId, layout, + /*preview_mode=*/false, base::BindLambdaForTesting([&run_loop](bool file_exists) { EXPECT_FALSE(file_exists); run_loop->Quit(); @@ -1025,7 +1036,8 @@ ClearWallpaperCount(); run_loop = std::make_unique<base::RunLoop>(); controller_->SetOnlineWallpaperIfExists( - account_id_1, kDummyUrl, layout, /*preview_mode=*/false, + account_id_1, kDummyUrl, kDummyCollectionId, layout, + /*preview_mode=*/false, base::BindLambdaForTesting([&run_loop](bool file_exists) { EXPECT_TRUE(file_exists); run_loop->Quit(); @@ -1122,7 +1134,8 @@ auto run_loop = std::make_unique<base::RunLoop>(); ClearWallpaperCount(); controller_->SetOnlineWallpaper( - account_id_1, GURL(kDummyUrl), layout, /*preview_mode=*/false, + account_id_1, GURL(kDummyUrl), kDummyCollectionId, layout, + /*preview_mode=*/false, base::BindLambdaForTesting([&run_loop](bool success) { EXPECT_TRUE(success); run_loop->Quit(); @@ -1136,6 +1149,10 @@ WallpaperInfo expected_wallpaper_info(kDummyUrl, layout, ONLINE, base::Time::Now().LocalMidnight()); EXPECT_EQ(wallpaper_info, expected_wallpaper_info); + // Verify that collection metric is logged. + histogram_tester().ExpectBucketCount( + "Ash.Wallpaper.Collection", + static_cast<int>(base::PersistentHash(kDummyCollectionId)), 1); // Verify that the wallpaper with |url| is available offline, and the returned // file name should not contain the small wallpaper suffix. @@ -1577,7 +1594,7 @@ ClearWallpaperCount(); controller_->SetOnlineWallpaperFromData( account_id_1, std::string() /*image_data=*/, kDummyUrl, - WALLPAPER_LAYOUT_CENTER, false /*preview_mode=*/, + WALLPAPER_LAYOUT_CENTER, /*preview_mode=*/false, base::BindLambdaForTesting([&run_loop](bool success) { EXPECT_FALSE(success); run_loop->Quit(); @@ -1638,7 +1655,8 @@ ClearWallpaperCount(); controller_->SetOnlineWallpaperFromData( account_id_1, std::string() /*image_data=*/, kDummyUrl, - WALLPAPER_LAYOUT_CENTER_CROPPED, false /*preview_mode=*/, + WALLPAPER_LAYOUT_CENTER_CROPPED, + /*preview_mode=*/false, base::BindLambdaForTesting([&run_loop](bool success) { EXPECT_FALSE(success); run_loop->Quit(); @@ -1673,8 +1691,8 @@ // Verify |SetOnlineWallpaperFromData| updates wallpaper cache for |user1|. controller_->SetOnlineWallpaperFromData( - account_id_1, std::string() /*image_data=*/, kDummyUrl, - WALLPAPER_LAYOUT_CENTER, false /*preview_mode=*/, + account_id_1, /*image_data=*/std::string(), kDummyUrl, + WALLPAPER_LAYOUT_CENTER, /*preview_mode=*/false, WallpaperControllerImpl::SetOnlineWallpaperCallback()); RunAllTasksUntilIdle(); EXPECT_TRUE( @@ -1907,8 +1925,8 @@ image = CreateImage(640, 480, kWallpaperColor); ClearWallpaperCount(); controller_->SetOnlineWallpaperFromData( - account_id_1, std::string() /*image_data=*/, kDummyUrl, layout, - false /*preview_mode=*/, + account_id_1, /*image_data=*/std::string(), kDummyUrl, layout, + /*preview_mode=*/false, WallpaperControllerImpl::SetOnlineWallpaperCallback()); RunAllTasksUntilIdle(); EXPECT_EQ(1, GetWallpaperCount()); @@ -2396,8 +2414,8 @@ ClearWallpaperCount(); std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>(); SetOnlineWallpaperFromImage( - account_id_1, gfx::ImageSkia(), kDummyUrl, layout, false /*save_file=*/, - true /*preview_mode=*/, + account_id_1, gfx::ImageSkia(), kDummyUrl, kDummyCollectionId, layout, + /*save_file=*/false, /*preview_mode=*/true, base::BindLambdaForTesting([&run_loop](bool success) { EXPECT_FALSE(success); run_loop->Quit(); @@ -2413,8 +2431,8 @@ EXPECT_NE(online_wallpaper_color, GetWallpaperColor()); run_loop = std::make_unique<base::RunLoop>(); SetOnlineWallpaperFromImage( - account_id_1, online_wallpaper, kDummyUrl, layout, false /*save_file=*/, - true /*preview_mode=*/, + account_id_1, online_wallpaper, kDummyUrl, kDummyCollectionId, layout, + /*save_file=*/false, /*preview_mode=*/true, base::BindLambdaForTesting([&run_loop](bool success) { EXPECT_TRUE(success); run_loop->Quit(); @@ -2499,8 +2517,8 @@ EXPECT_NE(online_wallpaper_color, GetWallpaperColor()); ClearWallpaperCount(); SetOnlineWallpaperFromImage( - account_id_1, online_wallpaper, kDummyUrl, layout, false /*save_file=*/, - true /*preview_mode=*/, + account_id_1, online_wallpaper, kDummyUrl, kDummyCollectionId, layout, + /*save_file=*/false, /*preview_mode=*/true, WallpaperControllerImpl::SetOnlineWallpaperCallback()); RunAllTasksUntilIdle(); EXPECT_EQ(1, GetWallpaperCount()); @@ -2601,8 +2619,8 @@ ClearWallpaperCount(); SetOnlineWallpaperFromImage( - account_id_1, online_wallpaper, kDummyUrl, layout, false /*save_file=*/, - true /*preview_mode=*/, + account_id_1, online_wallpaper, kDummyUrl, kDummyCollectionId, layout, + /*save_file=*/false, /*preview_mode=*/true, WallpaperControllerImpl::SetOnlineWallpaperCallback()); RunAllTasksUntilIdle(); EXPECT_EQ(1, GetWallpaperCount()); @@ -2619,8 +2637,8 @@ CreateImage(640, 480, synced_online_wallpaper_color); ClearWallpaperCount(); SetOnlineWallpaperFromImage( - account_id_1, synced_online_wallpaper, kDummyUrl2, layout, - false /*save_file=*/, false /*preview_mode=*/, + account_id_1, synced_online_wallpaper, kDummyUrl2, kDummyCollectionId, + layout, /*save_file=*/false, /*preview_mode=*/false, WallpaperControllerImpl::SetOnlineWallpaperCallback()); RunAllTasksUntilIdle(); EXPECT_EQ(0, GetWallpaperCount()); @@ -3089,8 +3107,9 @@ // successfully. ClearWallpaperCount(); controller_->SetOnlineWallpaperFromData( - account_id_1, std::string() /*image_data=*/, kDummyUrl, - WALLPAPER_LAYOUT_CENTER_CROPPED, false /*preview_mode=*/, + account_id_1, /*image_data=*/std::string(), kDummyUrl, + WALLPAPER_LAYOUT_CENTER_CROPPED, + /*preview_mode=*/false, WallpaperControllerImpl::SetOnlineWallpaperCallback()); RunAllTasksUntilIdle();
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index 4bb787b9..be15f46 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -4224,6 +4224,35 @@ EXPECT_EQ(std::u16string(), desk_name_view_2->GetText()); } +// Tests that when a user has a `DeskNameView` focused and clicks within the +// overview grid, the `DeskNameView` loses focus and the overview grid is not +// closed. +TEST_F(DesksTest, ClickingOverviewGridUnfocusesDeskNameView) { + // Create a second desk so we don't start in zero state. + NewDesk(); + + // Start overview. + auto* overview_controller = Shell::Get()->overview_controller(); + overview_controller->StartOverview(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + + // Focus on a `DeskNameView`. + auto* overview_grid = GetOverviewGridForRoot(Shell::GetPrimaryRootWindow()); + const auto* desks_bar_view = overview_grid->desks_bar_view(); + ASSERT_EQ(2u, desks_bar_view->mini_views().size()); + auto* desk_name_view = desks_bar_view->mini_views()[0]->desk_name_view(); + desk_name_view->RequestFocus(); + ASSERT_TRUE(desk_name_view->HasFocus()); + + // Click the center of the overview grid. This should not close overview mode + // and should remove focus from the focused `desk_name_view`. + auto* event_generator = GetEventGenerator(); + event_generator->MoveMouseTo(overview_grid->bounds().CenterPoint()); + event_generator->ClickLeftButton(); + EXPECT_FALSE(desk_name_view->HasFocus()); + EXPECT_TRUE(overview_controller->InOverviewSession()); +} + TEST_F(DesksTest, ScrollableDesks) { UpdateDisplay("201x400"); auto* overview_controller = Shell::Get()->overview_controller();
diff --git a/ash/wm/full_restore/full_restore_controller.cc b/ash/wm/full_restore/full_restore_controller.cc index 9cc11d3..2777a01 100644 --- a/ash/wm/full_restore/full_restore_controller.cc +++ b/ash/wm/full_restore/full_restore_controller.cc
@@ -212,7 +212,7 @@ if (window->GetProperty(full_restore::kParentToHiddenContainerKey)) return; - UpdateAndObserveWindow(widget->GetNativeWindow()); + UpdateAndObserveWindow(window); } void FullRestoreController::OnARCTaskReadyForUnparentedWindow( @@ -256,22 +256,22 @@ void FullRestoreController::OnWindowVisibilityChanged(aura::Window* window, bool visible) { - if (!windows_observation_.IsObservingSource(window) && - !to_be_shown_windows_.contains(window)) { + // `OnWindowVisibilityChanged` fires for children of a window as well, but we + // are only interested in the window we originally observed. + if (!windows_observation_.IsObservingSource(window)) return; - } + + if (!visible || !to_be_shown_windows_.contains(window)) + return; to_be_shown_windows_.erase(window); - // Arc app geometry is ready at this point so restore state type. - if (IsArcWindow(window)) - RestoreStateTypeAndClearLaunchedKey(window); + RestoreStateTypeAndClearLaunchedKey(window); - // Early return if `window` isn't visible, we're not in tablet mode, or the - // app list is null. + // Early return if we're not in tablet mode, or the app list is null. aura::Window* app_list_window = Shell::Get()->app_list_controller()->GetWindow(); - if (!visible || !Shell::Get()->tablet_mode_controller()->InTabletMode() || + if (!Shell::Get()->tablet_mode_controller()->InTabletMode() || !app_list_window) { return; } @@ -291,9 +291,12 @@ DCHECK(window->parent()); windows_observation_.AddObservation(window); - // Only restore state type for arc apps once their geometry is ready. - if (!IsArcWindow(window)) - RestoreStateTypeAndClearLaunchedKey(window); + // Unless minimized, snap state and activation unblock are done when the + // window is first shown, which will be async for exo apps. + if (WindowState::Get(window)->IsMinimized()) + window->SetProperty(full_restore::kLaunchedFromFullRestoreKey, false); + else + to_be_shown_windows_.insert(window); int32_t* activation_index = window->GetProperty(full_restore::kActivationIndexKey);
diff --git a/ash/wm/overview/overview_grid_event_handler.cc b/ash/wm/overview/overview_grid_event_handler.cc index 127e213..ff9214c 100644 --- a/ash/wm/overview/overview_grid_event_handler.cc +++ b/ash/wm/overview/overview_grid_event_handler.cc
@@ -134,6 +134,14 @@ void OverviewGridEventHandler::HandleClickOrTap(ui::Event* event) { CHECK_EQ(ui::EP_PRETARGET, event->phase()); + // If the user is renaming a desk, rather than closing overview the focused + // `DeskNameView` should lose focus. + if (grid_->IsDeskNameBeingModified()) { + grid_->CommitDeskNameChanges(); + event->StopPropagation(); + return; + } + if (Shell::Get()->tablet_mode_controller()->InTabletMode()) { aura::Window* window = static_cast<views::View*>(event->target()) ->GetWidget()
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc index 03b8083d..0bd0a3c 100644 --- a/base/allocator/partition_allocator/partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -1021,12 +1021,7 @@ #endif // BUILDFLAG(USE_BACKUP_REF_PTR) // Test the realloc() contract. -#if defined(OS_ANDROID) -#define MAYBE_Realloc DISABLED_Realloc -#else -#define MAYBE_Realloc Realloc -#endif -TEST_F(PartitionAllocTest, MAYBE_Realloc) { +TEST_F(PartitionAllocTest, Realloc) { // realloc(0, size) should be equivalent to malloc(). void* ptr = allocator.root()->Realloc(nullptr, kTestAllocSize, type_name); memset(ptr, 'A', kTestAllocSize); @@ -1385,12 +1380,7 @@ } // Basic tests to ensure that allocations work for partial page buckets. -#if defined(OS_ANDROID) -#define MAYBE_PartialPages DISABLED_PartialPages -#else -#define MAYBE_PartialPages PartialPages -#endif -TEST_F(PartitionAllocTest, MAYBE_PartialPages) { +TEST_F(PartitionAllocTest, PartialPages) { // Find a size that is backed by a partial partition page. size_t size = sizeof(void*); size_t bucket_index; @@ -2099,12 +2089,7 @@ } // Tests the API to purge freeable memory. -#if defined(OS_ANDROID) -#define MAYBE_Purge DISABLED_Purge -#else -#define MAYBE_Purge Purge -#endif -TEST_F(PartitionAllocTest, MAYBE_Purge) { +TEST_F(PartitionAllocTest, Purge) { char* ptr = reinterpret_cast<char*>( allocator.root()->Alloc(2048 - kExtraAllocSize, type_name)); allocator.root()->Free(ptr); @@ -2708,12 +2693,7 @@ PartitionRoot<ThreadSafe>::Free(ptr); } -#if defined(OS_ANDROID) -#define MAYBE_AlignedAllocations DISABLED_AlignedAllocations -#else -#define MAYBE_AlignedAllocations AlignedAllocations -#endif -TEST_F(PartitionAllocTest, MAYBE_AlignedAllocations) { +TEST_F(PartitionAllocTest, AlignedAllocations) { size_t alloc_sizes[] = {1, 10, 100, 1000, 10000, 60000, 70000, 130000, 500000, 900000}; size_t max_alignment = 1048576; @@ -3079,12 +3059,7 @@ #endif // BUILDFLAG(ENABLE_BRP_DIRECTMAP_SUPPORT) // Test for crash http://crbug.com/1169003. -#if defined(OS_ANDROID) -#define MAYBE_CrossPartitionRootRealloc DISABLED_CrossPartitionRootRealloc -#else -#define MAYBE_CrossPartitionRootRealloc CrossPartitionRootRealloc -#endif -TEST_F(PartitionAllocTest, MAYBE_CrossPartitionRootRealloc) { +TEST_F(PartitionAllocTest, CrossPartitionRootRealloc) { // Size is large enough to satisfy it from a single-slot slot span size_t test_size = SystemPageSize() * MaxSystemPagesPerSlotSpan() - kExtraAllocSize;
diff --git a/base/debug/crash_logging.h b/base/debug/crash_logging.h index fb9651bf..4d7eb4c 100644 --- a/base/debug/crash_logging.h +++ b/base/debug/crash_logging.h
@@ -25,13 +25,43 @@ // // The preferred API is //components/crash/core/common:crash_key, however not // all clients can hold a direct dependency on that target. The API provided -// in this file indirects the dependency. +// in this file indirects the dependency and adds some convenience helpers that +// make the API a bit less clunky. // -// Example usage: -// static CrashKeyString* crash_key = -// AllocateCrashKeyString("name", CrashKeySize::Size32); -// SetCrashKeyString(crash_key, "value"); -// ClearCrashKeyString(crash_key); +// TODO(dcheng): Some of the nicer APIs should probably be upstreamed into +// //components/crash. +// +// Preferred usage when a crash key value only needs to be set within a scope: +// +// SCOPED_CRASH_KEY_STRING32("category", "name", "value"); +// base::debug::DumpWithoutCrashing(); +// +// If the crash key is pre-allocated elsewhere, but the value only needs to be +// set within a scope: +// +// base::debug::ScopedCrashKeyString scoper( +// GetCrashKeyForComponent(), +// "value"); +// +// Otherwise, if the crash key needs to persist (e.g. the actual crash dump is +// triggered some time later asynchronously): +// +// static auto* const crash_key = base::debug::AllocateCrashKeyString( +// "name", base::debug::CrashKeySize::Size32); +// base::debug::SetCrashKeyString(crash_key); +// +// // Do other work before calling `base::debug::DumpWithoutCrashing()` later. +// +// ***WARNING*** +// +// Do *not* write this: +// +// base::debug::SetCrashKeyString( +// base::debug::AllocateCrashKeyString( +// "name", base::debug::CrashKeySize::Size32), +// "value"); +// +// As this will leak a heap allocation every time the crash key is set! // The maximum length for a crash key's value must be one of the following // pre-determined values. @@ -46,6 +76,10 @@ // Allocates a new crash key with the specified |name| with storage for a // value up to length |size|. This will return null if the crash key system is // not initialized. +// +// Note: this internally allocates, so the returned pointer should always +// be cached in a variable with static storage duration, e.g.: +// static auto* const crash_key = base::debug::AllocateCrashKeyString(...); BASE_EXPORT CrashKeyString* AllocateCrashKeyString(const char name[], CrashKeySize size);
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc index b33440fa..e5265e6 100644 --- a/base/task/sequence_manager/sequence_manager_impl.cc +++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -109,6 +109,9 @@ if (time_domain_now->find(time_domain) == time_domain_now->end()) time_domain_now->insert(std::make_pair(time_domain, time_domain->Now())); queue->ReclaimMemory(time_domain_now->at(time_domain)); + // If the queue was shut down as a side-effect of reclaiming memory, |queue| + // will still be valid but the work queues will have been removed by + // TaskQueueImpl::UnregisterTaskQueue. if (queue->delayed_work_queue()) { queue->delayed_work_queue()->RemoveAllCanceledTasksFromFront(); queue->immediate_work_queue()->RemoveAllCanceledTasksFromFront();
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc index cc3cc89..396827d3 100644 --- a/base/task/sequence_manager/task_queue_impl.cc +++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -9,6 +9,7 @@ #include <memory> #include <utility> +#include "base/containers/stack_container.h" #include "base/logging.h" #include "base/ranges/algorithm.h" #include "base/strings/stringprintf.h" @@ -1048,7 +1049,9 @@ main_thread_only().delayed_incoming_queue.SweepCancelledTasks( sequence_manager_); - // If deleting one of the cancelled tasks shut down this queue, bail out. + // If deleting one of the cancelled tasks shut down this queue, bail out. Note + // that in this scenario |this| is still valid, but some fields of the queue + // have been cleared out by |UnregisterTaskQueue|. if (!main_thread_only().delayed_work_queue) return; @@ -1389,15 +1392,16 @@ // move all the cancelled tasks into a temporary container before deleting // them. This is to avoid |c| from changing while c.erase() is running. auto delete_start = std::stable_partition(c.begin(), c.end(), keep_task); - std::vector<Task> tasks_to_delete; - std::move(delete_start, c.end(), std::back_inserter(tasks_to_delete)); + StackVector<Task, 8> tasks_to_delete; + std::move(delete_start, c.end(), + std::back_inserter(tasks_to_delete.container())); c.erase(delete_start, c.end()); // stable_partition ensures order was not changed if there was nothing to // delete. - if (!tasks_to_delete.empty()) { + if (!tasks_to_delete->empty()) { ranges::make_heap(c, comp); - tasks_to_delete.clear(); + tasks_to_delete->clear(); } return num_high_res_tasks_swept; }
diff --git a/base/task/sequence_manager/work_queue.cc b/base/task/sequence_manager/work_queue.cc index b4bccca..5459de8 100644 --- a/base/task/sequence_manager/work_queue.cc +++ b/base/task/sequence_manager/work_queue.cc
@@ -4,6 +4,7 @@ #include "base/task/sequence_manager/work_queue.h" +#include "base/containers/stack_container.h" #include "base/debug/alias.h" #include "base/task/sequence_manager/sequence_manager_impl.h" #include "base/task/sequence_manager/work_queue_sets.h" @@ -205,7 +206,7 @@ // Since task destructors could have a side-effect of deleting this task queue // we move cancelled tasks into a temporary container which can be emptied // without accessing |this|. - std::vector<Task> tasks_to_delete; + StackVector<Task, 8> tasks_to_delete; while (!tasks_.empty()) { const auto& pending_task = tasks_.front(); @@ -232,10 +233,10 @@ #endif // !defined(OS_NACL) if (pending_task.task && !pending_task.task.IsCancelled()) break; - tasks_to_delete.push_back(std::move(tasks_.front())); + tasks_to_delete->push_back(std::move(tasks_.front())); tasks_.pop_front(); } - if (!tasks_to_delete.empty()) { + if (!tasks_to_delete->empty()) { if (tasks_.empty()) { // NB delayed tasks are inserted via Push, no don't need to reload those. if (queue_type_ == QueueType::kImmediate) { @@ -253,7 +254,7 @@ work_queue_sets_->OnQueuesFrontTaskChanged(this); task_queue_->TraceQueueSize(); } - return !tasks_to_delete.empty(); + return !tasks_to_delete->empty(); } void WorkQueue::AssignToWorkQueueSets(WorkQueueSets* work_queue_sets) {
diff --git a/base/values.h b/base/values.h index 7198dc48..4d0ffe0 100644 --- a/base/values.h +++ b/base/values.h
@@ -650,10 +650,6 @@ // DEPRECATED, use `Value::FindKey(key)` instead. bool HasKey(StringPiece key) const; - // Returns the number of Values in this dictionary. - // DEPRECATED, use `Value::DictSize()` instead. - size_t size() const { return dict().size(); } - // Returns whether the dictionary is empty. // DEPRECATED, use `Value::DictEmpty()` instead. bool empty() const { return dict().empty(); }
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java index dc90986f..b68f109 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPersonalDataManagerTest.java
@@ -813,6 +813,7 @@ */ @Test @MediumTest + @FlakyTest(message = "https://crbug.com/1213197") public void testEditOfServerCard() throws Exception { String profileId = mHelper.addDummyProfile("Adam West", "adamwest@google.com"); mHelper.addServerCreditCard(mHelper.createDummyCreditCard(
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index 4441a1c..ce7962c 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -462,6 +462,7 @@ @Test @MediumTest @Feature({"StartSurface"}) + @FlakyTest(message = "https://crbug.com/1169673") // clang-format off @CommandLineFlags.Add({BASE_PARAMS + "/single"}) public void testShow_SingleAsHomepage_FromResumeShowStart() throws Exception { @@ -1658,6 +1659,7 @@ } StartSurfaceTestUtils.waitForOverviewVisible( mLayoutChangedCallbackHelper, mCurrentlyActiveLayout); + StartSurfaceTestUtils.waitForTabModel(mActivityTestRule.getActivity()); SiteSuggestion siteToDismiss = mMostVisitedSites.getCurrentSites().get(1); final View tileView = getTileViewFor(siteToDismiss); @@ -1690,18 +1692,19 @@ } StartSurfaceTestUtils.waitForOverviewVisible( mLayoutChangedCallbackHelper, mCurrentlyActiveLayout); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + StartSurfaceTestUtils.waitForTabModel(cta); SiteSuggestion siteToOpen = mMostVisitedSites.getCurrentSites().get(1); final View tileView = getTileViewFor(siteToOpen); // Open the tile using the context menu. - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); TabUiTestHelper.verifyTabModelTabCount(cta, 1, 0); OverviewModeBehaviorWatcher hideWatcher = TabUiTestHelper.createOverviewHideWatcher(cta); invokeContextMenu(tileView, ContextMenuManager.ContextMenuItemId.OPEN_IN_NEW_TAB); hideWatcher.waitForBehavior(); CriteriaHelper.pollUiThread(() -> !cta.getLayoutManager().overviewVisible()); - // Verifies a new Tab is created. + // Verifies a new tab is created. TabUiTestHelper.verifyTabModelTabCount(cta, 2, 0); } @@ -1716,18 +1719,19 @@ } StartSurfaceTestUtils.waitForOverviewVisible( mLayoutChangedCallbackHelper, mCurrentlyActiveLayout); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + StartSurfaceTestUtils.waitForTabModel(cta); SiteSuggestion siteToOpen = mMostVisitedSites.getCurrentSites().get(1); final View tileView = getTileViewFor(siteToOpen); - // Open the tile using the context menu. - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + // Open the incognito tile using the context menu. TabUiTestHelper.verifyTabModelTabCount(cta, 1, 0); OverviewModeBehaviorWatcher hideWatcher = TabUiTestHelper.createOverviewHideWatcher(cta); invokeContextMenu(tileView, ContextMenuManager.ContextMenuItemId.OPEN_IN_INCOGNITO_TAB); hideWatcher.waitForBehavior(); CriteriaHelper.pollUiThread(() -> !cta.getLayoutManager().overviewVisible()); - // Verifies a new Tab is created. + // Verifies a new incognito tab is created. TabUiTestHelper.verifyTabModelTabCount(cta, 1, 1); } @@ -1740,6 +1744,8 @@ } private View getTileViewFor(SiteSuggestion suggestion) { + onViewWaiting( + allOf(withId(org.chromium.chrome.tab_ui.R.id.mv_tiles_layout), isDisplayed())); View tileView = getMvTilesLayout().getTileViewForTesting(suggestion); Assert.assertNotNull("Tile not found for suggestion " + suggestion.url, tileView);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingDialogTest.java index 6441640..e20b77aad 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingDialogTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingDialogTest.java
@@ -46,6 +46,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.app.ChromeActivity; @@ -113,6 +114,7 @@ @Test @MediumTest @CommandLineFlags.Add({BASE_PARAMS}) + @FlakyTest(message = "https://crbug.com/1213194") public void testShowAndHidePriceTrackingDialog() { final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java index 18b9459a..9423b8f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -97,12 +97,6 @@ /** The {@link LayoutManagerHost}, who is responsible for showing the active {@link Layout}. */ protected final LayoutManagerHost mHost; - /** - * A means of notifying features that the browser controls' android view is being forced to - * hide. - */ - private final ObservableSupplierImpl<Boolean> mAndroidViewShownSupplier; - /** The last X coordinate of the last {@link MotionEvent#ACTION_DOWN} event. */ protected int mLastTapX; @@ -274,8 +268,6 @@ Supplier<TopUiThemeColorProvider> topUiThemeColorProvider) { mHost = host; mPxToDp = 1.f / mHost.getContext().getResources().getDisplayMetrics().density; - mAndroidViewShownSupplier = new ObservableSupplierImpl<>(); - mAndroidViewShownSupplier.set(true); mTabContentManagerSupplier = tabContentManagerSupplier; mLayoutStateProviderOneshotSupplier = layoutStateProviderOneshotSupplier; mLayerTitleCacheSupplier = layerTitleCacheSupplier; @@ -651,10 +643,8 @@ if (overlayHidesControls || mActiveLayout.forceHideBrowserControlsAndroidView()) { mControlsHidingToken = controlsVisibilityManager.hideAndroidControlsAndClearOldToken( mControlsHidingToken); - mAndroidViewShownSupplier.set(false); } else { controlsVisibilityManager.releaseAndroidControlsHidingToken(mControlsHidingToken); - mAndroidViewShownSupplier.set(true); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index 0015ab37..f9191ab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -393,6 +393,7 @@ * @see AutocompleteController#onVoiceResults(List) */ void onVoiceResults(@Nullable List<VoiceRecognitionHandler.VoiceResult> results) { + if (!mNativeInitialized || mAutocomplete == null) return; mAutocomplete.onVoiceResults(results); } @@ -438,7 +439,8 @@ @Override public void onSuggestionClicked( @NonNull AutocompleteMatch suggestion, int position, @NonNull GURL url) { - if (mAutocompleteResult.isFromCachedResult() && !mNativeInitialized) { + if (mAutocompleteResult.isFromCachedResult() + && (!mNativeInitialized || mAutocomplete == null)) { // clang-format off mDeferredLoadAction = () -> loadUrlForOmniboxMatch( position, suggestion, url, mLastActionUpTimestamp, true); @@ -584,10 +586,7 @@ */ private GURL updateSuggestionUrlIfNeeded(@NonNull AutocompleteMatch suggestion, int selectedIndex, @NonNull GURL url, boolean skipCheck) { - // Only called once we have suggestions, and don't have a listener though which we can - // receive suggestions until the native side is ready, so this is safe - assert mNativeInitialized - : "updateSuggestionUrlIfNeeded called before native initialization"; + if (!mNativeInitialized || mAutocomplete == null) return url; if (suggestion.getType() == OmniboxSuggestionType.VOICE_SUGGEST || suggestion.getType() == OmniboxSuggestionType.TILE_SUGGESTION || suggestion.getType() == OmniboxSuggestionType.TILE_NAVSUGGEST) { @@ -651,7 +650,8 @@ mIgnoreOmniboxItemSelection = true; cancelAutocompleteRequests(); - if (mEditSessionState == EditSessionState.INACTIVE && mNativeInitialized) { + if (mEditSessionState == EditSessionState.INACTIVE && mNativeInitialized + && mAutocomplete != null) { mAutocomplete.resetSession(); mNewOmniboxEditSessionTimestamp = SystemClock.elapsedRealtime(); mEditSessionState = EditSessionState.ACTIVATED_BY_USER_INPUT; @@ -742,7 +742,7 @@ void loadTypedOmniboxText(long eventTime) { final String urlText = mUrlBarEditingTextProvider.getTextWithAutocomplete(); cancelAutocompleteRequests(); - if (mNativeInitialized) { + if (mNativeInitialized && mAutocomplete != null) { findMatchAndLoadUrl(urlText, eventTime); } else { mDeferredLoadAction = () -> findMatchAndLoadUrl(urlText, eventTime); @@ -769,6 +769,7 @@ // user tapped the URL bar to dismiss the suggestions, then pressed enter. This can // also happen if the user presses enter before any suggestions have been received // from the autocomplete controller. + if (!mNativeInitialized || mAutocomplete == null) return; suggestionMatch = mAutocomplete.classify(urlText, mDelegate.didFocusUrlFromFakebox()); // Classify matches don't propagate to java, so skip the OOB check. inSuggestionList = false; @@ -886,8 +887,7 @@ * @see AutocompleteController#stop(boolean) */ private void hideSuggestions() { - if (mAutocomplete == null || !mNativeInitialized) return; - + if (!mNativeInitialized || mAutocomplete == null) return; stopAutocomplete(true); mDropdownViewInfoListManager.clear(); @@ -902,7 +902,7 @@ * @param clear Whether to clear the most recent autocomplete results. */ private void stopAutocomplete(boolean clear) { - if (mAutocomplete != null) mAutocomplete.stop(clear); + if (mNativeInitialized && mAutocomplete != null) mAutocomplete.stop(clear); cancelAutocompleteRequests(); } @@ -910,6 +910,7 @@ * Trigger autocomplete for the given query. */ void startAutocompleteForQuery(String query) { + if (!mNativeInitialized || mAutocomplete == null) return; stopAutocomplete(false); if (mDataProvider.hasTab()) { mAutocomplete.start(mDataProvider.getProfile(), mDataProvider.getCurrentUrl(),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java index c8b74418..a377d54 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java
@@ -19,7 +19,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.MinAndroidSdkLevel; @@ -113,7 +112,7 @@ @MediumTest @CommandLineFlags.Add({"enable-features=Portals"}) @MinAndroidSdkLevel(Build.VERSION_CODES.O) - @DisableIf.Build(supported_abis_includes = "x86", message = "https://crbug.com/1211930") + @FlakyTest(message = "https://crbug.com/1211930") public void testExitPipOnPortalActivation() throws Throwable { testExitOn(() -> JavaScriptUtils.executeJavaScript(getWebContents(), @@ -124,7 +123,7 @@ @Test @MediumTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) - @DisableIf.Build(supported_abis_includes = "x86", message = "https://crbug.com/1211930") + @FlakyTest(message = "https://crbug.com/1211930") public void testExitOnLeaveFullscreen() throws Throwable { testExitOn(() -> DOMUtils.exitFullscreen(getWebContents())); } @@ -133,7 +132,7 @@ @Test @MediumTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) - @DisableIf.Build(supported_abis_includes = "x86", message = "https://crbug.com/1211930") + @FlakyTest(message = "https://crbug.com/1211930") public void testExitOnCloseTab() throws Throwable { // We want 2 Tabs so we can close the first without any special behaviour. mActivityTestRule.loadUrlInNewTab(mTestServer.getURL(TEST_PATH)); @@ -145,7 +144,7 @@ @Test @MediumTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) - @DisableIf.Build(supported_abis_includes = "x86", message = "https://crbug.com/1211930") + @FlakyTest(message = "https://crbug.com/1211930") public void testExitOnCrash() throws Throwable { testExitOn(() -> WebContentsUtils.simulateRendererKilled(getWebContents(), false)); } @@ -154,7 +153,7 @@ @Test @MediumTest @MinAndroidSdkLevel(Build.VERSION_CODES.O) - @DisableIf.Build(supported_abis_includes = "x86", message = "https://crbug.com/1211930") + @FlakyTest(message = "https://crbug.com/1211930") public void testExitOnNewForegroundTab() throws Throwable { testExitOn(new Runnable() { @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java index df1d53f..79980a5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java
@@ -25,6 +25,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisableIf; +import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.profiles.Profile; @@ -82,6 +83,7 @@ @Test @MediumTest + @FlakyTest(message = "https://crbug.com/1205346") public void signinWhenPrimaryAccountIsRenamedToAKnownAccount() { mActivityTestRule.startMainActivityOnBlankPage(); mAccountManagerTestRule.addAccountAndWaitForSeeding("the.second.account@gmail.com"); @@ -103,6 +105,7 @@ @Test @MediumTest + @FlakyTest(message = "https://crbug.com/1205346") public void signoutWhenPrimaryAccountIsRenamedToAnUnknownAccount() { mActivityTestRule.startMainActivityOnBlankPage(); mAccountManagerTestRule.addAccountAndWaitForSeeding("the.second.account@gmail.com"); @@ -124,6 +127,7 @@ @Test @MediumTest + @FlakyTest(message = "https://crbug.com/1205346") public void signoutWhenPrimaryAccountIsRemoved() { mActivityTestRule.startMainActivityOnBlankPage(); mAccountManagerTestRule.addAccountAndWaitForSeeding("the.second.account@gmail.com");
diff --git a/chrome/app/profiles_strings.grdp b/chrome/app/profiles_strings.grdp index b5b231e..c3f1a1a 100644 --- a/chrome/app/profiles_strings.grdp +++ b/chrome/app/profiles_strings.grdp
@@ -64,9 +64,6 @@ </message> <!-- Multi-profile --> - <message name="IDS_PROFILES_OPTIONS_GROUP_NAME" desc="The name of the sync group in the options dialog when using the new Profiles UI."> - People - </message> <message name="IDS_PROFILES_MENU_NAME" desc="The name of menu for profiles (Mac and linux) and name for the launcher menu section (Mac)."> Profiles </message> @@ -138,9 +135,6 @@ Addresses and more </message> <if expr="not use_titlecase"> - <message name="IDS_PROFILES_OTHER_PROFILES_TITLE" desc="Title in the profile menu of the 'other profiles' section."> - Other people - </message> <message name="IDS_PROFILES_LIST_PROFILES_TITLE" desc="Title in the profile menu for the list of 'other profiles'."> Other profiles </message> @@ -150,14 +144,8 @@ <message name="IDS_PROFILES_PROFILE_HIDE_MANAGE_ACCOUNTS_BUTTON" desc="Button in the avatar menu bubble view used to hide the accounts for a profile."> Hide accounts </message> - <message name="IDS_PROFILES_MANAGE_USERS_BUTTON" desc="Button in the avatar menu bubble view for launching the user manager."> - Manage people - </message> </if> <if expr="use_titlecase"> - <message name="IDS_PROFILES_OTHER_PROFILES_TITLE" desc="Title in the profile menu of the 'other profiles' section."> - Other People - </message> <message name="IDS_PROFILES_LIST_PROFILES_TITLE" desc="Title in the profile menu for the list of 'other profiles'."> Other Profiles </message> @@ -167,9 +155,6 @@ <message name="IDS_PROFILES_PROFILE_HIDE_MANAGE_ACCOUNTS_BUTTON" desc="Button in the avatar menu bubble view used to hide the accounts for a profile."> Hide Accounts </message> - <message name="IDS_PROFILES_MANAGE_USERS_BUTTON" desc="Button in the avatar menu bubble view for launching the user manager."> - Manage People - </message> </if> <message name="IDS_PROFILES_MANAGE_PROFILES_BUTTON_TOOLTIP" desc="Button in the avatar menu bubble view for launching the profile picker."> Manage profiles
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 04329eee..a1de6d88 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -3202,9 +3202,6 @@ <message name="IDS_SETTINGS_SYNC_DISCONNECT_MANAGED_PROFILE_EXPLANATION" desc="The text to display in the 'Sign out of Chrome' dialog to stop syncing for managed profiles."> Because this account is managed by <ph name="DOMAIN">$1<ex>example.com</ex></ph>, your bookmarks, history, passwords, and other settings will be cleared from this device. However, your data will remain stored in your Google Account and can be managed on <ph name="BEGIN_LINK"><a href="$2" target="_blank"><ex><a href="$2" target="_blank"></ex></ph>Google Dashboard<ph name="END_LINK"></a><ex></a></ex></ph>. </message> - <message name="IDS_SETTINGS_EDIT_PERSON" desc="Title of the edit person subpage. This is a subpage to edit the name and icon of a Chrome Profile."> - Edit person - </message> <message name="IDS_SETTINGS_TURN_OFF_SYNC_AND_SIGN_OUT_DIALOG_TITLE" desc="The text to display on the title of the dialog to turn off sync and sign out."> Turn off sync and personalization? </message>
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn index 8ab19ed..9ba424b8 100644 --- a/chrome/app/vector_icons/BUILD.gn +++ b/chrome/app/vector_icons/BUILD.gn
@@ -35,7 +35,6 @@ "chrome_labs_touch.icon", "click_to_call_illustration.icon", "click_to_call_illustration_dark.icon", - "close_all.icon", "computer_with_circle_background.icon", "copy.icon", "crashed_tab.icon",
diff --git a/chrome/app/vector_icons/close_all.icon b/chrome/app/vector_icons/close_all.icon deleted file mode 100644 index 20c8b0c..0000000 --- a/chrome/app/vector_icons/close_all.icon +++ /dev/null
@@ -1,86 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -CANVAS_DIMENSIONS, 24, -MOVE_TO, 4, 6, -H_LINE_TO, 2, -R_V_LINE_TO, 14, -R_CUBIC_TO, 0, 1.1f, 0.9f, 2, 2, 2, -R_H_LINE_TO, 14, -R_V_LINE_TO, -2, -H_LINE_TO, 4, -V_LINE_TO, 6, -CLOSE, -R_MOVE_TO, 16, -4, -H_LINE_TO, 8, -R_CUBIC_TO, -1.1f, 0, -2, 0.9f, -2, 2, -R_V_LINE_TO, 12, -R_CUBIC_TO, 0, 1.1f, 0.9f, 2, 2, 2, -R_H_LINE_TO, 12, -R_CUBIC_TO, 1.1f, 0, 2, -0.9f, 2, -2, -V_LINE_TO, 4, -R_CUBIC_TO, 0, -1.1f, -0.9f, -2, -2, -2, -CLOSE, -R_MOVE_TO, -3.17f, 12.24f, -LINE_TO, 14, 11.41f, -R_LINE_TO, -2.83f, 2.83f, -R_LINE_TO, -1.41f, -1.41f, -LINE_TO, 12.59f, 10, -LINE_TO, 9.76f, 7.17f, -R_LINE_TO, 1.41f, -1.41f, -LINE_TO, 14, 8.59f, -R_LINE_TO, 2.83f, -2.83f, -R_LINE_TO, 1.41f, 1.41f, -LINE_TO, 15.41f, 10, -R_LINE_TO, 2.83f, 2.83f, -R_LINE_TO, -1.41f, 1.41f, -CLOSE - -CANVAS_DIMENSIONS, 16, -MOVE_TO, 2.5f, 13.5f, -LINE_TO, 10.5f, 13.5f, -CUBIC_TO, 10.78f, 13.5f, 11, 13.72f, 11, 14, -LINE_TO, 11, 14.5f, -CUBIC_TO, 11, 14.78f, 10.78f, 15, 10.5f, 15, -LINE_TO, 2.5f, 15, -LINE_TO, 2, 15, -CUBIC_TO, 1.45f, 15, 1, 14.55f, 1, 14, -LINE_TO, 1, 5.5f, -CUBIC_TO, 1, 5.22f, 1.22f, 5, 1.5f, 5, -LINE_TO, 2, 5, -CUBIC_TO, 2.28f, 5, 2.5f, 5.22f, 2.5f, 5.5f, -LINE_TO, 2.5f, 13.5f, -CLOSE, -MOVE_TO, 13.78f, 1, -CUBIC_TO, 14.45f, 1, 15, 1.55f, 15, 2.22f, -LINE_TO, 15, 10.78f, -CUBIC_TO, 15, 11.45f, 14.45f, 12, 13.78f, 12, -LINE_TO, 5.22f, 12, -CUBIC_TO, 4.55f, 12, 4, 11.45f, 4, 10.78f, -LINE_TO, 4, 2.22f, -CUBIC_TO, 4, 1.55f, 4.55f, 1, 5.22f, 1, -LINE_TO, 13.78f, 1, -CLOSE, -MOVE_TO, 12.65f, 3.63f, -LINE_TO, 12.37f, 3.35f, -CUBIC_TO, 12.17f, 3.16f, 11.85f, 3.16f, 11.66f, 3.35f, -LINE_TO, 9.5f, 5.51f, -LINE_TO, 7.34f, 3.35f, -CUBIC_TO, 7.15f, 3.16f, 6.83f, 3.16f, 6.63f, 3.35f, -LINE_TO, 6.35f, 3.63f, -CUBIC_TO, 6.16f, 3.83f, 6.16f, 4.15f, 6.35f, 4.34f, -LINE_TO, 8.51f, 6.5f, -LINE_TO, 6.35f, 8.66f, -CUBIC_TO, 6.16f, 8.85f, 6.16f, 9.17f, 6.35f, 9.37f, -LINE_TO, 6.63f, 9.65f, -CUBIC_TO, 6.83f, 9.84f, 7.15f, 9.84f, 7.34f, 9.65f, -LINE_TO, 9.5f, 7.49f, -LINE_TO, 11.66f, 9.65f, -CUBIC_TO, 11.85f, 9.84f, 12.17f, 9.84f, 12.37f, 9.65f, -LINE_TO, 12.65f, 9.37f, -CUBIC_TO, 12.84f, 9.17f, 12.84f, 8.85f, 12.65f, 8.66f, -LINE_TO, 10.49f, 6.5f, -LINE_TO, 12.65f, 4.34f, -CUBIC_TO, 12.84f, 4.15f, 12.84f, 3.83f, 12.65f, 3.63f, -CLOSE
diff --git a/chrome/app_shim/app_shim_controller.h b/chrome/app_shim/app_shim_controller.h index d072dd1..0a485fa 100644 --- a/chrome/app_shim/app_shim_controller.h +++ b/chrome/app_shim/app_shim_controller.h
@@ -120,9 +120,8 @@ void SetBadgeLabel(const std::string& badge_label) override; void SetUserAttention( chrome::mojom::AppShimAttentionType attention_type) override; - void UpdateProfileMenu( - std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items, - bool use_new_picker) override; + void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr> + profile_menu_items) override; // Helper function to set up a connection to the AppShimListener at the given // Mach endpoint name.
diff --git a/chrome/app_shim/app_shim_controller.mm b/chrome/app_shim/app_shim_controller.mm index ab2a95aa5..b69587f 100644 --- a/chrome/app_shim/app_shim_controller.mm +++ b/chrome/app_shim/app_shim_controller.mm
@@ -359,12 +359,7 @@ void AppShimController::SetUpMenu() { chrome::BuildMainMenu(NSApp, delegate_, params_.app_name, true); - - // Initialize the profiles menu to be empty (the value of `use_new_picker` is - // chosen arbitrarily as it does not matter for an empty menu). It will be - // updated from the browser. - UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr>(), - /*use_new_picker=*/false); + UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr>()); } void AppShimController::BootstrapChannelError(uint32_t custom_reason, @@ -451,8 +446,7 @@ } void AppShimController::UpdateProfileMenu( - std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items, - bool use_new_picker) { + std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items) { profile_menu_items_ = std::move(profile_menu_items); NSMenuItem* cocoa_profile_menu = @@ -465,9 +459,7 @@ [cocoa_profile_menu setHidden:NO]; base::scoped_nsobject<NSMenu> menu([[NSMenu alloc] - initWithTitle:l10n_util::GetNSStringWithFixup( - use_new_picker ? IDS_PROFILES_MENU_NAME - : IDS_PROFILES_OPTIONS_GROUP_NAME)]); + initWithTitle:l10n_util::GetNSStringWithFixup(IDS_PROFILES_MENU_NAME)]); [cocoa_profile_menu setSubmenu:menu]; // Note that this code to create menu items is nearly identical to the code
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 3c4fccb1..b2e3362 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -329,6 +329,8 @@ "component_updater/mei_preload_component_installer.h", "component_updater/pepper_flash_component_installer.cc", "component_updater/pepper_flash_component_installer.h", + "component_updater/pki_metadata_component_installer.cc", + "component_updater/pki_metadata_component_installer.h", "component_updater/pnacl_component_installer.cc", "component_updater/pnacl_component_installer.h", "component_updater/recovery_component_installer.cc", @@ -1676,10 +1678,6 @@ "ssl/connection_help_tab_helper.h", "ssl/insecure_form/insecure_form_controller_client.cc", "ssl/insecure_form/insecure_form_controller_client.h", - "ssl/insecure_sensitive_input_driver.cc", - "ssl/insecure_sensitive_input_driver.h", - "ssl/insecure_sensitive_input_driver_factory.cc", - "ssl/insecure_sensitive_input_driver_factory.h", "ssl/known_interception_disclosure_infobar_delegate.cc", "ssl/known_interception_disclosure_infobar_delegate.h", "ssl/sct_reporting_service.cc", @@ -2429,6 +2427,7 @@ "//chromeos/timezone", "//chromeos/tpm", "//components/arc/mojom", + "//components/certificate_transparency", "//components/drive", "//components/quirks", "//components/session_manager/core",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e518a1b..3f317975 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -5102,11 +5102,6 @@ #endif // !defined(OS_ANDROID) #if BUILDFLAG(ENABLE_DICE_SUPPORT) - {"enable-new-profile-picker", flag_descriptions::kNewProfilePickerName, - flag_descriptions::kNewProfilePickerDescription, - kOsMac | kOsWin | kOsLinux, - FEATURE_VALUE_TYPE(features::kNewProfilePicker)}, - {"enable-sign-in-profile-creation", flag_descriptions::kSignInProfileCreationName, flag_descriptions::kSignInProfileCreationDescription,
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index c7780ed..9b168ee 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -1548,6 +1548,10 @@ _startupUrls.insert(_startupUrls.end(), urls.begin(), urls.end()); return; } + + if (StartupBrowserCreator::MaybeHandleProfileAgnosticUrls(urls)) + return; + // Pick the last used browser from a regular profile to open the urls. Profile* profile = g_browser_process->profile_manager()->GetLastUsedProfileAllowedByPolicy();
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm index 7f793fef..2efa2a6 100644 --- a/chrome/browser/app_controller_mac_browsertest.mm +++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -50,7 +50,13 @@ #include "chrome/browser/ui/search/ntp_test_utils.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/web_applications/app_browser_controller.h" #include "chrome/browser/ui/webui/welcome/helpers.h" +#include "chrome/browser/web_applications/components/os_integration_manager.h" +#include "chrome/browser/web_applications/components/url_handler_manager.h" +#include "chrome/browser/web_applications/test/fake_web_app_origin_association_manager.h" +#include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -61,11 +67,13 @@ #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/prefs/pref_service.h" +#include "components/services/app_service/public/cpp/url_handler_info.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" +#include "content/public/test/test_utils.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/common/extension.h" #include "extensions/test/extension_test_message_listener.h" @@ -82,6 +90,8 @@ namespace { GURL g_open_shortcut_url = GURL::EmptyGURL(); +const char16_t kAppName[] = u"Test App"; +const char kStartUrl[] = "https://test.com"; // Returns an Apple Event that instructs the application to open |url|. NSAppleEventDescriptor* AppleEventToOpenUrl(const GURL& url) { @@ -865,6 +875,125 @@ EXPECT_EQ(profile, new_browser->profile()->GetOriginalProfile()); } +class StartupWebAppUrlHandlingBrowserTest : public InProcessBrowserTest { + protected: + StartupWebAppUrlHandlingBrowserTest() = default; + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + OverrideAssociationManager(); + } + + web_app::WebAppProviderBase* provider() { + return web_app::WebAppProviderBase::GetProviderBase(browser()->profile()); + } + + web_app::AppId InstallWebAppWithUrlHandlers( + const std::vector<apps::UrlHandlerInfo>& url_handlers) { + return web_app::test::InstallWebAppWithUrlHandlers( + browser()->profile(), GURL(kStartUrl), kAppName, url_handlers); + } + + void OverrideAssociationManager() { + auto association_manager = + std::make_unique<web_app::FakeWebAppOriginAssociationManager>(); + association_manager->set_pass_through(true); + + auto& url_handler_manager = + provider()->os_integration_manager().url_handler_manager_for_testing(); + url_handler_manager.SetAssociationManagerForTesting( + std::move(association_manager)); + } + + // Check that there are two browsers. Find the one that is not |browser|. + Browser* FindOneOtherBrowser(Browser* browser) { + // There should only be one other browser. + EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile())); + + // Find the new browser. + Browser* other_browser = nullptr; + for (auto* b : *BrowserList::GetInstance()) { + if (b != browser) + other_browser = b; + } + return other_browser; + } +}; + +IN_PROC_BROWSER_TEST_F(StartupWebAppUrlHandlingBrowserTest, + WebAppLaunch_InScopeUrl) { + apps::UrlHandlerInfo url_handler; + url_handler.origin = url::Origin::Create(GURL(kStartUrl)); + + web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); + + // Start URL is in app scope. + SendAppleEventToOpenUrlToAppController(GURL(kStartUrl)); + + // Wait for app launch task to complete. + content::RunAllTasksUntilIdle(); + + // Check for new app window. + ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); + Browser* app_browser; + app_browser = FindOneOtherBrowser(browser()); + ASSERT_TRUE(app_browser); + ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); + + // Verify the launched URL of the app window. + TabStripModel* tab_strip = app_browser->tab_strip_model(); + ASSERT_EQ(1, tab_strip->count()); + content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); + EXPECT_EQ(GURL(kStartUrl), web_contents->GetVisibleURL()); +} + +IN_PROC_BROWSER_TEST_F(StartupWebAppUrlHandlingBrowserTest, + WebAppLaunch_DifferentOriginUrl) { + apps::UrlHandlerInfo url_handler; + url_handler.origin = url::Origin::Create(GURL("https://example.com")); + web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); + + // URL is not in app scope but matches url_handlers of installed app. + SendAppleEventToOpenUrlToAppController(GURL("https://example.com/abc/def")); + + // Wait for app launch task to complete. + content::RunAllTasksUntilIdle(); + + // Check for new app window. + ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); + Browser* app_browser; + app_browser = FindOneOtherBrowser(browser()); + ASSERT_TRUE(app_browser); + ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); + + // Out-of-scope URL launch results in app launch with default launch URL. + TabStripModel* tab_strip = app_browser->tab_strip_model(); + ASSERT_EQ(1, tab_strip->count()); + content::WebContents* web_contents = tab_strip->GetWebContentsAt(0); + EXPECT_EQ(GURL(kStartUrl), web_contents->GetVisibleURL()); +} + +IN_PROC_BROWSER_TEST_F(StartupWebAppUrlHandlingBrowserTest, UrlNotCaptured) { + apps::UrlHandlerInfo url_handler; + url_handler.origin = url::Origin::Create(GURL("https://example.com")); + web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); + + // This URL is not in scope of installed app and does not match url_handlers. + SendAppleEventToOpenUrlToAppController( + GURL("https://en.example.com/abc/def")); + + content::RunAllTasksUntilIdle(); + + ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile())); + ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); + TabStripModel* tab_strip = browser()->tab_strip_model(); + ASSERT_EQ(2, tab_strip->count()); + // Check the link of the new tab that was opened. + content::WebContents* web_contents = tab_strip->GetWebContentsAt(1); + EXPECT_EQ(GURL("https://en.example.com/abc/def"), + web_contents->GetVisibleURL()); +} + } // namespace //--------------------------AppControllerHandoffBrowserTest---------------------
diff --git a/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc index ab86f6e..2730edb 100644 --- a/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc +++ b/chrome/browser/apps/app_shim/app_shim_host_mac_unittest.cc
@@ -62,9 +62,8 @@ void SetUserAttention( chrome::mojom::AppShimAttentionType attention_type) override {} void SetBadgeLabel(const std::string& badge_label) override {} - void UpdateProfileMenu( - std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items, - bool use_new_picker) override {} + void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr> + profile_menu_items) override {} bool received_launch_done_result_ = false; chrome::mojom::AppShimLaunchResult launch_done_result_ =
diff --git a/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm b/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm index 1d10511..3c4aa91 100644 --- a/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm +++ b/chrome/browser/apps/app_shim/app_shim_listener_browsertest_mac.mm
@@ -75,9 +75,8 @@ void SetUserAttention( chrome::mojom::AppShimAttentionType attention_type) override {} void SetBadgeLabel(const std::string& badge_label) override {} - void UpdateProfileMenu( - std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items, - bool use_new_picker) override {} + void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr> + profile_menu_items) override {} private: void OnShimConnectedDone(
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc index 8646ae2b..063f5020 100644 --- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc +++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -1056,8 +1056,7 @@ // Send the profile menu to the app shim process. app_state->multi_profile_host->GetAppShim()->UpdateProfileMenu( - std::move(items), - base::FeatureList::IsEnabled(features::kNewProfilePicker)); + std::move(items)); } AppShimManager::ProfileState* AppShimManager::GetOrCreateProfileState(
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc index fa853879..be607b56 100644 --- a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc +++ b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
@@ -243,9 +243,8 @@ void SetBadgeLabel(const std::string& badge_label) override {} void SetUserAttention( chrome::mojom::AppShimAttentionType attention_type) override {} - void UpdateProfileMenu( - std::vector<chrome::mojom::ProfileMenuItemPtr> profile_menu_items, - bool use_new_picker) override { + void UpdateProfileMenu(std::vector<chrome::mojom::ProfileMenuItemPtr> + profile_menu_items) override { profile_menu_items_ = std::move(profile_menu_items); }
diff --git a/chrome/browser/ash/accessibility/dictation.cc b/chrome/browser/ash/accessibility/dictation.cc index da2a0fd..8995463b 100644 --- a/chrome/browser/ash/accessibility/dictation.cc +++ b/chrome/browser/ash/accessibility/dictation.cc
@@ -107,7 +107,7 @@ // SODA is installed on-device. speech_recognizer_ = std::make_unique<OnDeviceSpeechRecognizer>( weak_ptr_factory_.GetWeakPtr(), profile_, language, - /*recognition_mode_ime=*/true); + /*recognition_mode_ime=*/true, /*enable_formatting=*/false); base::UmaHistogramBoolean("Accessibility.CrosDictation.UsedOnDeviceSpeech", true); no_speech_timeout_ = kDeviceNoSpeechTimeout;
diff --git a/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc b/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc index 1b68f46..91a5278 100644 --- a/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc +++ b/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc
@@ -280,7 +280,7 @@ } backdrop_fetcher_.reset(); - std::move(callback_).Run(success, images); + std::move(callback_).Run(success, collection_id_, images); } SurpriseMeImageFetcher::SurpriseMeImageFetcher(const std::string& collection_id,
diff --git a/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h b/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h index 4c4b134d..194686d 100644 --- a/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h +++ b/chrome/browser/ash/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h
@@ -51,6 +51,7 @@ public: using OnImagesInfoFetched = base::OnceCallback<void(bool success, + const std::string& collection_id, const std::vector<backdrop::Image>& images)>; explicit ImageInfoFetcher(const std::string& collection_id);
diff --git a/chrome/browser/ash/login/chrome_restart_request.cc b/chrome/browser/ash/login/chrome_restart_request.cc index d9f73ac..7d42302 100644 --- a/chrome/browser/ash/login/chrome_restart_request.cc +++ b/chrome/browser/ash/login/chrome_restart_request.cc
@@ -244,6 +244,7 @@ void DeriveEnabledFeatures(base::CommandLine* out_command_line) { static const base::Feature* kForwardEnabledFeatures[] = { &ash::features::kAutoNightLight, + &chromeos::features::kCellularUseAttachApn, &chromeos::features::kLacrosPrimary, &chromeos::features::kLacrosSupport, &::features::kPluginVm,
diff --git a/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.cc b/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.cc index 7977a63..f54f12d 100644 --- a/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.cc +++ b/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.cc
@@ -9,6 +9,7 @@ #include <algorithm> #include <iterator> #include <memory> +#include <string> #include <vector> #include "ash/public/cpp/wallpaper_info.h" @@ -29,6 +30,7 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/type_converter.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" namespace mojo { @@ -172,8 +174,9 @@ client->SetOnlineWallpaper( user->GetAccountId(), - GURL(it->second.spec() + + GURL(it->second.image_url.spec() + WallpaperControllerClientImpl::GetBackdropWallpaperSuffix()), + it->second.collection_id, ash::WallpaperLayout::WALLPAPER_LAYOUT_CENTER_CROPPED, /*preview_mode=*/false, std::move(callback)); } @@ -204,6 +207,7 @@ void ChromePersonalizationAppUiDelegate::OnFetchCollectionImages( FetchImagesForCollectionCallback callback, bool success, + const std::string& collection_id, const std::vector<backdrop::Image>& images) { DCHECK(wallpaper_images_info_fetcher_); @@ -222,7 +226,8 @@ LOG(WARNING) << "Invalid image discarded"; continue; } - image_asset_id_map_.insert({mojom_image->asset_id, mojom_image->url}); + image_asset_id_map_.insert( + {mojom_image->asset_id, {mojom_image->url, collection_id}}); data.push_back(std::move(mojom_image)); } result = std::move(data);
diff --git a/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.h b/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.h index ab683aba..4d1166b 100644 --- a/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.h +++ b/chrome/browser/ash/web_applications/chrome_personalization_app_ui_delegate.h
@@ -9,9 +9,12 @@ #include <stdint.h> +#include <string> + #include "chromeos/components/personalization_app/mojom/personalization_app.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "url/gurl.h" namespace backdrop { class Collection; @@ -72,6 +75,7 @@ void OnFetchCollectionImages(FetchImagesForCollectionCallback callback, bool success, + const std::string& collection_id, const std::vector<backdrop::Image>& images); std::unique_ptr<backdrop_wallpaper_handlers::CollectionInfoFetcher> @@ -80,9 +84,14 @@ std::unique_ptr<backdrop_wallpaper_handlers::ImageInfoFetcher> wallpaper_images_info_fetcher_; - // Store a mapping of valid image asset_ids to their URL to validate user - // wallpaper selections. - std::map<uint64_t, GURL> image_asset_id_map_; + struct ImageInfo { + GURL image_url; + std::string collection_id; + }; + + // Store a mapping of valid image asset_ids to their ImageInfo to validate + // user wallpaper selections. + std::map<uint64_t, ImageInfo> image_asset_id_map_; // Pointer to profile of user that opened personalization SWA. Not owned. Profile* const profile_ = nullptr;
diff --git a/chrome/browser/attribution_reporting/conversions_usecounter_browsertest.cc b/chrome/browser/attribution_reporting/chrome_attribution_browsertest.cc similarity index 69% rename from chrome/browser/attribution_reporting/conversions_usecounter_browsertest.cc rename to chrome/browser/attribution_reporting/chrome_attribution_browsertest.cc index f33a082..028ca2939 100644 --- a/chrome/browser/attribution_reporting/conversions_usecounter_browsertest.cc +++ b/chrome/browser/attribution_reporting/chrome_attribution_browsertest.cc
@@ -6,6 +6,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h" @@ -20,11 +21,12 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest/include/gtest/gtest.h" -// Tests UseCounters recorded for the Conversion Measurement API. This is tested -// in the Chrome layer, as UseCounter recording is not used with content shell. -class ConversionsUseCounterBrowsertest : public InProcessBrowserTest { +// Tests for the Conversion Measurement API that rely on chrome/ layer features. +// UseCounter recording and multiple browser window behavior is not available +// content shell. +class ChromeAttributionBrowserTest : public InProcessBrowserTest { public: - ConversionsUseCounterBrowsertest() { + ChromeAttributionBrowserTest() { feature_list_.InitAndEnableFeature(features::kConversionMeasurement); } @@ -50,7 +52,7 @@ base::test::ScopedFeatureList feature_list_; }; -IN_PROC_BROWSER_TEST_F(ConversionsUseCounterBrowsertest, +IN_PROC_BROWSER_TEST_F(ChromeAttributionBrowserTest, ImpressionClicked_FeatureRecorded) { base::HistogramTester histogram_tester; content::WebContents* web_contents = @@ -95,7 +97,7 @@ 1); } -IN_PROC_BROWSER_TEST_F(ConversionsUseCounterBrowsertest, +IN_PROC_BROWSER_TEST_F(ChromeAttributionBrowserTest, ConversionPing_FeatureRecorded) { base::HistogramTester histogram_tester; @@ -127,3 +129,44 @@ "Blink.UseCounter.Features", blink::mojom::WebFeature::kConversionAPIAll, 1); } + +IN_PROC_BROWSER_TEST_F(ChromeAttributionBrowserTest, + WindowOpenWithOnlyAttributionFeatures_LinkOpenedInTab) { + base::HistogramTester histogram_tester; + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + page_load_metrics::PageLoadMetricsTestWaiter waiter(web_contents); + waiter.AddWebFeatureExpectation( + blink::mojom::WebFeature::kImpressionRegistration); + + EXPECT_TRUE(ui_test_utils::NavigateToURL( + browser(), + server_.GetURL("a.test", + "/conversions/page_with_impression_creator.html"))); + + // Create an observer to catch the opened WebContents. + content::WebContentsAddedObserver window_observer; + + GURL link_url = server_.GetURL( + "b.test", "/conversions/page_with_conversion_redirect.html"); + // Navigate the page using window.open and set an attribution source. + EXPECT_TRUE(ExecJs(web_contents, content::JsReplace(R"( + window.open($1, "_blank", + "attributionsourceeventid=1,attributiondestination=https://b.test,\ + attributionreportto=https://report.com,attributionexpiry=1000,\ + attributionsourcepriority=10");)", + link_url))); + + content::WebContents* new_contents = window_observer.GetWebContents(); + WaitForLoadStop(new_contents); + + // Verify that the impression registration is observed. + waiter.Wait(); + + // Ensure the window was opened in a new tab. If the window is in a new popup + // the web contents would not belong to the tab strip. + EXPECT_EQ(1, + browser()->tab_strip_model()->GetIndexOfWebContents(new_contents)); + EXPECT_EQ(BrowserList::GetInstance()->size(), 1u); + EXPECT_EQ(browser()->tab_strip_model()->count(), 2); +}
diff --git a/chrome/browser/autofill/DEPS b/chrome/browser/autofill/DEPS index adf6d352..67d4531 100644 --- a/chrome/browser/autofill/DEPS +++ b/chrome/browser/autofill/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - '+components/android_autofill/browser', '+third_party/libaddressinput/chromium/chrome_metadata_source.h', '+third_party/libaddressinput/chromium/chrome_storage_impl.h', ]
diff --git a/chrome/browser/autofill/autofill_provider_browsertest.cc b/chrome/browser/autofill/autofill_provider_browsertest.cc deleted file mode 100644 index e3a24c5..0000000 --- a/chrome/browser/autofill/autofill_provider_browsertest.cc +++ /dev/null
@@ -1,341 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/base_switches.h" -#include "base/bind.h" -#include "base/macros.h" -#include "build/build_config.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/url_constants.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/ui_test_utils.h" -#include "components/android_autofill/browser/android_autofill_manager.h" -#include "components/android_autofill/browser/test_autofill_provider.h" -#include "components/autofill/content/browser/content_autofill_driver.h" -#include "components/autofill/content/browser/content_autofill_driver_factory.h" -#include "components/autofill/core/browser/test_autofill_client.h" -#include "components/autofill/core/common/autofill_features.h" -#include "components/autofill/core/common/form_data.h" -#include "components/autofill/core/common/mojom/autofill_types.mojom.h" -#include "content/public/browser/web_contents.h" -#include "content/public/common/url_constants.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/browser_test_utils.h" -#include "content/public/test/test_utils.h" -#include "net/dns/mock_host_resolver.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/common/switches.h" - -using ::testing::_; -using ::testing::Invoke; - -namespace autofill { - -using mojom::SubmissionSource; - -namespace { - -class MockAutofillProvider : public TestAutofillProvider { - public: - // WebContents takes ownership of the MockAutofillProvider. - explicit MockAutofillProvider(content::WebContents* web_contents) - : TestAutofillProvider(web_contents) {} - - ~MockAutofillProvider() override = default; - - MOCK_METHOD4(OnFormSubmitted, - void(AndroidAutofillManager* manager, - const FormData& form, - bool, - SubmissionSource)); - - MOCK_METHOD6(OnQueryFormFieldAutofill, - void(AndroidAutofillManager* manager, - int32_t id, - const FormData& form, - const FormFieldData& field, - const gfx::RectF& bounding_box, - bool autoselect_first_suggestion)); - - void OnQueryFormFieldAutofillImpl(AndroidAutofillManager* manager, - int32_t id, - const FormData& form, - const FormFieldData& field, - const gfx::RectF& bounding_box, - bool autoselect_first_suggestion) { - queried_form_ = form; - } - - void OnFormSubmittedImpl(AndroidAutofillManager*, - const FormData& form, - bool success, - SubmissionSource source) { - submitted_form_ = form; - } - - const FormData& queried_form() { return queried_form_; } - - const FormData& submitted_form() { return submitted_form_; } - - private: - FormData queried_form_; - FormData submitted_form_; -}; - -} // namespace - -class AutofillProviderBrowserTest : public InProcessBrowserTest { - public: - AutofillProviderBrowserTest() {} - ~AutofillProviderBrowserTest() override {} - - void SetUp() override { - InProcessBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - autofill_client_ = std::make_unique<TestAutofillClient>(); - // WebContents takes ownership of the MockAutofillProvider. - autofill_provider_ = new MockAutofillProvider(WebContents()); - // Serve both a.com and b.com (and any other domain). - host_resolver()->AddRule("*", "127.0.0.1"); - ASSERT_TRUE(embedded_test_server()->Start()); - } - - // Necessary to avoid flakiness or failure due to input arriving - // before the first compositor commit. - void SetUpCommandLine(base::CommandLine* command_line) override { - InProcessBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitch(blink::switches::kAllowPreCommitInput); - } - - void CreateContentAutofillDriverFactoryForSubFrame() { - content::WebContents* web_contents = WebContents(); - ASSERT_TRUE(web_contents != NULL); - - web_contents->RemoveUserData( - ContentAutofillDriverFactory:: - kContentAutofillDriverFactoryWebContentsUserDataKey); - - // Replace the ContentAutofillDriverFactory for sub frame. - ContentAutofillDriverFactory::CreateForWebContentsAndDelegate( - web_contents, autofill_client_.get(), "en-US", - BrowserAutofillManager::DISABLE_AUTOFILL_DOWNLOAD_MANAGER, - base::BindRepeating(&AndroidAutofillManager::Create)); - } - - void TearDownOnMainThread() override { - testing::Mock::VerifyAndClearExpectations(autofill_provider_); - } - - content::RenderFrameHost* GetMainFrame() { - return WebContents()->GetMainFrame(); - } - - content::WebContents* WebContents() { - return browser()->tab_strip_model()->GetActiveWebContents(); - } - - void SimulateUserTypingInFocusedField() { - content::WebContents* web_contents = WebContents(); - - content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('O'), - ui::DomCode::US_O, ui::VKEY_O, false, false, - false, false); - content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('R'), - ui::DomCode::US_R, ui::VKEY_R, false, false, - false, false); - content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('A'), - ui::DomCode::US_A, ui::VKEY_A, false, false, - false, false); - content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('R'), - ui::DomCode::US_R, ui::VKEY_R, false, false, - false, false); - content::SimulateKeyPress(web_contents, ui::DomKey::FromCharacter('Y'), - ui::DomCode::US_Y, ui::VKEY_Y, false, false, - false, false); - } - - void SetLabelChangeExpectationAndTriggerQuery() { - // One query for the single click, and a second query when the typing is - // simulated. - base::RunLoop run_loop; - EXPECT_CALL(*autofill_provider_, OnQueryFormFieldAutofill(_, _, _, _, _, _)) - .Times(testing::Exactly(2)) - .WillOnce(Invoke(autofill_provider_, - &MockAutofillProvider::OnQueryFormFieldAutofillImpl)) - .WillOnce( - testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); - - EXPECT_CALL(*autofill_provider_, OnFormSubmitted) - .WillOnce(Invoke(autofill_provider_, - &MockAutofillProvider::OnFormSubmittedImpl)); - - ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL( - "/autofill/label_change.html")); - - std::string focus("document.getElementById('address').focus();"); - ASSERT_TRUE(content::ExecuteScript(GetMainFrame(), focus)); - - SimulateUserTypingInFocusedField(); - run_loop.Run(); - } - - void ChangeLabelAndCheckResult(const std::string& element_id, - bool expect_forms_same) { - std::string change_label_and_submit = - "document.getElementById('" + element_id + - "').innerHTML='address change';" - "document.getElementById('submit_button').click();"; - - ASSERT_TRUE( - content::ExecuteScript(GetMainFrame(), change_label_and_submit)); - // Need to pay attention for a message that XHR has finished since there - // is no navigation to wait for. - content::DOMMessageQueue message_queue; - std::string message; - while (message_queue.WaitForMessage(&message)) { - if (message == "\"SUBMISSION_FINISHED\"") - break; - } - - EXPECT_EQ("\"SUBMISSION_FINISHED\"", message); - EXPECT_EQ(2u, autofill_provider_->queried_form().fields.size()); - EXPECT_EQ(2u, autofill_provider_->submitted_form().fields.size()); - EXPECT_EQ(expect_forms_same, - autofill_provider_->submitted_form().SimilarFormAs( - autofill_provider_->queried_form())); - } - - protected: - MockAutofillProvider* autofill_provider_; - - private: - std::unique_ptr<TestAutofillClient> autofill_client_; -}; - -IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTest, - FrameDetachedOnFormlessSubmission) { - CreateContentAutofillDriverFactoryForSubFrame(); - EXPECT_CALL(*autofill_provider_, - OnFormSubmitted(_, _, _, SubmissionSource::FRAME_DETACHED)) - .Times(1); - ui_test_utils::NavigateToURL( - browser(), embedded_test_server()->GetURL( - "/autofill/frame_detached_on_formless_submit.html")); - - // Need to pay attention for a message that XHR has finished since there - // is no navigation to wait for. - content::DOMMessageQueue message_queue; - - std::string focus( - "var iframe = document.getElementById('address_iframe');" - "var frame_doc = iframe.contentDocument;" - "frame_doc.getElementById('address_field').focus();"); - ASSERT_TRUE(content::ExecuteScript(GetMainFrame(), focus)); - - SimulateUserTypingInFocusedField(); - std::string fill_and_submit = - "var iframe = document.getElementById('address_iframe');" - "var frame_doc = iframe.contentDocument;" - "frame_doc.getElementById('submit_button').click();"; - - ASSERT_TRUE(content::ExecuteScript(GetMainFrame(), fill_and_submit)); - std::string message; - while (message_queue.WaitForMessage(&message)) { - if (message == "\"SUBMISSION_FINISHED\"") - break; - } - EXPECT_EQ("\"SUBMISSION_FINISHED\"", message); -} - -IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTest, - FrameDetachedOnFormSubmission) { - CreateContentAutofillDriverFactoryForSubFrame(); - EXPECT_CALL(*autofill_provider_, - OnFormSubmitted(_, _, _, SubmissionSource::FORM_SUBMISSION)) - .Times(1); - ui_test_utils::NavigateToURL( - browser(), embedded_test_server()->GetURL( - "/autofill/frame_detached_on_form_submit.html")); - - // Need to pay attention for a message that XHR has finished since there - // is no navigation to wait for. - content::DOMMessageQueue message_queue; - - std::string focus( - "var iframe = document.getElementById('address_iframe');" - "var frame_doc = iframe.contentDocument;" - "frame_doc.getElementById('address_field').focus();"); - ASSERT_TRUE(content::ExecuteScript(GetMainFrame(), focus)); - - SimulateUserTypingInFocusedField(); - std::string fill_and_submit = - "var iframe = document.getElementById('address_iframe');" - "var frame_doc = iframe.contentDocument;" - "frame_doc.getElementById('submit_button').click();"; - - ASSERT_TRUE(content::ExecuteScript(GetMainFrame(), fill_and_submit)); - std::string message; - while (message_queue.WaitForMessage(&message)) { - if (message == "\"SUBMISSION_FINISHED\"") - break; - } - EXPECT_EQ("\"SUBMISSION_FINISHED\"", message); -} - -class AutofillProviderBrowserTestWithSkipFlagOn - : public AutofillProviderBrowserTest { - public: - AutofillProviderBrowserTestWithSkipFlagOn() { - feature_list_.InitAndEnableFeature( - features::kAutofillSkipComparingInferredLabels); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -class AutofillProviderBrowserTestWithSkipFlagOff - : public AutofillProviderBrowserTest { - public: - AutofillProviderBrowserTestWithSkipFlagOff() { - feature_list_.InitAndDisableFeature( - features::kAutofillSkipComparingInferredLabels); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// TODO(crbug.com/1076487): These tests are flaky on all platforms. - -IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTestWithSkipFlagOn, - DISABLED_LabelTagChangeImpactFormComparing) { - SetLabelChangeExpectationAndTriggerQuery(); - ChangeLabelAndCheckResult("label_id", false /*expect_forms_same*/); -} - -IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTestWithSkipFlagOn, - DISABLED_InferredLabelChangeNotImpactFormComparing) { - SetLabelChangeExpectationAndTriggerQuery(); - ChangeLabelAndCheckResult("p_id", true /*expect_forms_same*/); -} - -IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTestWithSkipFlagOff, - DISABLED_LabelTagChangeImpactFormComparing) { - SetLabelChangeExpectationAndTriggerQuery(); - ChangeLabelAndCheckResult("label_id", false /*expect_forms_same*/); -} - -IN_PROC_BROWSER_TEST_F(AutofillProviderBrowserTestWithSkipFlagOff, - DISABLED_InferredLabelChangeImpactFormComparing) { - SetLabelChangeExpectationAndTriggerQuery(); - ChangeLabelAndCheckResult("p_id", false /*expect_forms_same*/); -} - -} // namespace autofill
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc b/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc index 4f8d0f7b..4f6d53d 100644 --- a/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc +++ b/chrome/browser/autofill/automated_tests/cache_replayer_unittest.cc
@@ -225,8 +225,9 @@ return WriteJSONNode(file_path, Value(std::move(root_dict))); } +// TODO(https://crbug.com/1212151): The test flakily times out. TEST(AutofillCacheReplayerDeathTest, - ServerCacheReplayerConstructor_CrashesWhenNoDomainNode) { + DISABLED_ServerCacheReplayerConstructor_CrashesWhenNoDomainNode) { // Make death test threadsafe. testing::FLAGS_gtest_death_test_style = "threadsafe";
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 1e7cc0c0..958f957 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -26,7 +26,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h" #include "chrome/browser/ssl/security_state_tab_helper.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/web_applications/draggable_region_host_impl.h" @@ -70,7 +69,6 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/image_annotation/public/mojom/image_annotation.mojom.h" #include "third_party/blink/public/mojom/credentialmanager/credential_manager.mojom.h" -#include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom.h" #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom.h" #include "third_party/blink/public/mojom/payments/payment_credential.mojom.h" #include "third_party/blink/public/mojom/payments/payment_request.mojom.h" @@ -515,9 +513,6 @@ map->Add<blink::mojom::AnchorElementMetricsHost>( base::BindRepeating(&NavigationPredictor::Create)); - map->Add<blink::mojom::InsecureInputService>( - base::BindRepeating(&InsecureSensitiveInputDriverFactory::BindDriver)); - map->Add<dom_distiller::mojom::DistillabilityService>( base::BindRepeating(&BindDistillabilityService));
diff --git a/chrome/browser/chromeos/extensions/default_app_order.cc b/chrome/browser/chromeos/extensions/default_app_order.cc index b6648e1..6762f3e 100644 --- a/chrome/browser/chromeos/extensions/default_app_order.cc +++ b/chrome/browser/chromeos/extensions/default_app_order.cc
@@ -124,7 +124,6 @@ arc::kInfinitePainterAppId, web_app::kShowtimeAppId, extension_misc::kGooglePlusAppId, - extension_misc::kChromeRemoteDesktopAppId, }; // Reads external ordinal json file and returned the parsed value. Returns NULL
diff --git a/chrome/browser/chromeos/extensions/gfx_utils.cc b/chrome/browser/chromeos/extensions/gfx_utils.cc index 573a85f..e6ec13f 100644 --- a/chrome/browser/chromeos/extensions/gfx_utils.cc +++ b/chrome/browser/chromeos/extensions/gfx_utils.cc
@@ -44,9 +44,6 @@ {"com.google.android.apps.maps", "lneaknkopdijkpnocmklfnjbeapigfbh"}, // Calculator {"com.google.android.calculator", "joodangkbfjnajiiifokapkpmhfnpleo"}, - // Chrome Remote Desktop - {"com.google.chromeremotedesktop", "gbchcmhmhahfdphkhkmpfmihenigjmpp"}, - {"com.google.chromeremotedesktop", "cdjikkcakjcdjemakobkmijmikhkegcj"}, // Google Calender {"com.google.android.calendar", "ejjicmeblgpmajnghnpcppodonldlgfn"}, {"com.google.android.calendar", "fpgfohogebplgnamlafljlcidjedbdeb"},
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc index c0f1d76..60259bdd 100644 --- a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc +++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
@@ -351,6 +351,7 @@ WallpaperControllerClientImpl::Get()->SetOnlineWallpaperIfExists( GetUserFromBrowserContext(browser_context())->GetAccountId(), params->url, + params->collection_id, wallpaper_api_util::GetLayoutEnum( wallpaper_base::ToString(params->layout)), params->preview_mode, @@ -737,6 +738,7 @@ void WallpaperPrivateGetImagesInfoFunction::OnImagesInfoFetched( bool success, + const std::string& collection_id, const std::vector<backdrop::Image>& images) { if (!success) { Respond(Error("Images info is not available."));
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.h b/chrome/browser/chromeos/extensions/wallpaper_private_api.h index c14d83b8..ed7ff17c 100644 --- a/chrome/browser/chromeos/extensions/wallpaper_private_api.h +++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.h
@@ -313,6 +313,7 @@ // Callback upon completion of fetching the images info. void OnImagesInfoFetched(bool success, + const std::string& collection_id, const std::vector<backdrop::Image>& images); DISALLOW_COPY_AND_ASSIGN(WallpaperPrivateGetImagesInfoFunction);
diff --git a/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.cc b/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.cc index 852d952..88580081 100644 --- a/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.cc +++ b/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.cc
@@ -63,7 +63,9 @@ } void DnsResolverPresentRoutine::AnalyzeResultsAndExecuteCallback() { - if (!name_servers_found_) { + if (!connected_network_) { + set_verdict(mojom::RoutineVerdict::kNotRun); + } else if (!name_servers_found_) { set_verdict(mojom::RoutineVerdict::kProblem); problems_.emplace_back( mojom::DnsResolverPresentProblem::kNoNameServersFound); @@ -138,6 +140,7 @@ if (default_guid.empty()) { AnalyzeResultsAndExecuteCallback(); } else { + connected_network_ = true; FetchManagedProperties(default_guid); } }
diff --git a/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.h b/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.h index 8859813..1235ac7 100644 --- a/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.h +++ b/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine.h
@@ -46,6 +46,7 @@ std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr> networks); + bool connected_network_ = false; bool name_servers_found_ = false; bool non_empty_name_servers_ = false; bool well_formed_name_servers_ = false;
diff --git a/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine_unittest.cc b/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine_unittest.cc index 88e5333..6c7cd3aa 100644 --- a/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine_unittest.cc +++ b/chrome/browser/chromeos/net/network_diagnostics/dns_resolver_present_routine_unittest.cc
@@ -255,5 +255,11 @@ {mojom::DnsResolverPresentProblem::kEmptyNameServers}); } +TEST_F(DnsResolverPresentRoutineTest, TestNoActiveNetwork) { + SetUpWiFi(shill::kStateDisconnect); + SetUpNameServers(kWellFormedDnsServers); + RunRoutine(mojom::RoutineVerdict::kNotRun, {}); +} + } // namespace network_diagnostics } // namespace chromeos
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java index 13c042e..ee9f416 100644 --- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java +++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java
@@ -38,6 +38,7 @@ import org.chromium.base.supplier.Supplier; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIf; +import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics.MessageClearReason; @@ -72,6 +73,7 @@ Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"}) @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.M) @DisableIf.Device(type = {UiDisableIf.TABLET}) +@DisabledTest(message = "crbug.com/1211897") public class MerchantTrustSignalsCoordinatorTest { @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer.cc b/chrome/browser/component_updater/pki_metadata_component_installer.cc new file mode 100644 index 0000000..660d1f6 --- /dev/null +++ b/chrome/browser/component_updater/pki_metadata_component_installer.cc
@@ -0,0 +1,215 @@ +// Copyright 2021 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/component_updater/pki_metadata_component_installer.h" + +#include <memory> +#include <utility> + +#include "base/base64.h" +#include "base/bind.h" +#include "base/feature_list.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/logging.h" +#include "base/memory/ref_counted.h" +#include "base/stl_util.h" +#include "base/task/post_task.h" +#include "base/task/thread_pool.h" +#include "base/threading/scoped_blocking_call.h" +#include "base/time/time.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/network_service_instance.h" +#include "services/network/public/cpp/network_service_buildflags.h" + +#if BUILDFLAG(IS_CT_SUPPORTED) +#include "components/certificate_transparency/certificate_transparency.pb.h" +#include "components/certificate_transparency/certificate_transparency_config.pb.h" +#include "components/certificate_transparency/ct_features.h" +#include "services/network/public/mojom/ct_log_info.mojom.h" +#include "services/network/public/mojom/network_service.mojom.h" +#endif + +using component_updater::ComponentUpdateService; + +namespace { + +const char kGoogleOperatorName[] = "Google"; + +// The SHA256 of the SubjectPublicKeyInfo used to sign the extension. +// The extension id is: efniojlnjndmcbiieegkicadnoecjjef +const uint8_t kPKIMetadataPublicKeySHA256[32] = { + 0x45, 0xd8, 0xe9, 0xbd, 0x9d, 0x3c, 0x21, 0x88, 0x44, 0x6a, 0x82, + 0x03, 0xde, 0x42, 0x99, 0x45, 0x66, 0x25, 0xfe, 0xb3, 0xd1, 0xf8, + 0x11, 0x65, 0xb4, 0x6f, 0xd3, 0x1b, 0x21, 0x89, 0xbe, 0x9c}; + +const base::FilePath::CharType kCTConfigProtoFileName[] = + FILE_PATH_LITERAL("ct_config.pb"); + +std::string LoadCTBinaryProtoFromDisk(const base::FilePath& pb_path) { + std::string result; + if (pb_path.empty()) + return result; + + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::WILL_BLOCK); + + if (!base::ReadFileToString(pb_path.Append(kCTConfigProtoFileName), + &result)) { + result.clear(); + } + return result; +} + +} // namespace + +namespace component_updater { + +PKIMetadataComponentInstallerPolicy::PKIMetadataComponentInstallerPolicy() = + default; + +PKIMetadataComponentInstallerPolicy::~PKIMetadataComponentInstallerPolicy() = + default; + +bool PKIMetadataComponentInstallerPolicy:: + SupportsGroupPolicyEnabledComponentUpdates() const { + return false; +} + +bool PKIMetadataComponentInstallerPolicy::RequiresNetworkEncryption() const { + return false; +} + +update_client::CrxInstaller::Result +PKIMetadataComponentInstallerPolicy::OnCustomInstall( + const base::DictionaryValue& /* manifest */, + const base::FilePath& /* install_dir */) { + return update_client::CrxInstaller::Result(0); // Nothing custom here. +} + +void PKIMetadataComponentInstallerPolicy::OnCustomUninstall() {} + +void PKIMetadataComponentInstallerPolicy::ComponentReady( + const base::Version& version, + const base::FilePath& install_dir, + std::unique_ptr<base::DictionaryValue> /* manifest */) { + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()}, + base::BindOnce(&LoadCTBinaryProtoFromDisk, install_dir), + base::BindOnce( + &PKIMetadataComponentInstallerPolicy::UpdateNetworkServiceOnUI, + base::Unretained(this))); +} + +// Called during startup and installation before ComponentReady(). +bool PKIMetadataComponentInstallerPolicy::VerifyInstallation( + const base::DictionaryValue& /* manifest */, + const base::FilePath& install_dir) const { + if (!base::PathExists(install_dir)) { + return false; + } + + return true; +} + +base::FilePath PKIMetadataComponentInstallerPolicy::GetRelativeInstallDir() + const { + return base::FilePath(FILE_PATH_LITERAL("PKIMetadata")); +} + +void PKIMetadataComponentInstallerPolicy::GetHash( + std::vector<uint8_t>* hash) const { + hash->assign(std::begin(kPKIMetadataPublicKeySHA256), + std::end(kPKIMetadataPublicKeySHA256)); +} + +std::string PKIMetadataComponentInstallerPolicy::GetName() const { + return "PKI Metadata"; +} + +update_client::InstallerAttributes +PKIMetadataComponentInstallerPolicy::GetInstallerAttributes() const { + return update_client::InstallerAttributes(); +} + +void PKIMetadataComponentInstallerPolicy::UpdateNetworkServiceOnUI( + const std::string& ct_config_bytes) { +#if BUILDFLAG(IS_CT_SUPPORTED) + auto proto = + std::make_unique<chrome_browser_certificate_transparency::CTConfig>(); + if (!proto->ParseFromString(ct_config_bytes)) { + return; + } + + network::mojom::NetworkService* network_service = + content::GetNetworkService(); + + if (proto->disable_ct_enforcement()) { + network_service->SetCtEnforcementEnabled(false); + return; + } + + std::vector<network::mojom::CTLogInfoPtr> log_list_mojo; + + // The log list shipped via component updater is a single message of CTLogList + // type, as defined in + // components/certificate_transparency/certificate_transparency.proto, the + // included logs are of the CTLog type, but include only the information + // required by Chrome to enforce its CT policy. Non Chrome used fields are + // left unset. + for (auto log : proto->log_list().logs()) { + std::string decoded_key; + if (!base::Base64Decode(log.key(), &decoded_key)) { + continue; + } + network::mojom::CTLogInfoPtr log_ptr = network::mojom::CTLogInfo::New(); + log_ptr->name = log.description(); + log_ptr->public_key = decoded_key; + // Operator history is ordered in inverse chronological order, so the 0th + // element will be the current operator. + if (!log.operator_history().empty() && + log.operator_history().Get(0).name() == kGoogleOperatorName) { + log_ptr->operated_by_google = true; + } + // State history is ordered in inverse chronological order, so the 0th + // element will be the current state. + if (!log.state().empty()) { + const auto& state = log.state().Get(0); + if (state.current_state() == + chrome_browser_certificate_transparency::CTLog_CurrentState_RETIRED) { + // If the log was RETIRED, record the timestamp at which it was. + // Note: RETIRED is a terminal state for the log, so other states do not + // need to be checked, because once RETIRED, the state will never + // change. + base::TimeDelta retired_since = + base::TimeDelta::FromSeconds( + log.state()[0].state_start().seconds()) + + base::TimeDelta::FromNanoseconds( + log.state()[0].state_start().nanos()); + log_ptr->disqualified_at = retired_since; + } + } + log_list_mojo.push_back(std::move(log_ptr)); + } + + network_service->UpdateCtLogList(std::move(log_list_mojo)); +#endif // BUILDFLAG(IS_CT_SUPPORTED) +} + +void MaybeRegisterPKIMetadataComponent(ComponentUpdateService* cus) { + // Currently the component is only used for the CT log list, so we no-op if CT + // is not supported. +#if BUILDFLAG(IS_CT_SUPPORTED) + if (!base::FeatureList::IsEnabled( + certificate_transparency::features:: + kCertificateTransparencyComponentUpdater)) { + return; + } + auto installer = base::MakeRefCounted<ComponentInstaller>( + std::make_unique<PKIMetadataComponentInstallerPolicy>()); + installer->Register(cus, base::OnceClosure()); +#endif // BUILDFLAG(IS_CT_SUPPORTED) +} + +} // namespace component_updater
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer.h b/chrome/browser/component_updater/pki_metadata_component_installer.h new file mode 100644 index 0000000..0563363d --- /dev/null +++ b/chrome/browser/component_updater/pki_metadata_component_installer.h
@@ -0,0 +1,56 @@ +// Copyright 2021 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_COMPONENT_UPDATER_PKI_METADATA_COMPONENT_INSTALLER_H_ +#define CHROME_BROWSER_COMPONENT_UPDATER_PKI_METADATA_COMPONENT_INSTALLER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/macros.h" +#include "components/component_updater/component_installer.h" + +namespace component_updater { + +// Component installer policy for the PKIMetadata component. This component +// includes any dynamically updateable needed for PKI policies enforcement. +// Initially this contains the Certificate Transparency log list. +class PKIMetadataComponentInstallerPolicy : public ComponentInstallerPolicy { + public: + PKIMetadataComponentInstallerPolicy(); + PKIMetadataComponentInstallerPolicy( + const PKIMetadataComponentInstallerPolicy&) = delete; + PKIMetadataComponentInstallerPolicy operator=( + const PKIMetadataComponentInstallerPolicy&) = delete; + ~PKIMetadataComponentInstallerPolicy() override; + + private: + // ComponentInstallerPolicy methods: + bool SupportsGroupPolicyEnabledComponentUpdates() const override; + bool RequiresNetworkEncryption() const override; + update_client::CrxInstaller::Result OnCustomInstall( + const base::DictionaryValue& manifest, + const base::FilePath& install_dir) override; + void OnCustomUninstall() override; + bool VerifyInstallation(const base::DictionaryValue& manifest, + const base::FilePath& install_dir) const override; + void ComponentReady(const base::Version& version, + const base::FilePath& install_dir, + std::unique_ptr<base::DictionaryValue> manifest) override; + base::FilePath GetRelativeInstallDir() const override; + void GetHash(std::vector<uint8_t>* hash) const override; + std::string GetName() const override; + update_client::InstallerAttributes GetInstallerAttributes() const override; + + // Updates the network service with the component delivered data. + // |ct_config_bytes| should be a serialized CTLogList proto message. + void UpdateNetworkServiceOnUI(const std::string& ct_config_bytes); +}; + +void MaybeRegisterPKIMetadataComponent(ComponentUpdateService* cus); + +} // namespace component_updater + +#endif // CHROME_BROWSER_COMPONENT_UPDATER_PKI_METADATA_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc index 3d7402a1..455e275 100644 --- a/chrome/browser/component_updater/registration.cc +++ b/chrome/browser/component_updater/registration.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/component_updater/registration.h" +#include "base/feature_list.h" #include "base/files/file_path.h" #include "base/metrics/histogram_functions.h" #include "base/path_service.h" @@ -24,6 +25,7 @@ #include "chrome/browser/component_updater/hyphenation_component_installer.h" #include "chrome/browser/component_updater/mei_preload_component_installer.h" #include "chrome/browser/component_updater/pepper_flash_component_installer.h" +#include "chrome/browser/component_updater/pki_metadata_component_installer.h" #include "chrome/browser/component_updater/ssl_error_assistant_component_installer.h" #include "chrome/browser/component_updater/sth_set_component_remover.h" #include "chrome/browser/component_updater/subresource_filter_component_installer.h" @@ -169,6 +171,8 @@ } #endif + MaybeRegisterPKIMetadataComponent(cus); + RegisterSafetyTipsComponent(cus); RegisterCrowdDenyComponent(cus);
diff --git a/chrome/browser/devtools/protocol/security_handler.cc b/chrome/browser/devtools/protocol/security_handler.cc index f78280c..449e7cbd 100644 --- a/chrome/browser/devtools/protocol/security_handler.cc +++ b/chrome/browser/devtools/protocol/security_handler.cc
@@ -34,7 +34,6 @@ "ran-content-with-cert-error"; const char kPkpBypassedSecurityStateIssueId[] = "pkp-bypassed"; const char kIsErrorPageSecurityStateIssueId[] = "is-error-page"; -const char kInsecureInputEventsSecurityStateIssueId[] = "insecure-input-events"; const char kCertMissingSubjectAltName[] = "cert-missing-subject-alt-name"; std::string SecurityLevelToProtocolSecurityState( @@ -192,8 +191,6 @@ security_state::IsSchemeCryptographic(state->url); bool malicious_content = state->malicious_content_status != security_state::MALICIOUS_CONTENT_STATUS_NONE; - bool insecure_input_events = - state->insecure_input_events.insecure_field_edited; bool secure_origin = scheme_is_cryptographic; if (!scheme_is_cryptographic) @@ -228,9 +225,6 @@ security_state_issue_ids.push_back(kPkpBypassedSecurityStateIssueId); if (state->is_error_page) security_state_issue_ids.push_back(kIsErrorPageSecurityStateIssueId); - if (insecure_input_events) - security_state_issue_ids.push_back( - kInsecureInputEventsSecurityStateIssueId); if (cert_missing_subject_alt_name) security_state_issue_ids.push_back(kCertMissingSubjectAltName);
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadSettingsTest.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadSettingsTest.java index d217dcd..7f502fb 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadSettingsTest.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadSettingsTest.java
@@ -18,6 +18,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.Matchers; import org.chromium.chrome.browser.download.DownloadDialogBridge; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -25,7 +26,6 @@ import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.settings.SettingsActivityTestRule; -import org.chromium.chrome.test.ChromeBrowserTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; @@ -99,6 +99,7 @@ @Test @MediumTest @EnableFeatures(ChromeFeatureList.DOWNLOAD_LATER) + @FlakyTest(message = "https://crbug.com/1213183") public void testGeneralSettings() throws Exception { mSettingsActivityTestRule.startSettingsActivity(); assertPreference(DownloadSettings.PREF_LOCATION_CHANGE); @@ -110,6 +111,7 @@ @Test @MediumTest @DisableFeatures(ChromeFeatureList.DOWNLOAD_LATER) + @FlakyTest(message = "https://crbug.com/1213183") public void testWithoutDownloadLater() throws Exception { mSettingsActivityTestRule.startSettingsActivity(); assertPreference(DownloadSettings.PREF_LOCATION_CHANGE);
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc index fbd5287..fc288a9 100644 --- a/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -2879,11 +2879,6 @@ IdentityGetAuthTokenError::State::kNotAllowlistedInPublicSession, 1); } -IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionPublicSessionTest, Allowlisted) { - // GetAuthToken() should return a token for allowlisted extensions. - RunExtensionAndVerifyNoError(/*is_extension_allowlisted=*/true); -} - class GetAuthTokenFunctionChromeKioskTest : public GetAuthTokenFunctionDeviceLocalAccountTest { protected: @@ -2909,12 +2904,6 @@ RunExtensionAndVerifyNoError(/*is_extension_allowlisted=*/false); } -IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionChromeKioskTest, Allowlisted) { - // GetAuthToken() should return a token for allowlisted extensions in the - // Chrome Kiosk session. - RunExtensionAndVerifyNoError(/*is_extension_allowlisted=*/true); -} - class GetAuthTokenFunctionWebKioskTest : public GetAuthTokenFunctionDeviceLocalAccountTest { protected: @@ -2940,12 +2929,6 @@ RunExtensionAndVerifyNoError(/*is_extension_allowlisted=*/false); } -IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionWebKioskTest, Allowlisted) { - // GetAuthToken() should return a token for allowlisted extensions in the - // web Kiosk session. - RunExtensionAndVerifyNoError(/*is_extension_allowlisted=*/true); -} - #endif // There are two parameters, which are stored in a std::pair, for these tests.
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc index 2d89213..be8b573 100644 --- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc +++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
@@ -58,16 +58,6 @@ namespace { -#if BUILDFLAG(IS_CHROMEOS_ASH) -// The list of apps that are allowed to use the Identity API to retrieve the -// token from the device robot account in a public session. -const char* const kPublicSessionAllowedOrigins[] = { - // Chrome Remote Desktop - Chromium branding. - "chrome-extension://ljacajndfccfgnfohlgkdphmbnpkjflk/", - // Chrome Remote Desktop - Official branding. - "chrome-extension://gbchcmhmhahfdphkhkmpfmihenigjmpp/"}; -#endif - const char* const kExtensionsIdentityAPIOAuthConsumerName = "extensions_identity_api"; @@ -255,7 +245,7 @@ user_manager::UserManager::Get()->IsLoggedInAsPublicAccount(); if (connector->IsEnterpriseManaged() && (is_kiosk || is_public_session)) { - if (is_public_session && !IsOriginAllowlistedInPublicSession()) { + if (is_public_session) { CompleteFunctionWithError(IdentityGetAuthTokenError( IdentityGetAuthTokenError::State::kNotAllowlistedInPublicSession)); return; @@ -481,8 +471,7 @@ case IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND: #if BUILDFLAG(IS_CHROMEOS_ASH) // Always force minting token for ChromeOS kiosk app and public session. - if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount() && - !IsOriginAllowlistedInPublicSession()) { + if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount()) { CompleteFunctionWithError( IdentityGetAuthTokenError(IdentityGetAuthTokenError::State:: kNotAllowlistedInPublicSession)); @@ -854,19 +843,6 @@ scopes.insert(GaiaConstants::kAnyApiOAuth2Scope); device_access_token_request_ = service->StartAccessTokenRequest(scopes, this); } - -bool IdentityGetAuthTokenFunction::IsOriginAllowlistedInPublicSession() { - DCHECK(extension()); - GURL extension_url = extension()->url(); - for (size_t i = 0; i < base::size(kPublicSessionAllowedOrigins); i++) { - URLPattern allowed_origin(URLPattern::SCHEME_ALL, - kPublicSessionAllowedOrigins[i]); - if (allowed_origin.MatchesSecurityOrigin(extension_url)) { - return true; - } - } - return false; -} #endif void IdentityGetAuthTokenFunction::StartTokenKeyAccountAccessTokenRequest() {
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h index 46adfad..1834786 100644 --- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h +++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
@@ -199,8 +199,6 @@ // 1. Enterprise kiosk mode. // 2. Allowlisted first party apps in public session. virtual void StartDeviceAccessTokenRequest(); - - bool IsOriginAllowlistedInPublicSession(); #endif // Methods for invoking UI. Overridable for testing.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index f918b3c..c859118 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -648,7 +648,7 @@ { "name": "context-menu-google-lens-chip", "owners": [ "yusuyoutube@google.com", "benwgold@google.com", "lens-chrome@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 96 }, { "name": "context-menu-performance-info-and-remote-hints-fetching", @@ -658,22 +658,22 @@ { "name": "context-menu-search-and-shop-with-google-lens", "owners": [ "yusuyoutube@google.com", "benwgold@google.com", "lens-chrome@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 96 }, { "name": "context-menu-search-with-google-lens", "owners": [ "benwgold@google.com", "lens-chrome@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 96 }, { "name": "context-menu-shop-with-google-lens", "owners": [ "yusuyoutube@google.com", "benwgold@google.com", "lens-chrome@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 96 }, { "name": "context-menu-translate-with-google-lens", "owners": [ "juanmojica@google.com", "hakop@google.com", "benwgold@google.com", "lens-chrome@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 96 }, { "name": "contextual-nudges", @@ -748,7 +748,7 @@ { "name": "copy-link-to-text", "owners": [ "johntlee" ], - "expiry_milestone": 92 + "expiry_milestone": 94 }, { "name": "cpu-affinity-restrict-to-little-cores", @@ -2110,11 +2110,6 @@ "expiry_milestone": 94 }, { - "name": "enable-new-profile-picker", - "owners": [ "msalama", "my-chrome-everywhere@google.com" ], - "expiry_milestone": 92 - }, - { "name": "enable-noscript-previews", "owners": [ "//components/data_reduction_proxy/OWNERS" ], // This flag is used for frequent manual testing and should not be removed. @@ -3073,7 +3068,7 @@ { "name": "google-lens-sdk-intent", "owners": [ "juanmojica@google.com", "benwgold@google.com", "lens-chrome@google.com" ], - "expiry_milestone": 92 + "expiry_milestone": 96 }, { "name": "handwriting-gesture-editing", @@ -3289,7 +3284,7 @@ { "name": "ios-shared-highlighting-color-change", "owners": [ "cheickcisse@google.com" ], - "expiry_milestone": 92 + "expiry_milestone": 95 }, { "name": "ios-synthetic-crash-reports", @@ -3371,7 +3366,7 @@ { "name": "lens-camera-assisted-search", "owners": [ "yusuyoutube@google.com", "benwgold@google.com", "fgorski", "wylieb", "lens-chrome@google.com" ], - "expiry_milestone": 94 + "expiry_milestone": 96 }, { "name": "link-doctor-deprecation-android", @@ -3727,22 +3722,22 @@ { "name": "ntp-chrome-cart-module", "owners": [ "wychen", "tiborg", "yuezhanggg" ], - "expiry_milestone": 92 + "expiry_milestone": 96 }, { "name": "ntp-drive-module", - "owners": [ "aee", "andrevincent", "mahmadi", "tiborg" ], - "expiry_milestone": 92 + "owners": [ "mahmadi", "tiborg" ], + "expiry_milestone": 96 }, { "name": "ntp-modules", - "owners": [ "aee", "mahmadi", "tiborg" ], - "expiry_milestone": 92 + "owners": [ "mahmadi", "tiborg" ], + "expiry_milestone": 96 }, { "name": "ntp-recipe-tasks-module", - "owners": [ "aee", "mahmadi", "tiborg" ], - "expiry_milestone": 92 + "owners": [ "mahmadi", "tiborg" ], + "expiry_milestone": 96 }, { "name": "ntp-repeatable-queries", @@ -3751,8 +3746,8 @@ }, { "name": "ntp-shopping-tasks-module", - "owners": [ "aee", "mahmadi", "tiborg" ], - "expiry_milestone": 92 + "owners": [ "mahmadi", "tiborg" ], + "expiry_milestone": 96 }, { "name": "offline-indicator-choice", @@ -4235,7 +4230,7 @@ { "name": "preemptive-link-to-text-generation", "owners": [ "cheickcisse@google.com" ], - "expiry_milestone": 92 + "expiry_milestone": 94 }, { "name": "prefer-constant-frame-rate", @@ -4728,17 +4723,17 @@ { "name": "shared-highlighting-ios", "owners": ["tmartino"], - "expiry_milestone": 90 + "expiry_milestone": 94 }, { "name": "shared-highlighting-use-blocklist", "owners": ["tmartino"], - "expiry_milestone": 91 + "expiry_milestone": 94 }, { "name": "shared-highlighting-v2", "owners": ["kmilka"], - "expiry_milestone": 92 + "expiry_milestone": 94 }, { "name": "sharing-device-expiration", @@ -4973,7 +4968,7 @@ { "name": "text-fragment-color-change", "owners": [ "cheickcisse@google.com" ], - "expiry_milestone": 92 + "expiry_milestone": 94 }, { "name": "texture-layer-skip-wait-for-activation",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index ffb4432..e87a07f 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1541,10 +1541,6 @@ "Enables in-progress features for the canvas 2D API. See " "https://github.com/fserb/canvas2d."; -const char kNewProfilePickerName[] = "New profile picker"; -const char kNewProfilePickerDescription[] = - "Enables new profile picker implementation."; - const char kSignInProfileCreationName[] = "Profile creation flow with sign-in"; const char kSignInProfileCreationDescription[] = "Enables a new sign-in flow in profile creation";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 5391ced2..fc59208 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -906,9 +906,6 @@ extern const char kNewCanvas2DAPIName[]; extern const char kNewCanvas2DAPIDescription[]; -extern const char kNewProfilePickerName[]; -extern const char kNewProfilePickerDescription[]; - extern const char kSignInProfileCreationName[]; extern const char kSignInProfileCreationDescription[];
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index b6ba47f..7904a05 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc
@@ -515,6 +515,37 @@ client_remote.InitWithNewPipeAndPassReceiver()); network_service_network_context_->SetClient(std::move(client_remote)); +// Configure the Certificate Transparency logs. +#if !defined(OS_ANDROID) + if (g_enable_certificate_transparency) { + std::vector<std::string> operated_by_google_logs = + certificate_transparency::GetLogsOperatedByGoogle(); + std::vector<std::pair<std::string, base::TimeDelta>> disqualified_logs = + certificate_transparency::GetDisqualifiedLogs(); + std::vector<network::mojom::CTLogInfoPtr> log_list_mojo; + for (const auto& ct_log : certificate_transparency::GetKnownLogs()) { + network::mojom::CTLogInfoPtr log_info = network::mojom::CTLogInfo::New(); + log_info->public_key = std::string(ct_log.log_key, ct_log.log_key_length); + log_info->name = ct_log.log_name; + + std::string log_id = crypto::SHA256HashString(log_info->public_key); + log_info->operated_by_google = + std::binary_search(std::begin(operated_by_google_logs), + std::end(operated_by_google_logs), log_id); + auto it = std::lower_bound( + std::begin(disqualified_logs), std::end(disqualified_logs), log_id, + [](const auto& disqualified_log, const std::string& log_id) { + return disqualified_log.first < log_id; + }); + if (it != std::end(disqualified_logs) && it->first == log_id) { + log_info->disqualified_at = it->second; + } + log_list_mojo.push_back(std::move(log_info)); + } + network_service->UpdateCtLogList(std::move(log_list_mojo)); + } +#endif + // Configure the stub resolver. This must be done after the system // NetworkContext is created, but before anything has the chance to use it. stub_resolver_config_reader_.UpdateNetworkService(true /* record_metrics */); @@ -650,32 +681,8 @@ if (g_enable_certificate_transparency) { network_context_params->enforce_chrome_ct_policy = true; network_context_params->ct_log_update_time = base::GetBuildTime(); - - std::vector<std::string> operated_by_google_logs = - certificate_transparency::GetLogsOperatedByGoogle(); - std::vector<std::pair<std::string, base::TimeDelta>> disqualified_logs = - certificate_transparency::GetDisqualifiedLogs(); - for (const auto& ct_log : certificate_transparency::GetKnownLogs()) { - // TODO(rsleevi): https://crbug.com/702062 - Remove this duplication. - network::mojom::CTLogInfoPtr log_info = network::mojom::CTLogInfo::New(); - log_info->public_key = std::string(ct_log.log_key, ct_log.log_key_length); - log_info->name = ct_log.log_name; - - std::string log_id = crypto::SHA256HashString(log_info->public_key); - log_info->operated_by_google = - std::binary_search(std::begin(operated_by_google_logs), - std::end(operated_by_google_logs), log_id); - auto it = std::lower_bound( - std::begin(disqualified_logs), std::end(disqualified_logs), log_id, - [](const auto& disqualified_log, const std::string& log_id) { - return disqualified_log.first < log_id; - }); - if (it != std::end(disqualified_logs) && it->first == log_id) { - log_info->disqualified_at = it->second; - } - network_context_params->ct_logs.push_back(std::move(log_info)); - } } + #endif #if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
diff --git a/chrome/browser/net/system_network_context_manager_browsertest.cc b/chrome/browser/net/system_network_context_manager_browsertest.cc index b0bb640f..b46ee29 100644 --- a/chrome/browser/net/system_network_context_manager_browsertest.cc +++ b/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -445,44 +445,6 @@ } }; -#if BUILDFLAG(IS_CT_SUPPORTED) -IN_PROC_BROWSER_TEST_P( - SystemNetworkContextManagerCertificateTransparencyBrowsertest, - CertificateTransparencyConfig) { - network::mojom::NetworkContextParamsPtr context_params = - g_browser_process->system_network_context_manager() - ->CreateDefaultNetworkContextParams(); - - const bool kDefault = -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && defined(OFFICIAL_BUILD) && \ - !defined(OS_ANDROID) - true; -#else - false; -#endif - - EXPECT_EQ(GetParam().value_or(kDefault), - context_params->enforce_chrome_ct_policy); - EXPECT_NE(GetParam().value_or(kDefault), context_params->ct_logs.empty()); - - if (GetParam().value_or(kDefault)) { - bool has_google_log = false; - bool has_disqualified_log = false; - for (const auto& ct_log : context_params->ct_logs) { - has_google_log |= ct_log->operated_by_google; - has_disqualified_log |= ct_log->disqualified_at.has_value(); - } - EXPECT_TRUE(has_google_log); - EXPECT_TRUE(has_disqualified_log); - } -} -#endif - -INSTANTIATE_TEST_SUITE_P( - All, - SystemNetworkContextManagerCertificateTransparencyBrowsertest, - ::testing::Values(absl::nullopt, true, false)); - #if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED) class SystemNetworkContextServiceCertVerifierBuiltinPermissionsPolicyTest : public policy::PolicyTest,
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc index 2bc043e..64752829 100644 --- a/chrome/browser/profiles/profile_attributes_storage_unittest.cc +++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
@@ -1140,8 +1140,6 @@ // Themes aren't used on Android #if !defined(OS_ANDROID) TEST_F(ProfileAttributesStorageTest, ProfileThemeColors) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kNewProfilePicker); AddTestingProfile(); base::FilePath profile_path = GetProfilePath("testing_profile_path0");
diff --git a/chrome/browser/profiles/profile_avatar_icon_util.cc b/chrome/browser/profiles/profile_avatar_icon_util.cc index a9ddd43a..a6ce497 100644 --- a/chrome/browser/profiles/profile_avatar_icon_util.cc +++ b/chrome/browser/profiles/profile_avatar_icon_util.cc
@@ -363,13 +363,9 @@ #endif ui::ImageModel GetGuestAvatar(int size) { - if (base::FeatureList::IsEnabled(features::kNewProfilePicker)) { return ui::ImageModel::FromVectorIcon( kUserAccountAvatarIcon, ui::NativeTheme::kColorId_AvatarIconGuest, size); - } - return ui::ImageModel::FromVectorIcon(kUserAccountAvatarIcon, - gfx::kGoogleGrey500, size); } gfx::Image GetSizedAvatarIcon(const gfx::Image& image, @@ -438,28 +434,12 @@ return gfx::Image(); } - if (base::FeatureList::IsEnabled(features::kNewProfilePicker)) { - // Get a higher res than 16px so it looks good after cropping to a circle. - gfx::Image icon = - entry->GetAvatarIcon(kAvatarIconSize, /*download_high_res=*/false); - return profiles::GetSizedAvatarIcon( - icon, /*is_rectangle=*/true, kMenuAvatarIconSize, kMenuAvatarIconSize, - profiles::SHAPE_CIRCLE); - } - - constexpr int kOldMenuAvatarIconSize = 38; + // Get a higher res than 16px so it looks good after cropping to a circle. gfx::Image icon = - entry->GetAvatarIcon(kOldMenuAvatarIconSize, /*download_high_res=*/false); - - // The image might be too large and need to be resized, e.g. if this is a - // signed-in user using the GAIA profile photo. - if (icon.Width() > kOldMenuAvatarIconSize || - icon.Height() > kOldMenuAvatarIconSize) { - icon = profiles::GetSizedAvatarIcon(icon, /*is_rectangle=*/true, - kOldMenuAvatarIconSize, - kOldMenuAvatarIconSize); - } - return icon; + entry->GetAvatarIcon(kAvatarIconSize, /*download_high_res=*/false); + return profiles::GetSizedAvatarIcon(icon, /*is_rectangle=*/true, + kMenuAvatarIconSize, kMenuAvatarIconSize, + profiles::SHAPE_CIRCLE); } #endif
diff --git a/chrome/browser/profiles/profile_theme_update_service_browsertest.cc b/chrome/browser/profiles/profile_theme_update_service_browsertest.cc index 3e39626f..8f949ef1 100644 --- a/chrome/browser/profiles/profile_theme_update_service_browsertest.cc +++ b/chrome/browser/profiles/profile_theme_update_service_browsertest.cc
@@ -23,10 +23,6 @@ class ProfileThemeUpdateServiceBrowserTest : public InProcessBrowserTest { public: - ProfileThemeUpdateServiceBrowserTest() { - feature_list_.InitAndEnableFeature(features::kNewProfilePicker); - } - ProfileAttributesEntry* GetProfileAttributesEntry() { CHECK(browser()); CHECK(browser()->profile()); @@ -45,9 +41,6 @@ ThemeService* theme_service() { return ThemeServiceFactory::GetForProfile(browser()->profile()); } - - private: - base::test::ScopedFeatureList feature_list_; }; // Tests that the profile theme colors are updated when an autogenerated theme
diff --git a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js index 900d1f1..8f0efed8 100644 --- a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js +++ b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js
@@ -503,6 +503,10 @@ const state = result.shift(); const states = []; if (state) { + // |state.type| is expected to be the string "etherneteap", which is not + // supported by the rest of this UI. Use the kEthernet constant instead. + // See https://crbug.com/1213176. + state.type = chromeos.networkConfig.mojom.NetworkType.kEthernet; states.push(state); } this.createStateTable_(
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js index d37e67b3..f1a99ea 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/util.js
@@ -373,8 +373,10 @@ */ WallpaperUtil.setOnlineWallpaperWithoutPreview = function( url, layout, onSuccess, onFailure) { + // Skip setting the collection id to avoid logging another collection + // impression when the wallpaper is automatically refreshed. chrome.wallpaperPrivate.setWallpaperIfExists( - url, layout, false /*previewMode=*/, exists => { + url, /*collection_id=*/ '', layout, /*previewMode=*/ false, exists => { if (exists) { onSuccess(); return; @@ -383,7 +385,7 @@ this.fetchURL(url, 'arraybuffer', xhr => { if (xhr.response != null) { chrome.wallpaperPrivate.setWallpaper( - xhr.response, layout, url, false /*previewMode=*/, onSuccess); + xhr.response, layout, url, /*previewMode=*/ false, onSuccess); } else { onFailure(); }
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js index 7cd9d69..77bcba5 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
@@ -904,8 +904,8 @@ var selectedGridItem = this.wallpaperGrid_.getListItem(selectedItem); chrome.wallpaperPrivate.setWallpaperIfExists( - selectedItem.highResolutionURL, selectedItem.layout, previewMode, - exists => { + selectedItem.highResolutionURL, selectedItem.collectionId || '', + selectedItem.layout, previewMode, exists => { if (exists) { successCallback(); return; @@ -1660,13 +1660,14 @@ this.pendingDailyRefreshInfo_.resumeToken = nextResumeToken; // Find the name of the collection based on its id for display // purpose. - var collectionName; - for (var i = 0; i < this.collectionsInfo_.length; ++i) { - if (this.collectionsInfo_[i]['collectionId'] === - this.pendingDailyRefreshInfo_.collectionId) { - collectionName = this.collectionsInfo_[i]['collectionName']; - } - } + var collection = this.collectionsInfo_.find( + info => info['collectionId'] === + this.pendingDailyRefreshInfo_.collectionId); + var collectionName = collection !== undefined ? + collection['collectionName'] : + undefined; + var collectionId = + collection !== undefined ? collection['collectionId'] : undefined; var dailyRefreshImageInfo = { highResolutionURL: imageInfo['imageUrl'] + str('highResolutionSuffix'), @@ -1674,7 +1675,8 @@ source: Constants.WallpaperSourceEnum.Daily, displayText: imageInfo['displayText'], authorWebsite: imageInfo['actionUrl'], - collectionName: collectionName + collectionName: collectionName, + collectionId: collectionId }; var previewMode = this.shouldPreviewWallpaper_();
diff --git a/chrome/browser/resources/download_shelf/BUILD.gn b/chrome/browser/resources/download_shelf/BUILD.gn index 27a061e..7761ea3 100644 --- a/chrome/browser/resources/download_shelf/BUILD.gn +++ b/chrome/browser/resources/download_shelf/BUILD.gn
@@ -93,7 +93,6 @@ out_manifest = "$target_gen_dir/$preprocess_web_components_manifest" in_files = [ "app.js", - "download_button.js", "download_item.js", "download_list.js", ] @@ -126,17 +125,12 @@ ] deps = [ ":app", - ":download_button", ":download_item", ":download_list", ":download_shelf_api_proxy", ] } -js_library("download_button") { - deps = [ "//ui/webui/resources/js:custom_element" ] -} - js_library("download_shelf_api_proxy") { deps = [ "//chrome/browser/ui/webui/download_shelf:mojo_bindings_webui_js", @@ -147,7 +141,6 @@ js_library("download_item") { deps = [ - ":download_button", ":download_shelf_api_proxy", "//ui/webui/resources/js:custom_element", "//ui/webui/resources/js:load_time_data.m", @@ -181,7 +174,6 @@ html_to_js("web_components") { js_files = [ "app.js", - "download_button.js", "download_item.js", "download_list.js", ]
diff --git a/chrome/browser/resources/download_shelf/app.html b/chrome/browser/resources/download_shelf/app.html index 3f0570a..71e8941 100644 --- a/chrome/browser/resources/download_shelf/app.html +++ b/chrome/browser/resources/download_shelf/app.html
@@ -24,6 +24,7 @@ </style> <download-list></download-list> +<cr-button id="show-all-button">$i18n{showAll}</cr-button> <cr-icon-button id="close-button" iron-icon="cr:close" aria-label="$i18n{close}"> </cr-icon-button>
diff --git a/chrome/browser/resources/download_shelf/app.js b/chrome/browser/resources/download_shelf/app.js index 4a4166d..7dbf78e 100644 --- a/chrome/browser/resources/download_shelf/app.js +++ b/chrome/browser/resources/download_shelf/app.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; @@ -23,14 +24,18 @@ /** @private {!DownloadShelfApiProxy} */ this.apiProxy_ = DownloadShelfApiProxyImpl.getInstance(); - this.$('#close-button').addEventListener('click', e => this.onClose_(e)); + this.$('#show-all-button') + .addEventListener('click', e => this.onShowAll_()); + this.$('#close-button').addEventListener('click', e => this.onClose_()); } - /** - * @param {!Event} e - * @private - */ - onClose_(e) { + /** @private */ + onShowAll_() { + this.apiProxy_.doShowAll(); + } + + /** @private */ + onClose_() { this.apiProxy_.doClose(); } }
diff --git a/chrome/browser/resources/download_shelf/download_button.html b/chrome/browser/resources/download_shelf/download_button.html deleted file mode 100644 index 837e39c..0000000 --- a/chrome/browser/resources/download_shelf/download_button.html +++ /dev/null
@@ -1,32 +0,0 @@ -<div> -<style> -:host { - --border-color: var(--google-grey-refresh-300); - --text-color: var(--google-blue-600); - --hover-bg-color: rgba(var(--google-blue-refresh-500-rgb), 0.12); - --active-bg-color: rgba(var(--google-blue-600-rgb), 0.32); - - border: 1px solid var(--border-color); - border-radius: 4px; - box-sizing: border-box; - color: var(--text-color); - cursor: pointer; - font-family: Roboto; - font-weight: 500; - min-width: 79px; - padding: 8px 16px; - text-align: center; - transition: background-color 300ms; - user-select: none; -} - -:host(:hover) { - background-color: var(--hover-bg-color); -} - -:host(:active) { - background-color: var(--active-bg-color); -} -</style> -<slot></slot> -</div>
diff --git a/chrome/browser/resources/download_shelf/download_button.js b/chrome/browser/resources/download_shelf/download_button.js deleted file mode 100644 index a407f23..0000000 --- a/chrome/browser/resources/download_shelf/download_button.js +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Button UI for "Discard" and "Show All". - */ - -import 'chrome://resources/cr_elements/shared_vars_css.m.js'; - -import {CustomElement} from 'chrome://resources/js/custom_element.js'; - -export class DownloadButtonElement extends CustomElement { - static get template() { - return `{__html_template__}`; - } - - constructor() { - super(); - } -} - -customElements.define('download-button', DownloadButtonElement);
diff --git a/chrome/browser/resources/download_shelf/download_item.html b/chrome/browser/resources/download_shelf/download_item.html index 66fd83f..fee9319 100644 --- a/chrome/browser/resources/download_shelf/download_item.html +++ b/chrome/browser/resources/download_shelf/download_item.html
@@ -234,8 +234,10 @@ <div id="status-text"></div> <div id="warning-text"></div> </div> - <download-button id="save-button"></download-button> - <download-button id="discard-button"></download-button> + <cr-button id="save-button"> + <!-- Text depends on file type so fill it in programmatically. --> + </cr-button> + <cr-button id="discard-button">$i18n{discardButtonText}</cr-button> <button id="dropdown-button"> <svg id="dropdown-icon" viewBox="0 0 16 16"> <g>
diff --git a/chrome/browser/resources/download_shelf/download_item.js b/chrome/browser/resources/download_shelf/download_item.js index c9f8a46..e004e475 100644 --- a/chrome/browser/resources/download_shelf/download_item.js +++ b/chrome/browser/resources/download_shelf/download_item.js
@@ -6,8 +6,8 @@ * @fileoverview UI element of a download item. */ +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; -import './download_button.js'; import './strings.m.js'; import {assert} from 'chrome://resources/js/assert.m.js'; @@ -54,9 +54,6 @@ this.$('#discard-button') .addEventListener('click', e => this.onDiscardButtonClick_(e)); this.addEventListener('contextmenu', e => this.onContextMenu_(e)); - - this.$('#discard-button').innerText = - loadTimeData.getString('discardButtonText'); } /** @param {DownloadItem} value */
diff --git a/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js b/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js index 674cd75..665e88b4 100644 --- a/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js +++ b/chrome/browser/resources/download_shelf/download_shelf_api_proxy.js
@@ -11,6 +11,8 @@ /** @return {!PageCallbackRouter} */ getCallbackRouter() {} + doShowAll() {} + doClose() {} /** @@ -61,6 +63,11 @@ } /** @override */ + doShowAll() { + this.handler.doShowAll(); + } + + /** @override */ doClose() { this.handler.doClose(); }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js index 870c465..5b7e98f 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -337,6 +337,13 @@ */ applyingChanges_: false, + /** + * Flag, if true, indicating that the next deviceState_ update + * should call deepLinkToSimLockElement_(). + * @private {boolean} + */ + pendingSimLockDeepLink_: false, + /** @override */ attached() { if (loadTimeData.getBoolean('splitSettingsSyncEnabled')) { @@ -448,14 +455,13 @@ } if (settingId === chromeos.settings.mojom.Setting.kCellularSimLock) { - // In this rare case, toggle not focusable until after a second wait. - // This is slightly preferable to requestAnimationFrame used within - // network-siminfo to focus elements since it can be reproduced in - // testing. - Polymer.RenderStatus.afterNextRender(this, () => { - this.afterRenderShowDeepLink( - settingId, () => this.$$('network-siminfo').getSimLockToggle()); - }); + this.advancedExpanded_ = true; + + // If the page just loaded, deviceState_ will not be fully initialized + // yet, so we won't know which SIM info element to focus. Set + // pendingSimLockDeepLink_ to indicate that a SIM info element should be + // focused next deviceState_ update. + this.pendingSimLockDeepLink_ = true; return false; } @@ -707,6 +713,30 @@ if (shouldGetNetworkDetails) { this.getNetworkDetails_(); } + if (this.pendingSimLockDeepLink_) { + this.pendingSimLockDeepLink_ = false; + this.deepLinkToSimLockElement_(); + } + }); + }, + + /** @private */ + deepLinkToSimLockElement_() { + const settingId = chromeos.settings.mojom.Setting.kCellularSimLock; + const simLockStatus = this.deviceState_.simLockStatus; + + // In this rare case, element not focusable until after a second wait. + // This is slightly preferable to requestAnimationFrame used within + // network-siminfo to focus elements since it can be reproduced in + // testing. + Polymer.RenderStatus.afterNextRender(this, () => { + if (simLockStatus && !!simLockStatus.lockType) { + this.afterRenderShowDeepLink( + settingId, () => this.$$('network-siminfo').getUnlockButton()); + return; + } + this.afterRenderShowDeepLink( + settingId, () => this.$$('network-siminfo').getSimLockToggle()); }); },
diff --git a/chrome/browser/resources_integrity.cc b/chrome/browser/resources_integrity.cc index 4a4a1667..e42f20a 100644 --- a/chrome/browser/resources_integrity.cc +++ b/chrome/browser/resources_integrity.cc
@@ -71,7 +71,7 @@ base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, base::BindOnce(&CheckResourceIntegrityInternal, path, expected_signature), std::move(callback)); }
diff --git a/chrome/browser/sessions/session_service_base.cc b/chrome/browser/sessions/session_service_base.cc index 62d7947..692d7b1 100644 --- a/chrome/browser/sessions/session_service_base.cc +++ b/chrome/browser/sessions/session_service_base.cc
@@ -144,7 +144,6 @@ command_storage_manager_ = std::make_unique<sessions::CommandStorageManager>( backend_type, profile->GetPath(), this, - /* use_marker */ true, /* enable_crypto */ false, std::vector<uint8_t>(), TaskRunnerData::GetBackendTaskRunnerForProfile(profile, type));
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java index 57683b0..5b1fe71 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java
@@ -34,7 +34,6 @@ import org.chromium.base.supplier.Supplier; import org.chromium.base.test.BaseActivityTestRule; import org.chromium.base.test.util.ApplicationTestUtils; -import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.JniMocker; import org.chromium.base.test.util.UserActionTester; import org.chromium.chrome.R; @@ -137,9 +136,11 @@ @Test @MediumTest - @Features.EnableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT}) - @FlakyTest(message = "crbug.com/1207314") - public void getPropertyModels_screenshotEnabled() { + @Features.EnableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT, + ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) + @Features.DisableFeatures({ChromeFeatureList.PREEMPTIVE_LINK_TO_TEXT_GENERATION}) + public void + getPropertyModels_screenshotEnabled() { setUpChromeProvidedSharingOptionsProviderTest( /*printingEnabled=*/false, LinkGeneration.MAX); List<PropertyModel> propertyModels = @@ -159,9 +160,11 @@ @Test @MediumTest - @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT}) - @FlakyTest(message = "crbug.com/1207314") - public void getPropertyModels_printingEnabled_includesPrinting() { + @Features.EnableFeatures({ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) + @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT, + ChromeFeatureList.PREEMPTIVE_LINK_TO_TEXT_GENERATION}) + public void + getPropertyModels_printingEnabled_includesPrinting() { setUpChromeProvidedSharingOptionsProviderTest( /*printingEnabled=*/true, LinkGeneration.MAX); List<PropertyModel> propertyModels =
diff --git a/chrome/browser/signin/signin_util_win_browsertest.cc b/chrome/browser/signin/signin_util_win_browsertest.cc index 45ce132..aabe9f3a 100644 --- a/chrome/browser/signin/signin_util_win_browsertest.cc +++ b/chrome/browser/signin/signin_util_win_browsertest.cc
@@ -543,11 +543,7 @@ ExistingWinBrowserProfilesSigninUtilTest() : BrowserTestHelper(L"gaia_id_for_foo_gmail.com", L"foo@gmail.com", - "lst-123456") { - // TODO(droger): Disable the profile picker using the local state preference - // instead. - feature_list_.InitAndDisableFeature(features::kNewProfilePicker); - } + "lst-123456") {} protected: bool SetUpUserDataDirectory() override { @@ -578,6 +574,9 @@ // but before this step ends, |current_profile| is created and browser switches // to that profile just to prepare the browser for the next step. IN_PROC_BROWSER_TEST_P(ExistingWinBrowserProfilesSigninUtilTest, PRE_PRE_Run) { + g_browser_process->local_state()->SetBoolean( + prefs::kBrowserShowProfilePickerOnStartup, false); + ProfileManager* profile_manager = g_browser_process->profile_manager(); Profile* profile = profile_manager->GetLastUsedProfile();
diff --git a/chrome/browser/speech/on_device_speech_recognizer.cc b/chrome/browser/speech/on_device_speech_recognizer.cc index c4448c9..afd8cf1 100644 --- a/chrome/browser/speech/on_device_speech_recognizer.cc +++ b/chrome/browser/speech/on_device_speech_recognizer.cc
@@ -73,7 +73,8 @@ const base::WeakPtr<SpeechRecognizerDelegate>& delegate, Profile* profile, std::string language_or_locale, - bool recognition_mode_ime) + bool recognition_mode_ime, + bool enable_formatting) : SpeechRecognizer(delegate), state_(SpeechRecognizerStatus::SPEECH_RECOGNIZER_OFF), is_multichannel_supported_(false), @@ -91,7 +92,8 @@ speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), media::mojom::SpeechRecognitionOptions::New( recognition_mode_ime ? media::mojom::SpeechRecognitionMode::kIme - : media::mojom::SpeechRecognitionMode::kCaption), + : media::mojom::SpeechRecognitionMode::kCaption, + enable_formatting), media::BindToCurrentLoop( base::BindOnce(&OnDeviceSpeechRecognizer::OnRecognizerBound, weak_factory_.GetWeakPtr())));
diff --git a/chrome/browser/speech/on_device_speech_recognizer.h b/chrome/browser/speech/on_device_speech_recognizer.h index 7a4da8dc..0ae7e29 100644 --- a/chrome/browser/speech/on_device_speech_recognizer.h +++ b/chrome/browser/speech/on_device_speech_recognizer.h
@@ -36,11 +36,15 @@ // |language_or_locale| specificies the recognition language. // |recognition_mode_ime| is whether to use speech recognition configured for // IME or Captions. + // |enable_formatting| is whether to include extra, assumed formatting and + // punctuation. + // TODO(katie): Combine bools into an int of bits. OnDeviceSpeechRecognizer( const base::WeakPtr<SpeechRecognizerDelegate>& delegate, Profile* profile, std::string language_or_locale, - bool recognition_mode_ime); + bool recognition_mode_ime, + bool enable_formatting); ~OnDeviceSpeechRecognizer() override; OnDeviceSpeechRecognizer(const OnDeviceSpeechRecognizer&) = delete; OnDeviceSpeechRecognizer& operator=(const OnDeviceSpeechRecognizer&) = delete;
diff --git a/chrome/browser/speech/on_device_speech_recognizer_browsertest.cc b/chrome/browser/speech/on_device_speech_recognizer_browsertest.cc index 99b690d..55d88b8 100644 --- a/chrome/browser/speech/on_device_speech_recognizer_browsertest.cc +++ b/chrome/browser/speech/on_device_speech_recognizer_browsertest.cc
@@ -133,7 +133,7 @@ .RetiresOnSaturation(); recognizer_ = std::make_unique<OnDeviceSpeechRecognizer>( mock_speech_delegate_->GetWeakPtr(), browser()->profile(), "en-US", - true /* is IME */); + /*recognition_mode_ime=*/true, /*enable_formatting=*/false); loop.Run(); }
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc index 5f59117..e09eec2 100644 --- a/chrome/browser/speech/speech_recognition_service_browsertest.cc +++ b/chrome/browser/speech/speech_recognition_service_browsertest.cc
@@ -230,7 +230,8 @@ std::move(pending_recognizer_receiver), speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), media::mojom::SpeechRecognitionOptions::New( - media::mojom::SpeechRecognitionMode::kCaption), + media::mojom::SpeechRecognitionMode::kCaption, + /*enable_formatting=*/true), base::BindOnce( [](bool* p_is_multichannel_supported, base::RunLoop* run_loop, bool is_multichannel_supported) { @@ -261,7 +262,8 @@ audio_source_fetcher_.BindNewPipeAndPassReceiver(), speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), media::mojom::SpeechRecognitionOptions::New( - media::mojom::SpeechRecognitionMode::kIme), + media::mojom::SpeechRecognitionMode::kIme, + /*enable_formatting=*/false), base::BindOnce( [](bool* p_is_multichannel_supported, base::RunLoop* run_loop, bool is_multichannel_supported) {
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver.cc b/chrome/browser/ssl/insecure_sensitive_input_driver.cc deleted file mode 100644 index ff97026..0000000 --- a/chrome/browser/ssl/insecure_sensitive_input_driver.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ssl/insecure_sensitive_input_driver.h" - -#include <utility> - -#include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents.h" - -InsecureSensitiveInputDriver::InsecureSensitiveInputDriver( - content::RenderFrameHost* render_frame_host) - : render_frame_host_(render_frame_host) {} - -InsecureSensitiveInputDriver::~InsecureSensitiveInputDriver() {} - -void InsecureSensitiveInputDriver::BindInsecureInputServiceReceiver( - mojo::PendingReceiver<blink::mojom::InsecureInputService> receiver) { - insecure_input_receivers_.Add(this, std::move(receiver)); -} - -void InsecureSensitiveInputDriver::DidEditFieldInInsecureContext() { - InsecureSensitiveInputDriverFactory* parent = - InsecureSensitiveInputDriverFactory::GetOrCreateForWebContents( - content::WebContents::FromRenderFrameHost(render_frame_host_)); - parent->DidEditFieldInInsecureContext(); -}
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver.h b/chrome/browser/ssl/insecure_sensitive_input_driver.h deleted file mode 100644 index f70b939c..0000000 --- a/chrome/browser/ssl/insecure_sensitive_input_driver.h +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_H_ -#define CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_H_ - -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver_set.h" -#include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom.h" - -namespace content { -class RenderFrameHost; -} - -// The InsecureSensitiveInputDriver watches for calls from renderers and -// instructs the parent |InsecureSensitiveInputDriverFactory| monitoring the -// WebContents to update the SSLStatusInputEventData. -// -// There is one InsecureSensitiveInputDriver per RenderFrameHost. -// The lifetime is managed by the InsecureSensitiveInputDriverFactory. -class InsecureSensitiveInputDriver : public blink::mojom::InsecureInputService { - public: - explicit InsecureSensitiveInputDriver( - content::RenderFrameHost* render_frame_host); - ~InsecureSensitiveInputDriver() override; - - void BindInsecureInputServiceReceiver( - mojo::PendingReceiver<blink::mojom::InsecureInputService> receiver); - - // blink::mojom::InsecureInputService: - void DidEditFieldInInsecureContext() override; - - private: - content::RenderFrameHost* render_frame_host_; - - mojo::ReceiverSet<blink::mojom::InsecureInputService> - insecure_input_receivers_; - - DISALLOW_COPY_AND_ASSIGN(InsecureSensitiveInputDriver); -}; - -#endif // CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_H_
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc b/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc deleted file mode 100644 index e8e1378..0000000 --- a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.cc +++ /dev/null
@@ -1,109 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h" - -#include <utility> - -#include "chrome/browser/ssl/insecure_sensitive_input_driver.h" -#include "components/security_state/content/ssl_status_input_event_data.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents.h" - -namespace { -// Creates or retrieves the |user_data| object in the SSLStatus attached to the -// WebContents' NavigationEntry. -security_state::SSLStatusInputEventData* GetOrCreateSSLStatusInputEventData( - content::WebContents* web_contents) { - content::NavigationEntry* entry = - web_contents->GetController().GetLastCommittedEntry(); - // We aren't guaranteed to always have a navigation entry. - if (!entry) - return nullptr; - - content::SSLStatus& ssl = entry->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - if (!input_events) { - ssl.user_data = std::make_unique<security_state::SSLStatusInputEventData>(); - input_events = static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - } - return input_events; -} -} // namespace - -InsecureSensitiveInputDriverFactory::~InsecureSensitiveInputDriverFactory() {} - -// static -InsecureSensitiveInputDriverFactory* -InsecureSensitiveInputDriverFactory::GetOrCreateForWebContents( - content::WebContents* web_contents) { - InsecureSensitiveInputDriverFactory* factory = FromWebContents(web_contents); - - if (!factory) { - content::WebContentsUserData<InsecureSensitiveInputDriverFactory>:: - CreateForWebContents(web_contents); - factory = FromWebContents(web_contents); - DCHECK(factory); - } - return factory; -} - -// static -void InsecureSensitiveInputDriverFactory::BindDriver( - content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver<blink::mojom::InsecureInputService> receiver) { - content::WebContents* web_contents = - content::WebContents::FromRenderFrameHost(render_frame_host); - if (!web_contents) - return; - - InsecureSensitiveInputDriverFactory* factory = - GetOrCreateForWebContents(web_contents); - - InsecureSensitiveInputDriver* driver = - factory->GetOrCreateDriverForFrame(render_frame_host); - - driver->BindInsecureInputServiceReceiver(std::move(receiver)); -} - -InsecureSensitiveInputDriver* -InsecureSensitiveInputDriverFactory::GetOrCreateDriverForFrame( - content::RenderFrameHost* render_frame_host) { - auto insertion_result = - frame_driver_map_.insert(std::make_pair(render_frame_host, nullptr)); - if (insertion_result.second) { - insertion_result.first->second = - std::make_unique<InsecureSensitiveInputDriver>(render_frame_host); - } - return insertion_result.first->second.get(); -} - -void InsecureSensitiveInputDriverFactory::DidEditFieldInInsecureContext() { - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_contents()); - if (!input_events) - return; - - // If the first field edit in the web contents was just performed, - // update the SSLStatusInputEventData. - if (!input_events->input_events()->insecure_field_edited) { - input_events->input_events()->insecure_field_edited = true; - web_contents()->DidChangeVisibleSecurityState(); - } -} - -void InsecureSensitiveInputDriverFactory::RenderFrameDeleted( - content::RenderFrameHost* render_frame_host) { - frame_driver_map_.erase(render_frame_host); -} - -InsecureSensitiveInputDriverFactory::InsecureSensitiveInputDriverFactory( - content::WebContents* web_contents) - : content::WebContentsObserver(web_contents) {} - -WEB_CONTENTS_USER_DATA_KEY_IMPL(InsecureSensitiveInputDriverFactory)
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h b/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h deleted file mode 100644 index fd6d20b..0000000 --- a/chrome/browser/ssl/insecure_sensitive_input_driver_factory.h +++ /dev/null
@@ -1,74 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_FACTORY_H_ -#define CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_FACTORY_H_ - -#include <map> -#include <memory> -#include <set> - -#include "content/public/browser/web_contents_observer.h" -#include "content/public/browser/web_contents_user_data.h" -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom-forward.h" - -namespace content { -class WebContents; -} - -class InsecureSensitiveInputDriver; - -// This object updates the NavigationEntry's SSLStatus UserData object when -// sensitive input events occur that may impact Chrome's determination of the -// page's security level. -// -// This class holds a map of InsecureSensitiveInputDrivers, which accept -// mojom::InsecureInputService notifications from renderers. There is at most -// one factory per WebContents, and one driver per render frame. -class InsecureSensitiveInputDriverFactory - : public content::WebContentsObserver, - public content::WebContentsUserData<InsecureSensitiveInputDriverFactory> { - public: - ~InsecureSensitiveInputDriverFactory() override; - - static InsecureSensitiveInputDriverFactory* GetOrCreateForWebContents( - content::WebContents* web_contents); - - // Finds or creates a factory for the |web_contents| and creates an - // |InsecureSensitiveInputDriver| for the target |render_frame_host|. - static void BindDriver( - content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver<blink::mojom::InsecureInputService> receiver); - - // Creates a |InsecureSensitiveInputDriver| for the specified - // |render_frame_host| and adds it to the |frame_driver_map_|. - InsecureSensitiveInputDriver* GetOrCreateDriverForFrame( - content::RenderFrameHost* render_frame_host); - - // This method is called when there is a message notifying the browser - // process that the user edited a field in a non-secure context. - void DidEditFieldInInsecureContext(); - - // content::WebContentsObserver: - void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; - - private: - explicit InsecureSensitiveInputDriverFactory( - content::WebContents* web_contents); - friend class content::WebContentsUserData< - InsecureSensitiveInputDriverFactory>; - - std::map<content::RenderFrameHost*, - std::unique_ptr<InsecureSensitiveInputDriver>> - frame_driver_map_; - - std::set<content::RenderFrameHost*> frames_with_visible_password_fields_; - - WEB_CONTENTS_USER_DATA_KEY_DECL(); - - DISALLOW_COPY_AND_ASSIGN(InsecureSensitiveInputDriverFactory); -}; - -#endif // CHROME_BROWSER_SSL_INSECURE_SENSITIVE_INPUT_DRIVER_FACTORY_H_
diff --git a/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc b/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc deleted file mode 100644 index 64d5cce..0000000 --- a/chrome/browser/ssl/insecure_sensitive_input_driver_unittest.cc +++ /dev/null
@@ -1,91 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ssl/insecure_sensitive_input_driver.h" - -#include <memory> -#include <string> - -#include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "components/security_state/content/ssl_status_input_event_data.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/ssl_status.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/navigation_simulator.h" -#include "content/public/test/web_contents_tester.h" - -namespace { - -class InsecureSensitiveInputDriverTest - : public ChromeRenderViewHostTestHarness { - protected: - InsecureSensitiveInputDriverTest() {} - - ~InsecureSensitiveInputDriverTest() override {} - - security_state::InsecureInputEventData GetInputEvents( - content::NavigationEntry* entry) { - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - entry->GetSSL().user_data.get()); - if (input_events) - return *input_events->input_events(); - - return security_state::InsecureInputEventData(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(InsecureSensitiveInputDriverTest); -}; - -// Tests that field edit notifications are forwarded. -TEST_F(InsecureSensitiveInputDriverTest, FieldEdit) { - std::unique_ptr<InsecureSensitiveInputDriver> driver( - new InsecureSensitiveInputDriver(main_rfh())); - - // Do a mock navigation so that there is a navigation entry on which the - // field edit gets recorded. - GURL url("http://example.test"); - NavigateAndCommit(url); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_FALSE(GetInputEvents(entry).insecure_field_edited); - - driver->DidEditFieldInInsecureContext(); - - // Check that the field edit notification was passed on. - entry = web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).insecure_field_edited); -} - -// Tests that field edit notifications from subframes are -// recorded correctly. -TEST_F(InsecureSensitiveInputDriverTest, FieldEditWithSubframe) { - // Do a mock navigation so that there is a navigation entry on which - // field edit modifications get recorded. - GURL url("http://example.test"); - NavigateAndCommit(url); - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - ASSERT_TRUE(entry); - EXPECT_FALSE(GetInputEvents(entry).insecure_field_edited); - - // Create a subframe and check that notifications for field edits - // are handled properly. - content::RenderFrameHost* subframe = - content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"); - subframe = content::NavigationSimulator::NavigateAndCommitFromDocument( - GURL("http://example2.test"), subframe); - auto subframe_driver = - std::make_unique<InsecureSensitiveInputDriver>(subframe); - subframe_driver->DidEditFieldInInsecureContext(); - - EXPECT_EQ(url, entry->GetURL()); - EXPECT_TRUE(GetInputEvents(entry).insecure_field_edited); -} - -} // namespace
diff --git a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc index b76635ca..61c080f1 100644 --- a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc +++ b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
@@ -57,7 +57,6 @@ #include "components/security_interstitials/content/ssl_blocking_page.h" #include "components/security_interstitials/core/features.h" #include "components/security_interstitials/core/pref_names.h" -#include "components/security_state/content/ssl_status_input_event_data.h" #include "components/security_state/core/features.h" #include "components/security_state/core/security_state.h" #include "components/strings/grit/components_strings.h" @@ -108,7 +107,6 @@ #include "net/test/test_data_directory.h" #include "services/network/public/cpp/features.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h" #include "third_party/boringssl/src/include/openssl/ssl.h" #include "ui/base/l10n/l10n_util.h" @@ -174,42 +172,6 @@ } } -// A delegate class that allows emulating selection of a file for an -// INPUT TYPE=FILE form field. -class FileChooserDelegate : public content::WebContentsDelegate { - public: - // Constructs a WebContentsDelegate that mocks a file dialog. - // The mocked file dialog will always reply that the user selected |file|. - explicit FileChooserDelegate(const base::FilePath& file, - base::OnceClosure callback) - : file_(file), callback_(std::move(callback)) {} - - // Copy of the params passed to RunFileChooser. - const blink::mojom::FileChooserParams& params() const { return *params_; } - - // WebContentsDelegate: - void RunFileChooser(content::RenderFrameHost* render_frame_host, - scoped_refptr<content::FileSelectListener> listener, - const blink::mojom::FileChooserParams& params) override { - // Send the selected file to the renderer process. - std::vector<blink::mojom::FileChooserFileInfoPtr> files; - files.push_back(blink::mojom::FileChooserFileInfo::NewNativeFile( - blink::mojom::NativeFileInfo::New(file_, std::u16string()))); - listener->FileSelected(std::move(files), base::FilePath(), - blink::mojom::FileChooserParams::Mode::kOpen); - - params_ = params.Clone(); - std::move(callback_).Run(); - } - - private: - base::FilePath file_; - base::OnceClosure callback_; - blink::mojom::FileChooserParamsPtr params_; - - DISALLOW_COPY_AND_ASSIGN(FileChooserDelegate); -}; - // A WebContentsObserver useful for testing the DidChangeVisibleSecurityState() // method: it keeps track of the latest security style and explanation that was // fired. @@ -1423,40 +1385,6 @@ true /* use_secure_inner_origin */); } -// Tests that the security level of a HTTP page is not downgraded when a form -// field is modified by JavaScript. -IN_PROC_BROWSER_TEST_F(SecurityStateTabHelperTest, - SecurityLevelNotDowngradedAfterScriptModification) { - content::WebContents* contents = - browser()->tab_strip_model()->GetActiveWebContents(); - - SecurityStateTabHelper* helper = - SecurityStateTabHelper::FromWebContents(contents); - ASSERT_TRUE(helper); - - // Navigate to an HTTP page. Use a non-local hostname so that it is - // not considered secure. - ui_test_utils::NavigateToURL( - browser(), - GetURLWithNonLocalHostname(embedded_test_server(), - "/textinput/focus_input_on_load.html")); - EXPECT_EQ(security_state::WARNING, helper->GetSecurityLevel()); - - // Verify a value set operation isn't treated as user-input. - EXPECT_TRUE(content::ExecuteScript( - contents, "document.getElementById('text_id').value='v';")); - InjectScript(contents); - base::RunLoop().RunUntilIdle(); - ASSERT_EQ(security_state::WARNING, helper->GetSecurityLevel()); - - // Verify an InsertText operation isn't treated as user-input. - EXPECT_TRUE(content::ExecuteScript( - contents, "document.execCommand('InsertText',false,'a');")); - InjectScript(contents); - base::RunLoop().RunUntilIdle(); - ASSERT_EQ(security_state::WARNING, helper->GetSecurityLevel()); -} - // Tests that the security state for a WebContents is up to date when the // WebContents is inserted into a Browser's TabStripModel. IN_PROC_BROWSER_TEST_F(SecurityStateTabHelperTest, AddedTab) {
diff --git a/chrome/browser/ssl/security_state_tab_helper_unittest.cc b/chrome/browser/ssl/security_state_tab_helper_unittest.cc index a6c3682..1270432 100644 --- a/chrome/browser/ssl/security_state_tab_helper_unittest.cc +++ b/chrome/browser/ssl/security_state_tab_helper_unittest.cc
@@ -10,7 +10,6 @@ #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/ssl/tls_deprecation_test_utils.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "components/security_state/content/ssl_status_input_event_data.h" #include "content/public/browser/navigation_entry.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/navigation_simulator.h" @@ -25,21 +24,6 @@ const char kInsecureMainFrameNonFormNavigationSecurityLevelHistogram[] = "Security.SecurityLevel.InsecureMainFrameNonFormNavigation"; -// Stores the Insecure Input Events to the entry's SSLStatus user data. -void SetInputEvents(content::NavigationEntry* entry, - security_state::InsecureInputEventData events) { - security_state::SSLStatus& ssl = entry->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - if (!input_events) { - ssl.user_data = - std::make_unique<security_state::SSLStatusInputEventData>(events); - } else { - *input_events->input_events() = events; - } -} - class SecurityStateTabHelperHistogramTest : public ChromeRenderViewHostTestHarness { public: @@ -74,13 +58,6 @@ bool is_in_main_frame_ = true; }; - void ClearInputEvents() { - content::NavigationEntry* entry = - web_contents()->GetController().GetVisibleEntry(); - SetInputEvents(entry, security_state::InsecureInputEventData()); - helper_->DidChangeVisibleSecurityState(); - } - void StartNavigation(bool is_form, bool is_main_frame) { MockNavigationHandle handle(GURL("http://example.test"), web_contents()->GetMainFrame());
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 98b3719..a827d020 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3255,8 +3255,6 @@ "views/frame/browser_non_client_frame_view_factory_mac.mm", "views/frame/browser_non_client_frame_view_mac.h", "views/frame/browser_non_client_frame_view_mac.mm", - "views/frame/caption_button_placeholder_container_mac.h", - "views/frame/caption_button_placeholder_container_mac.mm", "views/frame/immersive_mode_controller_mac.h", "views/frame/immersive_mode_controller_mac.mm", "views/frame/native_browser_frame_factory_mac.mm", @@ -3508,6 +3506,13 @@ } } + if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + sources += [ + "startup/web_app_url_handling_startup_utils.cc", + "startup/web_app_url_handling_startup_utils.h", + ] + } + if (is_linux || is_chromeos) { # Both desktop Linux and ChromeOS. sources += [ "certificate_dialogs.cc", @@ -3833,6 +3838,8 @@ "views/frame/browser_view_layout.h", "views/frame/browser_view_layout_delegate.h", "views/frame/browser_window_factory.cc", + "views/frame/caption_button_placeholder_container.cc", + "views/frame/caption_button_placeholder_container.h", "views/frame/contents_layout_manager.cc", "views/frame/contents_layout_manager.h", "views/frame/contents_web_view.cc",
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc index 2eb156bb..5157519 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -2513,7 +2513,9 @@ } // Test that icon is correctly updated for suspended/non-suspended app. -TEST_P(ArcAppModelBuilderTest, IconLoaderForSuspendedApps) { +// +// TODO(https://crbug.com/1211227): The test is flaky. +TEST_P(ArcAppModelBuilderTest, DISABLED_IconLoaderForSuspendedApps) { arc::mojom::AppInfo app = fake_apps()[0]; const std::string app_id = ArcAppTest::GetAppId(app);
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.cc b/chrome/browser/ui/ash/projector/projector_client_impl.cc index 946f5507..fc08166 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_client_impl.cc
@@ -48,7 +48,8 @@ DCHECK_EQ(speech_recognizer_.get(), nullptr); speech_recognizer_ = std::make_unique<OnDeviceSpeechRecognizer>( weak_ptr_factory_.GetWeakPtr(), ProfileManager::GetPrimaryUserProfile(), - kEnglishLanguageCode, /*recognition_mode_ime=*/false); + kEnglishLanguageCode, /*recognition_mode_ime=*/false, + /*enable_formatting=*/true); speech_recognizer_->Start(); }
diff --git a/chrome/browser/ui/ash/shelf/shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/shelf_context_menu.cc index 32dcaae..f7831929 100644 --- a/chrome/browser/ui/ash/shelf/shelf_context_menu.cc +++ b/chrome/browser/ui/ash/shelf/shelf_context_menu.cc
@@ -95,9 +95,6 @@ std::unique_ptr<ui::SimpleMenuModel> ShelfContextMenu::GetBaseMenuModel() { auto menu_model = std::make_unique<ui::SimpleMenuModel>(this); - // TODO(manucornet): Don't add 'swap with next' on the last item, or 'swap - // with previous' on the first one. For now, these options appear, but - // selecting them is a no-op. AddContextMenuOption(menu_model.get(), ash::SWAP_WITH_NEXT, IDS_SHELF_CONTEXT_MENU_SWAP_WITH_NEXT); AddContextMenuOption(menu_model.get(), ash::SWAP_WITH_PREVIOUS, @@ -119,9 +116,11 @@ if (command_id == ash::SWAP_WITH_NEXT || command_id == ash::SWAP_WITH_PREVIOUS) { - // Only show commands to reorder shelf items when ChromeVox is enabled. + // Only show commands to reorder shelf items when ChromeVox or SwitchAccess + // are enabled. if (!AccessibilityManager::Get() || - !AccessibilityManager::Get()->IsSpokenFeedbackEnabled()) { + (!AccessibilityManager::Get()->IsSpokenFeedbackEnabled() && + !AccessibilityManager::Get()->IsSwitchAccessEnabled())) { return false; } const ash::ShelfModel* model = controller_->shelf_model();
diff --git a/chrome/browser/ui/ash/test_wallpaper_controller.cc b/chrome/browser/ui/ash/test_wallpaper_controller.cc index 0131686..be9b5b5 100644 --- a/chrome/browser/ui/ash/test_wallpaper_controller.cc +++ b/chrome/browser/ui/ash/test_wallpaper_controller.cc
@@ -51,6 +51,7 @@ void TestWallpaperController::SetOnlineWallpaper( const AccountId& account_id, const GURL& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) { @@ -60,6 +61,7 @@ void TestWallpaperController::SetOnlineWallpaperIfExists( const AccountId& account_id, const std::string& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) {
diff --git a/chrome/browser/ui/ash/test_wallpaper_controller.h b/chrome/browser/ui/ash/test_wallpaper_controller.h index a09022f..3eb93b4 100644 --- a/chrome/browser/ui/ash/test_wallpaper_controller.h +++ b/chrome/browser/ui/ash/test_wallpaper_controller.h
@@ -53,11 +53,13 @@ bool preview_mode) override; void SetOnlineWallpaper(const AccountId& account_id, const GURL& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) override; void SetOnlineWallpaperIfExists(const AccountId& account_id, const std::string& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, SetOnlineWallpaperCallback callback) override;
diff --git a/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc b/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc index 631a1902..1c670ce 100644 --- a/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc +++ b/chrome/browser/ui/ash/wallpaper_controller_client_impl.cc
@@ -298,26 +298,30 @@ void WallpaperControllerClientImpl::SetOnlineWallpaper( const AccountId& account_id, const GURL& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, ash::WallpaperController::SetOnlineWallpaperCallback callback) { if (!IsKnownUser(account_id)) return; - wallpaper_controller_->SetOnlineWallpaper(account_id, url, layout, - preview_mode, std::move(callback)); + wallpaper_controller_->SetOnlineWallpaper(account_id, url, collection_id, + layout, preview_mode, + std::move(callback)); } void WallpaperControllerClientImpl::SetOnlineWallpaperIfExists( const AccountId& account_id, const std::string& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, ash::WallpaperController::SetOnlineWallpaperCallback callback) { if (!IsKnownUser(account_id)) return; wallpaper_controller_->SetOnlineWallpaperIfExists( - account_id, url, layout, preview_mode, std::move(callback)); + account_id, url, collection_id, layout, preview_mode, + std::move(callback)); } void WallpaperControllerClientImpl::SetOnlineWallpaperFromData(
diff --git a/chrome/browser/ui/ash/wallpaper_controller_client_impl.h b/chrome/browser/ui/ash/wallpaper_controller_client_impl.h index bc9e0aac..b8d8fbf 100644 --- a/chrome/browser/ui/ash/wallpaper_controller_client_impl.h +++ b/chrome/browser/ui/ash/wallpaper_controller_client_impl.h
@@ -64,12 +64,14 @@ void SetOnlineWallpaper( const AccountId& account_id, const GURL& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, ash::WallpaperController::SetOnlineWallpaperCallback callback); void SetOnlineWallpaperIfExists( const AccountId& account_id, const std::string& url, + const std::string& collection_id, ash::WallpaperLayout layout, bool preview_mode, ash::WallpaperController::SetOnlineWallpaperCallback callback);
diff --git a/chrome/browser/ui/cocoa/main_menu_builder.mm b/chrome/browser/ui/cocoa/main_menu_builder.mm index 68444f1c..e5f7aef 100644 --- a/chrome/browser/ui/cocoa/main_menu_builder.mm +++ b/chrome/browser/ui/cocoa/main_menu_builder.mm
@@ -358,14 +358,10 @@ id app_delegate, const std::u16string& product_name, bool is_pwa) { - const bool new_picker = - base::FeatureList::IsEnabled(features::kNewProfilePicker); - base::scoped_nsobject<NSMenuItem> item = - Item(new_picker ? IDS_PROFILES_MENU_NAME - : IDS_PROFILES_OPTIONS_GROUP_NAME) - .tag(IDC_PROFILE_MAIN_MENU) - .submenu({}) - .Build(); + base::scoped_nsobject<NSMenuItem> item = Item(IDS_PROFILES_MENU_NAME) + .tag(IDC_PROFILE_MAIN_MENU) + .submenu({}) + .Build(); return item; }
diff --git a/chrome/browser/ui/cocoa/profiles/profile_menu_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_menu_controller.mm index a624e55..8dd606a83 100644 --- a/chrome/browser/ui/cocoa/profiles/profile_menu_controller.mm +++ b/chrome/browser/ui/cocoa/profiles/profile_menu_controller.mm
@@ -40,10 +40,7 @@ } NSString* GetProfileMenuTitle() { - const bool newPicker = - base::FeatureList::IsEnabled(features::kNewProfilePicker); - return l10n_util::GetNSStringWithFixup( - newPicker ? IDS_PROFILES_MENU_NAME : IDS_PROFILES_OPTIONS_GROUP_NAME); + return l10n_util::GetNSStringWithFixup(IDS_PROFILES_MENU_NAME); } } // namespace @@ -203,14 +200,9 @@ if (IsAddPersonEnabled()) { [[self menu] addItem:[NSMenuItem separatorItem]]; - const bool newPicker = - base::FeatureList::IsEnabled(features::kNewProfilePicker); - item = [self - createItemWithTitle:l10n_util::GetNSStringWithFixup( - newPicker - ? IDS_PROFILES_ADD_PROFILE_LABEL - : IDS_PROFILES_CREATE_NEW_PROFILE_OPTION) - action:@selector(newProfile:)]; + item = [self createItemWithTitle:l10n_util::GetNSStringWithFixup( + IDS_PROFILES_ADD_PROFILE_LABEL) + action:@selector(newProfile:)]; [[self menu] addItem:item]; }
diff --git a/chrome/browser/ui/profile_picker.cc b/chrome/browser/ui/profile_picker.cc index c1789337..1b07bbd 100644 --- a/chrome/browser/ui/profile_picker.cc +++ b/chrome/browser/ui/profile_picker.cc
@@ -44,9 +44,6 @@ const char ProfilePicker::kTaskManagerUrl[] = "chrome://profile-picker/task-manager"; -const base::Feature kEnableProfilePickerOnStartupFeature{ - "EnableProfilePickerOnStartup", base::FEATURE_ENABLED_BY_DEFAULT}; - // static bool ProfilePicker::Shown() { PrefService* prefs = g_browser_process->local_state(); @@ -58,12 +55,6 @@ bool ProfilePicker::ShouldShowAtLaunch() { AvailabilityOnStartup availability_on_startup = GetAvailabilityOnStartup(); - if (!base::FeatureList::IsEnabled(features::kNewProfilePicker)) - return false; - - if (!base::FeatureList::IsEnabled(kEnableProfilePickerOnStartupFeature)) - return false; - if (availability_on_startup == AvailabilityOnStartup::kDisabled) return false;
diff --git a/chrome/browser/ui/profile_picker.h b/chrome/browser/ui/profile_picker.h index 9ed6053..b2e55fc 100644 --- a/chrome/browser/ui/profile_picker.h +++ b/chrome/browser/ui/profile_picker.h
@@ -27,10 +27,6 @@ class WebView; } // namespace views -// Kill switch to disable showing the picker on startup. Has no effect if -// features::kNewProfilePicker is disabled. -extern const base::Feature kEnableProfilePickerOnStartupFeature; - class ProfilePicker { public: // Only work when passed as the argument 'on_select_profile_target_url' to
diff --git a/chrome/browser/ui/profile_picker_unittest.cc b/chrome/browser/ui/profile_picker_unittest.cc index 808ef8c..05bc67b4d 100644 --- a/chrome/browser/ui/profile_picker_unittest.cc +++ b/chrome/browser/ui/profile_picker_unittest.cc
@@ -22,7 +22,6 @@ public: ProfilePickerTest() : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) { - feature_list_.InitAndEnableFeature(features::kNewProfilePicker); } void SetUp() override { ASSERT_TRUE(testing_profile_manager_.SetUp()); } @@ -47,7 +46,6 @@ content::BrowserTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; TestingProfileManager testing_profile_manager_; - base::test::ScopedFeatureList feature_list_; }; TEST_F(ProfilePickerTest, ShouldShowAtLaunch_MultipleProfiles_TwoActive) { @@ -64,18 +62,6 @@ task_environment()->FastForwardBy(base::TimeDelta::FromDays(27)); EXPECT_TRUE(ProfilePicker::ShouldShowAtLaunch()); } -TEST_F(ProfilePickerTest, ShouldShowAtLaunch_KillSwitch) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature(kEnableProfilePickerOnStartupFeature); - - TestingProfile* profile1 = - testing_profile_manager()->CreateTestingProfile("profile1"); - GetProfileAttributes(profile1)->SetActiveTimeToNow(); - TestingProfile* profile2 = - testing_profile_manager()->CreateTestingProfile("profile2"); - GetProfileAttributes(profile2)->SetActiveTimeToNow(); - EXPECT_FALSE(ProfilePicker::ShouldShowAtLaunch()); -} TEST_F(ProfilePickerTest, ShouldShowAtLaunch_MultipleProfiles_Inactive_SeenPicker) {
diff --git a/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.cc b/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.cc index efafb4e2..af88603 100644 --- a/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.cc +++ b/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.cc
@@ -28,7 +28,7 @@ namespace { -#if defined(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) // Result of the CrOS sharesheet, i.e. whether the user selects a share target // after opening the sharesheet. // These values are persisted to logs. Entries should not be renumbered and @@ -86,7 +86,7 @@ } void SharingHubBubbleController::ShowBubble() { -#if defined(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) ShowSharesheet(); #else Browser* browser = chrome::FindBrowserWithWebContents(web_contents_); @@ -148,7 +148,7 @@ sharing_hub_bubble_view_ = nullptr; } -#if defined(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) void SharingHubBubbleController::ShowSharesheet() { if (!base::FeatureList::IsEnabled(features::kSharesheet) || !base::FeatureList::IsEnabled(features::kChromeOSSharingHub)) {
diff --git a/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h b/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h index 747b29d..215a1de 100644 --- a/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h +++ b/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller.h
@@ -60,7 +60,7 @@ private: friend class content::WebContentsUserData<SharingHubBubbleController>; -#if defined(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) void ShowSharesheet(); void OnSharesheetShown(sharesheet::SharesheetResult result); #endif
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index b2390ee..1b49179 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -136,8 +136,7 @@ #if defined(OS_WIN) || defined(OS_MAC) || \ (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -#include "chrome/browser/web_applications/components/url_handler_launch_params.h" -#include "chrome/browser/web_applications/components/url_handler_manager_impl.h" +#include "chrome/browser/ui/startup/web_app_url_handling_startup_utils.h" #endif using content::BrowserThread; @@ -376,27 +375,29 @@ if (!browser) return; - LaunchMode mode; - switch (container) { - case apps::mojom::LaunchContainer::kLaunchContainerWindow: - DCHECK(browser->is_type_app()); - mode = LaunchMode::kAsWebAppInWindow; - break; - case apps::mojom::LaunchContainer::kLaunchContainerTab: - DCHECK(!browser->is_type_app()); - mode = LaunchMode::kAsWebAppInTab; - break; - case apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated: - NOTREACHED(); - FALLTHROUGH; - case apps::mojom::LaunchContainer::kLaunchContainerNone: - DCHECK(!browser->is_type_app()); - mode = LaunchMode::kUnknownWebApp; - break; + if (launch_mode_recorder) { + LaunchMode mode; + switch (container) { + case apps::mojom::LaunchContainer::kLaunchContainerWindow: + DCHECK(browser->is_type_app()); + mode = LaunchMode::kAsWebAppInWindow; + break; + case apps::mojom::LaunchContainer::kLaunchContainerTab: + DCHECK(!browser->is_type_app()); + mode = LaunchMode::kAsWebAppInTab; + break; + case apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated: + NOTREACHED(); + FALLTHROUGH; + case apps::mojom::LaunchContainer::kLaunchContainerNone: + DCHECK(!browser->is_type_app()); + mode = LaunchMode::kUnknownWebApp; + break; + } + + launch_mode_recorder->SetLaunchMode(mode); } - if (launch_mode_recorder) - launch_mode_recorder->SetLaunchMode(mode); StartupBrowserCreatorImpl::MaybeToggleFullscreen(browser); } @@ -554,47 +555,6 @@ return false; } -#if defined(OS_WIN) || defined(OS_MAC) || \ - (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) -// If |command_line| contains a single URL argument and that URL matches URL -// handling registration from installed web apps, show app options to user and -// launch one if accepted. -// Returns true if launching an app, false otherwise. -bool MaybeLaunchUrlHandlerWebApp( - const base::CommandLine& command_line, - const base::FilePath& cur_dir, - std::unique_ptr<LaunchModeRecorder> launch_mode_recorder) { - const std::vector<web_app::UrlHandlerLaunchParams> url_handler_matches = - web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line); - - // Launch the first match for which a Profile can be loaded. - // TODO(crbug/1072058): Use WebAppUiManagerImpl and WebAppDialogManager - // to display the intent picker dialog. Use the first match here for testing. - // TODO(crbug/1072058): Check user preferences before showing intent picker. - ProfileManager* profile_manager = g_browser_process->profile_manager(); - for (const auto& match : url_handler_matches) { - // Do not load profile if profile path is not valid. - if (!profile_manager->GetProfileAttributesStorage() - .GetProfileAttributesWithPath(match.profile_path)) { - continue; - } - Profile* const profile = profile_manager->GetProfile(match.profile_path); - if (profile == nullptr) - continue; - - apps::AppServiceProxyFactory::GetForProfile(profile) - ->BrowserAppLauncher() - ->LaunchAppWithCallback( - match.app_id, command_line, cur_dir, match.url, - /*protocol_handler_launch_url=*/absl::nullopt, - base::BindOnce(&FinalizeWebAppLaunch, - std::move(launch_mode_recorder))); - return true; - } - return false; -} -#endif - } // namespace StartupBrowserCreator::StartupBrowserCreator() = default; @@ -830,6 +790,19 @@ #endif // defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) } +// static +bool StartupBrowserCreator::MaybeHandleProfileAgnosticUrls( + const std::vector<GURL>& urls) { + // Web app URL handling. +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) + return web_app::startup::MaybeLaunchUrlHandlerWebAppFromUrls( + urls, base::BindOnce(&FinalizeWebAppLaunch, + std::make_unique<LaunchModeRecorder>())); +#endif + return false; +} + bool StartupBrowserCreator::ProcessCmdLineImpl( const base::CommandLine& command_line, const base::FilePath& cur_dir, @@ -1114,8 +1087,10 @@ // Web app URL handling. #if defined(OS_WIN) || defined(OS_MAC) || \ (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) - if (MaybeLaunchUrlHandlerWebApp(command_line, cur_dir, - std::make_unique<LaunchModeRecorder>())) { + if (web_app::startup::MaybeLaunchUrlHandlerWebAppFromCmd( + command_line, cur_dir, + base::BindOnce(&FinalizeWebAppLaunch, + std::make_unique<LaunchModeRecorder>()))) { return true; } #endif
diff --git a/chrome/browser/ui/startup/startup_browser_creator.h b/chrome/browser/ui/startup/startup_browser_creator.h index 95f6bbe..6b4ba6ea 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.h +++ b/chrome/browser/ui/startup/startup_browser_creator.h
@@ -113,6 +113,9 @@ static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); static void RegisterProfilePrefs(PrefRegistrySimple* registry); + // Return true if |urls| are handled, false otherwise. + static bool MaybeHandleProfileAgnosticUrls(const std::vector<GURL>& urls); + private: friend class CloudPrintProxyPolicyTest; friend class CloudPrintProxyPolicyStartupTest;
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index e8d8cd5..9e6868ff 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -1437,31 +1437,10 @@ return web_app::WebAppProviderBase::GetProviderBase(browser()->profile()); } - // Install a web app with url_handlers then register it with the - // UrlHandlerManager. This is sufficient for testing URL matching and launch - // at startup. web_app::AppId InstallWebAppWithUrlHandlers( const std::vector<apps::UrlHandlerInfo>& url_handlers) { - std::unique_ptr<WebApplicationInfo> info = - std::make_unique<WebApplicationInfo>(); - info->start_url = GURL(kStartUrl); - info->title = kAppName; - info->open_as_window = true; - info->url_handlers = url_handlers; - web_app::AppId app_id = - web_app::test::InstallWebApp(browser()->profile(), std::move(info)); - - auto& url_handler_manager = - provider()->os_integration_manager().url_handler_manager_for_testing(); - - base::RunLoop run_loop; - url_handler_manager.RegisterUrlHandlers( - app_id, base::BindLambdaForTesting([&](bool success) { - EXPECT_TRUE(success); - run_loop.Quit(); - })); - run_loop.Run(); - return app_id; + return web_app::test::InstallWebAppWithUrlHandlers( + browser()->profile(), GURL(kStartUrl), kAppName, url_handlers); } void SetUpCommandlineAndStart(const std::string& url) { @@ -2446,7 +2425,6 @@ class StartupBrowserCreatorPickerTestBase : public InProcessBrowserTest { public: StartupBrowserCreatorPickerTestBase() { - scoped_feature_list_.InitAndEnableFeature(features::kNewProfilePicker); // This test configures command line params carefully. Make sure // InProcessBrowserTest does _not_ add about:blank as a startup URL to the // command line. @@ -2479,9 +2457,6 @@ entry->SetActiveTimeToNow(); } } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; struct ProfilePickerSetup { @@ -2518,9 +2493,6 @@ command_line->AppendSwitch(*GetParam().switch_name); } } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; // Create a secondary profile in a separate PRE run because the existence of
diff --git a/chrome/browser/ui/startup/web_app_url_handling_startup_utils.cc b/chrome/browser/ui/startup/web_app_url_handling_startup_utils.cc new file mode 100644 index 0000000..b6f8a9b --- /dev/null +++ b/chrome/browser/ui/startup/web_app_url_handling_startup_utils.cc
@@ -0,0 +1,100 @@ +// Copyright 2021 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/startup/web_app_url_handling_startup_utils.h" + +#include <utility> +#include <vector> + +#include "base/command_line.h" +#include "base/files/file_path.h" +#include "chrome/browser/apps/app_service/app_service_proxy.h" +#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" +#include "chrome/browser/apps/app_service/browser_app_launcher.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_attributes_storage.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/web_applications/components/url_handler_launch_params.h" +#include "chrome/browser/web_applications/components/url_handler_manager_impl.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" + +namespace { + +void LaunchApp(const base::FilePath& profile_path, + const web_app::AppId& app_id, + const base::CommandLine& command_line, + const base::FilePath& cur_dir, + const GURL& url, + web_app::startup::FinalizeWebAppLaunchCallback callback) { + apps::AppServiceProxyFactory::GetForProfile( + g_browser_process->profile_manager()->GetProfile(profile_path)) + ->BrowserAppLauncher() + ->LaunchAppWithCallback(app_id, command_line, cur_dir, url, + /*protocol_handler_launch_url=*/absl::nullopt, + std::move(callback)); +} + +bool LaunchFirstValidMatch( + const base::CommandLine& command_line, + const base::FilePath& cur_dir, + const std::vector<web_app::UrlHandlerLaunchParams>& url_handler_matches, + web_app::startup::FinalizeWebAppLaunchCallback callback) { + // Launch the first match for which a Profile can be loaded. + // TODO(crbug/1072058): Use WebAppUiManagerImpl and WebAppDialogManager + // to display the intent picker dialog. Use the first match here for testing. + // TODO(crbug/1072058): Check user preferences before showing intent picker. + ProfileManager* profile_manager = g_browser_process->profile_manager(); + Profile* profile = nullptr; + const web_app::UrlHandlerLaunchParams* found_match = nullptr; + for (const auto& match : url_handler_matches) { + // Do not load profile if profile path is not valid. + if (!profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(match.profile_path)) { + continue; + } + profile = profile_manager->GetProfile(match.profile_path); + if (profile) { + found_match = &match; + break; + } + } + + if (profile && found_match) { + LaunchApp(found_match->profile_path, found_match->app_id, command_line, + cur_dir, found_match->url, std::move(callback)); + return true; + } + return false; +} + +} // namespace + +namespace web_app { +namespace startup { + +bool MaybeLaunchUrlHandlerWebAppFromCmd(const base::CommandLine& command_line, + const base::FilePath& cur_dir, + FinalizeWebAppLaunchCallback callback) { + return LaunchFirstValidMatch( + command_line, cur_dir, + UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line), + std::move(callback)); +} + +bool MaybeLaunchUrlHandlerWebAppFromUrls( + const std::vector<GURL>& urls, + FinalizeWebAppLaunchCallback callback) { + if (urls.size() != 1) + return false; + + return LaunchFirstValidMatch( + base::CommandLine(base::CommandLine::NO_PROGRAM), base::FilePath(), + UrlHandlerManagerImpl::GetUrlHandlerMatches(urls.front()), + std::move(callback)); +} + +} // namespace startup +} // namespace web_app
diff --git a/chrome/browser/ui/startup/web_app_url_handling_startup_utils.h b/chrome/browser/ui/startup/web_app_url_handling_startup_utils.h new file mode 100644 index 0000000..56f383c --- /dev/null +++ b/chrome/browser/ui/startup/web_app_url_handling_startup_utils.h
@@ -0,0 +1,44 @@ +// Copyright 2021 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_STARTUP_WEB_APP_URL_HANDLING_STARTUP_UTILS_H_ +#define CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_UTILS_H_ + +#include <vector> + +#include "base/callback.h" +#include "components/services/app_service/public/mojom/types.mojom.h" + +namespace base { +class CommandLine; +class FilePath; +} // namespace base + +class Browser; +class GURL; + +namespace web_app { +namespace startup { + +using FinalizeWebAppLaunchCallback = + base::OnceCallback<void(Browser* browser, + apps::mojom::LaunchContainer container)>; + +// If |command_line| contains a single URL argument and that URL matches URL +// handling registration from installed web apps, show app options to user and +// launch one if accepted. +// Returns true if launching an app, false otherwise. +bool MaybeLaunchUrlHandlerWebAppFromCmd(const base::CommandLine& command_line, + const base::FilePath& cur_dir, + FinalizeWebAppLaunchCallback callback); + +// Same as MaybeLaunchUrlHandlerWebAppFromCmd but check if |urls| contains a +// single URL. +bool MaybeLaunchUrlHandlerWebAppFromUrls(const std::vector<GURL>& urls, + FinalizeWebAppLaunchCallback callback); + +} // namespace startup +} // namespace web_app + +#endif // CHROME_BROWSER_UI_STARTUP_WEB_APP_URL_HANDLING_STARTUP_UTILS_H_
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index abb81207..e3ddc3c 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -43,11 +43,6 @@ const base::Feature kForceSignInReauth{"ForceSignInReauth", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables the new profile picker. -// https:://crbug.com/1063856 -const base::Feature kNewProfilePicker{"NewProfilePicker", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Enables updated tabstrip animations, required for a scrollable tabstrip. // https://crbug.com/958173 const base::Feature kNewTabstripAnimation{"NewTabstripAnimation",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 26f1eab9..d36a74b 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -39,8 +39,6 @@ extern const base::Feature kForceSignInReauth; -extern const base::Feature kNewProfilePicker; - extern const base::Feature kNewTabstripAnimation; extern const base::Feature kProminentDarkModeActiveTabTitle;
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc index 20e9436..a7e5dc8 100644 --- a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc +++ b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
@@ -1047,8 +1047,14 @@ // works in app but the tests aren't working. } +// TODO(https://crbug.com/1207312): Flaky test. +#if defined(USE_OZONE) +#define MAYBE_ClearsTextAfterInactivity DISABLED_ClearsTextAfterInactivity +#else +#define MAYBE_ClearsTextAfterInactivity ClearsTextAfterInactivity +#endif IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, - ClearsTextAfterInactivity) { + MAYBE_ClearsTextAfterInactivity) { // Use a ScopedMockTimeMessageLoopTaskRunner to test the inactivity timer with // a mock tick clock that replaces the default tick clock with mock time. base::ScopedMockTimeMessageLoopTaskRunner test_task_runner;
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index b302e40..7305203 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -187,11 +187,6 @@ } // LabelButton: - void OnThemeChanged() override { - LabelButton::OnThemeChanged(); - ToolbarButton::UpdateFocusRingColor(this, focus_ring()); - } - std::unique_ptr<LabelButtonBorder> CreateDefaultBorder() const override { return CreateBookmarkButtonBorder(); } @@ -292,11 +287,6 @@ BookmarkMenuButtonBase& operator=(const BookmarkMenuButtonBase&) = delete; // MenuButton: - void OnThemeChanged() override { - MenuButton::OnThemeChanged(); - ToolbarButton::UpdateFocusRingColor(this, focus_ring()); - } - std::unique_ptr<LabelButtonBorder> CreateDefaultBorder() const override { return CreateBookmarkButtonBorder(); } @@ -499,6 +489,10 @@ // May be null for tests. if (browser_view) SetBackground(std::make_unique<TopContainerBackground>(browser_view)); + + views::FocusRing::SetColorContextForSubtree( + this, ThemeProperties::COLOR_TOOLBAR, + ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); } BookmarkBarView::~BookmarkBarView() {
diff --git a/chrome/browser/ui/views/download/download_shelf_view.cc b/chrome/browser/ui/views/download/download_shelf_view.cc index aa3229bb..638cef9 100644 --- a/chrome/browser/ui/views/download/download_shelf_view.cc +++ b/chrome/browser/ui/views/download/download_shelf_view.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/download/download_item_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/grit/generated_resources.h" #include "components/download/public/common/download_item.h" #include "components/strings/grit/components_strings.h" @@ -108,6 +109,9 @@ // and return to chrome with the download shelf still open. mouse_watcher_.set_notify_on_exit_time(base::TimeDelta::FromSeconds(5)); SetID(VIEW_ID_DOWNLOAD_SHELF); + views::FocusRing::SetColorContextForSubtree( + this, ThemeProperties::COLOR_TOOLBAR, + ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); } DownloadShelfView::~DownloadShelfView() = default;
diff --git a/chrome/browser/ui/views/download/download_shelf_web_view.cc b/chrome/browser/ui/views/download/download_shelf_web_view.cc index 51fa36b..6d4828a 100644 --- a/chrome/browser/ui/views/download/download_shelf_web_view.cc +++ b/chrome/browser/ui/views/download/download_shelf_web_view.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/task_manager/web_contents_tags.h" #include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/common/webui_url_constants.h" #include "ui/base/theme_provider.h" @@ -135,6 +136,10 @@ return this; } +void DownloadShelfWebView::DoShowAll() { + chrome::ShowDownloads(browser()); +} + void DownloadShelfWebView::ShowDownloadContextMenu( DownloadUIModel* download, const gfx::Point& position,
diff --git a/chrome/browser/ui/views/download/download_shelf_web_view.h b/chrome/browser/ui/views/download/download_shelf_web_view.h index 4a33082..074f9af 100644 --- a/chrome/browser/ui/views/download/download_shelf_web_view.h +++ b/chrome/browser/ui/views/download/download_shelf_web_view.h
@@ -41,6 +41,7 @@ views::View* GetView() override; // DownloadShelfUIEmbedder: + void DoShowAll() override; void ShowDownloadContextMenu( DownloadUIModel* download, const gfx::Point& position,
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc index 08cac1f..e896de3 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container_browsertest.cc
@@ -6,6 +6,7 @@ #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" +#include "build/build_config.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h" #include "chrome/browser/extensions/extension_action_runner.h" #include "chrome/browser/extensions/extension_service.h" @@ -394,8 +395,14 @@ // Verifies that dragging extension icons is disabled in incognito windows. // https://crbug.com/1203833. +// Flaky on Linux. http://crbug.com/1207630 +#if defined(OS_LINUX) +#define MAYBE_IncognitoDraggingIsDisabled DISABLED_IncognitoDraggingIsDisabled +#else +#define MAYBE_IncognitoDraggingIsDisabled IncognitoDraggingIsDisabled +#endif IN_PROC_BROWSER_TEST_F(ExtensionsToolbarContainerBrowserTest, - IncognitoDraggingIsDisabled) { + MAYBE_IncognitoDraggingIsDisabled) { // Load an extension, pin it, and enable it in incognito. scoped_refptr<const extensions::Extension> extension = LoadTestExtension("extensions/simple_with_popup");
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc index a429110..012b7c92 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
@@ -268,10 +268,14 @@ const gfx::Point& point) { int hit_test = chromeos::FrameBorderNonClientHitTest(this, point); - // When the window is restored we want a large click target above the tabs - // to drag the window, so redirect clicks in the tab's shadow to caption. + // When the window is restored (and not in tablet split-view mode) we want a + // large click target above the tabs to drag the window, so redirect clicks in + // the tab's shadow to caption. if (hit_test == HTCLIENT && !frame()->IsMaximized() && - !frame()->IsFullscreen()) { + !frame()->IsFullscreen() && + !chromeos::TabletState::Get()->InTabletMode()) { + // TODO(crbug.com/1213133): Tab Strip hit calculation and bounds logic + // should reside in the TabStrip class. gfx::Point client_point(point); View::ConvertPointToTarget(this, frame()->client_view(), &client_point); gfx::Rect tabstrip_shadow_bounds(browser_view()->tabstrip()->bounds());
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc index db62a95..5e4d4cd 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos_browsertest.cc
@@ -49,6 +49,7 @@ #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller_chromeos.h" #include "chrome/browser/ui/views/frame/tab_strip_region_view.h" +#include "chrome/browser/ui/views/frame/webui_tab_strip_container_view.h" #include "chrome/browser/ui/views/fullscreen_control/fullscreen_control_host.h" #include "chrome/browser/ui/views/location_bar/content_setting_image_view.h" #include "chrome/browser/ui/views/location_bar/custom_tab_bar_view.h" @@ -167,6 +168,17 @@ ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_; }; +// Template used as a base class for touch-optimized UI test fixtures. +template <class BaseTest> +class TopChromeTouchTest : public BaseTest { + public: + TopChromeTouchTest() : touch_ui_scoper_(true) {} + ~TopChromeTouchTest() override = default; + + private: + ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_; +}; + // Template to be used when a test does not work with the webUI tabstrip. template <bool kEnabled, class BaseTest> class WebUiTabStripOverrideTest : public BaseTest { @@ -270,10 +282,14 @@ using BrowserNonClientFrameViewChromeOSTest = TopChromeMdParamTest<InProcessBrowserTest>; +using BrowserNonClientFrameViewChromeOSTouchTest = + TopChromeTouchTest<InProcessBrowserTest>; using BrowserNonClientFrameViewChromeOSTestNoWebUiTabStrip = WebUiTabStripOverrideTest<false, BrowserNonClientFrameViewChromeOSTest>; using BrowserNonClientFrameViewChromeOSTestWithWebUiTabStrip = WebUiTabStripOverrideTest<true, BrowserNonClientFrameViewChromeOSTest>; +using BrowserNonClientFrameViewChromeOSTouchTestWithWebUiTabStrip = + WebUiTabStripOverrideTest<true, BrowserNonClientFrameViewChromeOSTouchTest>; // This test does not make sense for the webUI tabstrip, since the window layout // is different in that case. @@ -301,6 +317,50 @@ EXPECT_EQ(expected_value, frame_view->NonClientHitTest(top_edge)); } +IN_PROC_BROWSER_TEST_F( + BrowserNonClientFrameViewChromeOSTouchTestWithWebUiTabStrip, + TabletSplitViewNonClientHitTest) { + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); + BrowserNonClientFrameViewChromeOS* frame_view = GetFrameViewAsh(browser_view); + EXPECT_EQ(0, frame_view->GetBoundsForClientView().y()); + + Widget* widget = browser_view->GetWidget(); + ASSERT_NO_FATAL_FAILURE( + ash::ShellTestApi().SetTabletModeEnabledForTest(true)); + ash::SplitViewTestApi().SnapWindow(widget->GetNativeWindow(), + ash::SplitViewTestApi::SnapPosition::LEFT); + + // Touch on the top of the window is interpreted as client hit. + gfx::Point top_point(widget->GetWindowBoundsInScreen().width() / 2, 0); + EXPECT_EQ(HTCLIENT, frame_view->NonClientHitTest(top_point)); +} + +IN_PROC_BROWSER_TEST_F( + BrowserNonClientFrameViewChromeOSTouchTestWithWebUiTabStrip, + TabletSplitViewSwipeDownFromEdgeOpensWebUiTabStrip) { + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); + BrowserNonClientFrameViewChromeOS* frame_view = GetFrameViewAsh(browser_view); + EXPECT_EQ(0, frame_view->GetBoundsForClientView().y()); + + Widget* widget = browser_view->GetWidget(); + ASSERT_NO_FATAL_FAILURE( + ash::ShellTestApi().SetTabletModeEnabledForTest(true)); + ash::SplitViewTestApi().SnapWindow(widget->GetNativeWindow(), + ash::SplitViewTestApi::SnapPosition::LEFT); + + // A point above the window. + gfx::Point edge_point(widget->GetWindowBoundsInScreen().width() / 2, -1); + + ASSERT_FALSE(browser_view->webui_tab_strip()->GetVisible()); + aura::Window* window = widget->GetNativeWindow(); + ui::test::EventGenerator event_generator(window->GetRootWindow()); + event_generator.SetTouchRadius(10, 5); + event_generator.PressTouch(edge_point); + event_generator.MoveTouchBy(0, 100); + event_generator.ReleaseTouch(); + ASSERT_TRUE(browser_view->webui_tab_strip()->GetVisible()); +} + // Test that the frame view does not do any painting in non-immersive // fullscreen. // This test does not make sense for the webUI tabstrip, since the frame is not
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h index c95075b8..32764a9 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h
@@ -18,7 +18,7 @@ @class FullscreenToolbarController; -class CaptionButtonPlaceholderContainerMac; +class CaptionButtonPlaceholderContainer; class WindowControlsOverlayInputRoutingMac; class BrowserNonClientFrameViewMac : public BrowserNonClientFrameView { @@ -27,8 +27,6 @@ BrowserNonClientFrameViewMac(BrowserFrame* frame, BrowserView* browser_view); ~BrowserNonClientFrameViewMac() override; - SkColor GetTitlebarColor() const; - // BrowserNonClientFrameView: void OnFullscreenStateChanged() override; bool CaptionButtonsOnLeadingEdge() const override; @@ -39,6 +37,8 @@ void UpdateFullscreenTopUI() override; bool ShouldHideTopUIForFullscreen() const override; void UpdateThrobber(bool running) override; + void PaintAsActiveChanged() override; + void UpdateFrameColor() override; // views::NonClientFrameView: gfx::Rect GetBoundsForClientView() const override; @@ -95,6 +95,8 @@ void LayoutTitleBarForWebApp(); void LayoutWindowControlsOverlay(); + void UpdateCaptionButtonPlaceholderContainerBackground(); + // Used to keep track of the update of kShowFullscreenToolbar preference. BooleanPrefMember show_fullscreen_toolbar_; @@ -102,7 +104,7 @@ // A placeholder container that lies on top of the traffic lights to indicate // NonClientArea. Only for PWAs with window controls overlay display override. - CaptionButtonPlaceholderContainerMac* caption_button_placeholder_container_ = + CaptionButtonPlaceholderContainer* caption_button_placeholder_container_ = nullptr; // PWAs with window controls overlay display override covers the browser
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm index 7834362..8f38ecb 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm
@@ -21,7 +21,7 @@ #include "chrome/browser/ui/views/frame/browser_frame.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/browser_view_layout.h" -#include "chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.h" +#include "chrome/browser/ui/views/frame/caption_button_placeholder_container.h" #include "chrome/browser/ui/views/frame/tab_strip_region_view.h" #include "chrome/browser/ui/views/frame/window_controls_overlay_input_routing_mac.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" @@ -80,8 +80,8 @@ std::make_unique<WebAppFrameToolbarView>(frame, browser_view))); if (browser_view->IsWindowControlsOverlayEnabled()) { - caption_button_placeholder_container_ = AddChildView( - std::make_unique<CaptionButtonPlaceholderContainerMac>(this)); + caption_button_placeholder_container_ = + AddChildView(std::make_unique<CaptionButtonPlaceholderContainer>()); caption_buttons_overlay_input_routing_view_ = std::make_unique<WindowControlsOverlayInputRoutingMac>( this, caption_button_placeholder_container_, @@ -112,9 +112,6 @@ [fullscreen_toolbar_controller_ exitFullscreenMode]; } -SkColor BrowserNonClientFrameViewMac::GetTitlebarColor() const { - return GetFrameColor(); -} /////////////////////////////////////////////////////////////////////////////// // BrowserNonClientFrameViewMac, BrowserNonClientFrameView implementation: @@ -259,6 +256,15 @@ void BrowserNonClientFrameViewMac::UpdateThrobber(bool running) { } +void BrowserNonClientFrameViewMac::PaintAsActiveChanged() { + UpdateCaptionButtonPlaceholderContainerBackground(); + BrowserNonClientFrameView::PaintAsActiveChanged(); +} + +void BrowserNonClientFrameViewMac::UpdateFrameColor() { + UpdateCaptionButtonPlaceholderContainerBackground(); + BrowserNonClientFrameView::UpdateFrameColor(); +} /////////////////////////////////////////////////////////////////////////////// // BrowserNonClientFrameViewMac, views::NonClientFrameView implementation: @@ -505,8 +511,9 @@ GetWebAppFrameToolbarAvailableBounds( is_rtl, frame, 0, caption_button_container_bounds.width()); - // Layout CaptionButtonDummyContainerMac which would have the traffic lights. - caption_button_placeholder_container_->LayoutForWindowControlsOverlay( + // Layout CaptionButtonPlaceholderContainer which would have the traffic + // lights. + caption_button_placeholder_container_->SetBoundsRect( caption_button_container_bounds); // Layout WebAppFrameToolbarView. @@ -534,3 +541,11 @@ web_contents->UpdateWindowControlsOverlay(bounding_rect); } } + +void BrowserNonClientFrameViewMac:: + UpdateCaptionButtonPlaceholderContainerBackground() { + if (caption_button_placeholder_container_) { + caption_button_placeholder_container_->SetBackground( + views::CreateSolidBackground(GetFrameColor())); + } +}
diff --git a/chrome/browser/ui/views/frame/caption_button_placeholder_container.cc b/chrome/browser/ui/views/frame/caption_button_placeholder_container.cc new file mode 100644 index 0000000..620e272 --- /dev/null +++ b/chrome/browser/ui/views/frame/caption_button_placeholder_container.cc
@@ -0,0 +1,20 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/frame/caption_button_placeholder_container.h" + +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/scoped_canvas.h" +#include "ui/views/view.h" + +CaptionButtonPlaceholderContainer::CaptionButtonPlaceholderContainer() { + SetPaintToLayer(); +} + +CaptionButtonPlaceholderContainer::~CaptionButtonPlaceholderContainer() = + default; + +BEGIN_METADATA(CaptionButtonPlaceholderContainer, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/frame/caption_button_placeholder_container.h b/chrome/browser/ui/views/frame/caption_button_placeholder_container.h new file mode 100644 index 0000000..56b22d4 --- /dev/null +++ b/chrome/browser/ui/views/frame/caption_button_placeholder_container.h
@@ -0,0 +1,25 @@ +// Copyright 2021 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_VIEWS_FRAME_CAPTION_BUTTON_PLACEHOLDER_CONTAINER_H_ +#define CHROME_BROWSER_UI_VIEWS_FRAME_CAPTION_BUTTON_PLACEHOLDER_CONTAINER_H_ + +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/views/view.h" + +// A placeholder container for control buttons for PWAs with window controls +// overlay display override. Does not interact with the buttons. It is just +// used to indicate that this is non-client-area. +class CaptionButtonPlaceholderContainer : public views::View { + public: + METADATA_HEADER(CaptionButtonPlaceholderContainer); + CaptionButtonPlaceholderContainer(); + CaptionButtonPlaceholderContainer(const CaptionButtonPlaceholderContainer&) = + delete; + CaptionButtonPlaceholderContainer& operator=( + const CaptionButtonPlaceholderContainer&) = delete; + ~CaptionButtonPlaceholderContainer() override; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_FRAME_CAPTION_BUTTON_PLACEHOLDER_CONTAINER_H_
diff --git a/chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.h b/chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.h deleted file mode 100644 index c6ff3e4..0000000 --- a/chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.h +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2021 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_VIEWS_FRAME_CAPTION_BUTTON_PLACEHOLDER_CONTAINER_MAC_H_ -#define CHROME_BROWSER_UI_VIEWS_FRAME_CAPTION_BUTTON_PLACEHOLDER_CONTAINER_MAC_H_ - -#include "ui/views/view.h" - -class BrowserNonClientFrameViewMac; - -// A placeholder container for the macOS's traffic lights for PWAs with window -// controls overlay display override. Does not interact with the buttons. It is -// just used to indicate that this is non-client-area. -class CaptionButtonPlaceholderContainerMac : public views::View { - public: - explicit CaptionButtonPlaceholderContainerMac( - BrowserNonClientFrameViewMac* frame_view); - - ~CaptionButtonPlaceholderContainerMac() override; - - CaptionButtonPlaceholderContainerMac( - const CaptionButtonPlaceholderContainerMac&) = delete; - CaptionButtonPlaceholderContainerMac& operator=( - const CaptionButtonPlaceholderContainerMac&) = delete; - - void LayoutForWindowControlsOverlay(const gfx::Rect& bounds); - - // views::View: - void AddedToWidget() override; - - private: - BrowserNonClientFrameViewMac* const frame_view_; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_FRAME_CAPTION_BUTTON_PLACEHOLDER_CONTAINER_MAC_H_
diff --git a/chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.mm b/chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.mm deleted file mode 100644 index 5d35ac5..0000000 --- a/chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.mm +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/frame/caption_button_placeholder_container_mac.h" - -#include "chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h" -#include "ui/gfx/canvas.h" -#include "ui/gfx/scoped_canvas.h" -#include "ui/views/view.h" - -CaptionButtonPlaceholderContainerMac::CaptionButtonPlaceholderContainerMac( - BrowserNonClientFrameViewMac* frame_view) - : frame_view_(frame_view) {} - -CaptionButtonPlaceholderContainerMac::~CaptionButtonPlaceholderContainerMac() = - default; - -void CaptionButtonPlaceholderContainerMac::LayoutForWindowControlsOverlay( - const gfx::Rect& bounds) { - SetBoundsRect(bounds); - Layout(); -} - -void CaptionButtonPlaceholderContainerMac::AddedToWidget() { - SetBackground(views::CreateSolidBackground(frame_view_->GetTitlebarColor())); - // BrowserView paints to a layer, so this must do the same to ensure that it - // paints on top of the BrowserView. - SetPaintToLayer(); -} \ No newline at end of file
diff --git a/chrome/browser/ui/views/frame/dbus_appmenu.cc b/chrome/browser/ui/views/frame/dbus_appmenu.cc index 78cd123..7ee771d 100644 --- a/chrome/browser/ui/views/frame/dbus_appmenu.cc +++ b/chrome/browser/ui/views/frame/dbus_appmenu.cc
@@ -145,13 +145,6 @@ {IDC_DEV_TOOLS_DEVICES, IDS_DEV_TOOLS_DEVICES}, {kMenuEnd}}; -// TODO(crbug.com/1108289): Remove after launch. -constexpr DbusAppmenuCommand kOldProfilesMenu[] = { - {kSeparator}, - {kTagProfileEdit, IDS_PROFILES_MANAGE_BUTTON_LABEL}, - {kTagProfileCreate, IDS_PROFILES_CREATE_BUTTON_LABEL}, - {kMenuEnd}}; - constexpr DbusAppmenuCommand kProfilesMenu[] = { {kSeparator}, {kTagProfileEdit, IDS_PROFILES_MANAGE_BUTTON_LABEL}, @@ -256,10 +249,7 @@ BuildStaticMenu(IDS_VIEW_MENU_LINUX, kViewMenu); history_menu_ = BuildStaticMenu(IDS_HISTORY_MENU_LINUX, kHistoryMenu); BuildStaticMenu(IDS_TOOLS_MENU_LINUX, kToolsMenu); - profiles_menu_ = - base::FeatureList::IsEnabled(features::kNewProfilePicker) - ? BuildStaticMenu(IDS_PROFILES_MENU_NAME, kProfilesMenu) - : BuildStaticMenu(IDS_PROFILES_OPTIONS_GROUP_NAME, kOldProfilesMenu); + profiles_menu_ = BuildStaticMenu(IDS_PROFILES_MENU_NAME, kProfilesMenu); BuildStaticMenu(IDS_HELP_MENU_LINUX, kHelpMenu); pref_change_registrar_.Init(browser_->profile()->GetPrefs());
diff --git a/chrome/browser/ui/views/frame/desktop_linux_browser_frame_view_layout_unittest.cc b/chrome/browser/ui/views/frame/desktop_linux_browser_frame_view_layout_unittest.cc index 9d1046c..68b80688 100644 --- a/chrome/browser/ui/views/frame/desktop_linux_browser_frame_view_layout_unittest.cc +++ b/chrome/browser/ui/views/frame/desktop_linux_browser_frame_view_layout_unittest.cc
@@ -65,6 +65,8 @@ bool UseCustomFrame() const override { return true; } bool IsFrameCondensed() const override { return false; } bool EverHasVisibleBackgroundTabShapes() const override { return false; } + void UpdateWindowControlsOverlay( + const gfx::Rect& bounding_rect) const override {} private: DISALLOW_COPY_AND_ASSIGN(TestLayoutDelegate);
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc index ef2ca8c..83dfdb9 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/views/frame/browser_frame.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/caption_button_placeholder_container.h" #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h" #include "chrome/browser/ui/views/frame/opaque_browser_frame_view_platform_specific.h" #include "chrome/browser/ui/views/frame/tab_strip_region_view.h" @@ -122,6 +123,16 @@ window_title_(nullptr), frame_background_(new views::FrameBackground()) { layout_->set_delegate(this); + + // TODO(crbug.com/937121): Remove the call to toggle WCO on by default once + // the toggle button functionality is implemented for OpaqueBrowserFrameView. + web_app::AppBrowserController* controller = + browser_view->browser()->app_controller(); + if (controller) { + controller->ToggleWindowControlsOverlayEnabled(); + layout_->set_window_controls_overlay_enabled( + browser_view->IsWindowControlsOverlayEnabled()); + } SetLayoutManager(std::unique_ptr<views::LayoutManager>(layout_)); platform_observer_ = @@ -131,6 +142,14 @@ OpaqueBrowserFrameView::~OpaqueBrowserFrameView() {} void OpaqueBrowserFrameView::InitViews() { + web_app::AppBrowserController* controller = + browser_view()->browser()->app_controller(); + + if (controller && controller->IsWindowControlsOverlayEnabled()) { + caption_button_placeholder_container_ = + AddChildView(std::make_unique<CaptionButtonPlaceholderContainer>()); + } + if (GetFrameButtonStyle() == FrameButtonStyle::kMdButton) { minimize_button_ = CreateFrameCaptionButton( views::CAPTION_BUTTON_ICON_MINIMIZE, HTMINBUTTON, @@ -189,8 +208,6 @@ .Build()); } - web_app::AppBrowserController* controller = - browser_view()->browser()->app_controller(); if (controller) { set_web_app_frame_toolbar(AddChildView( std::make_unique<WebAppFrameToolbarView>(frame(), browser_view()))); @@ -234,6 +251,15 @@ return layout_->GetMinimumSize(this); } +void OpaqueBrowserFrameView::PaintAsActiveChanged() { + UpdateCaptionButtonPlaceholderContainerBackground(); + BrowserNonClientFrameView::PaintAsActiveChanged(); +} + +void OpaqueBrowserFrameView::UpdateFrameColor() { + UpdateCaptionButtonPlaceholderContainerBackground(); + BrowserNonClientFrameView::PaintAsActiveChanged(); +} /////////////////////////////////////////////////////////////////////////////// // OpaqueBrowserFrameView, views::NonClientFrameView implementation: @@ -470,6 +496,13 @@ #endif } +void OpaqueBrowserFrameView::UpdateWindowControlsOverlay( + const gfx::Rect& bounding_rect) const { + content::WebContents* web_contents = browser_view()->GetActiveWebContents(); + if (web_contents) { + web_contents->UpdateWindowControlsOverlay(bounding_rect); + } +} /////////////////////////////////////////////////////////////////////////////// // OpaqueBrowserFrameView, protected: @@ -736,6 +769,14 @@ } } +void OpaqueBrowserFrameView:: + UpdateCaptionButtonPlaceholderContainerBackground() { + if (caption_button_placeholder_container_) { + caption_button_placeholder_container_->SetBackground( + views::CreateSolidBackground(GetFrameColor())); + } +} + BEGIN_METADATA(OpaqueBrowserFrameView, BrowserNonClientFrameView) ADD_READONLY_PROPERTY_METADATA(gfx::Rect, IconBounds) ADD_READONLY_PROPERTY_METADATA(bool, ShowWindowTitleBar)
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h index df21c433..e37eb5f 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h
@@ -20,6 +20,7 @@ #include "ui/views/window/non_client_view.h" class BrowserView; +class CaptionButtonPlaceholderContainer; class OpaqueBrowserFrameViewLayout; class OpaqueBrowserFrameViewPlatformSpecific; class TabIconView; @@ -63,6 +64,8 @@ int GetThemeBackgroundXInset() const override; void UpdateThrobber(bool running) override; gfx::Size GetMinimumSize() const override; + void PaintAsActiveChanged() override; + void UpdateFrameColor() override; // views::NonClientFrameView: gfx::Rect GetBoundsForClientView() const override; @@ -102,6 +105,8 @@ bool IsFrameCondensed() const override; bool EverHasVisibleBackgroundTabShapes() const override; FrameButtonStyle GetFrameButtonStyle() const override; + void UpdateWindowControlsOverlay( + const gfx::Rect& bounding_rect) const override; protected: views::Button* minimize_button() const { return minimize_button_; } @@ -183,6 +188,8 @@ void PaintMaximizedFrameBorder(gfx::Canvas* canvas) const; void PaintClientEdge(gfx::Canvas* canvas) const; + void UpdateCaptionButtonPlaceholderContainerBackground(); + // Our layout manager also calculates various bounds. OpaqueBrowserFrameViewLayout* layout_; @@ -201,6 +208,11 @@ // Observer that handles platform dependent configuration. std::unique_ptr<OpaqueBrowserFrameViewPlatformSpecific> platform_observer_; + + // PlaceholderContainer beneath the controls button for PWAs with window + // controls overlay display override. + CaptionButtonPlaceholderContainer* caption_button_placeholder_container_ = + nullptr; }; #endif // CHROME_BROWSER_UI_VIEWS_FRAME_OPAQUE_BROWSER_FRAME_VIEW_H_
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc index e0bddb7..c9a6c65 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/web_applications/components/web_application_info.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/test/base/in_process_browser_test.h" +#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "ui/gfx/color_utils.h" #include "ui/views/test/test_views.h" @@ -180,3 +181,140 @@ EXPECT_EQ(container_height, web_app_frame_toolbar_->height()); EXPECT_EQ(title_bar_height, GetRestoredTitleBarHeight()); } + +class WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest + : public InProcessBrowserTest { + public: + WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest() { + scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); + scoped_feature_list_->InitAndEnableFeature( + features::kWebAppWindowControlsOverlay); + } + WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest( + const WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest&) = delete; + WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest& operator=( + const WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest&) = delete; + ~WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest() override = default; + + bool InstallAndLaunchWebAppWithWindowControlsOverlay() { + GURL start_url("https://test.org"); + std::vector<blink::mojom::DisplayMode> display_overrides; + display_overrides.emplace_back( + blink::mojom::DisplayMode::kWindowControlsOverlay); + auto web_app_info = std::make_unique<WebApplicationInfo>(); + web_app_info->start_url = start_url; + web_app_info->scope = start_url.GetWithoutFilename(); + web_app_info->display_mode = blink::mojom::DisplayMode::kStandalone; + web_app_info->open_as_window = true; + web_app_info->title = u"A Web App"; + web_app_info->display_override = display_overrides; + + web_app::AppId app_id = web_app::test::InstallWebApp( + browser()->profile(), std::move(web_app_info)); + + Browser* app_browser = + web_app::LaunchWebAppBrowser(browser()->profile(), app_id); + + web_app::NavigateToURLAndWait(app_browser, start_url); + + browser_view_ = BrowserView::GetBrowserViewForBrowser(app_browser); + views::NonClientFrameView* frame_view = + browser_view_->GetWidget()->non_client_view()->frame_view(); + + // Not all platform configurations use OpaqueBrowserFrameView for their + // browser windows, see |CreateBrowserNonClientFrameView()|. + bool is_opaque_browser_frame_view = + views::IsViewClass<OpaqueBrowserFrameView>(frame_view); +#if defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_ASH) && \ + !BUILDFLAG(IS_CHROMEOS_LACROS) + DCHECK(is_opaque_browser_frame_view); +#else + if (!is_opaque_browser_frame_view) + return false; +#endif + + opaque_browser_frame_view_ = + static_cast<OpaqueBrowserFrameView*>(frame_view); + auto* web_app_frame_toolbar = + opaque_browser_frame_view_->web_app_frame_toolbar_for_testing(); + DCHECK(web_app_frame_toolbar); + DCHECK(web_app_frame_toolbar->GetVisible()); + + return true; + } + + BrowserView* browser_view_ = nullptr; + OpaqueBrowserFrameView* opaque_browser_frame_view_ = nullptr; + + private: + std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest, + UpdateBoundingRect) { + if (!InstallAndLaunchWebAppWithWindowControlsOverlay()) + return; + + static_cast<views::View*>(opaque_browser_frame_view_)->Layout(); + + auto* web_contents = + opaque_browser_frame_view_->browser_view()->GetActiveWebContents(); + + // window controls overlay should be not be an empty rect and visible as this + // a web app. + int empty_rect_value = 0; + + EXPECT_EQ(true, EvalJs(web_contents, + "window.navigator.windowControlsOverlay.visible")); + + EXPECT_EQ( + 0, EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().x")); + EXPECT_EQ( + 0, EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().y")); + EXPECT_NE( + empty_rect_value, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().width")); + EXPECT_NE( + empty_rect_value, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().height")); +} + +IN_PROC_BROWSER_TEST_F(WebAppOpaqueBrowserFrameViewWindowControlsOvelayTest, + GeometryChangeEvent) { + if (!InstallAndLaunchWebAppWithWindowControlsOverlay()) + return; + + auto* web_contents = + opaque_browser_frame_view_->browser_view()->GetActiveWebContents(); + + EXPECT_TRUE(ExecuteScript( + web_contents->GetMainFrame(), + "geometrychangeCount = 0;" + "navigator.windowControlsOverlay.ongeometrychange = (e) => {" + " geometrychangeCount++;" + " rect = e.boundingRect;" + " visible = e.visible;" + "}")); + + // Change size of widget to trigger a "geometrychange" event. + gfx::Rect bounds = + opaque_browser_frame_view_->browser_view()->GetLocalBounds(); + bounds.set_width(bounds.width() - 1); + opaque_browser_frame_view_->browser_view()->GetWidget()->SetBounds(bounds); + + // Window controls overlay should be not be an empty rect and visible as this + // a web app. + int empty_rect_value = 0; + + // expect the "geometrychange" event to have fired. + EXPECT_NE(0, EvalJs(web_contents, "geometrychangeCount")); + + // Validate event payload. + EXPECT_EQ(true, EvalJs(web_contents, "visible")); + EXPECT_NE(empty_rect_value, EvalJs(web_contents, "rect.width")); + EXPECT_NE(empty_rect_value, EvalJs(web_contents, "rect.height")); +}
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc index 3b07f6e..e5254fa 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
@@ -14,8 +14,10 @@ #include "base/stl_util.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" +#include "chrome/browser/ui/views/frame/caption_button_placeholder_container.h" #include "chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.h" #include "chrome/common/chrome_switches.h" +#include "ui/compositor/layer.h" #include "ui/gfx/font.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/label.h" @@ -194,7 +196,8 @@ gfx::Rect OpaqueBrowserFrameViewLayout::CalculateClientAreaBounds( int width, int height) const { - int top_height = NonClientTopHeight(false); + int top_height = + is_window_controls_overlay_enabled_ ? 0 : NonClientTopHeight(false); int border_thickness = FrameBorderThickness(false); return gfx::Rect(border_thickness, top_height, std::max(0, width - (2 * border_thickness)), @@ -551,9 +554,18 @@ } web_app_frame_toolbar_ = static_cast<WebAppFrameToolbarView*>(view); break; - default: - NOTREACHED() << "Unknown view id " << id; - break; + } + + if (view && views::IsViewClass<CaptionButtonPlaceholderContainer>(view)) { + caption_button_placeholder_container_ = + static_cast<CaptionButtonPlaceholderContainer*>(view); + } + + if (is_window_controls_overlay_enabled_ && + (id == VIEW_ID_MINIMIZE_BUTTON || id == VIEW_ID_MAXIMIZE_BUTTON || + id == VIEW_ID_RESTORE_BUTTON || id == VIEW_ID_CLOSE_BUTTON)) { + view->SetPaintToLayer(); + view->layer()->SetFillsBoundsOpaquely(false); } } @@ -563,6 +575,36 @@ !trailing_buttons_.empty()); } +void OpaqueBrowserFrameViewLayout::LayoutTitleBarForWindowControlsOverlay( + const views::View* host) { + int y = 0; + int height = NonClientTopHeight(false); + int container_x = 0; + int x = available_space_leading_x_; + int web_app_frame_toolbar_view_width = host->width() - x; + + if (placed_trailing_button_) { + container_x = available_space_trailing_x_; + x = 0; + + web_app_frame_toolbar_view_width = available_space_trailing_x_; + + available_space_trailing_x_ -= + web_app_frame_toolbar_->GetPreferredSize().width(); + } + + caption_button_placeholder_container_->SetBounds( + container_x, y, minimum_size_for_buttons_, height); + + web_app_frame_toolbar_->LayoutForWindowControlsOverlay( + gfx::Rect(x, y, web_app_frame_toolbar_view_width, height)); + + int bounding_rect_width = + web_app_frame_toolbar_->bounds().x() - available_space_leading_x_; + delegate_->UpdateWindowControlsOverlay( + gfx::Rect(x, y, bounding_rect_width, height)); +} + /////////////////////////////////////////////////////////////////////////////// // OpaqueBrowserFrameViewLayout, views::LayoutManager: @@ -578,7 +620,10 @@ placed_trailing_button_ = false; LayoutWindowControls(); - LayoutTitleBar(); + if (is_window_controls_overlay_enabled_) + LayoutTitleBarForWindowControlsOverlay(host); + else + LayoutTitleBar(); // Any buttons/icon/title were laid out based on the frame border thickness, // but the tabstrip bounds need to be based on the non-client border thickness
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h index ec7d845..720e346f 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
@@ -12,6 +12,7 @@ #include "ui/views/layout/layout_manager.h" #include "ui/views/window/frame_buttons.h" +class CaptionButtonPlaceholderContainer; class WebAppFrameToolbarView; class OpaqueBrowserFrameViewLayoutDelegate; @@ -124,6 +125,11 @@ // the other overrides. gfx::Size GetMinimumSize(const views::View* host) const override; + void set_window_controls_overlay_enabled( + bool is_window_controls_overlay_enabled) { + is_window_controls_overlay_enabled_ = is_window_controls_overlay_enabled; + } + protected: // Whether a specific button should be inserted on the leading or trailing // side. @@ -178,6 +184,8 @@ // frame buttons. TopAreaPadding GetTopAreaPadding() const; + void LayoutTitleBarForWindowControlsOverlay(const views::View* host); + // Returns true if a 3D edge should be drawn around the window frame. If // |restored| is true, acts as if the window is restored regardless of the // real mode. @@ -219,6 +227,9 @@ views::ClientView* client_view_ = nullptr; + bool is_window_controls_overlay_enabled_ = false; + CaptionButtonPlaceholderContainer* caption_button_placeholder_container_; + DISALLOW_COPY_AND_ASSIGN(OpaqueBrowserFrameViewLayout); };
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h index 8bc516c7..da730e5 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h
@@ -10,6 +10,7 @@ namespace gfx { class Size; +class Rect; } // Delegate interface to control layout decisions without having to depend on @@ -77,6 +78,9 @@ // Indicates the type of the frame buttons. virtual FrameButtonStyle GetFrameButtonStyle() const; + virtual void UpdateWindowControlsOverlay( + const gfx::Rect& bounding_rect) const = 0; + protected: virtual ~OpaqueBrowserFrameViewLayoutDelegate() {} };
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc index 5e85de07..03fa407f 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
@@ -77,6 +77,8 @@ return !show_caption_buttons_ || maximized_; } bool EverHasVisibleBackgroundTabShapes() const override { return false; } + void UpdateWindowControlsOverlay( + const gfx::Rect& bounding_rect) const override {} private: std::u16string window_title_;
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.cc b/chrome/browser/ui/views/frame/tab_strip_region_view.cc index d0571d6..3d5a552f 100644 --- a/chrome/browser/ui/views/frame/tab_strip_region_view.cc +++ b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/strings/utf_string_conversions.h" #include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" @@ -15,12 +16,14 @@ #include "chrome/browser/ui/views/tabs/tab_strip.h" #include "chrome/browser/ui/views/tabs/tab_strip_controller.h" #include "chrome/browser/ui/views/tabs/tab_style_views.h" +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/views/user_education/tip_marquee_view.h" #include "chrome/grit/generated_resources.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/gfx/color_utils.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/highlight_path_generator.h" @@ -152,6 +155,11 @@ } // namespace TabStripRegionView::TabStripRegionView(std::unique_ptr<TabStrip> tab_strip) { + // TOOD(pbos): Find a better update. See TabStrip::GetTabForegroundColor. + views::FocusRing::SetColorContextForSubtree( + this, ThemeProperties::COLOR_TAB_BACKGROUND_INACTIVE_FRAME_INACTIVE, + ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); + layout_manager_ = SetLayoutManager(std::make_unique<views::FlexLayout>()); layout_manager_->SetOrientation(views::LayoutOrientation::kHorizontal);
diff --git a/chrome/browser/ui/views/infobars/infobar_container_view.cc b/chrome/browser/ui/views/infobars/infobar_container_view.cc index 96097f3d..1123c61 100644 --- a/chrome/browser/ui/views/infobars/infobar_container_view.cc +++ b/chrome/browser/ui/views/infobars/infobar_container_view.cc
@@ -8,6 +8,7 @@ #include "cc/paint/paint_flags.h" #include "cc/paint/paint_shader.h" +#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/infobars/infobar_view.h" #include "chrome/grit/generated_resources.h" @@ -20,6 +21,7 @@ #include "ui/gfx/canvas.h" #include "ui/gfx/skia_paint_util.h" #include "ui/views/bubble/bubble_border.h" +#include "ui/views/controls/focus_ring.h" namespace { @@ -64,6 +66,9 @@ content_shadow_(new ContentShadow()) { SetID(VIEW_ID_INFO_BAR_CONTAINER); AddChildView(content_shadow_); + views::FocusRing::SetColorContextForSubtree( + this, ThemeProperties::COLOR_TOOLBAR, + ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); } InfoBarContainerView::~InfoBarContainerView() {
diff --git a/chrome/browser/ui/views/payments/payment_request_row_view.cc b/chrome/browser/ui/views/payments/payment_request_row_view.cc index f49390b..0b75da4 100644 --- a/chrome/browser/ui/views/payments/payment_request_row_view.cc +++ b/chrome/browser/ui/views/payments/payment_request_row_view.cc
@@ -55,9 +55,13 @@ } void PaymentRequestRowView::UpdateBottomSeparator() { - if (!GetWidget()) - return; - SetBorder(bottom_separator_visible_ + // Create an empty border even when not present in a Widget hierarchy as the + // border is needed to correctly compute the bounds of the ScrollView in the + // PaymentRequestSheetController which is done before this is added to its + // Widget. + // TODO(crbug.com/1213247): Update PaymentRequestSheetController to recompute + // the bounds of its ScrollView in response to changes in preferred size. + SetBorder(bottom_separator_visible_ && GetWidget() ? payments::CreatePaymentRequestRowBorder( GetNativeTheme()->GetSystemColor( ui::NativeTheme::kColorId_SeparatorColor),
diff --git a/chrome/browser/ui/views/profiles/incognito_menu_view.cc b/chrome/browser/ui/views/profiles/incognito_menu_view.cc index ae41e10..8a93e59 100644 --- a/chrome/browser/ui/views/profiles/incognito_menu_view.cc +++ b/chrome/browser/ui/views/profiles/incognito_menu_view.cc
@@ -81,16 +81,11 @@ } #endif - const bool new_menu_design = - base::FeatureList::IsEnabled(features::kNewProfilePicker); - AddFeatureButton( - l10n_util::GetStringUTF16( - new_menu_design ? IDS_INCOGNITO_PROFILE_MENU_CLOSE_BUTTON_NEW - : IDS_INCOGNITO_PROFILE_MENU_CLOSE_BUTTON), + l10n_util::GetStringUTF16(IDS_INCOGNITO_PROFILE_MENU_CLOSE_BUTTON_NEW), base::BindRepeating(&IncognitoMenuView::OnExitButtonClicked, base::Unretained(this)), - new_menu_design ? vector_icons::kCloseIcon : kCloseAllIcon); + vector_icons::kCloseIcon); } std::u16string IncognitoMenuView::GetAccessibleWindowTitle() const {
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc index 751e4bf..392579d 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -176,10 +176,6 @@ return profile->IsGuestSession() || profile->IsEphemeralGuestProfile(); } -bool UseNewPicker() { - return base::FeatureList::IsEnabled(features::kNewProfilePicker); -} - } // namespace // ProfileMenuView --------------------------------------------------------- @@ -211,9 +207,9 @@ // ChromeOS doesn't support multi-profile. #if !BUILDFLAG(IS_CHROMEOS_ASH) - if (!(IsGuest(profile) && - base::FeatureList::IsEnabled(features::kNewProfilePicker))) { - BuildProfileManagementHeading(); + if (!(IsGuest(profile))) { + SetProfileManagementHeading( + l10n_util::GetStringUTF16(IDS_PROFILES_LIST_PROFILES_TITLE)); BuildSelectableProfiles(); BuildProfileManagementFeatureButtons(); } @@ -468,19 +464,12 @@ absl::optional<EditButtonParams> edit_button_params; // Profile names are not supported on ChromeOS. #if !BUILDFLAG(IS_CHROMEOS_ASH) - size_t num_of_profiles = - g_browser_process->profile_manager()->GetNumberOfProfiles(); - if (num_of_profiles > 1 || !profile_attributes->IsUsingDefaultName() || - base::FeatureList::IsEnabled(features::kNewProfilePicker)) { - profile_name = profile_attributes->GetLocalProfileName(); - edit_button_params = EditButtonParams( - &vector_icons::kEditIcon, - UseNewPicker() ? l10n_util::GetStringUTF16( - IDS_PROFILES_CUSTOMIZE_PROFILE_BUTTON_TOOLTIP) - : l10n_util::GetStringUTF16(IDS_SETTINGS_EDIT_PERSON), - base::BindRepeating(&ProfileMenuView::OnEditProfileButtonClicked, - base::Unretained(this))); - } + profile_name = profile_attributes->GetLocalProfileName(); + edit_button_params = EditButtonParams( + &vector_icons::kEditIcon, + l10n_util::GetStringUTF16(IDS_PROFILES_CUSTOMIZE_PROFILE_BUTTON_TOOLTIP), + base::BindRepeating(&ProfileMenuView::OnEditProfileButtonClicked, + base::Unretained(this))); #endif SkColor background_color = @@ -512,8 +501,7 @@ menu_title_ = l10n_util::GetStringUTF16(IDS_GUEST_PROFILE_NAME); menu_subtitle_ = std::u16string(); - if (guest_window_count > 1 && - base::FeatureList::IsEnabled(features::kNewProfilePicker)) { + if (guest_window_count > 1) { menu_subtitle_ = l10n_util::GetPluralStringFUTF16( IDS_GUEST_WINDOW_COUNT_MESSAGE, guest_window_count); } @@ -639,8 +627,7 @@ } int window_count = CountBrowsersFor(profile); - if (base::FeatureList::IsEnabled(features::kNewProfilePicker) && - IsGuest(profile)) { + if (IsGuest(profile)) { AddFeatureButton( l10n_util::GetPluralStringFUTF16(IDS_GUEST_PROFILE_MENU_CLOSE_BUTTON, window_count), @@ -674,13 +661,6 @@ } #if !BUILDFLAG(IS_CHROMEOS_ASH) -void ProfileMenuView::BuildProfileManagementHeading() { - SetProfileManagementHeading( - UseNewPicker() - ? l10n_util::GetStringUTF16(IDS_PROFILES_LIST_PROFILES_TITLE) - : l10n_util::GetStringUTF16(IDS_PROFILES_OTHER_PROFILES_TITLE)); -} - void ProfileMenuView::BuildSelectableProfiles() { auto profile_entries = g_browser_process->profile_manager() ->GetProfileAttributesStorage() @@ -716,10 +696,7 @@ void ProfileMenuView::BuildProfileManagementFeatureButtons() { AddProfileManagementShortcutFeatureButton( vector_icons::kSettingsIcon, - UseNewPicker() - ? l10n_util::GetStringUTF16( - IDS_PROFILES_MANAGE_PROFILES_BUTTON_TOOLTIP) - : l10n_util::GetStringUTF16(IDS_PROFILES_MANAGE_USERS_BUTTON), + l10n_util::GetStringUTF16(IDS_PROFILES_MANAGE_PROFILES_BUTTON_TOOLTIP), base::BindRepeating(&ProfileMenuView::OnManageProfilesButtonClicked, base::Unretained(this)));
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.h b/chrome/browser/ui/views/profiles/profile_menu_view.h index a937d8fa..beb7d3d0 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.h +++ b/chrome/browser/ui/views/profiles/profile_menu_view.h
@@ -85,7 +85,6 @@ void BuildFeatureButtons(); #if !BUILDFLAG(IS_CHROMEOS_ASH) void BuildSelectableProfiles(); - void BuildProfileManagementHeading(); void BuildProfileManagementFeatureButtons(); #endif
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index 905c775..29432f0 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -297,11 +297,8 @@ gfx::ImageSkia sized_avatar_image = views::GetImageSkiaFromImageModel( SizeImageModel(avatar_image_, ProfileMenuViewBase::kIdentityImageSize), GetNativeTheme()); - if (base::FeatureList::IsEnabled(features::kNewProfilePicker)) { - sized_avatar_image = - AddCircularBackground(sized_avatar_image, GetBackgroundColor(), - kIdentityImageSizeInclBorder); - } + sized_avatar_image = AddCircularBackground( + sized_avatar_image, GetBackgroundColor(), kIdentityImageSizeInclBorder); gfx::ImageSkia sized_badge = AddCircularBackground( SizeImage(root_view_->GetSyncIcon(), kBadgeSize), GetBackgroundColor(), kBadgeSize + 2 * kBadgePadding); @@ -586,19 +583,14 @@ const std::u16string& subtitle, const ui::ThemedVectorIcon& avatar_header_art) { constexpr int kBottomMargin = kDefaultMargin; - const bool new_design = - base::FeatureList::IsEnabled(features::kNewProfilePicker); identity_info_container_->RemoveAllChildViews(/*delete_children=*/true); - // In the new design, the colored background fully bleeds to the edges of the - // menu and to achieve that |container_margin| is set to 0. In this case, - // further margins will be added by children views. - const int container_margin = new_design ? 0 : kMenuEdgeMargin; + // The colored background fully bleeds to the edges of the menu and to achieve + // that margin is set to 0. Further margins will be added by children views. identity_info_container_->SetLayoutManager( CreateBoxLayout(views::BoxLayout::Orientation::kVertical, views::BoxLayout::CrossAxisAlignment::kStretch, - gfx::Insets(container_margin, container_margin, - kBottomMargin, container_margin))); + gfx::Insets(0, 0, kBottomMargin, 0))); auto avatar_image_view = std::make_unique<AvatarImageView>(image_model, this); @@ -611,38 +603,6 @@ GetViewAccessibility().OverrideName(GetAccessibleWindowTitle()); #endif - if (!new_design) { - if (!profile_name.empty()) { - DCHECK(edit_button_params.has_value()); - const SkColor kBackgroundColor = GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_HighlightedMenuItemBackgroundColor); - - heading_container_->RemoveAllChildViews(/*delete_children=*/true); - heading_container_->SetLayoutManager( - std::make_unique<views::FillLayout>()); - heading_container_->SetBackground( - views::CreateSolidBackground(kBackgroundColor)); - - views::LabelButton* heading_button = - heading_container_->AddChildView(std::make_unique<HoverButton>( - base::BindRepeating(&ProfileMenuViewBase::ButtonPressed, - base::Unretained(this), - std::move(edit_button_params->edit_action)), - profile_name)); - heading_button->SetEnabledTextColors(views::style::GetColor( - *this, views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY)); - heading_button->SetTooltipText(edit_button_params->edit_tooltip_text); - heading_button->SetHorizontalAlignment(gfx::ALIGN_CENTER); - heading_button->SetBorder( - views::CreateEmptyBorder(gfx::Insets(kDefaultMargin))); - } - - identity_info_container_->AddChildView(std::move(avatar_image_view)); - BuildProfileTitleAndSubtitle(/*parent=*/identity_info_container_, title, - subtitle); - return; - } - std::unique_ptr<views::Label> heading_label; if (!profile_name.empty()) { views::Label::CustomFont font = {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_test_base.cc b/chrome/browser/ui/views/profiles/profile_picker_test_base.cc index d41d24f..69b2e04 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_test_base.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_test_base.cc
@@ -114,9 +114,7 @@ } // namespace -ProfilePickerTestBase::ProfilePickerTestBase() { - feature_list_.InitAndEnableFeature(features::kNewProfilePicker); -} +ProfilePickerTestBase::ProfilePickerTestBase() = default; ProfilePickerTestBase::~ProfilePickerTestBase() = default;
diff --git a/chrome/browser/ui/views/profiles/profile_picker_test_base.h b/chrome/browser/ui/views/profiles/profile_picker_test_base.h index 31c7562..73e226e 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_test_base.h +++ b/chrome/browser/ui/views/profiles/profile_picker_test_base.h
@@ -5,7 +5,6 @@ #ifndef CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_TEST_BASE_H_ #define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_TEST_BASE_H_ -#include "base/test/scoped_feature_list.h" #include "chrome/test/base/in_process_browser_test.h" namespace content { @@ -48,9 +47,6 @@ // Gets the picker's web contents. content::WebContents* web_contents(); - - private: - base::test::ScopedFeatureList feature_list_; }; #endif // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_TEST_BASE_H_
diff --git a/chrome/browser/ui/views/read_later/read_later_button.cc b/chrome/browser/ui/views/read_later/read_later_button.cc index 1056287b..6c0cf302 100644 --- a/chrome/browser/ui/views/read_later/read_later_button.cc +++ b/chrome/browser/ui/views/read_later/read_later_button.cc
@@ -160,8 +160,6 @@ ui::NativeTheme::kColorId_AlertSeverityHigh), /*border_color=*/theme_provider->GetColor( ThemeProperties::COLOR_TOOLBAR)); - - ToolbarButton::UpdateFocusRingColor(this, focus_ring()); } void ReadLaterButton::Layout() {
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.cc b/chrome/browser/ui/views/tabs/new_tab_button.cc index dcd5d279..66288f9 100644 --- a/chrome/browser/ui/views/tabs/new_tab_button.cc +++ b/chrome/browser/ui/views/tabs/new_tab_button.cc
@@ -77,8 +77,7 @@ SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); } -NewTabButton::~NewTabButton() { -} +NewTabButton::~NewTabButton() = default; void NewTabButton::FrameColorsChanged() { UpdateInkDropBaseColor();
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc index 5821f25d..73a9b6cb 100644 --- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -2349,6 +2349,8 @@ bool TabDragController::CanAttachTo(gfx::NativeWindow window) { if (!window) return false; + if (window == GetAttachedBrowserWidget()->GetNativeWindow()) + return true; BrowserView* other_browser_view = BrowserView::GetBrowserViewForNativeWindow(window);
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index e8b72e33..0f272e2 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -1114,6 +1114,9 @@ base::BindRepeating(&TabStrip::tabs_view_model, base::Unretained(this)))), drag_context_(std::make_unique<TabDragContextImpl>(this)) { + views::FocusRing::SetColorContextForSubtree( + this, ThemeProperties::COLOR_TOOLBAR, + ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); Init(); SetEventTargeter(std::make_unique<views::ViewTargeter>(this)); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc index c0f00a3..ed87f2e 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
@@ -93,12 +93,6 @@ return bounds; } -void ToolbarActionView::OnThemeChanged() { - MenuButton::OnThemeChanged(); - - ToolbarButton::UpdateFocusRingColor(this, focus_ring()); -} - std::unique_ptr<LabelButtonBorder> ToolbarActionView::CreateDefaultBorder() const { std::unique_ptr<LabelButtonBorder> border = @@ -220,8 +214,6 @@ void ToolbarActionView::AddedToWidget() { MenuButton::AddedToWidget(); - ToolbarButton::UpdateFocusRingColor(this, focus_ring()); - // This cannot happen until there's a focus controller, which lives on the // widget. view_controller_->RegisterCommand();
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.h b/chrome/browser/ui/views/toolbar/toolbar_action_view.h index e291be9..dd9eba67 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view.h +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.h
@@ -55,7 +55,6 @@ // views::MenuButton: gfx::Rect GetAnchorBoundsInScreen() const override; - void OnThemeChanged() override; std::unique_ptr<views::LabelButtonBorder> CreateDefaultBorder() const override; bool IsTriggerableEvent(const ui::Event& event) override;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.cc b/chrome/browser/ui/views/toolbar/toolbar_button.cc index e98b8fa..2432062 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_button.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_button.cc
@@ -230,35 +230,6 @@ ToolbarButton::~ToolbarButton() = default; -void ToolbarButton::UpdateFocusRingColor(views::View* host, - views::FocusRing* focus_ring) { - DCHECK(host->GetWidget()); - DCHECK_EQ(host, focus_ring->parent()); - const SkColor default_focus_ring_color = - host->GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_FocusedBorderColor); - const SkColor background = - host->GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR); - const float default_contrast = - color_utils::GetContrastRatio(default_focus_ring_color, background); - if (default_contrast > color_utils::kMinimumVisibleContrastRatio) { - focus_ring->SetColor(absl::nullopt); - return; - } - const SkColor fallback_focus_ring_color = host->GetThemeProvider()->GetColor( - ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); - // TODO(pbos): Should this fallback_contrast_ratio be a DCHECK of > - // color_utils::kMinimumVisibleContrastRatio? Hopefully these are already - // contrasty. - const float fallback_contrast_ratio = - color_utils::GetContrastRatio(fallback_focus_ring_color, background); - if (fallback_contrast_ratio > default_contrast) { - focus_ring->SetColor(fallback_focus_ring_color); - return; - } - focus_ring->SetColor(absl::nullopt); -} - void ToolbarButton::SetHighlight(const std::u16string& highlight_text, absl::optional<SkColor> highlight_color) { if (highlight_text.empty() && !highlight_color.has_value()) { @@ -496,12 +467,6 @@ installable_ink_drop_->SetConfig(GetToolbarInstallableInkDropConfig(this)); UpdateIcon(); - // TODO(pbos): Remove calls to OnThemeChanged() where there's no widget. - // Afaik this is only done in ToolbarButtonViewsTest.NoDefaultLayoutInsets, - // but the test setup should instead add the ToolbarButton to a Widget. - if (GetWidget()) - UpdateFocusRingColor(this, focus_ring()); - // Call this after UpdateIcon() to properly reset images. LabelButton::OnThemeChanged(); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.h b/chrome/browser/ui/views/toolbar/toolbar_button.h index 731221c5..1247c52 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_button.h +++ b/chrome/browser/ui/views/toolbar/toolbar_button.h
@@ -147,9 +147,6 @@ const ui::ThemeProvider* theme_provider); static SkColor GetDefaultBorderColor(views::View* host_view); - static void UpdateFocusRingColor(views::View* host, - views::FocusRing* focus_ring); - protected: // Returns if menu should be shown. Override this to change default behavior. virtual bool ShouldShowMenu();
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc index 650fb98..2c5c301 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -176,6 +176,9 @@ for (const auto& view_and_command : GetViewCommandMap()) chrome::AddCommandObserver(browser_, view_and_command.second, this); } + views::FocusRing::SetColorContextForSubtree( + this, ThemeProperties::COLOR_TOOLBAR, + ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); } ToolbarView::~ToolbarView() {
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.cc index 9afba02..a641f18 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.cc
@@ -79,6 +79,10 @@ << "This should be the first ToolbarButtorProvider or a replacement for " "an existing instance of this class during a window frame refresh."; browser_view_->SetToolbarButtonProvider(this); + + if (browser_view_->IsWindowControlsOverlayEnabled()) { + OnWindowControlsOverlayEnabledChanged(); + } } WebAppFrameToolbarView::~WebAppFrameToolbarView() = default;
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf.mojom b/chrome/browser/ui/webui/download_shelf/download_shelf.mojom index e8b16062..34f64c8 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf.mojom +++ b/chrome/browser/ui/webui/download_shelf/download_shelf.mojom
@@ -195,6 +195,9 @@ // Browser-side handler for requests from WebUI page. interface PageHandler { + // Open chrome://downloads. + DoShowAll(); + // Notify the Views component to hide itself. DoClose();
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc b/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc index bd22567..4d1714b1 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc +++ b/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.cc
@@ -32,6 +32,10 @@ DownloadShelfPageHandler::~DownloadShelfPageHandler() = default; +void DownloadShelfPageHandler::DoShowAll() { + download_shelf_ui_->DoShowAll(); +} + void DownloadShelfPageHandler::DoClose() { download_shelf_ui_->DoClose(); }
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h b/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h index 8f0cf05d..ef65311 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h +++ b/chrome/browser/ui/webui/download_shelf/download_shelf_page_handler.h
@@ -29,6 +29,7 @@ ~DownloadShelfPageHandler() override; // download_shelf::mojom::PageHandler: + void DoShowAll() override; void DoClose() override; void GetDownloads(GetDownloadsCallback callback) override; void ShowContextMenu(uint32_t download_id,
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc b/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc index 5c0dae0..edc7252 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc +++ b/chrome/browser/ui/webui/download_shelf/download_shelf_ui.cc
@@ -45,7 +45,7 @@ {"close", IDS_ACCNAME_CLOSE}, {"discardButtonText", IDS_DISCARD_DOWNLOAD}, {"downloadStatusOpeningText", IDS_DOWNLOAD_STATUS_OPENING}, - }; + {"showAll", IDS_SHOW_ALL_DOWNLOADS}}; source->AddLocalizedStrings(kStrings); webui::SetupWebUIDataSource( @@ -83,6 +83,11 @@ embedder()->DoClose(); } +void DownloadShelfUI::DoShowAll() { + if (embedder()) + embedder()->DoShowAll(); +} + void DownloadShelfUI::ShowContextMenu( uint32_t download_id, int32_t client_x,
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h b/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h index efb7017..4a1bd50 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h +++ b/chrome/browser/ui/webui/download_shelf/download_shelf_ui.h
@@ -41,6 +41,8 @@ void DoClose(); + void DoShowAll(); + void ShowContextMenu(uint32_t download_id, int32_t client_x, int32_t client_y,
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h b/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h index 3d0f9cc..ec6df12 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h +++ b/chrome/browser/ui/webui/download_shelf/download_shelf_ui_embedder.h
@@ -16,6 +16,8 @@ virtual void DoClose() = 0; + virtual void DoShowAll() = 0; + // Show the context menu for |download| at |position| in container's // coordinate. virtual void ShowDownloadContextMenu(
diff --git a/chrome/browser/ui/webui/download_shelf/download_shelf_ui_unittest.cc b/chrome/browser/ui/webui/download_shelf/download_shelf_ui_unittest.cc index 3c8fbd2..a3f6f6a 100644 --- a/chrome/browser/ui/webui/download_shelf/download_shelf_ui_unittest.cc +++ b/chrome/browser/ui/webui/download_shelf/download_shelf_ui_unittest.cc
@@ -23,6 +23,7 @@ class TestDownloadShelfHandler : public DownloadShelfHandler { public: MOCK_METHOD0(DoClose, void()); + MOCK_METHOD0(DoShowAll, void()); MOCK_METHOD1(GetDownloads, void(download_shelf::mojom::PageHandler::GetDownloadsCallback)); MOCK_METHOD4(ShowContextMenu,
diff --git a/chrome/browser/ui/webui/signin/profile_picker_ui.cc b/chrome/browser/ui/webui/signin/profile_picker_ui.cc index 554025d..b6f2cee 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_ui.cc +++ b/chrome/browser/ui/webui/signin/profile_picker_ui.cc
@@ -162,9 +162,7 @@ g_browser_process->local_state()->GetInteger( prefs::kBrowserProfilePickerAvailabilityOnStartup)); bool ask_on_startup_allowed = - availability_on_startup == - ProfilePicker::AvailabilityOnStartup::kEnabled && - base::FeatureList::IsEnabled(kEnableProfilePickerOnStartupFeature); + availability_on_startup == ProfilePicker::AvailabilityOnStartup::kEnabled; html_source->AddBoolean("askOnStartup", g_browser_process->local_state()->GetBoolean( prefs::kBrowserShowProfilePickerOnStartup));
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 161c14e..669bc4e 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -162,9 +162,11 @@ "//chrome/browser/profiles:profile", "//chrome/browser/web_applications", "//chrome/browser/web_applications/components", + "//chrome/common:buildflags", "//chrome/common:chrome_features", "//chrome/common:non_code_constants", "//components/keyed_service/content", + "//components/services/app_service/public/cpp:app_url_handling", "//components/webapps/browser", "//content/public/browser", "//url",
diff --git a/chrome/browser/web_applications/README.md b/chrome/browser/web_applications/README.md index bb461d5d8..b0ba8f57b 100644 --- a/chrome/browser/web_applications/README.md +++ b/chrome/browser/web_applications/README.md
@@ -34,6 +34,8 @@ This refers to the the document described by the [appmanifest](https://www.w3.org/TR/appmanifest/) spec, with some extra features described by [manifest-incubations](https://wicg.github.io/manifest-incubations/index.html). This document describes metadata and developer configuration of an installable webapp. +For code representations of the manifest see [the list](docs/manifest_representations.md). + ### Manifest Link A manifest link is something that looks like this in a html document:
diff --git a/chrome/browser/web_applications/components/url_handler_manager_impl.cc b/chrome/browser/web_applications/components/url_handler_manager_impl.cc index 05556bef..4cf7458 100644 --- a/chrome/browser/web_applications/components/url_handler_manager_impl.cc +++ b/chrome/browser/web_applications/components/url_handler_manager_impl.cc
@@ -47,6 +47,12 @@ GURL url(command_line.GetArgs()[0]); #endif + return GetUrlHandlerMatches(url); +} + +// static +std::vector<UrlHandlerLaunchParams> UrlHandlerManagerImpl::GetUrlHandlerMatches( + const GURL& url) { if (!url.is_valid() || !url.IsStandard() || !url.SchemeIs(url::kHttpsScheme)) return {};
diff --git a/chrome/browser/web_applications/components/url_handler_manager_impl.h b/chrome/browser/web_applications/components/url_handler_manager_impl.h index ea3b696..cc1632420 100644 --- a/chrome/browser/web_applications/components/url_handler_manager_impl.h +++ b/chrome/browser/web_applications/components/url_handler_manager_impl.h
@@ -37,6 +37,10 @@ static std::vector<UrlHandlerLaunchParams> GetUrlHandlerMatches( const base::CommandLine& command_line); + // Get matching URL handlers that can handle |url|. + static std::vector<UrlHandlerLaunchParams> GetUrlHandlerMatches( + const GURL& url); + void RegisterUrlHandlers( const AppId& app_id, base::OnceCallback<void(bool success)> callback) override;
diff --git a/chrome/browser/web_applications/docs/manifest_representations.md b/chrome/browser/web_applications/docs/manifest_representations.md new file mode 100644 index 0000000..fb174bb --- /dev/null +++ b/chrome/browser/web_applications/docs/manifest_representations.md
@@ -0,0 +1,35 @@ +# [Web Apps](../../README.md) - Manifest representations in code + +This is a list of all the places where we represent +[manifest](https://w3c.github.io/manifest/) data in our codebase. + + - [blink.mojom.Manifest](../../../../third_party/blink/public/mojom/manifest/manifest.mojom)\ + Mojo IPC representation between Blink and the browser. + Output of the [Blink manifest parser](../../../../third_party/blink/renderer/modules/manifest/manifest_parser.cc). + + - [blink::Manifest](../../../../third_party/blink/public/common/manifest/manifest.h)\ + Pre blink.mojom.Manifest representation that should be cleaned up. + + - [WebApplicationInfo](../components/web_application_info.h)\ + Used for installation and updates. + + - [web_app::WebApp](../web_app.h)\ + Installed web app representation in RAM. + + - [web_app.WebAppProto](../proto/web_app.proto)\ + Installed web app representation on disk. + + - [sync_pb.WebAppSpecificsProto](../../../../components/sync/protocol/web_app_specifics.proto)\ + Installed web app representation in sync cloud. + + - [webapps.mojom.WebPageMetadata](../../../../components/webapps/common/web_page_metadata.mojom)\ + Manifest data provided by an HTML document. + + - [web_app::ParseOfflineManifest()](../preinstalled_web_app_utils.cc)\ + Custom JSON + PNG format for bundling WebApplicationInfo data on disk for offline default web app installation. + + - [WebApkInfo](../../android/webapk/webapk_info.h)\ + Web app installation data that was packaged in an APK. + + - [payments::WebAppInstallationInfo](../../../../components/payments/content/web_app_manifest.h)\ + Payments code doesn't live under /chrome/browser, they have their own parser and representation.
diff --git a/chrome/browser/web_applications/test/web_app_install_test_utils.cc b/chrome/browser/web_applications/test/web_app_install_test_utils.cc index 6c009a64..2764954 100644 --- a/chrome/browser/web_applications/test/web_app_install_test_utils.cc +++ b/chrome/browser/web_applications/test/web_app_install_test_utils.cc
@@ -8,6 +8,7 @@ #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" +#include "build/build_config.h" #include "chrome/browser/web_applications/components/install_finalizer.h" #include "chrome/browser/web_applications/components/install_manager.h" #include "chrome/browser/web_applications/components/web_app_constants.h" @@ -18,11 +19,19 @@ #include "chrome/browser/web_applications/system_web_apps/test/test_system_web_app_manager.h" #include "chrome/browser/web_applications/test/test_web_app_provider.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/buildflags.h" #include "chrome/common/chrome_switches.h" #include "components/webapps/browser/installable/installable_metrics.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +#include "chrome/browser/web_applications/components/os_integration_manager.h" +#include "chrome/browser/web_applications/components/url_handler_manager.h" +#include "components/services/app_service/public/cpp/url_handler_info.h" +#endif + namespace web_app { namespace test { @@ -111,5 +120,36 @@ return app_id; } +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +AppId InstallWebAppWithUrlHandlers( + Profile* profile, + const GURL& start_url, + const std::u16string& app_name, + const std::vector<apps::UrlHandlerInfo>& url_handlers) { + std::unique_ptr<WebApplicationInfo> info = + std::make_unique<WebApplicationInfo>(); + info->start_url = start_url; + info->title = app_name; + info->open_as_window = true; + info->url_handlers = url_handlers; + web_app::AppId app_id = + web_app::test::InstallWebApp(profile, std::move(info)); + + auto& url_handler_manager = WebAppProviderBase::GetProviderBase(profile) + ->os_integration_manager() + .url_handler_manager_for_testing(); + + base::RunLoop run_loop; + url_handler_manager.RegisterUrlHandlers( + app_id, base::BindLambdaForTesting([&](bool success) { + EXPECT_TRUE(success); + run_loop.Quit(); + })); + run_loop.Run(); + return app_id; +} +#endif + } // namespace test } // namespace web_app
diff --git a/chrome/browser/web_applications/test/web_app_install_test_utils.h b/chrome/browser/web_applications/test/web_app_install_test_utils.h index 7d448461..be4b917 100644 --- a/chrome/browser/web_applications/test/web_app_install_test_utils.h +++ b/chrome/browser/web_applications/test/web_app_install_test_utils.h
@@ -7,9 +7,17 @@ #include <memory> #include <string> +#include <vector> +#include "build/build_config.h" #include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/components/web_application_info.h" +#include "chrome/common/buildflags.h" + +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +#include "components/services/app_service/public/cpp/url_handler_info.h" +#endif class GURL; class Profile; @@ -36,6 +44,18 @@ // unit tests and browser tests. AppId InstallWebApp(Profile* profile, std::unique_ptr<WebApplicationInfo>); +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +// Install a web app with url_handlers then register it with the +// UrlHandlerManager. This is sufficient for testing URL matching and launch +// at startup. +AppId InstallWebAppWithUrlHandlers( + Profile* profile, + const GURL& start_url, + const std::u16string& app_name, + const std::vector<apps::UrlHandlerInfo>& url_handlers); +#endif + } // namespace test } // namespace web_app
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index d9e5dafbb..11f38fb 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-master-1621932938-5594fc6d2c5390bfebb184c495cb8ecce1fcb43f.profdata +chrome-win32-master-1621954393-e733b6f5d67eb909295f4ef0c4f3617bf2a0e01c.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index fd5e6e4..0f71b43 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1621943827-d00289ef5df5b49eaadb075bd66d072d47bc3039.profdata +chrome-win64-master-1621954393-1ae16c5c6bf64a2d5de639296cc11682e71e377a.profdata
diff --git a/chrome/common/extensions/api/wallpaper_private.json b/chrome/common/extensions/api/wallpaper_private.json index 9c129ba..b68739b 100644 --- a/chrome/common/extensions/api/wallpaper_private.json +++ b/chrome/common/extensions/api/wallpaper_private.json
@@ -101,6 +101,11 @@ "name": "url" }, { + "type": "string", + "name": "collectionId", + "description": "The id of the collection that the wallpaper belongs to. The id is used for analytics. If it is empty, the metric will not be logged." + }, + { "name": "layout", "$ref": "wallpaper.WallpaperLayout" },
diff --git a/chrome/common/extensions/extension_constants.cc b/chrome/common/extensions/extension_constants.cc index 484cc59..9e6959c 100644 --- a/chrome/common/extensions/extension_constants.cc +++ b/chrome/common/extensions/extension_constants.cc
@@ -22,7 +22,6 @@ namespace extension_misc { const char kCalendarAppId[] = "ejjicmeblgpmajnghnpcppodonldlgfn"; -const char kChromeRemoteDesktopAppId[] = "gbchcmhmhahfdphkhkmpfmihenigjmpp"; const char kCloudPrintAppId[] = "mfehgcgbbipciphmccgaenjidiccnmng"; const char kDataSaverExtensionId[] = "pfmgfdlgomnbgkofeojodiodmgpgmkac"; const char kDocsOfflineExtensionId[] = "ghbmnnjooekpmoecnnnilnnbdlolhkhi"; @@ -45,7 +44,6 @@ const char* const kBuiltInFirstPartyExtensionIds[] = { kCalculatorAppId, kCalendarAppId, - kChromeRemoteDesktopAppId, kCloudPrintAppId, kDataSaverExtensionId, kDocsOfflineExtensionId,
diff --git a/chrome/common/extensions/extension_constants.h b/chrome/common/extensions/extension_constants.h index 14feb0e..7235bef4 100644 --- a/chrome/common/extensions/extension_constants.h +++ b/chrome/common/extensions/extension_constants.h
@@ -28,9 +28,6 @@ // The extension id of the Calendar application. extern const char kCalendarAppId[]; -// The extension id of the Chrome Remote Desktop application. -extern const char kChromeRemoteDesktopAppId[]; - // The extension id of the Cloud Print component application. extern const char kCloudPrintAppId[];
diff --git a/chrome/common/mac/app_shim.mojom b/chrome/common/mac/app_shim.mojom index 77c4224..73e952e8 100644 --- a/chrome/common/mac/app_shim.mojom +++ b/chrome/common/mac/app_shim.mojom
@@ -92,9 +92,7 @@ SetBadgeLabel(string badge_label); // Called to update the state of the profiles NSMenu. - // TODO(crbug.com/1108289): Remove `use_new_picker` after launch. - UpdateProfileMenu(array<ProfileMenuItem> profile_menu_items, - bool use_new_picker); + UpdateProfileMenu(array<ProfileMenuItem> profile_menu_items); }; // Interface through which the a process communicates to the browser process.
diff --git a/chrome/renderer/media/chrome_speech_recognition_client.cc b/chrome/renderer/media/chrome_speech_recognition_client.cc index 9291ee2..e6ec1b4 100644 --- a/chrome/renderer/media/chrome_speech_recognition_client.cc +++ b/chrome/renderer/media/chrome_speech_recognition_client.cc
@@ -144,7 +144,8 @@ speech_recognition_recognizer_.BindNewPipeAndPassReceiver(), std::move(speech_recognition_client_remote), media::mojom::SpeechRecognitionOptions::New( - media::mojom::SpeechRecognitionMode::kCaption), + media::mojom::SpeechRecognitionMode::kCaption, + /*enable_formatting=*/true), media::BindToCurrentLoop( base::BindOnce(&ChromeSpeechRecognitionClient::OnRecognizerBound, weak_factory_.GetWeakPtr())));
diff --git a/chrome/services/speech/audio_source_fetcher_impl.cc b/chrome/services/speech/audio_source_fetcher_impl.cc index bd11e14..295c12a 100644 --- a/chrome/services/speech/audio_source_fetcher_impl.cc +++ b/chrome/services/speech/audio_source_fetcher_impl.cc
@@ -103,7 +103,9 @@ SpeechRecognitionRecognizerImpl::IsMultichannelSupported())); } -void AudioSourceFetcherImpl::OnCaptureError(const std::string& message) { +void AudioSourceFetcherImpl::OnCaptureError( + media::AudioCapturerSource::ErrorCode code, + const std::string& message) { speech_recognition_recognizer_->OnSpeechRecognitionError(); }
diff --git a/chrome/services/speech/audio_source_fetcher_impl.h b/chrome/services/speech/audio_source_fetcher_impl.h index 4a86f662..406cd98 100644 --- a/chrome/services/speech/audio_source_fetcher_impl.h +++ b/chrome/services/speech/audio_source_fetcher_impl.h
@@ -48,7 +48,8 @@ base::TimeTicks audio_capture_time, double volume, bool key_pressed) final; - void OnCaptureError(const std::string& message) final; + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) final; void OnCaptureMuted(bool is_muted) final {} void set_audio_capturer_source_for_tests(
diff --git a/chrome/services/speech/cros_speech_recognition_recognizer_impl.cc b/chrome/services/speech/cros_speech_recognition_recognizer_impl.cc index 4b5592c..6596663 100644 --- a/chrome/services/speech/cros_speech_recognition_recognizer_impl.cc +++ b/chrome/services/speech/cros_speech_recognition_recognizer_impl.cc
@@ -92,6 +92,8 @@ config->api_key = google_apis::GetSodaAPIKey(); config->language_dlc_path = languagepack_path_.value(); config->library_dlc_path = binary_path_.value(); + // TODO(crbug.com/1173135): Set options_->recognition_mode and + // options_->enable_formatting in the SodaConfig when available. cros_soda_client_->Reset(std::move(config), recognition_event_callback_); } cros_soda_client_->AddAudio(reinterpret_cast<char*>(buffer->data.data()),
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.cc b/chrome/services/speech/speech_recognition_recognizer_impl.cc index c8e390e5..3937722 100644 --- a/chrome/services/speech/speech_recognition_recognizer_impl.cc +++ b/chrome/services/speech/speech_recognition_recognizer_impl.cc
@@ -338,6 +338,7 @@ config_msg.set_enable_lang_id(false); config_msg.set_recognition_mode( GetSodaSpeechRecognitionMode(options_->recognition_mode)); + config_msg.set_enable_formatting(options_->enable_formatting); auto serialized = config_msg.SerializeAsString(); SerializedSodaConfig config;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 2b450f4..92011b08 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -921,7 +921,6 @@ "//chrome/renderer", "//chrome/services/removable_storage_writer:lib", "//chrome/test/data:webui_test_resources", - "//components/android_autofill/browser", "//components/autofill/content/browser:risk_proto", "//components/autofill/content/common/mojom", "//components/autofill/content/renderer:test_support", @@ -1105,13 +1104,12 @@ "../browser/apps/platform_apps/event_page_browsertest.cc", "../browser/apps/platform_apps/platform_app_navigation_redirector_browsertest.cc", "../browser/apps/platform_apps/service_worker_browsertest.cc", + "../browser/attribution_reporting/chrome_attribution_browsertest.cc", "../browser/attribution_reporting/conversions_usage_restriction_trial_browsertest.cc", - "../browser/attribution_reporting/conversions_usecounter_browsertest.cc", "../browser/autocomplete/autocomplete_browsertest.cc", "../browser/autofill/autofill_autocomplete_browsertest.cc", "../browser/autofill/autofill_browsertest.cc", "../browser/autofill/autofill_metrics_browsertest.cc", - "../browser/autofill/autofill_provider_browsertest.cc", "../browser/autofill/autofill_server_browsertest.cc", "../browser/autofill/content_autofill_driver_browsertest.cc", "../browser/autofill/form_structure_browsertest.cc", @@ -4027,7 +4025,6 @@ "../browser/ssl/certificate_error_reporter_unittest.cc", "../browser/ssl/certificate_reporting_test_utils.cc", "../browser/ssl/certificate_reporting_test_utils.h", - "../browser/ssl/insecure_sensitive_input_driver_unittest.cc", "../browser/ssl/security_state_tab_helper_unittest.cc", "../browser/ssl/ssl_config_service_manager_pref_unittest.cc", "../browser/status_icons/status_icon_menu_model_unittest.cc",
diff --git a/chrome/test/base/chrome_unit_test_suite.cc b/chrome/test/base/chrome_unit_test_suite.cc index 8e6151a..622a0eb 100644 --- a/chrome/test/base/chrome_unit_test_suite.cc +++ b/chrome/test/base/chrome_unit_test_suite.cc
@@ -26,6 +26,7 @@ #include "components/startup_metric_utils/browser/startup_metric_utils.h" #include "components/update_client/update_query_params.h" #include "content/public/common/content_paths.h" +#include "content/public/test/scoped_web_ui_controller_factory_registration.h" #include "extensions/buildflags/buildflags.h" #include "gpu/ipc/service/image_transport_surface.h" #include "testing/gtest/include/gtest/gtest.h" @@ -128,6 +129,8 @@ testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners(); listeners.Append(new ChromeUnitTestSuiteInitializer); + listeners.Append( + new content::CheckForLeakedWebUIControllerFactoryRegistrations); { ChromeContentClient content_client;
diff --git a/chrome/test/data/autofill/frame_detached_on_form_submit.html b/chrome/test/data/autofill/frame_detached_on_form_submit.html deleted file mode 100644 index b68d127dc..0000000 --- a/chrome/test/data/autofill/frame_detached_on_form_submit.html +++ /dev/null
@@ -1,25 +0,0 @@ -<html> -<body> - -<script> - -function delayedUpload() { - window.domAutomationController.send("SUBMISSION_FINISHED"); -} - -function receiveMessage(event) { - var address_iframe = document.getElementById('address_iframe'); - address_iframe.parentNode.removeChild(address_iframe); - setTimeout(delayedUpload, 0); -} - -window.addEventListener("message", receiveMessage, false); - -</script> - -<iframe src="inner_frame_address_form.html" id="address_iframe" name="address_iframe"> -</iframe> - - -</body> -</html>
diff --git a/chrome/test/data/autofill/frame_detached_on_formless_submit.html b/chrome/test/data/autofill/frame_detached_on_formless_submit.html deleted file mode 100644 index 85b9be7..0000000 --- a/chrome/test/data/autofill/frame_detached_on_formless_submit.html +++ /dev/null
@@ -1,25 +0,0 @@ -<html> -<body> - -<script> - -function delayedUpload() { - window.domAutomationController.send("SUBMISSION_FINISHED"); -} - -function receiveMessage(event) { - var address_iframe = document.getElementById('address_iframe'); - address_iframe.parentNode.removeChild(address_iframe); - setTimeout(delayedUpload, 0); -} - -window.addEventListener("message", receiveMessage, false); - -</script> - -<iframe src="inner_frame_address_formless.html" id="address_iframe" name="address_iframe"> -</iframe> - - -</body> -</html>
diff --git a/chrome/test/data/autofill/inner_frame_address_form.html b/chrome/test/data/autofill/inner_frame_address_form.html deleted file mode 100644 index cfa42da6..0000000 --- a/chrome/test/data/autofill/inner_frame_address_form.html +++ /dev/null
@@ -1,15 +0,0 @@ -<html> -<body> - -<script> -function send_post() { - window.parent.postMessage("SubmitComplete", "*"); -} -</script> -<form action="inner_frame_address_form.html" onsubmit="send_post(); return false;" - id="deleting_form"> - <input type="text" id="address_field" name="address" autocomplete="on"> - <input type="submit" id="submit_button" name="submit_button"> -</form> -</body> -</html>
diff --git a/chrome/test/data/autofill/inner_frame_address_formless.html b/chrome/test/data/autofill/inner_frame_address_formless.html deleted file mode 100644 index 76df33c1..0000000 --- a/chrome/test/data/autofill/inner_frame_address_formless.html +++ /dev/null
@@ -1,12 +0,0 @@ -<html> -<body> - -<script> -function send_post() { - window.parent.postMessage("SubmitComplete", "*"); -} -</script> - <input type="text" id="address_field" name="address" autocomplete="on"> - <input type="button" id="submit_button" name="submit_button" onclick="send_post()"> -</body> -</html>
diff --git a/chrome/test/data/autofill/label_change.html b/chrome/test/data/autofill/label_change.html deleted file mode 100644 index 0e037102..0000000 --- a/chrome/test/data/autofill/label_change.html +++ /dev/null
@@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -</head> -<body> -<script> - -function delayedUpload() { - window.domAutomationController.send("SUBMISSION_FINISHED"); - console.log("delayedUpload") -} - -function send_post() { - setTimeout(delayedUpload, 0); -} - -</script> - -<form action="" onsubmit="send_post(); return false;"> -<label id="label_id"> Address </label> -<input type="text" id="address" name="address" autocomplete="on"> - -<p id="p_id">Address 1</p> -<input type="text" name="address1" autocomplete="on"> -<input type="submit" id="submit_button" name="submit_button"> -</form> -</body> -</html>
diff --git a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js index 885ac77..dc508bb 100644 --- a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js +++ b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/api_mock.js
@@ -6,6 +6,7 @@ var TestConstants = { isPowerwashed: 0, wallpaperUrl: 'https://test.com/test.jpg', + collectionId: 'test_collection', highResolutionSuffix: 'suffix', // A dummy string which is used to mock an image. IMAGE: '*#*@#&', @@ -280,7 +281,7 @@ }, onWallpaperChangedBy3rdParty: {addListener: function(listener) {}}, getCollectionsInfo: function(callback) { - callback([{collectionId: 'dummyId'}]); + callback([{collectionId: TestConstants.collectionId}]); }, getImagesInfo: function(collectionId, callback) { callback([{imageUrl: TestConstants.wallpaperUrl}]);
diff --git a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js index c64f7616..c2f7b5d 100644 --- a/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js +++ b/chrome/test/data/chromeos/wallpaper_manager/unit_tests/event_page_unittest.js
@@ -106,8 +106,9 @@ chrome.wallpaperPrivate, 'setWallpaperIfExists'); mockSetWallpaperIfExists.addExpectation( changes[Constants.AccessSyncWallpaperInfoKey].newValue.url, + /*collection_id=*/'', changes[Constants.AccessSyncWallpaperInfoKey].newValue.layout, - false /*previewMode=*/); + /*previewMode=*/false); mockSetWallpaperIfExists.callbackData = [false]; var mockSetWallpaper = mockController.createFunctionMock( @@ -116,7 +117,7 @@ TestConstants.IMAGE, changes[Constants.AccessSyncWallpaperInfoKey].newValue.layout, changes[Constants.AccessSyncWallpaperInfoKey].newValue.url, - false /*previewMode=*/); + /*previewMode=*/false); chrome.storage.onChanged.dispatch(changes); } @@ -127,7 +128,7 @@ chrome.wallpaperPrivate, 'setWallpaperIfExists'); mockSetWallpaperIfExists.addExpectation( TestConstants.wallpaperUrl + TestConstants.highResolutionSuffix, - 'CENTER_CROPPED', false /*previewMode=*/); + /*collection_id=*/'', 'CENTER_CROPPED', false /*previewMode=*/); mockSetWallpaperIfExists.callbackData = [true]; var mockRecordWallpaperUMA = mockController.createFunctionMock(
diff --git a/chrome/test/data/extensions/api_test/wallpaper_manager/test.js b/chrome/test/data/extensions/api_test/wallpaper_manager/test.js index 28b2acc..9553f4b 100644 --- a/chrome/test/data/extensions/api_test/wallpaper_manager/test.js +++ b/chrome/test/data/extensions/api_test/wallpaper_manager/test.js
@@ -40,8 +40,8 @@ if (requestStatus === 200) { wallpaperJpeg = response; chrome.wallpaperPrivate.setWallpaper( - wallpaperJpeg, 'CENTER_CROPPED', url, false /*previewMode=*/, - pass()); + wallpaperJpeg, 'CENTER_CROPPED', url, + /*previewMode=*/false, pass()); } else { chrome.test.fail('Failed to load test.jpg from local server.'); } @@ -100,18 +100,19 @@ "/wallpaper_manager/test.jpg"; url = url.replace(/PORT/, config.testServer.port); chrome.wallpaperPrivate.setWallpaperIfExists( - url, 'CENTER_CROPPED', false /*previewMode=*/, pass(function(exists) { + url, /*collection_id=*/'', 'CENTER_CROPPED', /*previewMode=*/false, + pass(function(exists) { chrome.test.assertTrue(exists); // Attempt to set wallpaper from a non-existent file should fail. chrome.wallpaperPrivate.setWallpaperIfExists( - 'http://dummyurl/test1.jpg', 'CENTER_CROPPED', - false /*previewMode=*/, + 'http://dummyurl/test1.jpg', /*collection_id=*/'', + 'CENTER_CROPPED', /*previewMode=*/false, fail('The wallpaper doesn\'t exist in local file system.')); // Attempt to preview wallpaper from a non-existent file should // also fail. chrome.wallpaperPrivate.setWallpaperIfExists( - 'http://dummyurl/test1.jpg', 'CENTER_CROPPED', - true /*previewMode=*/, + 'http://dummyurl/test1.jpg', /*collectionId=*/'', + 'CENTER_CROPPED', /*previewMode=*/true, fail('The wallpaper doesn\'t exist in local file system.')); })); },
diff --git a/chrome/test/data/webui/download_shelf/test_download_shelf_api_proxy.js b/chrome/test/data/webui/download_shelf/test_download_shelf_api_proxy.js index 2d77d73..f7bf88f9 100644 --- a/chrome/test/data/webui/download_shelf/test_download_shelf_api_proxy.js +++ b/chrome/test/data/webui/download_shelf/test_download_shelf_api_proxy.js
@@ -10,6 +10,7 @@ constructor() { super([ 'doClose', + 'doShowAll', 'getDownloads', 'getFileIcon', 'openDownload', @@ -33,6 +34,11 @@ } /** @override */ + doShowAll() { + this.methodCalled('doShowAll'); + } + + /** @override */ getDownloads() { this.methodCalled('getDownloads'); return Promise.resolve({downloadItems: this.downloadItems_});
diff --git a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js index 52a748b..e632273 100644 --- a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js
@@ -86,6 +86,44 @@ return result; } + /** + * @param {boolean} isSimLocked + */ + function deepLinkToSimLockElement(isSimLocked) { + init(); + const mojom = chromeos.networkConfig.mojom; + + const test_iccid = '11111111111111111'; + mojoApi_.setDeviceStateForTest({ + type: mojom.NetworkType.kCellular, + deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled, + simLockStatus: { + lockEnabled: true, + lockType: isSimLocked ? 'sim-pin' : undefined, + }, + simInfos: [{ + iccid: test_iccid, + isPrimary: true, + }], + }); + + const cellularNetwork = + getManagedProperties(mojom.NetworkType.kCellular, 'cellular'); + cellularNetwork.connectable = false; + cellularNetwork.typeProperties.cellular.iccid = test_iccid; + mojoApi_.setManagedPropertiesForTest(cellularNetwork); + + const params = new URLSearchParams; + params.append('guid', 'cellular_guid'); + params.append('type', 'Cellular'); + params.append('name', 'cellular'); + params.append('settingId', '14'); + settings.Router.getInstance().navigateTo( + settings.routes.NETWORK_DETAIL, params); + + return flushAsync(); + } + setup(function() { loadTimeData.overrideValues({ internetAddConnection: 'internetAddConnection', @@ -564,30 +602,8 @@ await popStatePromise; }); - test('Deep link to sim lock toggle', async () => { - init(); - const mojom = chromeos.networkConfig.mojom; - mojoApi_.setDeviceStateForTest({ - type: mojom.NetworkType.kCellular, - deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled, - simLockStatus: { - lockEnabled: false, - }, - }); - const cellularNetwork = - getManagedProperties(mojom.NetworkType.kCellular, 'cellular'); - cellularNetwork.connectable = false; - mojoApi_.setManagedPropertiesForTest(cellularNetwork); - - const params = new URLSearchParams; - params.append('guid', 'cellular_guid'); - params.append('type', 'Cellular'); - params.append('name', 'cellular'); - params.append('settingId', '14'); - settings.Router.getInstance().navigateTo( - settings.routes.NETWORK_DETAIL, params); - - Polymer.dom.flush(); + test('Deep link to sim lock toggle with cellular flag off', async () => { + await deepLinkToSimLockElement(/*isSimLocked=*/ false); const simInfo = internetDetailPage.$$('#cellularSimInfo'); @@ -600,6 +616,40 @@ 'Sim lock toggle should be focused for settingId=14.'); }); + test('Deep link to sim lock toggle with cellular flag on', async () => { + loadTimeData.overrideValues({ + updatedCellularActivationUi: true, + }); + await deepLinkToSimLockElement(/*isSimLocked=*/ false); + + const simInfo = internetDetailPage.$$('#cellularSimInfoAdvanced'); + + // In this rare case, wait after next render twice due to focus behavior + // of the siminfo component. + await test_util.waitAfterNextRender(simInfo); + await test_util.waitAfterNextRender(simInfo); + assertEquals( + simInfo.$$('#simLockButton'), getDeepActiveElement(), + 'Sim lock toggle should be focused for settingId=14.'); + }); + + test('Deep link to sim unlock button with cellular flag on', async () => { + loadTimeData.overrideValues({ + updatedCellularActivationUi: true, + }); + await deepLinkToSimLockElement(/*isSimLocked=*/ true); + + const simInfo = internetDetailPage.$$('#cellularSimInfoAdvanced'); + + // In this rare case, wait after next render twice due to focus behavior + // of the siminfo component. + await test_util.waitAfterNextRender(simInfo); + await test_util.waitAfterNextRender(simInfo); + assertEquals( + simInfo.$$('#unlockPinButton'), getDeepActiveElement(), + 'Sim unlock button should be focused for settingId=14.'); + }); + test('Cellular page hides hidden toggle', function() { init(); const mojom = chromeos.networkConfig.mojom;
diff --git a/chrome/test/data/webui/signin/local_profile_customization_interactive_ui_test.js b/chrome/test/data/webui/signin/local_profile_customization_interactive_ui_test.js index 2049500..550a091 100644 --- a/chrome/test/data/webui/signin/local_profile_customization_interactive_ui_test.js +++ b/chrome/test/data/webui/signin/local_profile_customization_interactive_ui_test.js
@@ -22,7 +22,6 @@ return { enabled: [ 'features::kSignInProfileCreation', - 'features::kNewProfilePicker', ] }; }
diff --git a/chrome/test/data/webui/signin/signin_browsertest.js b/chrome/test/data/webui/signin/signin_browsertest.js index e058234..6bf48f8 100644 --- a/chrome/test/data/webui/signin/signin_browsertest.js +++ b/chrome/test/data/webui/signin/signin_browsertest.js
@@ -98,7 +98,6 @@ return { enabled: [ 'features::kSignInProfileCreation', - 'features::kNewProfilePicker', ] }; } @@ -120,15 +119,6 @@ get browsePreload() { return 'chrome://profile-picker/test_loader.html?module=signin/local_profile_customization_test.js'; } - - /** @override */ - get featureList() { - return { - enabled: [ - 'features::kNewProfilePicker', - ] - }; - } }; TEST_F('LocalProfileCustomizationTest', 'All', function() { @@ -152,7 +142,6 @@ return { enabled: [ 'features::kSignInProfileCreation', - 'features::kNewProfilePicker', ] }; } @@ -179,7 +168,6 @@ return { enabled: [ 'features::kSignInProfileCreation', - 'features::kNewProfilePicker', ] }; } @@ -200,15 +188,6 @@ get browsePreload() { return 'chrome://profile-picker/test_loader.html?module=signin/profile_card_menu_test.js'; } - - /** @override */ - get featureList() { - return { - enabled: [ - 'features::kNewProfilePicker', - ] - }; - } }; TEST_F('ProfileCardMenuTest', 'All', function() {
diff --git a/chromecast/crash/linux/dump_info.cc b/chromecast/crash/linux/dump_info.cc index f3b35782..a2d4ccf7 100644 --- a/chromecast/crash/linux/dump_info.cc +++ b/chromecast/crash/linux/dump_info.cc
@@ -157,7 +157,7 @@ ++num_params; // Disallow extraneous params - if (dict->size() != num_params) + if (dict->DictSize() != num_params) return false; valid_ = true;
diff --git a/chromecast/crash/linux/synchronized_minidump_manager.cc b/chromecast/crash/linux/synchronized_minidump_manager.cc index 015c490..d47d0c4 100644 --- a/chromecast/crash/linux/synchronized_minidump_manager.cc +++ b/chromecast/crash/linux/synchronized_minidump_manager.cc
@@ -126,7 +126,7 @@ base::DictionaryValue* ratelimit_params = GetRatelimitParams(metadata); return ratelimit_params && - ratelimit_params->size() == kLockfileNumRatelimitParams && + ratelimit_params->DictSize() == kLockfileNumRatelimitParams && !GetRatelimitPeriodStart(metadata).is_null() && GetRatelimitPeriodDumps(metadata) >= 0; }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index d47057b..b418f50 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -13989.0.0 \ No newline at end of file +13991.0.0 \ No newline at end of file
diff --git a/chromeos/components/diagnostics_ui/backend/session_log_handler.cc b/chromeos/components/diagnostics_ui/backend/session_log_handler.cc index d35cfe99..b030817 100644 --- a/chromeos/components/diagnostics_ui/backend/session_log_handler.cc +++ b/chromeos/components/diagnostics_ui/backend/session_log_handler.cc
@@ -8,6 +8,7 @@ #include "base/files/file_util.h" #include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" +#include "base/task/thread_pool.h" #include "base/values.h" #include "chromeos/components/diagnostics_ui/backend/routine_log.h" #include "chromeos/components/diagnostics_ui/backend/telemetry_log.h" @@ -58,7 +59,15 @@ void SessionLogHandler::FileSelected(const base::FilePath& path, int index, void* params) { - const bool success = CreateSessionLog(path); + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, {base::MayBlock()}, + base::BindOnce(&SessionLogHandler::CreateSessionLog, + base::Unretained(this), std::move(path)), + base::BindOnce(&SessionLogHandler::OnSessionLogCreated, + weak_factory_.GetWeakPtr())); +} + +void SessionLogHandler::OnSessionLogCreated(const bool success) { ResolveJavascriptCallback(base::Value(save_session_log_callback_id_), base::Value(success)); save_session_log_callback_id_ = "";
diff --git a/chromeos/components/diagnostics_ui/backend/session_log_handler.h b/chromeos/components/diagnostics_ui/backend/session_log_handler.h index b6c7a0f..9bf5494e 100644 --- a/chromeos/components/diagnostics_ui/backend/session_log_handler.h +++ b/chromeos/components/diagnostics_ui/backend/session_log_handler.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" #include "content/public/browser/web_ui_message_handler.h" #include "ui/shell_dialogs/select_file_dialog.h" #include "ui/shell_dialogs/select_file_policy.h" @@ -52,6 +53,8 @@ int index, void* params) override; + void OnSessionLogCreated(const bool success); + void FileSelectionCanceled(void* params) override; SessionLogHandler(const SessionLogHandler&) = delete; @@ -79,6 +82,8 @@ std::unique_ptr<RoutineLog> routine_log_; std::string save_session_log_callback_id_; scoped_refptr<ui::SelectFileDialog> select_file_dialog_; + + base::WeakPtrFactory<SessionLogHandler> weak_factory_{this}; }; } // namespace diagnostics
diff --git a/chromeos/components/diagnostics_ui/backend/session_log_handler_unittest.cc b/chromeos/components/diagnostics_ui/backend/session_log_handler_unittest.cc index 7d79d55..628802a 100644 --- a/chromeos/components/diagnostics_ui/backend/session_log_handler_unittest.cc +++ b/chromeos/components/diagnostics_ui/backend/session_log_handler_unittest.cc
@@ -15,6 +15,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/test/task_environment.h" #include "base/values.h" #include "chromeos/components/diagnostics_ui/backend/log_test_helpers.h" #include "chromeos/components/diagnostics_ui/backend/routine_log.h" @@ -211,7 +212,7 @@ base::ListValue args; args.Append(kHandlerFunctionName); web_ui_.HandleReceivedMessage("saveSessionLog", &args); - + task_environment_.RunUntilIdle(); const std::string expected_telemetry_log_header = "=== Telemetry Log ==="; const std::string expected_system_info_section_name = "--- System Info ---"; const std::string expected_snapshot_time_prefix = "Snapshot Time: "; @@ -258,6 +259,7 @@ base::ListValue args; args.Append(kHandlerFunctionName); web_ui_.HandleReceivedMessage("saveSessionLog", &args); + task_environment_.RunUntilIdle(); EXPECT_EQ(call_data_count_before_call + 1u, web_ui_.call_data().size()); const content::TestWebUI::CallData& call_data =
diff --git a/chromeos/components/fast_pair/DIR_METADATA b/chromeos/components/fast_pair/DIR_METADATA new file mode 100644 index 0000000..4891ec87 --- /dev/null +++ b/chromeos/components/fast_pair/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail: { + component: "OS>Systems>Multidevice>FastPair" +}
diff --git a/chromeos/components/fast_pair/OWNERS b/chromeos/components/fast_pair/OWNERS new file mode 100644 index 0000000..f0f3a774 --- /dev/null +++ b/chromeos/components/fast_pair/OWNERS
@@ -0,0 +1,2 @@ +shanefitz@google.com +jonmann@chromium.org
diff --git a/chromeos/components/fast_pair/common/BUILD.gn b/chromeos/components/fast_pair/common/BUILD.gn new file mode 100644 index 0000000..aed93ad --- /dev/null +++ b/chromeos/components/fast_pair/common/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2021 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. + +assert(is_chromeos, "Fast Pair is CrOS only") + +source_set("common") { + sources = [ + "fast_pair_features.cc", + "fast_pair_features.h", + ] + + public_deps = [ "//base" ] + + deps = [] +}
diff --git a/chromeos/components/fast_pair/common/fast_pair_features.cc b/chromeos/components/fast_pair/common/fast_pair_features.cc new file mode 100644 index 0000000..117bcb0 --- /dev/null +++ b/chromeos/components/fast_pair/common/fast_pair_features.cc
@@ -0,0 +1,14 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/fast_pair/common/fast_pair_features.h" + +namespace chromeos { +namespace features { + +// Enables Fast Pair functionality. +const base::Feature kFastPair{"FastPair", base::FEATURE_DISABLED_BY_DEFAULT}; + +} // namespace features +} // namespace chromeos
diff --git a/chromeos/components/fast_pair/common/fast_pair_features.h b/chromeos/components/fast_pair/common/fast_pair_features.h new file mode 100644 index 0000000..1b52bf8f --- /dev/null +++ b/chromeos/components/fast_pair/common/fast_pair_features.h
@@ -0,0 +1,18 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_FAST_PAIR_COMMON_FAST_PAIR_FEATURES_H_ +#define CHROMEOS_COMPONENTS_FAST_PAIR_COMMON_FAST_PAIR_FEATURES_H_ + +#include "base/feature_list.h" + +namespace chromeos { +namespace features { + +extern const base::Feature kFastPair; + +} // namespace features +} // namespace chromeos + +#endif // CHROMEOS_COMPONENTS_FAST_PAIR_COMMON_FAST_PAIR_FEATURES_H_
diff --git a/chromeos/dbus/missive/fake_missive_client.cc b/chromeos/dbus/missive/fake_missive_client.cc index e8e4848..f154e96 100644 --- a/chromeos/dbus/missive/fake_missive_client.cc +++ b/chromeos/dbus/missive/fake_missive_client.cc
@@ -24,7 +24,7 @@ void FakeMissiveClient::Init() { auto missive_storage_module_delegate = std::make_unique<MissiveStorageModuleDelegateImpl>( - base::BindRepeating(&FakeMissiveClient::AddRecord, + base::BindRepeating(&FakeMissiveClient::EnqueueRecord, weak_ptr_factory_.GetWeakPtr()), base::BindRepeating(&FakeMissiveClient::Flush, weak_ptr_factory_.GetWeakPtr()), @@ -36,7 +36,7 @@ MissiveStorageModule::Create(std::move(missive_storage_module_delegate)); } -void FakeMissiveClient::AddRecord( +void FakeMissiveClient::EnqueueRecord( const reporting::Priority priority, reporting::Record record, base::OnceCallback<void(reporting::Status)> completion_callback) {
diff --git a/chromeos/dbus/missive/fake_missive_client.h b/chromeos/dbus/missive/fake_missive_client.h index 6b55d02..602c621 100644 --- a/chromeos/dbus/missive/fake_missive_client.h +++ b/chromeos/dbus/missive/fake_missive_client.h
@@ -24,7 +24,7 @@ void Init(); private: - void AddRecord( + void EnqueueRecord( const reporting::Priority priority, reporting::Record record, base::OnceCallback<void(reporting::Status)> completion_callback) override;
diff --git a/chromeos/dbus/missive/missive_client.cc b/chromeos/dbus/missive/missive_client.cc index 8fdc958..a7bdc93 100644 --- a/chromeos/dbus/missive/missive_client.cc +++ b/chromeos/dbus/missive/missive_client.cc
@@ -7,8 +7,10 @@ #include <memory> #include "base/bind.h" +#include "base/bind_post_task.h" #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/logging.h" #include "base/memory/weak_ptr.h" #include "chromeos/dbus/missive/fake_missive_client.h" #include "components/reporting/proto/interface.pb.h" @@ -48,17 +50,28 @@ MissiveClientImpl(const MissiveClientImpl& other) = delete; MissiveClientImpl& operator=(const MissiveClientImpl& other) = delete; void Init(dbus::Bus* const bus) { + origin_task_runner_ = bus->GetOriginTaskRunner(); + DCHECK(!missive_service_proxy_); + auto missive_storage_module_delegate = std::make_unique<MissiveStorageModuleDelegateImpl>( - base::BindRepeating(&MissiveClientImpl::AddRecord, - weak_ptr_factory_.GetWeakPtr()), - base::BindRepeating(&MissiveClientImpl::Flush, - weak_ptr_factory_.GetWeakPtr()), - base::BindRepeating(&MissiveClientImpl::ReportSuccess, - weak_ptr_factory_.GetWeakPtr()), - base::BindRepeating(&MissiveClientImpl::UpdateEncryptionKey, - weak_ptr_factory_.GetWeakPtr())); + base::BindPostTask( + origin_task_runner_, + base::BindRepeating(&MissiveClientImpl::EnqueueRecord, + weak_ptr_factory_.GetWeakPtr())), + base::BindPostTask( + origin_task_runner_, + base::BindRepeating(&MissiveClientImpl::Flush, + weak_ptr_factory_.GetWeakPtr())), + base::BindPostTask( + origin_task_runner_, + base::BindRepeating(&MissiveClientImpl::ReportSuccess, + weak_ptr_factory_.GetWeakPtr())), + base::BindPostTask( + origin_task_runner_, + base::BindRepeating(&MissiveClientImpl::UpdateEncryptionKey, + weak_ptr_factory_.GetWeakPtr()))); missive_storage_module_ = MissiveStorageModule::Create( std::move(missive_storage_module_delegate)); @@ -68,10 +81,10 @@ } private: - void AddRecord(const reporting::Priority priority, - reporting::Record record, - base::OnceCallback<void(reporting::Status)> - completion_callback) override { + void EnqueueRecord(const reporting::Priority priority, + reporting::Record record, + base::OnceCallback<void(reporting::Status)> + completion_callback) override { reporting::EnqueueRecordRequest request; *request.mutable_record() = std::move(record); request.set_priority(priority); @@ -83,14 +96,20 @@ missive_service_proxy_->CallMethod( &method_call, kTimeoutMs, - base::BindOnce(&MissiveClientImpl::HandleAddRecordResponse, + base::BindOnce(&MissiveClientImpl::HandleEnqueueRecordResponse, weak_ptr_factory_.GetWeakPtr(), std::move(completion_callback))); } - void HandleAddRecordResponse( + void HandleEnqueueRecordResponse( base::OnceCallback<void(reporting::Status)> completion_callback, dbus::Response* response) { + if (!response) { + std::move(completion_callback) + .Run(Status(reporting::error::UNAVAILABLE, + "EnqueueRecord is not exported by missived")); + return; + } dbus::MessageReader reader(response); reporting::EnqueueRecordResponse response_body; reader.PopArrayOfBytesAsProto(&response_body); @@ -120,6 +139,12 @@ void HandleFlushResponse( base::OnceCallback<void(reporting::Status)> completion_callback, dbus::Response* response) { + if (!response) { + std::move(completion_callback) + .Run(Status(reporting::error::UNAVAILABLE, + "HandleFlushResponse is not exported by missived")); + return; + } dbus::MessageReader reader(response); reporting::FlushPriorityResponse response_body; reader.PopArrayOfBytesAsProto(&response_body); @@ -147,21 +172,21 @@ void UpdateEncryptionKey( const reporting::SignedEncryptionInfo& encryption_info) override { - // TODO(1174889): Uncomment the following code once system_api has been - // updated with kUpdateEncryptionKey. - // reporting::UpdateEncryptKeyRequest request; - // *request.mutable_signed_encryption_info() = std::move(encryption_info); - // dbus::MethodCall method_call(missive::MissiveServiceInterface, - // missive::kUpdateEncryptionKey); - // dbus::MessageWriter writer(&method_call); - // writer.AppendProtoAsArrayOfBytes(request); + reporting::UpdateEncryptionKeyRequest request; + *request.mutable_signed_encryption_info() = std::move(encryption_info); + dbus::MethodCall method_call(missive::kMissiveServiceInterface, + missive::kUpdateEncryptionKey); + dbus::MessageWriter writer(&method_call); + writer.AppendProtoAsArrayOfBytes(request); - // missive_service_proxy_->CallMethod( - // &method_call, kTimeoutMs, base::DoNothing()); + missive_service_proxy_->CallMethod(&method_call, kTimeoutMs, + base::DoNothing()); return; } - dbus::ObjectProxy* missive_service_proxy_ = nullptr; + scoped_refptr<dbus::ObjectProxy> missive_service_proxy_; + + scoped_refptr<base::SequencedTaskRunner> origin_task_runner_; // Must be last class member. base::WeakPtrFactory<MissiveClientImpl> weak_ptr_factory_{this};
diff --git a/chromeos/dbus/missive/missive_client.h b/chromeos/dbus/missive/missive_client.h index a227b66c..eb4496e 100644 --- a/chromeos/dbus/missive/missive_client.h +++ b/chromeos/dbus/missive/missive_client.h
@@ -44,7 +44,7 @@ scoped_refptr<reporting::MissiveStorageModule> missive_storage_module_; private: - virtual void AddRecord( + virtual void EnqueueRecord( const reporting::Priority priority, reporting::Record record, base::OnceCallback<void(reporting::Status)> completion_callback) = 0;
diff --git a/chromeos/services/libassistant/audio/audio_input_impl.cc b/chromeos/services/libassistant/audio/audio_input_impl.cc index c68f250f..b8fe262 100644 --- a/chromeos/services/libassistant/audio/audio_input_impl.cc +++ b/chromeos/services/libassistant/audio/audio_input_impl.cc
@@ -210,7 +210,8 @@ } // Runs on audio service thread. - void OnCaptureError(const std::string& message) override { + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) override { LOG(ERROR) << "Capture error " << message; base::AutoLock lock(observers_lock_); for (auto* observer : observers_)
diff --git a/chromeos/ui/frame/frame_utils.cc b/chromeos/ui/frame/frame_utils.cc index ab8e598..559e137 100644 --- a/chromeos/ui/frame/frame_utils.cc +++ b/chromeos/ui/frame/frame_utils.cc
@@ -5,6 +5,7 @@ #include "chromeos/ui/frame/frame_utils.h" #include "chromeos/ui/base/chromeos_ui_constants.h" +#include "chromeos/ui/base/tablet_state.h" #include "chromeos/ui/base/window_properties.h" #include "ui/aura/env.h" #include "ui/aura/window.h" @@ -34,9 +35,11 @@ // Check the frame first, as we allow a small area overlapping the contents // to be used for resize handles. views::Widget* widget = view->GetWidget(); - // Ignore the resize border when maximized or full screen. + bool in_tablet_mode = chromeos::TabletState::Get()->InTabletMode(); + // Ignore the resize border when maximized or full screen or in (split view) + // tablet mode. const bool has_resize_border = - !widget->IsMaximized() && !widget->IsFullscreen(); + !widget->IsMaximized() && !widget->IsFullscreen() && !in_tablet_mode; const int resize_border_size = has_resize_border ? chromeos::kResizeInsideBoundsSize : 0;
diff --git a/components/BUILD.gn b/components/BUILD.gn index 8139703..a30d95ea 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -642,7 +642,6 @@ "metrics/content/subprocess_metrics_provider_browsertest.cc", "optimization_guide/content/renderer/page_text_agent_browsertest.cc", "paint_preview/renderer/paint_preview_recorder_browsertest.cc", - "security_state/content/content_utils_browsertest.cc", "ukm/content/source_url_recorder_browsertest.cc", ]
diff --git a/components/cast_streaming/DEPS b/components/cast_streaming/DEPS index cce7e79..f8f3627 100644 --- a/components/cast_streaming/DEPS +++ b/components/cast_streaming/DEPS
@@ -1,6 +1,10 @@ include_rules = [ "+content/public/common", - "-components/cast_streaming", "+net", "+services/network/public", + + # The browser and renderer code may not depend on eachother, and can only + # depend on shared "public" code. + "-components/cast_streaming", + "+components/cast_streaming/public", ]
diff --git a/components/cast_streaming/browser/BUILD.gn b/components/cast_streaming/browser/BUILD.gn index 950ef3e..d740ff4b 100644 --- a/components/cast_streaming/browser/BUILD.gn +++ b/components/cast_streaming/browser/BUILD.gn
@@ -40,7 +40,7 @@ "//mojo/public/cpp/system", ] public_deps = [ - "//components/cast_streaming/mojo:mojom", + "//components/cast_streaming/public/mojom", "//third_party/openscreen/src/cast/common:channel", ] visibility = [ ":*" ]
diff --git a/components/cast_streaming/browser/DEPS b/components/cast_streaming/browser/DEPS index e76d5654..0376433a 100644 --- a/components/cast_streaming/browser/DEPS +++ b/components/cast_streaming/browser/DEPS
@@ -1,6 +1,5 @@ include_rules = [ "+components/cast/message_port", - "+components/cast_streaming/mojo", "+components/openscreen_platform", "+media/base", "+media/mojo",
diff --git a/components/cast_streaming/browser/public/receiver_session.h b/components/cast_streaming/browser/public/receiver_session.h index 2032de7a..2db3ddbc 100644 --- a/components/cast_streaming/browser/public/receiver_session.h +++ b/components/cast_streaming/browser/public/receiver_session.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/callback.h" -#include "components/cast_streaming/mojo/cast_streaming_session.mojom.h" +#include "components/cast_streaming/public/mojom/cast_streaming_session.mojom.h" #include "mojo/public/cpp/bindings/associated_remote.h" namespace cast_api_bindings {
diff --git a/components/cast_streaming/browser/receiver_session_impl.h b/components/cast_streaming/browser/receiver_session_impl.h index 58193083..8d649415 100644 --- a/components/cast_streaming/browser/receiver_session_impl.h +++ b/components/cast_streaming/browser/receiver_session_impl.h
@@ -7,7 +7,7 @@ #include "components/cast_streaming/browser/cast_streaming_session.h" #include "components/cast_streaming/browser/public/receiver_session.h" -#include "components/cast_streaming/mojo/cast_streaming_session.mojom.h" +#include "components/cast_streaming/public/mojom/cast_streaming_session.mojom.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/components/cast_streaming/mojo/BUILD.gn b/components/cast_streaming/public/mojom/BUILD.gn similarity index 100% rename from components/cast_streaming/mojo/BUILD.gn rename to components/cast_streaming/public/mojom/BUILD.gn
diff --git a/components/cast_streaming/mojo/OWNERS b/components/cast_streaming/public/mojom/OWNERS similarity index 100% rename from components/cast_streaming/mojo/OWNERS rename to components/cast_streaming/public/mojom/OWNERS
diff --git a/components/cast_streaming/mojo/cast_streaming_session.mojom b/components/cast_streaming/public/mojom/cast_streaming_session.mojom similarity index 100% rename from components/cast_streaming/mojo/cast_streaming_session.mojom rename to components/cast_streaming/public/mojom/cast_streaming_session.mojom
diff --git a/components/cast_streaming/renderer/BUILD.gn b/components/cast_streaming/renderer/BUILD.gn index 2dc75ed3..afad152 100644 --- a/components/cast_streaming/renderer/BUILD.gn +++ b/components/cast_streaming/renderer/BUILD.gn
@@ -9,7 +9,7 @@ source_set("renderer") { deps = [ "//base", - "//components/cast_streaming/mojo:mojom", + "//components/cast_streaming/public/mojom", "//media", "//media/mojo/common", "//mojo/public/cpp/bindings",
diff --git a/components/cast_streaming/renderer/DEPS b/components/cast_streaming/renderer/DEPS index 89d16417..d19ff23 100644 --- a/components/cast_streaming/renderer/DEPS +++ b/components/cast_streaming/renderer/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+components/cast_streaming/mojo", "+media/base", "+media/mojo", "+mojo/public",
diff --git a/components/cast_streaming/renderer/cast_streaming_demuxer.h b/components/cast_streaming/renderer/cast_streaming_demuxer.h index 6750400..5818c70 100644 --- a/components/cast_streaming/renderer/cast_streaming_demuxer.h +++ b/components/cast_streaming/renderer/cast_streaming_demuxer.h
@@ -5,7 +5,7 @@ #ifndef COMPONENTS_CAST_STREAMING_RENDERER_CAST_STREAMING_DEMUXER_H_ #define COMPONENTS_CAST_STREAMING_RENDERER_CAST_STREAMING_DEMUXER_H_ -#include "components/cast_streaming/mojo/cast_streaming_session.mojom.h" +#include "components/cast_streaming/public/mojom/cast_streaming_session.mojom.h" #include "media/base/demuxer.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/components/cast_streaming/renderer/cast_streaming_receiver.h b/components/cast_streaming/renderer/cast_streaming_receiver.h index 57ba88c..18ea020f 100644 --- a/components/cast_streaming/renderer/cast_streaming_receiver.h +++ b/components/cast_streaming/renderer/cast_streaming_receiver.h
@@ -7,7 +7,7 @@ #include "base/callback.h" #include "base/sequence_checker.h" -#include "components/cast_streaming/mojo/cast_streaming_session.mojom.h" +#include "components/cast_streaming/public/mojom/cast_streaming_session.mojom.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
diff --git a/components/certificate_transparency/BUILD.gn b/components/certificate_transparency/BUILD.gn index 3eedd649..e560bd9 100644 --- a/components/certificate_transparency/BUILD.gn +++ b/components/certificate_transparency/BUILD.gn
@@ -2,12 +2,24 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//third_party/protobuf/proto_library.gni") + +proto_library("proto") { + sources = [ + "certificate_transparency.proto", + "certificate_transparency_config.proto", + "ct_timestamp.proto", + ] +} + static_library("certificate_transparency") { sources = [ "chrome_ct_policy_enforcer.cc", "chrome_ct_policy_enforcer.h", "chrome_require_ct_delegate.cc", "chrome_require_ct_delegate.h", + "ct_features.cc", + "ct_features.h", "ct_known_logs.cc", "ct_known_logs.h", "pref_names.cc", @@ -24,6 +36,8 @@ "//net", "//url", ] + + public_deps = [ ":proto" ] } source_set("unit_tests") {
diff --git a/components/certificate_transparency/certificate_transparency.proto b/components/certificate_transparency/certificate_transparency.proto new file mode 100644 index 0000000..3cd039d --- /dev/null +++ b/components/certificate_transparency/certificate_transparency.proto
@@ -0,0 +1,116 @@ +// Copyright 2021 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. + +syntax = "proto3"; + +package chrome_browser_certificate_transparency; + +import "ct_timestamp.proto"; + +option optimize_for = LITE_RUNTIME; + +// Represents the final state of a log at the time it was made read-only. +message FinalTreeHead { + // Size of the log at the time it was made read-only. + uint64 tree_size = 1; + // Root hash of the log (base64-encoded) at the time it was made read-only. + string sha256_root_hash = 2; +} + +message CTLog { + // Human-readable description to identify log. + string description = 1; + // Public key of the log, as a DER-encoded ASN.1 SubjectPublicKeyInfo + // structure, then encoded as base64 + // (https://tools.ietf.org/html/rfc5280#section-4.1.2.7). + string key = 2; + // The base64-encoded LogID found in SCTs issued by this log + // (https://tools.ietf.org/html/rfc6962#section-3.2). + string log_id = 3; + // Maximum merge delay, in seconds. The log should not take longer than this + // to incorporate a certificate. + uint64 mmd_secs = 4; + // URL of the log's HTTP API. + string url = 5; + + message Interval { + CTTimestamp start = 1; + CTTimestamp end = 2; + } + // The log will only accept certificates that expire between those dates. + // Start time is inclusive, end time is not inclusive. + Interval temporal_interval = 6; + + enum Purpose { + UNSET_PURPOSE = 0; + PROD = 1; + TEST = 2; + } + // Whether the log is for production purposes, or test only. + Purpose purpose = 7; + + enum CurrentState { + UNSET_STATE = 0; + PENDING = 1; + QUALIFIED = 2; + USABLE = 3; + READ_ONLY = 4; + RETIRED = 5; + REJECTED = 6; + } + message State { + // Current state of the log. + CurrentState current_state = 1; + // Time at which the log entered this state. + CTTimestamp state_start = 2; + } + // State history of the log. Inverse chronological order, first element should + // be the current state. + repeated State state = 8; + + message OperatorChange { + // Name of the log operator. + string name = 1; + // Timestamp at which this operator started operating this log. + CTTimestamp operator_start = 2; + } + // History of all log operators that have ever operated this log, including + // the timestamp at which each started operating it. Inverse chronological + // order, first element should be the current operator. + repeated OperatorChange operator_history = 9; + + // State of the log at the time it was made read-only. Should only be set if + // state is READ_ONLY. + FinalTreeHead read_only_info = 16; +} + +message LogOperator { + // Name of this log operator. + string name = 1; + // Email addresses at which the log operator can be reached. + repeated string email = 2; +} + +message CTLogList { + // Major version of the list, incremented any time there are changes in the + // list, except for trivial (i.e. timestamp-only) changes. + uint64 list_version_major = 1; + // Minor version of the list, incremented any time the list is modified with + // only trivial (i.e. timestamp-only) changes. Allows consumers to determine + // the timestamp at which certain changes occur; for example, if a log is + // rejected, a consumer can look at the minor version 1 of that major version + // to determine at what timestamp that change was made. + uint64 list_version_minor = 2; + // Log list timestamp. This is meant to be used for freshness checks, and is + // updated periodically regardless of whether the list contents' have changed. + // Use list_version_major instead if monitoring for list contents' changes. + CTTimestamp timestamp = 3; + // Compatibility version, incremented if the list structure is changed in a + // non-backwards-compatible way. + uint64 compatibility_version = 4; + // Contains all known log operators. + repeated LogOperator operators = 5; + // Contains all known logs. + repeated CTLog logs = 6; +} \ No newline at end of file
diff --git a/components/certificate_transparency/certificate_transparency_config.proto b/components/certificate_transparency/certificate_transparency_config.proto new file mode 100644 index 0000000..e2f2db2 --- /dev/null +++ b/components/certificate_transparency/certificate_transparency_config.proto
@@ -0,0 +1,19 @@ +// Copyright 2021 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. + +syntax = "proto3"; + +package chrome_browser_certificate_transparency; + +import "certificate_transparency.proto"; + +option optimize_for = LITE_RUNTIME; + +// Certificate transparency configuration as used by Chrome. +message CTConfig { + // Emergency switch to disable all CT enforcement. + bool disable_ct_enforcement = 1; + // Logs Chrome should recognize. + CTLogList log_list = 2; +} \ No newline at end of file
diff --git a/components/certificate_transparency/ct_features.cc b/components/certificate_transparency/ct_features.cc new file mode 100644 index 0000000..16f8de4 --- /dev/null +++ b/components/certificate_transparency/ct_features.cc
@@ -0,0 +1,15 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/certificate_transparency/ct_features.h" + +namespace certificate_transparency { +namespace features { + +const base::Feature kCertificateTransparencyComponentUpdater{ + "CertificateTransparencyComponentUpdater", + base::FEATURE_DISABLED_BY_DEFAULT}; + +} // namespace features +} // namespace certificate_transparency
diff --git a/components/certificate_transparency/ct_features.h b/components/certificate_transparency/ct_features.h new file mode 100644 index 0000000..ca2e926 --- /dev/null +++ b/components/certificate_transparency/ct_features.h
@@ -0,0 +1,18 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_CERTIFICATE_TRANSPARENCY_CT_FEATURES_H_ +#define COMPONENTS_CERTIFICATE_TRANSPARENCY_CT_FEATURES_H_ + +#include "base/feature_list.h" + +namespace certificate_transparency { +namespace features { + +extern const base::Feature kCertificateTransparencyComponentUpdater; + +} // namespace features +} // namespace certificate_transparency + +#endif // COMPONENTS_CERTIFICATE_TRANSPARENCY_CT_FEATURES_H_
diff --git a/components/certificate_transparency/ct_timestamp.proto b/components/certificate_transparency/ct_timestamp.proto new file mode 100644 index 0000000..da579e81 --- /dev/null +++ b/components/certificate_transparency/ct_timestamp.proto
@@ -0,0 +1,15 @@ +// Copyright 2021 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. + +syntax = "proto3"; + +package chrome_browser_certificate_transparency; + +option optimize_for = LITE_RUNTIME; + +message CTTimestamp { + int64 seconds = 1; + + int32 nanos = 2; +} \ No newline at end of file
diff --git a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc index e1d9286d..2d58017 100644 --- a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc +++ b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
@@ -29,13 +29,6 @@ namespace discardable_memory { -// This controls whether unlocked memory is released when |ReleaseFreeMemory| is -// called. Enabling this causes |ReleaseFreeMemory| to release all -// unlocked memory instances, as well as release all free memory (as opposed to -// merely releasing all free memory). -const base::Feature kPurgeUnlockedMemory{"PurgeUnlockedMemory", - base::FEATURE_DISABLED_BY_DEFAULT}; - // This controls whether unlocked memory is periodically purged from the // foreground process. Enabling this causes a task to be scheduled at regular // intervals to purge unlocked memory that hasn't been touched in a while. This @@ -483,17 +476,10 @@ } } - ReleaseFreeMemoryImpl(); + ReleaseFreeMemory(); } void ClientDiscardableSharedMemoryManager::ReleaseFreeMemory() { - if (base::FeatureList::IsEnabled(kPurgeUnlockedMemory)) - BackgroundPurge(); - else - ReleaseFreeMemoryImpl(); -} - -void ClientDiscardableSharedMemoryManager::ReleaseFreeMemoryImpl() { TRACE_EVENT0("blink", "ClientDiscardableSharedMemoryManager::ReleaseFreeMemory()"); base::AutoLock lock(lock_);
diff --git a/components/discardable_memory/client/client_discardable_shared_memory_manager.h b/components/discardable_memory/client/client_discardable_shared_memory_manager.h index 009450e..5efc90219 100644 --- a/components/discardable_memory/client/client_discardable_shared_memory_manager.h +++ b/components/discardable_memory/client/client_discardable_shared_memory_manager.h
@@ -66,7 +66,7 @@ void OnBackgrounded(); // Release memory and associated resources that have been purged. - void ReleaseFreeMemory() override; + void ReleaseFreeMemory() override LOCKS_EXCLUDED(lock_); bool LockSpan(DiscardableSharedMemoryHeap::Span* span) EXCLUSIVE_LOCKS_REQUIRED(lock_); @@ -177,7 +177,6 @@ // Releases all unlocked memory that was last locked at least |min_age| ago. void PurgeUnlockedMemory(base::TimeDelta min_age) LOCKS_EXCLUDED(lock_); - void ReleaseFreeMemoryImpl() LOCKS_EXCLUDED(lock_); void UnlockAndReleaseMemory( DiscardableMemoryImpl* memory, std::unique_ptr<DiscardableSharedMemoryHeap::Span> span)
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc index 46f111b..e53e6c3 100644 --- a/components/download/internal/common/download_utils.cc +++ b/components/download/internal/common/download_utils.cc
@@ -54,6 +54,9 @@ // Default time for an overwritten download to be removed from the history. const int kDefaultOverwrittenDownloadExpiredTimeInDays = 90; +// Default buffer size in bytes to write to the download file. +const int kDefaultDownloadFileBufferSize = 4096; + #if defined(OS_ANDROID) // Default maximum length of a downloaded file name on Android. const int kDefaultMaxFileNameLengthOnAndroid = 127; @@ -655,4 +658,10 @@ return base::TimeDelta::FromDays(expired_days); } +int GetDownloadFileBufferSize() { + return base::GetFieldTrialParamByFeatureAsInt( + features::kAllowFileBufferSizeControl, kDownloadFileBufferSizeFinchKey, + kDefaultDownloadFileBufferSize); +} + } // namespace download
diff --git a/components/download/internal/common/stream_handle_input_stream.cc b/components/download/internal/common/stream_handle_input_stream.cc index a118e5a..d694991 100644 --- a/components/download/internal/common/stream_handle_input_stream.cc +++ b/components/download/internal/common/stream_handle_input_stream.cc
@@ -7,15 +7,11 @@ #include "base/bind.h" #include "base/task/post_task.h" #include "components/download/public/common/download_interrupt_reasons_utils.h" +#include "components/download/public/common/download_utils.h" #include "mojo/public/c/system/types.h" namespace download { -namespace { -// Data length to read from data pipe. -const int kBytesToRead = 4096; -} // namespace - StreamHandleInputStream::StreamHandleInputStream( mojom::DownloadStreamHandlePtr stream_handle) : stream_handle_(std::move(stream_handle)), @@ -71,8 +67,9 @@ if (!handle_watcher_) return InputStream::EMPTY; - *length = kBytesToRead; - *data = base::MakeRefCounted<net::IOBuffer>(kBytesToRead); + static int bytes_to_read = GetDownloadFileBufferSize(); + *length = bytes_to_read; + *data = base::MakeRefCounted<net::IOBuffer>(bytes_to_read); MojoResult mojo_result = stream_handle_->stream->ReadData( (*data)->data(), (uint32_t*)length, MOJO_READ_DATA_FLAG_NONE); // TODO(qinmin): figure out when COMPLETE should be returned.
diff --git a/components/download/public/common/download_features.cc b/components/download/public/common/download_features.cc index 409d18d8..04403829 100644 --- a/components/download/public/common/download_features.cc +++ b/components/download/public/common/download_features.cc
@@ -70,6 +70,9 @@ const base::Feature kDeleteOverwrittenDownloads{ "DeleteOverwrittenDownloads", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kAllowFileBufferSizeControl{ + "AllowFileBufferSizeControl", base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace features namespace switches {
diff --git a/components/download/public/common/download_features.h b/components/download/public/common/download_features.h index 891cf65..b34ffc9 100644 --- a/components/download/public/common/download_features.h +++ b/components/download/public/common/download_features.h
@@ -72,6 +72,10 @@ COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature kDeleteOverwrittenDownloads; +// Whether to allow changing the size of file buffer. +COMPONENTS_DOWNLOAD_EXPORT extern const base::Feature + kAllowFileBufferSizeControl; + } // namespace features namespace switches {
diff --git a/components/download/public/common/download_utils.h b/components/download/public/common/download_utils.h index e1e00db..454274b 100644 --- a/components/download/public/common/download_utils.h +++ b/components/download/public/common/download_utils.h
@@ -122,11 +122,17 @@ constexpr char kOverwrittenDownloadDeleteTimeFinchKey[] = "overwritten_download_delete_days"; +// Finch parameter key value for the buffer size to write to the download file. +constexpr char kDownloadFileBufferSizeFinchKey[] = "download_file_buffer_size"; + // Returns the time to delete expired downloads. COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta GetExpiredDownloadDeleteTime(); // Returns the time in days to delete download that is overwritten by others. COMPONENTS_DOWNLOAD_EXPORT base::TimeDelta GetOverwrittenDownloadDeleteTime(); + +// Returns the size of the file buffer that reads data from the data pipe. +COMPONENTS_DOWNLOAD_EXPORT int GetDownloadFileBufferSize(); } // namespace download #endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_UTILS_H_
diff --git a/components/feed/core/proto/BUILD.gn b/components/feed/core/proto/BUILD.gn index d14b9442..1735016 100644 --- a/components/feed/core/proto/BUILD.gn +++ b/components/feed/core/proto/BUILD.gn
@@ -38,6 +38,7 @@ "v2/wire/feed_response.proto", "v2/wire/next_page_token.proto", "v2/wire/payload_metadata.proto", + "v2/wire/reliability_logging_enums.proto", "v2/wire/render_data.proto", "v2/wire/request.proto", "v2/wire/request_schedule.proto",
diff --git a/components/feed/core/proto/v2/wire/capability.proto b/components/feed/core/proto/v2/wire/capability.proto index 854fd053..e0bb418 100644 --- a/components/feed/core/proto/v2/wire/capability.proto +++ b/components/feed/core/proto/v2/wire/capability.proto
@@ -14,7 +14,7 @@ INFINITE_FEED = 5; DISMISS_COMMAND = 9; UNDO_FOR_DISMISS_COMMAND = 10; - WEB_FEEDS = 11; + WEB_FEEDS = 11 [deprecated = true]; SPORTS_IN_GAME_UPDATE = 35; PERSIST_GAME_CONTENT = 46; OPEN_VIDEO_COMMAND = 16;
diff --git a/components/feed/core/proto/v2/wire/reliability_logging_enums.proto b/components/feed/core/proto/v2/wire/reliability_logging_enums.proto new file mode 100644 index 0000000..afefe92 --- /dev/null +++ b/components/feed/core/proto/v2/wire/reliability_logging_enums.proto
@@ -0,0 +1,45 @@ +// Copyright 2021 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. + +syntax = "proto2"; + +package feedreliabilitylogging; + +option optimize_for = LITE_RUNTIME; + +enum DiscoverLaunchResult { + CARDS_FULLY_RENDERED = 1; + CARDS_RENDERED_BUT_IMAGE_LOADING_CANCELLED = 2; + CARDS_RENDERED_BUT_IMAGE_LOADING_FAILED = 3; + INELIGIBLE_DISCOVER_DISABLED = 15; + NO_CARDS_FAILED_TO_GET_AUTH_TOKEN = 23; + NO_CARDS_REQUEST_ERROR_NO_INTERNET = 24; + NO_CARDS_REQUEST_ERROR_OTHER = 25; + NO_CARDS_RESPONSE_ERROR_NON_200 = 26; + NO_CARDS_RESPONSE_ERROR_ZERO_CARDS = 27; + NO_CARDS_UNKNOWN_REASON = 29; + FAILED_TO_RENDER = 5; + NAVIGATED_TO_ANOTHER_TAB = 10; + FRAGMENT_STOPPED = 11; + ABORTED_DUE_TO_INVALID_STATE = 6; + NAVIGATED_AWAY = 31; + FEED_HIDDEN = 32; +} +enum DiscoverCardReadCacheResult { + CACHE_READ_OK = 1; + EMPTY_SESSION = 2; + STALE = 3; + FAILED = 7; +} +enum DiscoverAboveTheFoldRenderResult { + SUCCESS = 1; + FULL_FEED_ERROR = 3; + INTERNAL_ERROR = 4; +} +enum DiscoverImagesInViewportLoadResult { + IMAGES_FULLY_RENDERED = 1; + SOME_IMAGES_FAILED_TO_RENDER = 2; + ALL_IMAGES_FAILED_TO_RENDER = 3; + IMAGE_LOADING_CANCELLED = 4; +}
diff --git a/components/feed/core/proto/v2/wire/web_feed_matcher.proto b/components/feed/core/proto/v2/wire/web_feed_matcher.proto index dbe9fc94..133d98b 100644 --- a/components/feed/core/proto/v2/wire/web_feed_matcher.proto +++ b/components/feed/core/proto/v2/wire/web_feed_matcher.proto
@@ -19,7 +19,7 @@ } oneof match { string text = 2; - string regex = 3; + string partial_match_regex = 3; } CriteriaType criteria_type = 1; }
diff --git a/components/feed/core/proto/v2/wire/web_feeds.proto b/components/feed/core/proto/v2/wire/web_feeds.proto index df91604..1637775 100644 --- a/components/feed/core/proto/v2/wire/web_feeds.proto +++ b/components/feed/core/proto/v2/wire/web_feeds.proto
@@ -15,6 +15,7 @@ STATE_UNSPECIFIED = 0; INACTIVE = 1; ACTIVE = 2; + SUSPENDED = 3; } string name = 1; string title = 2;
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc index 9619d85..f4532a4a 100644 --- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -353,19 +353,27 @@ } TEST_F(FeedApiTest, ForceRefreshForDebugging) { - // First do a normal load via network that will fail. - is_offline_ = true; - TestForYouSurface surface(stream_.get()); - WaitForIdleTaskQueue(); + // Enable WebFeed and subscribe to a page, so that we can check if the WebFeed + // is refreshed by ForceRefreshForDebugging. + base::test::ScopedFeatureList features; + features.InitAndEnableFeature(kWebFeed); + // WebFeed stream is only fetched when there's a subscription. + FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); - // Next, force a refresh that results in a successful load. - is_offline_ = false; + // Force a refresh that results in a successful load of both feed types. + response_translator_.InjectResponse(MakeTypicalInitialModelState()); response_translator_.InjectResponse(MakeTypicalInitialModelState()); stream_->ForceRefreshForDebugging(); WaitForIdleTaskQueue(); - EXPECT_EQ("loading -> cant-refresh -> loading -> 2 slices", - surface.DescribeUpdates()); + + is_offline_ = true; + + TestForYouSurface surface(stream_.get()); + TestWebFeedSurface web_feed_surface(stream_.get()); + WaitForIdleTaskQueue(); + EXPECT_EQ("2 slices", surface.DescribeState()); + EXPECT_EQ("2 slices", web_feed_surface.DescribeState()); } TEST_F(FeedApiTest, RefreshScheduleFlow) { @@ -2163,12 +2171,12 @@ TEST_F(FeedApiTest, LoadingForYouStreamTriggersWebFeedRefreshIfNoUnreadContent) { - Config config = GetFeedConfig(); - config.refresh_web_feed_after_for_you_feed_loads = true; - SetFeedConfigForTesting(config); base::test::ScopedFeatureList features; features.InitAndEnableFeature(kWebFeed); + // WebFeed stream is only fetched when there's a subscription. + FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); + // Both streams should be fetched. response_translator_.InjectResponse(MakeTypicalInitialModelState()); response_translator_.InjectResponse(MakeTypicalInitialModelState()); @@ -2188,15 +2196,30 @@ metrics_reporter_->load_stream_status); } +TEST_F(FeedApiTest, + LoadingForYouStreamDoesNotTriggerWebFeedRefreshIfNoSubscriptions) { + base::test::ScopedFeatureList features; + features.InitAndEnableFeature(kWebFeed); + + // Only for-you feed is fetched on load. + response_translator_.InjectResponse(MakeTypicalInitialModelState()); + TestForYouSurface surface(stream_.get()); + WaitForIdleTaskQueue(); + ASSERT_EQ(1, network_.send_query_call_count); + EXPECT_EQ("loading -> 2 slices", surface.DescribeUpdates()); + EXPECT_EQ(LoadStreamStatus::kLoadedFromNetwork, + metrics_reporter_->load_stream_status); +} + TEST_F( FeedApiTest, LoadForYouStreamDoesNotTriggerWebFeedRefreshContentIfIsAlreadyAvailable) { - Config config = GetFeedConfig(); - config.refresh_web_feed_after_for_you_feed_loads = true; - SetFeedConfigForTesting(config); base::test::ScopedFeatureList features; features.InitAndEnableFeature(kWebFeed); + // WebFeed stream is only fetched when there's a subscription. + FollowWebFeed(MakeWebFeedPageInformation("https://cats.com")); + // Both streams should be fetched because there is no unread web-feed content. response_translator_.InjectResponse(MakeTypicalInitialModelState()); response_translator_.InjectResponse(MakeTypicalInitialModelState());
diff --git a/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc b/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc index f449973..887cd6a9 100644 --- a/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_subscriptions_unittest.cc
@@ -21,45 +21,6 @@ namespace test { namespace { using testing::PrintToString; -constexpr int64_t kFollowerCount = 123; - -WebFeedPageInformation MakeWebFeedPageInformation(const std::string& url) { - WebFeedPageInformation info; - info.SetUrl(GURL(url)); - return info; -} - -feedwire::webfeed::WebFeedMatcher MakeDomainMatcher(const std::string& domain) { - feedwire::webfeed::WebFeedMatcher result; - feedwire::webfeed::WebFeedMatcher::Criteria* criteria = result.add_criteria(); - criteria->set_criteria_type( - feedwire::webfeed::WebFeedMatcher::Criteria::PAGE_URL_HOST_SUFFIX); - criteria->set_text(domain); - return result; -} - -feedwire::webfeed::WebFeed MakeWireWebFeed(const std::string& name) { - feedwire::webfeed::WebFeed result; - result.set_name("id_" + name); - result.set_title("Title " + name); - result.set_subtitle("Subtitle " + name); - result.set_detail_text("details..."); - result.set_visit_uri("https://" + name + ".com"); - result.set_follower_count(kFollowerCount); - *result.add_web_feed_matchers() = MakeDomainMatcher(name + ".com"); - return result; -} - -feedwire::webfeed::FollowWebFeedResponse SuccessfulFollowResponse( - const std::string& follow_name) { - feedwire::webfeed::FollowWebFeedResponse response; - *response.mutable_web_feed() = MakeWireWebFeed(follow_name); - return response; -} - -feedwire::webfeed::UnfollowWebFeedResponse SuccessfulUnfollowResponse() { - return {}; -} FeedNetwork::RawResponse MakeFailedResponse() { FeedNetwork::RawResponse network_response;
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc index debe207..81f14a4 100644 --- a/components/feed/core/v2/api_test/feed_api_test.cc +++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -194,6 +194,10 @@ return result; } +std::string TestSurfaceBase::DescribeState() { + return described_updates_.empty() ? "" : described_updates_.back(); +} + std::map<std::string, std::string> TestSurfaceBase::GetDataStoreEntries() const { return data_store_entries_; @@ -613,9 +617,6 @@ // `use_feed_query_requests_for_web_feeds` is a temporary option for // debugging, setting it to false tests the preferred endpoint. config.use_feed_query_requests_for_web_feeds = false; - // Disable refreshing the Web Feed stream after the for-you stream is loaded, - // to simplify tests unrelated to this feature. - config.refresh_web_feed_after_for_you_feed_loads = false; SetFeedConfigForTesting(config); feed::prefs::RegisterFeedSharedProfilePrefs(profile_prefs_.registry()); @@ -732,6 +733,15 @@ return ss.str(); } +void FeedApiTest::FollowWebFeed(const WebFeedPageInformation page_info) { + CallbackReceiver<WebFeedSubscriptions::FollowWebFeedResult> callback; + network_.InjectResponse(SuccessfulFollowResponse(page_info.url().host())); + stream_->subscriptions().FollowWebFeed(page_info, callback.Bind()); + + EXPECT_EQ(WebFeedSubscriptionRequestStatus::kSuccess, + callback.RunAndGetResult().request_status); +} + void FeedApiTest::UploadActions(std::vector<feedwire::FeedAction> actions) { size_t actions_remaining = actions.size(); for (feedwire::FeedAction& action : actions) {
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h index 3b34d86..935ba515 100644 --- a/components/feed/core/v2/api_test/feed_api_test.h +++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -26,6 +26,7 @@ #include "components/feed/core/v2/metrics_reporter.h" #include "components/feed/core/v2/prefs.h" #include "components/feed/core/v2/public/feed_stream_surface.h" +#include "components/feed/core/v2/public/types.h" #include "components/feed/core/v2/stream_model.h" #include "components/feed/core/v2/test/proto_printer.h" #include "components/feed/core/v2/test/stream_builder.h" @@ -91,6 +92,8 @@ // Returns a description of the updates this surface received. Each update // is separated by ' -> '. Returns only the updates since the last call. std::string DescribeUpdates(); + // Returns a description of the current state, ignoring prior updates. + std::string DescribeState(); std::map<std::string, std::string> GetDataStoreEntries() const; @@ -369,6 +372,7 @@ bool IsTaskQueueIdle() const; void WaitForIdleTaskQueue(); void UnloadModel(const StreamType& stream_type); + void FollowWebFeed(const WebFeedPageInformation page_info); // Dumps the state of |FeedStore| to a string for debugging. std::string DumpStoreState(bool print_keys = false);
diff --git a/components/feed/core/v2/config.h b/components/feed/core/v2/config.h index 61e3b00..c5b395f 100644 --- a/components/feed/core/v2/config.h +++ b/components/feed/core/v2/config.h
@@ -80,9 +80,6 @@ // Number of days of history to query when determining whether to show the // follow accelerator. int webfeed_accelerator_recent_visit_history_days = 14; - // After loading the for-you feed, should the web-feed be refreshed as well? - // This is true except for testing. - bool refresh_web_feed_after_for_you_feed_loads = true; // Configuration for `PersistentKeyValueStore`.
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index 23b728c..bec041d 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -245,10 +245,10 @@ // When done loading the for-you feed, try to refresh the web-feed if there's // no unread content. - if (base::FeatureList::IsEnabled(kWebFeed) && - GetFeedConfig().refresh_web_feed_after_for_you_feed_loads) { + if (base::FeatureList::IsEnabled(kWebFeed)) { if (result.stream_type.IsForYou()) { - if (!HasUnreadContent(kWebFeedStream)) { + if (!HasUnreadContent(kWebFeedStream) && + subscriptions().IsWebFeedSubscriber()) { LoadStreamTask::Options options; options.load_type = LoadStreamTask::LoadType::kBackgroundRefresh; options.stream_type = kWebFeedStream; @@ -582,7 +582,7 @@ if (base::FeatureList::IsEnabled(kWebFeed)) { UnloadModel(kWebFeedStream); store_->ClearStreamData(kWebFeedStream, base::DoNothing()); - TriggerStreamLoad(kWebFeedStream); + // WebFeed is refreshed automatically after for-you. } }
diff --git a/components/feed/core/v2/test/proto_printer.cc b/components/feed/core/v2/test/proto_printer.cc index 8b92d1d..f059c85 100644 --- a/components/feed/core/v2/test/proto_printer.cc +++ b/components/feed/core/v2/test/proto_printer.cc
@@ -279,7 +279,7 @@ const feedwire::webfeed::WebFeedMatcher::Criteria& v) { BeginMessage(); PRINT_FIELD(text); - PRINT_FIELD(regex); + PRINT_FIELD(partial_match_regex); PRINT_FIELD(criteria_type); EndMessage(); return *this;
diff --git a/components/feed/core/v2/test/stream_builder.cc b/components/feed/core/v2/test/stream_builder.cc index fad2d5f..2191682 100644 --- a/components/feed/core/v2/test/stream_builder.cc +++ b/components/feed/core/v2/test/stream_builder.cc
@@ -278,4 +278,42 @@ return result; } +feedwire::webfeed::WebFeed MakeWireWebFeed(const std::string& name) { + feedwire::webfeed::WebFeed result; + result.set_name("id_" + name); + result.set_title("Title " + name); + result.set_subtitle("Subtitle " + name); + result.set_detail_text("details..."); + result.set_visit_uri("https://" + name + ".com"); + result.set_follower_count(kFollowerCount); + *result.add_web_feed_matchers() = MakeDomainMatcher(name + ".com"); + return result; +} + +feedwire::webfeed::FollowWebFeedResponse SuccessfulFollowResponse( + const std::string& follow_name) { + feedwire::webfeed::FollowWebFeedResponse response; + *response.mutable_web_feed() = MakeWireWebFeed(follow_name); + return response; +} + +feedwire::webfeed::UnfollowWebFeedResponse SuccessfulUnfollowResponse() { + return {}; +} + +WebFeedPageInformation MakeWebFeedPageInformation(const std::string& url) { + WebFeedPageInformation info; + info.SetUrl(GURL(url)); + return info; +} + +feedwire::webfeed::WebFeedMatcher MakeDomainMatcher(const std::string& domain) { + feedwire::webfeed::WebFeedMatcher result; + feedwire::webfeed::WebFeedMatcher::Criteria* criteria = result.add_criteria(); + criteria->set_criteria_type( + feedwire::webfeed::WebFeedMatcher::Criteria::PAGE_URL_HOST_SUFFIX); + criteria->set_text(domain); + return result; +} + } // namespace feed
diff --git a/components/feed/core/v2/test/stream_builder.h b/components/feed/core/v2/test/stream_builder.h index f52dcb2e..b805428d 100644 --- a/components/feed/core/v2/test/stream_builder.h +++ b/components/feed/core/v2/test/stream_builder.h
@@ -11,6 +11,7 @@ #include "base/time/time.h" #include "components/feed/core/proto/v2/store.pb.h" +#include "components/feed/core/proto/v2/wire/web_feeds.pb.h" #include "components/feed/core/v2/proto_util.h" #include "components/feed/core/v2/protocol_translator.h" #include "components/feed/core/v2/types.h" @@ -20,6 +21,7 @@ struct StreamModelUpdateRequest; extern base::Time kTestTimeEpoch; +constexpr int64_t kFollowerCount = 123; ContentId MakeContentId(ContentId::Type type, std::string content_domain, @@ -92,7 +94,13 @@ StreamModelUpdateRequest::Source source = StreamModelUpdateRequest::Source::kNetworkLoadMore); +feedwire::webfeed::WebFeed MakeWireWebFeed(const std::string& name); feedstore::WebFeedInfo MakeWebFeedInfo(const std::string& name); +WebFeedPageInformation MakeWebFeedPageInformation(const std::string& url); +feedwire::webfeed::FollowWebFeedResponse SuccessfulFollowResponse( + const std::string& follow_name); +feedwire::webfeed::UnfollowWebFeedResponse SuccessfulUnfollowResponse(); +feedwire::webfeed::WebFeedMatcher MakeDomainMatcher(const std::string& domain); } // namespace feed
diff --git a/components/feed/core/v2/web_feed_subscriptions/web_feed_index.cc b/components/feed/core/v2/web_feed_subscriptions/web_feed_index.cc index 464e0d4f..68d21b4 100644 --- a/components/feed/core/v2/web_feed_subscriptions/web_feed_index.cc +++ b/components/feed/core/v2/web_feed_subscriptions/web_feed_index.cc
@@ -226,8 +226,9 @@ const std::string* text = nullptr; const std::string* regex = nullptr; switch (criteria.match_case()) { - case feedwire::webfeed::WebFeedMatcher::Criteria::MatchCase::kRegex: - regex = &criteria.regex(); + case feedwire::webfeed::WebFeedMatcher::Criteria::MatchCase:: + kPartialMatchRegex: + regex = &criteria.partial_match_regex(); if (regex->empty()) return false; break; @@ -266,8 +267,9 @@ const std::string* text = nullptr; const std::string* regex = nullptr; switch (criteria.match_case()) { - case feedwire::webfeed::WebFeedMatcher::Criteria::MatchCase::kRegex: - regex = &criteria.regex(); + case feedwire::webfeed::WebFeedMatcher::Criteria::MatchCase:: + kPartialMatchRegex: + regex = &criteria.partial_match_regex(); break; case feedwire::webfeed::WebFeedMatcher::Criteria::MatchCase::kText: text = &criteria.text();
diff --git a/components/feed/core/v2/web_feed_subscriptions/web_feed_index_unittest.cc b/components/feed/core/v2/web_feed_subscriptions/web_feed_index_unittest.cc index 9c1ed3b..b146ffb 100644 --- a/components/feed/core/v2/web_feed_subscriptions/web_feed_index_unittest.cc +++ b/components/feed/core/v2/web_feed_subscriptions/web_feed_index_unittest.cc
@@ -33,7 +33,7 @@ const std::string& regex) { feedwire::webfeed::WebFeedMatcher::Criteria criteria; criteria.set_criteria_type(criteria_type); - criteria.set_regex(regex); + criteria.set_partial_match_regex(regex); return criteria; }
diff --git a/components/feed/core/v2/web_feed_subscriptions/wire_to_store.cc b/components/feed/core/v2/web_feed_subscriptions/wire_to_store.cc index 5310de6..52dcc6c 100644 --- a/components/feed/core/v2/web_feed_subscriptions/wire_to_store.cc +++ b/components/feed/core/v2/web_feed_subscriptions/wire_to_store.cc
@@ -14,6 +14,7 @@ feedstore::WebFeedInfo::State ConvertToStore( feedwire::webfeed::WebFeed::State value) { + // TODO(harringtond): Add SUSPENDED state. switch (value) { case feedwire::webfeed::WebFeed::State::WebFeed_State_ACTIVE: return feedstore::WebFeedInfo::State::WebFeedInfo_State_ACTIVE;
diff --git a/components/feedback/OWNERS b/components/feedback/OWNERS index 699355a..795f92a 100644 --- a/components/feedback/OWNERS +++ b/components/feedback/OWNERS
@@ -1,3 +1,9 @@ +# Primary OWNERS +jimmyxgong@chromium.org +joonbug@chromium.org + +# Backup OWNERS +zentaro@chromium.org afakhry@chromium.org iby@chromium.org mutexlox@chromium.org
diff --git a/components/full_restore/full_restore_read_and_save_unittest.cc b/components/full_restore/full_restore_read_and_save_unittest.cc index 7ec3817..63b01589 100644 --- a/components/full_restore/full_restore_read_and_save_unittest.cc +++ b/components/full_restore/full_restore_read_and_save_unittest.cc
@@ -154,6 +154,10 @@ ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir()); } + void TearDown() override { + FullRestoreSaveHandler::GetInstance()->ClearForTesting(); + } + const base::FilePath& GetPath() { return tmp_dir_.GetPath(); } void ReadFromFile(const base::FilePath& file_path) {
diff --git a/components/full_restore/full_restore_save_handler.cc b/components/full_restore/full_restore_save_handler.cc index b5690d31..149704ce 100644 --- a/components/full_restore/full_restore_save_handler.cc +++ b/components/full_restore/full_restore_save_handler.cc
@@ -339,6 +339,18 @@ return arc_save_handler_->GetArcSessionId(); } +void FullRestoreSaveHandler::ClearForTesting() { + profile_path_to_file_handler_.clear(); + profile_path_to_restore_data_.clear(); + app_id_to_app_launch_infos_.clear(); + active_profile_path_.clear(); + primary_profile_path_.clear(); + save_running_.clear(); + pending_save_profile_paths_.clear(); + window_id_to_app_restore_info_.clear(); + app_id_to_app_launch_infos_.clear(); +} + void FullRestoreSaveHandler::MaybeStartSaveTimer() { if (!save_timer_.IsRunning() && save_running_.empty()) { save_timer_.Start(FROM_HERE, kSaveDelay,
diff --git a/components/full_restore/full_restore_save_handler.h b/components/full_restore/full_restore_save_handler.h index 503ab44c..d94bd86 100644 --- a/components/full_restore/full_restore_save_handler.h +++ b/components/full_restore/full_restore_save_handler.h
@@ -127,6 +127,9 @@ base::OneShotTimer* GetTimerForTesting() { return &save_timer_; } + // Since this is a singleton, tests may need to clear it between tests. + void ClearForTesting(); + private: friend class FullRestoreSaveHandlerTestApi;
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java index c0851af3..ebb1b23 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java
@@ -129,4 +129,28 @@ () -> { getActivity().setContentView(view, params); }); mRenderTestRule.render(view, "message_banner_basic_with_spannable_description"); } + + @Test + @SmallTest + @Feature({"RenderTest", "Messages"}) + public void testBasic_multilineDescriptionMaxLines() throws Exception { + Activity activity = getActivity(); + final String multilineDescription = "Line 1\nLine 2\nLine 3\nLine 4"; + PropertyModel model = + new PropertyModel.Builder(MessageBannerProperties.ALL_KEYS) + .with(MessageBannerProperties.TITLE, "Primary Title") + .with(MessageBannerProperties.DESCRIPTION, multilineDescription) + .with(MessageBannerProperties.DESCRIPTION_MAX_LINES, 2) + .with(MessageBannerProperties.PRIMARY_BUTTON_TEXT, "Action") + .build(); + MessageBannerView view = (MessageBannerView) LayoutInflater.from(activity).inflate( + R.layout.message_banner_view, null, false); + PropertyModelChangeProcessor.create(model, view, MessageBannerViewBinder::bind); + LayoutParams params = + new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + + TestThreadUtils.runOnUiThreadBlocking( + () -> { getActivity().setContentView(view, params); }); + mRenderTestRule.render(view, "message_banner_basic_with_multiline_description"); + } } \ No newline at end of file
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java index 7615ef13..8d882ec 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java
@@ -8,6 +8,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -70,6 +71,11 @@ mDescription.setText(description); } + void setDescriptionMaxLines(int maxLines) { + mDescription.setMaxLines(maxLines); + mDescription.setEllipsize(TextUtils.TruncateAt.END); + } + void setIcon(Drawable icon) { mIconView.setImageDrawable(icon); }
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerViewBinder.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerViewBinder.java index f4b147f..988c5a0 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerViewBinder.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerViewBinder.java
@@ -6,6 +6,7 @@ import static org.chromium.components.messages.MessageBannerProperties.ALPHA; import static org.chromium.components.messages.MessageBannerProperties.DESCRIPTION; +import static org.chromium.components.messages.MessageBannerProperties.DESCRIPTION_MAX_LINES; import static org.chromium.components.messages.MessageBannerProperties.ICON; import static org.chromium.components.messages.MessageBannerProperties.ICON_RESOURCE_ID; import static org.chromium.components.messages.MessageBannerProperties.ICON_TINT_COLOR; @@ -42,6 +43,8 @@ view.setTitle(model.get(TITLE)); } else if (propertyKey == DESCRIPTION) { view.setDescription(model.get(DESCRIPTION)); + } else if (propertyKey == DESCRIPTION_MAX_LINES) { + view.setDescriptionMaxLines(model.get(DESCRIPTION_MAX_LINES)); } else if (propertyKey == ICON) { view.setIcon(model.get(ICON)); } else if (propertyKey == ICON_RESOURCE_ID) {
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java b/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java index 4fc6017..a21dff10 100644 --- a/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java +++ b/components/messages/android/java/src/org/chromium/components/messages/MessageBannerProperties.java
@@ -34,6 +34,11 @@ public static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); public static final WritableObjectPropertyKey<CharSequence> DESCRIPTION = new WritableObjectPropertyKey<>(); + /** + * DESCRIPTION_MAX_LINES allows limiting description view to the specified number of lines. The + * description will be ellipsized with TruncateAt.END option. + */ + public static final WritableIntPropertyKey DESCRIPTION_MAX_LINES = new WritableIntPropertyKey(); public static final WritableObjectPropertyKey<Drawable> ICON = new WritableObjectPropertyKey<>(); @@ -74,8 +79,9 @@ new WritableObjectPropertyKey<>(); public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {PRIMARY_BUTTON_TEXT, - PRIMARY_BUTTON_CLICK_LISTENER, TITLE, DESCRIPTION, ICON, ICON_RESOURCE_ID, - ICON_TINT_COLOR, SECONDARY_ICON, SECONDARY_ICON_RESOURCE_ID, SECONDARY_BUTTON_MENU_TEXT, - SECONDARY_ICON_CONTENT_DESCRIPTION, DISMISSAL_DURATION, TRANSLATION_X, TRANSLATION_Y, - ALPHA, ON_TOUCH_RUNNABLE, ON_PRIMARY_ACTION, ON_SECONDARY_ACTION, ON_DISMISSED}; + PRIMARY_BUTTON_CLICK_LISTENER, TITLE, DESCRIPTION, DESCRIPTION_MAX_LINES, ICON, + ICON_RESOURCE_ID, ICON_TINT_COLOR, SECONDARY_ICON, SECONDARY_ICON_RESOURCE_ID, + SECONDARY_BUTTON_MENU_TEXT, SECONDARY_ICON_CONTENT_DESCRIPTION, DISMISSAL_DURATION, + TRANSLATION_X, TRANSLATION_Y, ALPHA, ON_TOUCH_RUNNABLE, ON_PRIMARY_ACTION, + ON_SECONDARY_ACTION, ON_DISMISSED}; }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java b/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java index b130bc07..153f72b 100644 --- a/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java +++ b/components/messages/android/java/src/org/chromium/components/messages/MessageWrapper.java
@@ -66,6 +66,16 @@ } @CalledByNative + int getDescriptionMaxLines() { + return mMessageProperties.get(MessageBannerProperties.DESCRIPTION_MAX_LINES); + } + + @CalledByNative + void setDescriptionMaxLines(int maxLines) { + mMessageProperties.set(MessageBannerProperties.DESCRIPTION_MAX_LINES, maxLines); + } + + @CalledByNative String getPrimaryButtonText() { return mMessageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT); }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageWrapperTest.java b/components/messages/android/java/src/org/chromium/components/messages/MessageWrapperTest.java index e995666..4213b1f4 100644 --- a/components/messages/android/java/src/org/chromium/components/messages/MessageWrapperTest.java +++ b/components/messages/android/java/src/org/chromium/components/messages/MessageWrapperTest.java
@@ -58,6 +58,10 @@ Assert.assertEquals("Description doesn't match provided value", "Description", messageProperties.get(MessageBannerProperties.DESCRIPTION)); + message.setDescriptionMaxLines(2); + Assert.assertEquals("Description max lines doesn't match provided value", 2, + messageProperties.get(MessageBannerProperties.DESCRIPTION_MAX_LINES)); + message.setPrimaryButtonText("Primary button"); Assert.assertEquals("Button text doesn't match provided value", "Primary button", messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT));
diff --git a/components/messages/android/message_wrapper.cc b/components/messages/android/message_wrapper.cc index 5d55ca7..4433a66c 100644 --- a/components/messages/android/message_wrapper.cc +++ b/components/messages/android/message_wrapper.cc
@@ -56,6 +56,17 @@ Java_MessageWrapper_setDescription(env, java_message_wrapper_, jdescription); } +int MessageWrapper::GetDescriptionMaxLines() { + JNIEnv* env = base::android::AttachCurrentThread(); + return Java_MessageWrapper_getDescriptionMaxLines(env, java_message_wrapper_); +} + +void MessageWrapper::SetDescriptionMaxLines(int max_lines) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_MessageWrapper_setDescriptionMaxLines(env, java_message_wrapper_, + max_lines); +} + std::u16string MessageWrapper::GetPrimaryButtonText() { JNIEnv* env = base::android::AttachCurrentThread(); base::android::ScopedJavaLocalRef<jstring> jprimary_button_text =
diff --git a/components/messages/android/message_wrapper.h b/components/messages/android/message_wrapper.h index 8e29bfc..889acff 100644 --- a/components/messages/android/message_wrapper.h +++ b/components/messages/android/message_wrapper.h
@@ -37,6 +37,12 @@ void SetTitle(const std::u16string& title); std::u16string GetDescription(); void SetDescription(const std::u16string& description); + + // SetDescriptionMaxLines allows limiting description view to the specified + // number of lines. The description will be ellipsized with TruncateAt.END + // option. + int GetDescriptionMaxLines(); + void SetDescriptionMaxLines(int max_lines); std::u16string GetPrimaryButtonText(); void SetPrimaryButtonText(const std::u16string& primary_button_text); std::u16string GetSecondaryButtonMenuText();
diff --git a/components/mirroring/service/captured_audio_input.cc b/components/mirroring/service/captured_audio_input.cc index eeed16f9..2e543c6 100644 --- a/components/mirroring/service/captured_audio_input.cc +++ b/components/mirroring/service/captured_audio_input.cc
@@ -6,6 +6,7 @@ #include "base/check_op.h" #include "base/notreached.h" +#include "media/mojo/common/input_error_code_converter.h" #include "media/mojo/mojom/audio_data_pipe.mojom.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -85,7 +86,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(delegate_); - delegate_->OnError(); + delegate_->OnError(media::ConvertToCaptureCallbackCode(code)); } void CapturedAudioInput::OnMutedStateChanged(bool is_muted) {
diff --git a/components/mirroring/service/captured_audio_input_unittest.cc b/components/mirroring/service/captured_audio_input_unittest.cc index cdb8940..102263db 100644 --- a/components/mirroring/service/captured_audio_input_unittest.cc +++ b/components/mirroring/service/captured_audio_input_unittest.cc
@@ -23,6 +23,8 @@ namespace mirroring { +using AudioSourceErrorCode = media::AudioCapturerSource::ErrorCode; + namespace { class MockStream final : public media::mojom::AudioInputStream { @@ -37,7 +39,7 @@ ~MockDelegate() override {} MOCK_METHOD0(StreamCreated, void()); - MOCK_METHOD0(OnError, void()); + MOCK_METHOD1(OnError, void(AudioSourceErrorCode code)); MOCK_METHOD1(OnMuted, void(bool muted)); MOCK_METHOD0(OnIPCClosed, void()); @@ -103,7 +105,7 @@ void SignalStreamError() { EXPECT_TRUE(stream_client_.is_bound()); base::RunLoop run_loop; - EXPECT_CALL(delegate_, OnError()) + EXPECT_CALL(delegate_, OnError(AudioSourceErrorCode::kUnknown)) .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); stream_client_->OnError(media::mojom::InputStreamErrorCode::kUnknown); run_loop.Run(); @@ -112,7 +114,7 @@ void SignalStreamPermissionsError() { EXPECT_TRUE(stream_client_.is_bound()); base::RunLoop run_loop; - EXPECT_CALL(delegate_, OnError()) + EXPECT_CALL(delegate_, OnError(AudioSourceErrorCode::kSystemPermissions)) .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); stream_client_->OnError( media::mojom::InputStreamErrorCode::kSystemPermissions);
diff --git a/components/mirroring/service/session.cc b/components/mirroring/service/session.cc index d855ac6..dc6e3ce 100644 --- a/components/mirroring/service/session.cc +++ b/components/mirroring/service/session.cc
@@ -354,7 +354,8 @@ audio_data_callback_.Run(std::move(captured_audio), audio_capture_time); } - void OnCaptureError(const std::string& message) override { + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) override { if (!error_callback_.is_null()) std::move(error_callback_).Run(); }
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc index faf1b30..32bfa6f 100644 --- a/components/omnibox/browser/zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -165,12 +165,19 @@ on_clobber_input.set_current_url(GURL(input_url)); on_clobber_input.set_focus_type(OmniboxFocusType::DELETED_PERMANENT_TEXT); - // ZeroSuggest should never deal with prefix suggestions. - EXPECT_FALSE(provider_->AllowZeroSuggestSuggestions(prefix_input)); + // Disable on-clobber. + { + base::test::ScopedFeatureList features; + features.InitAndDisableFeature( + omnibox::kClobberTriggersContextualWebZeroSuggest); - EXPECT_TRUE(provider_->AllowZeroSuggestSuggestions(on_focus_input)); + // ZeroSuggest should never deal with prefix suggestions. + EXPECT_FALSE(provider_->AllowZeroSuggestSuggestions(prefix_input)); - EXPECT_FALSE(provider_->AllowZeroSuggestSuggestions(on_clobber_input)); + EXPECT_TRUE(provider_->AllowZeroSuggestSuggestions(on_focus_input)); + + EXPECT_FALSE(provider_->AllowZeroSuggestSuggestions(on_clobber_input)); + } // Enable on-clobber. { @@ -287,17 +294,27 @@ const ZeroSuggestProvider::ResultType kDefaultContextualWebResultType = ZeroSuggestProvider::ResultType::NONE; - EXPECT_EQ(kDefaultContextualWebResultType, - ZeroSuggestProvider::TypeOfResultToRun( - client_.get(), on_focus_input, suggest_url)); - EXPECT_EQ(kDefaultContextualWebResultType, - ZeroSuggestProvider::TypeOfResultToRun( - client_.get(), on_clobber_input, suggest_url)); + // Disable on-clobber. + { + base::test::ScopedFeatureList features; + features.InitAndDisableFeature( + omnibox::kClobberTriggersContextualWebZeroSuggest); + + EXPECT_EQ(kDefaultContextualWebResultType, + ZeroSuggestProvider::TypeOfResultToRun( + client_.get(), on_focus_input, suggest_url)); + EXPECT_EQ(kDefaultContextualWebResultType, + ZeroSuggestProvider::TypeOfResultToRun( + client_.get(), on_clobber_input, suggest_url)); + } // Enable on-focus only. { base::test::ScopedFeatureList features; - features.InitAndEnableFeature(omnibox::kOnFocusSuggestionsContextualWeb); + features.InitWithFeatures( + {omnibox::kOnFocusSuggestionsContextualWeb}, // Enabled + {omnibox::kClobberTriggersContextualWebZeroSuggest} // Disabled + ); EXPECT_EQ(ZeroSuggestProvider::ResultType::REMOTE_SEND_URL, ZeroSuggestProvider::TypeOfResultToRun( @@ -324,8 +341,9 @@ base::test::ScopedFeatureList features; features.InitWithFeatures( {omnibox::kOnFocusSuggestionsContextualWeb, - omnibox::kClobberTriggersContextualWebZeroSuggest}, - {}); + omnibox::kClobberTriggersContextualWebZeroSuggest}, // Enabled + {} // Disabled + ); EXPECT_EQ(ZeroSuggestProvider::ResultType::REMOTE_SEND_URL, ZeroSuggestProvider::TypeOfResultToRun(
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 29046f7..8d3d7da0 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -137,7 +137,7 @@ // classification (contextual web). const base::Feature kClobberTriggersContextualWebZeroSuggest{ "OmniboxClobberTriggersContextualWebZeroSuggest", - base::FEATURE_DISABLED_BY_DEFAULT}; + enabled_by_default_desktop_only}; // Used to adjust the age threshold since the last visit in order to consider a // normalized keyword search term as a zero-prefix suggestion. If disabled, the
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc index aedd8c94..62967f68 100644 --- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc +++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -203,6 +203,12 @@ WebFeature:: kCrossBrowsingContextGroupMainFrameNulledNonEmptyNameAccessed, WebFeature::kControlledWorkerWillBeUncontrolled, + WebFeature::kUsbDeviceOpen, + WebFeature::kWebBluetoothRemoteServerConnect, + WebFeature::kSerialRequestPort, + WebFeature::kSerialPortOpen, + WebFeature::kHidRequestDevice, + WebFeature::kHidDeviceOpen, })); return *opt_in_features; }
diff --git a/components/policy/core/common/mac_util_unittest.cc b/components/policy/core/common/mac_util_unittest.cc index 554d7240..75d6136 100644 --- a/components/policy/core/common/mac_util_unittest.cc +++ b/components/policy/core/common/mac_util_unittest.cc
@@ -42,7 +42,7 @@ base::ListValue list; for (base::DictionaryValue::Iterator it(root); !it.IsAtEnd(); it.Advance()) list.Append(std::make_unique<base::Value>(it.value().Clone())); - EXPECT_EQ(root.size(), list.GetSize()); + EXPECT_EQ(root.DictSize(), list.GetSize()); list.Append(std::make_unique<base::Value>(root.Clone())); root.SetKey("list", list.Clone());
diff --git a/components/power_scheduler/power_scheduler.cc b/components/power_scheduler/power_scheduler.cc index 4ef10ef..661b8f6 100644 --- a/components/power_scheduler/power_scheduler.cc +++ b/components/power_scheduler/power_scheduler.cc
@@ -7,6 +7,7 @@ #include "base/command_line.h" #include "base/cpu.h" #include "base/cpu_affinity_posix.h" +#include "base/lazy_instance.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/no_destructor.h" @@ -218,10 +219,17 @@ base::TimeTicks now = base::TimeTicks::Now(); if (new_affinity == base::CpuAffinityMode::kDefault && !enforced_affinity_setup_time_.is_null()) { + auto throttling_duration = now - enforced_affinity_setup_time_; UMA_HISTOGRAM_CUSTOM_TIMES("Power.PowerScheduler.ThrottlingDuration", - now - enforced_affinity_setup_time_, + throttling_duration, base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), 100); + + UMA_HISTOGRAM_SCALED_ENUMERATION( + "Power.PowerScheduler.ThrottlingDurationPerCpuAffinityMode", + GetCpuAffinityModeForUma(enforced_affinity_), + throttling_duration.InMicroseconds(), + base::Time::kMicrosecondsPerMillisecond); } enforced_affinity_setup_time_ = now; enforced_affinity_ = new_affinity;
diff --git a/components/reporting/storage/storage_unittest.cc b/components/reporting/storage/storage_unittest.cc index 7ec19d0..7ca4ce23 100644 --- a/components/reporting/storage/storage_unittest.cc +++ b/components/reporting/storage/storage_unittest.cc
@@ -378,7 +378,7 @@ .WillOnce( // Provision the storage with a key. // Key delivery must have been requested above. - Invoke(client_, &MockUploadClient::KeyGeneration)); + WithoutArgs(Invoke(client_, &MockUploadClient::KeyGeneration))); } private:
diff --git a/components/reporting/storage_selector/storage_selector.cc b/components/reporting/storage_selector/storage_selector.cc index b4d6137..7c103b27 100644 --- a/components/reporting/storage_selector/storage_selector.cc +++ b/components/reporting/storage_selector/storage_selector.cc
@@ -9,6 +9,7 @@ #include "base/feature_list.h" #include "base/files/file_path.h" +#include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/path_service.h" #include "build/build_config.h" @@ -83,12 +84,14 @@ "Missive Client has not returned Storage Module")); return; } + LOG(WARNING) << "Store reporting data by a Missive daemon"; std::move(cb).Run(missive_module); return; } #endif // BUILDFLAG(IS_CHROMEOS_ASH) // Use Storage in a local file system. + LOG(WARNING) << "Store reporting data locally"; StorageModule::Create( StorageOptions() .set_directory(local_reporting_path)
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc index 7892c70..7f751777 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc
@@ -286,8 +286,8 @@ base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::TaskPriority::BEST_EFFORT}, base::BindOnce(&ApplyVisualTfLiteModelHelper, bitmap, - model_.tflite_model_input_width(), - model_.tflite_model_input_height(), + model_.tflite_metadata().input_width(), + model_.tflite_metadata().input_height(), std::string(reinterpret_cast<const char*>( visual_tflite_model_.data()), visual_tflite_model_.length())), @@ -334,12 +334,12 @@ } int Scorer::tflite_model_version() const { - return model_.tflite_model_version(); + return model_.tflite_metadata().model_version(); } -const google::protobuf::RepeatedPtrField<ClientSideModel::Threshold>& +const google::protobuf::RepeatedPtrField<TfLiteModelMetadata::Threshold>& Scorer::tflite_thresholds() const { - return model_.tflite_thresholds(); + return model_.tflite_metadata().thresholds(); } double Scorer::ComputeRuleScore(const ClientSideModel::Rule& rule,
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.h b/components/safe_browsing/content/renderer/phishing_classifier/scorer.h index 52e1ae5..9ca73d0 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.h
@@ -99,7 +99,7 @@ int tflite_model_version() const; // Returns the thresholds configured for the visual TFLite model categories. - const google::protobuf::RepeatedPtrField<ClientSideModel::Threshold>& + const google::protobuf::RepeatedPtrField<TfLiteModelMetadata::Threshold>& tflite_thresholds() const; protected:
diff --git a/components/safe_browsing/core/fbs/client_model.fbs b/components/safe_browsing/core/fbs/client_model.fbs index c605e57..48f1fc7 100644 --- a/components/safe_browsing/core/fbs/client_model.fbs +++ b/components/safe_browsing/core/fbs/client_model.fbs
@@ -33,8 +33,12 @@ shingle_size:int = 4; threshold_probability:float = 0.5; vision_model:safe_browsing.flat.VisionModel; - tflite_model_version:int; - tflite_thresholds:[safe_browsing.flat.ClientSideModel_.Threshold]; + tflite_model_version:int (deprecated); + tflite_thresholds:[safe_browsing.flat.ClientSideModel_.Threshold] + (deprecated); + tflite_model_input_width: int (deprecated); + tflite_model_input_height: int (deprecated); + tflite_metadata:safe_browsing.flat.TfLiteModelMetadata; } root_type ClientSideModel; @@ -58,6 +62,13 @@ namespace safe_browsing.flat; +table TfLiteModelMetadata { + version:int; + thresholds:[safe_browsing.flat.ClientSideModel_.Threshold]; + input_width: int; + input_height: int; +} + table VisionModel { targets:[safe_browsing.flat.VisualTarget]; }
diff --git a/components/safe_browsing/core/proto/client_model.proto b/components/safe_browsing/core/proto/client_model.proto index 4a89a31..a3587e0 100644 --- a/components/safe_browsing/core/proto/client_model.proto +++ b/components/safe_browsing/core/proto/client_model.proto
@@ -103,8 +103,20 @@ // The vision model. optional VisionModel vision_model = 12; + // Reserved tag numbers holding deprecated fields. + reserved 13; + reserved 14; + reserved 15; + reserved 16; + + optional TfLiteModelMetadata tflite_metadata = 17; + + // next available tag number: 18 +} + +message TfLiteModelMetadata { // The version number of the visual TFLite model. - optional int32 tflite_model_version = 13; + optional int32 model_version = 1; message Threshold { // The label for the category @@ -117,13 +129,11 @@ // The list of threshold values for each category in the TFLite model. Pages // where the model score exceeds one of these thresholds will be sent to // Safe Browsing for a more definitive classification. - repeated Threshold tflite_thresholds = 14; + repeated Threshold thresholds = 2; // The width and height of the input tensor to the corresponding TFLite model. - optional int32 tflite_model_input_width = 15; - optional int32 tflite_model_input_height = 16; - - // next available tag number: 17 + optional int32 input_width = 3; + optional int32 input_height = 4; } // Wrapper of the vision model for the similarity check target images.
diff --git a/components/security_state/content/BUILD.gn b/components/security_state/content/BUILD.gn index cb1077b..0ba68a0b2 100644 --- a/components/security_state/content/BUILD.gn +++ b/components/security_state/content/BUILD.gn
@@ -6,8 +6,6 @@ sources = [ "content_utils.cc", "content_utils.h", - "ssl_status_input_event_data.cc", - "ssl_status_input_event_data.h", ] public_deps = [
diff --git a/components/security_state/content/content_utils.cc b/components/security_state/content/content_utils.cc index fed2551..31d762f 100644 --- a/components/security_state/content/content_utils.cc +++ b/components/security_state/content/content_utils.cc
@@ -13,7 +13,6 @@ #include "base/strings/utf_string_conversions.h" #include "components/dom_distiller/core/url_constants.h" #include "components/security_interstitials/core/common_string_util.h" -#include "components/security_state/content/ssl_status_input_event_data.h" #include "components/security_state/core/security_state.h" #include "components/strings/grit/components_chromium_strings.h" #include "components/strings/grit/components_strings.h" @@ -73,12 +72,6 @@ security_style_explanations->summary = l10n_util::GetStringUTF8(IDS_HTTP_NONSECURE_SUMMARY); } - if (visible_security_state.insecure_input_events.insecure_field_edited) { - security_style_explanations->insecure_explanations.push_back( - content::SecurityStyleExplanation( - l10n_util::GetStringUTF8(IDS_EDITED_NONSECURE), - l10n_util::GetStringUTF8(IDS_EDITED_NONSECURE_DESCRIPTION))); - } } } @@ -456,12 +449,6 @@ !!(ssl.content_status & content::SSLStatus::DISPLAYED_FORM_WITH_INSECURE_ACTION); - SSLStatusInputEventData* input_events = - static_cast<SSLStatusInputEventData*>(ssl.user_data.get()); - - if (input_events) - state->insecure_input_events = *input_events->input_events(); - return state; }
diff --git a/components/security_state/content/content_utils_browsertest.cc b/components/security_state/content/content_utils_browsertest.cc deleted file mode 100644 index f7a1362..0000000 --- a/components/security_state/content/content_utils_browsertest.cc +++ /dev/null
@@ -1,96 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/security_state/content/content_utils.h" - -#include <memory> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "build/build_config.h" -#include "components/security_state/content/ssl_status_input_event_data.h" -#include "components/security_state/core/insecure_input_event_data.h" -#include "components/security_state/core/security_state.h" -#include "content/public/browser/navigation_controller.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/ssl_status.h" -#include "content/public/browser/web_contents.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/content_browser_test.h" -#include "content/public/test/content_browser_test_utils.h" -#include "content/shell/browser/shell.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -namespace { - -using content::NavigateToURL; -using security_state::GetVisibleSecurityState; -using security_state::InsecureInputEventData; -using security_state::SSLStatusInputEventData; - -const base::FilePath::CharType kDocRoot[] = - FILE_PATH_LITERAL("components/security_state/content/testdata"); - -class SecurityStateContentUtilsBrowserTest - : public content::ContentBrowserTest { - public: - SecurityStateContentUtilsBrowserTest() - : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) { - https_server_.ServeFilesFromSourceDirectory(base::FilePath(kDocRoot)); - } - - protected: - net::EmbeddedTestServer https_server_; - - private: - DISALLOW_COPY_AND_ASSIGN(SecurityStateContentUtilsBrowserTest); -}; - -#if defined(OS_WIN) -#define MAYBE_VisibleSecurityStateInsecureFieldEdit \ - DISABLED_VisibleSecurityStateInsecureFieldEdit -#else -#define MAYBE_VisibleSecurityStateInsecureFieldEdit \ - VisibleSecurityStateInsecureFieldEdit -#endif -// Tests that the flags for nonsecure editing are set correctly. -IN_PROC_BROWSER_TEST_F(SecurityStateContentUtilsBrowserTest, - MAYBE_VisibleSecurityStateInsecureFieldEdit) { - ASSERT_TRUE(https_server_.Start()); - EXPECT_TRUE(NavigateToURL(shell(), https_server_.GetURL("/hello.html"))); - - content::WebContents* contents = shell()->web_contents(); - ASSERT_TRUE(contents); - - // First, ensure the flag is not set prematurely. - content::SSLStatus& ssl_status = - contents->GetController().GetVisibleEntry()->GetSSL(); - SSLStatusInputEventData* ssl_status_input_events = - static_cast<SSLStatusInputEventData*>(ssl_status.user_data.get()); - InsecureInputEventData events; - if (ssl_status_input_events) - events = *ssl_status_input_events->input_events(); - EXPECT_FALSE(events.insecure_field_edited); - - std::unique_ptr<security_state::VisibleSecurityState> visible_state = - GetVisibleSecurityState(contents); - EXPECT_FALSE(visible_state->insecure_input_events.insecure_field_edited); - - // Simulate a field edit and update the SSLStatus' |user_data|. - events.insecure_field_edited = true; - ssl_status.user_data = - std::make_unique<security_state::SSLStatusInputEventData>(events); - - // Verify the field edit was recorded properly in the |user_data|. - ssl_status_input_events = - static_cast<SSLStatusInputEventData*>(ssl_status.user_data.get()); - EXPECT_TRUE(ssl_status_input_events->input_events()->insecure_field_edited); - // Verify the field edit was propagated to the VisibleSecurityState. - visible_state = GetVisibleSecurityState(contents); - EXPECT_TRUE(visible_state->insecure_input_events.insecure_field_edited); -} - -} // namespace
diff --git a/components/security_state/content/content_utils_unittest.cc b/components/security_state/content/content_utils_unittest.cc index 91cde60..8e1cc40 100644 --- a/components/security_state/content/content_utils_unittest.cc +++ b/components/security_state/content/content_utils_unittest.cc
@@ -599,21 +599,6 @@ EXPECT_EQ(0u, explanations.neutral_explanations.size()); } -// Tests that a security level of DANGEROUS on an HTTP page with insecure form -// edits produces blink::SecurityStyleInsecure and an explanation. -TEST(SecurityStateContentUtilsTest, HTTPDangerous) { - security_state::VisibleSecurityState visible_security_state; - visible_security_state.url = GURL("http://scheme-is-not-cryptographic.test"); - content::SecurityStyleExplanations explanations; - visible_security_state.insecure_input_events.insecure_field_edited = true; - blink::SecurityStyle security_style = GetSecurityStyle( - security_state::DANGEROUS, visible_security_state, &explanations); - // Verify that the security style was downgraded and an explanation shown - // because a form was edited. - EXPECT_EQ(blink::SecurityStyle::kInsecureBroken, security_style); - EXPECT_EQ(1u, explanations.insecure_explanations.size()); -} - // Tests that an explanation is provided if a certificate is missing a // subjectAltName extension containing a domain name or IP address. TEST(SecurityStateContentUtilsTest, SubjectAltNameWarning) {
diff --git a/components/security_state/content/ssl_status_input_event_data.cc b/components/security_state/content/ssl_status_input_event_data.cc deleted file mode 100644 index 2dc69e9..0000000 --- a/components/security_state/content/ssl_status_input_event_data.cc +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/security_state/content/ssl_status_input_event_data.h" - -#include <memory> -#include <utility> - -namespace security_state { - -SSLStatusInputEventData::SSLStatusInputEventData() {} -SSLStatusInputEventData::SSLStatusInputEventData( - const InsecureInputEventData& initial_data) - : data_(initial_data) {} - -SSLStatusInputEventData::~SSLStatusInputEventData() {} - -InsecureInputEventData* SSLStatusInputEventData::input_events() { - return &data_; -} - -std::unique_ptr<SSLStatus::UserData> SSLStatusInputEventData::Clone() { - return std::make_unique<SSLStatusInputEventData>(data_); -} - -} // namespace security_state
diff --git a/components/security_state/content/ssl_status_input_event_data.h b/components/security_state/content/ssl_status_input_event_data.h deleted file mode 100644 index 44ac585..0000000 --- a/components/security_state/content/ssl_status_input_event_data.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SECURITY_STATE_CONTENT_SSL_STATUS_INPUT_EVENT_DATA_H_ -#define COMPONENTS_SECURITY_STATE_CONTENT_SSL_STATUS_INPUT_EVENT_DATA_H_ - -#include <memory> - -#include "components/security_state/core/insecure_input_event_data.h" -#include "content/public/browser/ssl_status.h" - -namespace security_state { - -using content::SSLStatus; - -// Stores flags about Input Events in the SSLStatus UserData to -// influence the Security Level of the page. -class SSLStatusInputEventData : public SSLStatus::UserData { - public: - SSLStatusInputEventData(); - explicit SSLStatusInputEventData(const InsecureInputEventData& initial_data); - ~SSLStatusInputEventData() override; - - InsecureInputEventData* input_events(); - - // SSLStatus::UserData: - std::unique_ptr<SSLStatus::UserData> Clone() override; - - private: - InsecureInputEventData data_; - - DISALLOW_COPY_AND_ASSIGN(SSLStatusInputEventData); -}; - -} // namespace security_state - -#endif // COMPONENTS_SECURITY_STATE_CONTENT_SSL_STATUS_INPUT_EVENT_DATA_H_
diff --git a/components/security_state/core/BUILD.gn b/components/security_state/core/BUILD.gn index c76ee42..fde5a10 100644 --- a/components/security_state/core/BUILD.gn +++ b/components/security_state/core/BUILD.gn
@@ -9,7 +9,6 @@ static_library("core") { sources = [ - "insecure_input_event_data.h", "security_state.cc", "security_state.h", ]
diff --git a/components/security_state/core/insecure_input_event_data.h b/components/security_state/core/insecure_input_event_data.h deleted file mode 100644 index e6b9c913..0000000 --- a/components/security_state/core/insecure_input_event_data.h +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SECURITY_STATE_CORE_INSECURE_INPUT_EVENT_DATA_H_ -#define COMPONENTS_SECURITY_STATE_CORE_INSECURE_INPUT_EVENT_DATA_H_ - -namespace security_state { - -// Stores flags about Input Events in the page that may influence -// its security level. -struct InsecureInputEventData { - InsecureInputEventData() : insecure_field_edited(false) {} - ~InsecureInputEventData() {} - - // True if the user edited a field on a non-secure page. - bool insecure_field_edited; -}; - -} // namespace security_state - -#endif // COMPONENTS_SECURITY_STATE_CORE_INSECURE_INPUT_EVENT_DATA_H_
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h index ac0f03c1..0bed2c6 100644 --- a/components/security_state/core/security_state.h +++ b/components/security_state/core/security_state.h
@@ -11,7 +11,6 @@ #include "base/feature_list.h" #include "base/macros.h" -#include "components/security_state/core/insecure_input_event_data.h" #include "net/base/url_util.h" #include "net/cert/cert_status_flags.h" #include "net/cert/sct_status_flags.h" @@ -206,9 +205,6 @@ // state perspective (for example, if a different warning is being shown for // them). bool should_treat_displayed_mixed_forms_as_secure; - // Contains information about input events that may impact the security - // level of the page. - InsecureInputEventData insecure_input_events; }; // These security levels describe the treatment given to pages that
diff --git a/components/security_state/core/security_state_unittest.cc b/components/security_state/core/security_state_unittest.cc index 600aad4..e43e35c54 100644 --- a/components/security_state/core/security_state_unittest.cc +++ b/components/security_state/core/security_state_unittest.cc
@@ -13,7 +13,6 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "components/security_state/core/features.h" -#include "components/security_state/core/insecure_input_event_data.h" #include "net/cert/x509_certificate.h" #include "net/ssl/ssl_cipher_suite_names.h" #include "net/ssl/ssl_connection_status_flags.h" @@ -94,9 +93,6 @@ is_view_source_ = is_view_source; } - void set_insecure_field_edit(bool insecure_field_edit) { - insecure_input_events_.insecure_field_edited = insecure_field_edit; - } void set_has_policy_certificate(bool has_policy_cert) { has_policy_certificate_ = has_policy_cert; } @@ -120,7 +116,6 @@ state->malicious_content_status = malicious_content_status_; state->is_error_page = is_error_page_; state->is_view_source = is_view_source_; - state->insecure_input_events = insecure_input_events_; state->safety_tip_info = safety_tip_info_; return state; } @@ -146,7 +141,6 @@ bool is_error_page_; bool is_view_source_; bool has_policy_certificate_; - InsecureInputEventData insecure_input_events_; security_state::SafetyTipInfo safety_tip_info_; }; @@ -312,16 +306,12 @@ EXPECT_EQ(DANGEROUS, helper.GetSecurityLevel()); } -// Tests that WARNING is set on normal http pages regardless of -// form edits. -TEST(SecurityStateTest, WarningOnHttpAndFormEdits) { +// Tests that HTTP URLs cause a WARNING security level. +TEST(SecurityStateTest, WarningOnHttp) { TestSecurityStateHelper helper; helper.SetUrl(GURL(kHttpUrl)); EXPECT_EQ(WARNING, helper.GetSecurityLevel()); - - helper.set_insecure_field_edit(true); - EXPECT_EQ(WARNING, helper.GetSecurityLevel()); } // Tests that |safety_tip_status| effects security level appropriately.
diff --git a/components/security_state/ios/BUILD.gn b/components/security_state/ios/BUILD.gn index 3243ff0..22149a2a 100644 --- a/components/security_state/ios/BUILD.gn +++ b/components/security_state/ios/BUILD.gn
@@ -5,12 +5,8 @@ component("ios") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ - "insecure_input_tab_helper.h", - "insecure_input_tab_helper.mm", "security_state_utils.h", "security_state_utils.mm", - "ssl_status_input_event_data.h", - "ssl_status_input_event_data.mm", ] deps = [ "//base",
diff --git a/components/security_state/ios/insecure_input_tab_helper.h b/components/security_state/ios/insecure_input_tab_helper.h deleted file mode 100644 index d1535462..0000000 --- a/components/security_state/ios/insecure_input_tab_helper.h +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SECURITY_STATE_IOS_INSECURE_INPUT_TAB_HELPER_H_ -#define COMPONENTS_SECURITY_STATE_IOS_INSECURE_INPUT_TAB_HELPER_H_ - -#include "base/macros.h" -#include "components/autofill/ios/form_util/form_activity_observer.h" -#include "ios/web/public/web_state_observer.h" -#import "ios/web/public/web_state_user_data.h" - -// Observes user activity on forms and receives notifications about page content -// from autofill and updates the page's |SSLStatusUserData| to track insecure -// input events. Such events may change the page's Security Level. -class InsecureInputTabHelper - : public web::WebStateObserver, - public autofill::FormActivityObserver, - public web::WebStateUserData<InsecureInputTabHelper> { - public: - ~InsecureInputTabHelper() override; - - static InsecureInputTabHelper* GetOrCreateForWebState( - web::WebState* web_state); - - // This method should be called when the user edits a field in a non-secure - // context. - void DidEditFieldInInsecureContext(); - - private: - friend class web::WebStateUserData<InsecureInputTabHelper>; - - explicit InsecureInputTabHelper(web::WebState* web_state); - - // FormActivityObserver implementation. - void FormActivityRegistered( - web::WebState* web_state, - web::WebFrame* sender_frame, - const autofill::FormActivityParams& params) override; - - // WebStateObserver implementation. - void DidFinishNavigation(web::WebState* web_state, - web::NavigationContext* navigation_context) override; - void WebStateDestroyed(web::WebState* web_state) override; - - bool IsInsecureContext(); - - // The WebState this instance is observing. Will be null after - // WebStateDestroyed has been called. - web::WebState* web_state_ = nullptr; - - WEB_STATE_USER_DATA_KEY_DECL(); - - DISALLOW_COPY_AND_ASSIGN(InsecureInputTabHelper); -}; - -#endif // COMPONENTS_SECURITY_STATE_IOS_INSECURE_INPUT_TAB_HELPER_H_
diff --git a/components/security_state/ios/insecure_input_tab_helper.mm b/components/security_state/ios/insecure_input_tab_helper.mm deleted file mode 100644 index eea20df..0000000 --- a/components/security_state/ios/insecure_input_tab_helper.mm +++ /dev/null
@@ -1,134 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "components/security_state/ios/insecure_input_tab_helper.h" - -#import <Foundation/Foundation.h> - -#include <memory> - -#include "base/check_op.h" -#include "components/autofill/ios/form_util/form_activity_params.h" -#include "components/autofill/ios/form_util/form_activity_tab_helper.h" -#include "components/security_state/ios/ssl_status_input_event_data.h" -#import "ios/web/public/navigation/navigation_context.h" -#import "ios/web/public/navigation/navigation_item.h" -#import "ios/web/public/navigation/navigation_manager.h" -#import "ios/web/public/web_state.h" -#import "ios/web/public/web_state_user_data.h" -#include "services/network/public/cpp/is_potentially_trustworthy.h" -#include "url/origin.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace { - -// Creates or retrieves the |user_data| object in the SSLStatus attached to the -// WebState's NavigationItem. -security_state::SSLStatusInputEventData* GetOrCreateSSLStatusInputEventData( - web::WebState* web_state) { - web::NavigationItem* item = - web_state->GetNavigationManager()->GetLastCommittedItem(); - - // We aren't guaranteed to always have a navigation item. - if (!item) - return nullptr; - - web::SSLStatus& ssl = item->GetSSL(); - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - if (!input_events) { - ssl.user_data = std::make_unique<security_state::SSLStatusInputEventData>(); - input_events = static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - } - return input_events; -} - -} // namespace - -InsecureInputTabHelper::~InsecureInputTabHelper() = default; - -// static -InsecureInputTabHelper* InsecureInputTabHelper::GetOrCreateForWebState( - web::WebState* web_state) { - InsecureInputTabHelper* helper = FromWebState(web_state); - if (!helper) { - CreateForWebState(web_state); - helper = FromWebState(web_state); - DCHECK(helper); - } - return helper; -} - -bool InsecureInputTabHelper::IsInsecureContext() { - // We don't want to mark data URLs as secure, so we check the origin rather - // than calling network::IsUrlPotentiallyTrustworthy. - // See https://w3c.github.io/webappsec-secure-contexts/#is-url-trustworthy - return !network::IsOriginPotentiallyTrustworthy( - url::Origin::Create(web_state_->GetLastCommittedURL())); -} - -void InsecureInputTabHelper::DidEditFieldInInsecureContext() { - DCHECK(IsInsecureContext()); - - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_state_); - if (!input_events) - return; - - // If the first field edit in the web contents was just performed, - // update the SSLStatusInputEventData. - if (!input_events->input_events()->insecure_field_edited) { - input_events->input_events()->insecure_field_edited = true; - web_state_->DidChangeVisibleSecurityState(); - } -} - -InsecureInputTabHelper::InsecureInputTabHelper(web::WebState* web_state) - : web_state_(web_state) { - web_state_->AddObserver(this); - autofill::FormActivityTabHelper::GetOrCreateForWebState(web_state) - ->AddObserver(this); -} - -void InsecureInputTabHelper::FormActivityRegistered( - web::WebState* web_state, - web::WebFrame* sender_frame, - const autofill::FormActivityParams& params) { - DCHECK_EQ(web_state_, web_state); - if (params.type == "input" && IsInsecureContext()) { - DidEditFieldInInsecureContext(); - } -} - -void InsecureInputTabHelper::DidFinishNavigation( - web::WebState* web_state, - web::NavigationContext* navigation_context) { - DCHECK_EQ(web_state_, web_state); - // Check if the navigation should clear insecure input event data (i.e., not a - // same-document navigation). - if (IsInsecureContext() && navigation_context->HasCommitted() && - !navigation_context->IsSameDocument()) { - security_state::SSLStatusInputEventData* input_events = - GetOrCreateSSLStatusInputEventData(web_state_); - if (!input_events) - return; - input_events->input_events()->insecure_field_edited = false; - web_state_->DidChangeVisibleSecurityState(); - } -} - -void InsecureInputTabHelper::WebStateDestroyed(web::WebState* web_state) { - DCHECK_EQ(web_state_, web_state); - autofill::FormActivityTabHelper::GetOrCreateForWebState(web_state) - ->RemoveObserver(this); - web_state_->RemoveObserver(this); - web_state_ = nullptr; -} - -WEB_STATE_USER_DATA_KEY_IMPL(InsecureInputTabHelper)
diff --git a/components/security_state/ios/security_state_utils.mm b/components/security_state/ios/security_state_utils.mm index 88538a9..224106e 100644 --- a/components/security_state/ios/security_state_utils.mm +++ b/components/security_state/ios/security_state_utils.mm
@@ -8,7 +8,6 @@ #import "components/safe_browsing/ios/browser/safe_browsing_url_allow_list.h" #include "components/security_state/core/security_state.h" -#include "components/security_state/ios/ssl_status_input_event_data.h" #include "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h" #include "ios/web/public/security/security_style.h" @@ -102,12 +101,6 @@ (ssl.content_status & web::SSLStatus::DISPLAYED_INSECURE_CONTENT) ? true : false; - security_state::SSLStatusInputEventData* input_events = - static_cast<security_state::SSLStatusInputEventData*>( - ssl.user_data.get()); - if (input_events) - state->insecure_input_events = *input_events->input_events(); - return state; }
diff --git a/components/security_state/ios/security_state_utils_unittest.mm b/components/security_state/ios/security_state_utils_unittest.mm index e6a1544e..22a9ca4 100644 --- a/components/security_state/ios/security_state_utils_unittest.mm +++ b/components/security_state/ios/security_state_utils_unittest.mm
@@ -6,73 +6,29 @@ #import "components/safe_browsing/ios/browser/safe_browsing_url_allow_list.h" #include "components/security_state/core/security_state.h" -#import "components/security_state/ios/insecure_input_tab_helper.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/navigation/navigation_manager.h" -#include "ios/web/public/security/ssl_status.h" #import "ios/web/public/test/web_test_with_web_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -// This test fixture creates an IOSSecurityStateTabHelper and an -// InsecureInputTabHelper for the WebState, then loads a non-secure -// HTML document. +// This test fixture creates an IOSSecurityStateTabHelper, then loads a +// non-secure HTML document. class SecurityStateUtilsTest : public web::WebTestWithWebState { protected: void SetUp() override { web::WebTestWithWebState::SetUp(); SafeBrowsingUrlAllowList::CreateForWebState(web_state()); - InsecureInputTabHelper::CreateForWebState(web_state()); - insecure_input_ = InsecureInputTabHelper::FromWebState(web_state()); - ASSERT_TRUE(insecure_input_); url_ = GURL("http://chromium.test"); LoadHtml(@"<html><body></body></html>", url_); } - // Returns the InsecureInputEventData for current WebState(). - security_state::InsecureInputEventData GetInsecureInputEventData() const { - return security_state::GetVisibleSecurityStateForWebState(web_state()) - ->insecure_input_events; - } - - InsecureInputTabHelper* insecure_input() { return insecure_input_; } - - InsecureInputTabHelper* insecure_input_; GURL url_; }; -// Ensures that |insecure_field_edited| is set only when an editing event has -// been reported. -TEST_F(SecurityStateUtilsTest, SecurityInfoAfterEditing) { - // Verify |insecure_field_edited| is not set prematurely. - security_state::InsecureInputEventData events = GetInsecureInputEventData(); - EXPECT_FALSE(events.insecure_field_edited); - - // Simulate an edit and verify |insecure_field_edited| is noted in the - // insecure_input_events. - insecure_input()->DidEditFieldInInsecureContext(); - events = GetInsecureInputEventData(); - EXPECT_TRUE(events.insecure_field_edited); -} - -// Ensures that re-navigating to the same page does not keep -// |insecure_field_set| set. -TEST_F(SecurityStateUtilsTest, InsecureInputClearedOnRenavigation) { - // Simulate an edit and verify |insecure_field_edited| is noted in the - // insecure_input_events. - insecure_input()->DidEditFieldInInsecureContext(); - security_state::InsecureInputEventData events = GetInsecureInputEventData(); - EXPECT_TRUE(events.insecure_field_edited); - - // Navigate to the same page again. - LoadHtml(@"<html><body></body></html>", GURL("http://chromium.test")); - events = GetInsecureInputEventData(); - EXPECT_FALSE(events.insecure_field_edited); -} - // Verifies GetMaliciousContentStatus() return values. TEST_F(SecurityStateUtilsTest, GetMaliciousContentStatus) { SafeBrowsingUrlAllowList* allow_list =
diff --git a/components/security_state/ios/ssl_status_input_event_data.h b/components/security_state/ios/ssl_status_input_event_data.h deleted file mode 100644 index f068411..0000000 --- a/components/security_state/ios/ssl_status_input_event_data.h +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SECURITY_STATE_IOS_SSL_STATUS_INPUT_EVENT_DATA_H_ -#define COMPONENTS_SECURITY_STATE_IOS_SSL_STATUS_INPUT_EVENT_DATA_H_ - -#include <memory> - -#include "components/security_state/core/insecure_input_event_data.h" -#include "ios/web/public/security/ssl_status.h" - -namespace security_state { - -using web::SSLStatus; - -// Stores flags about Input Events in the SSLStatus UserData to -// influence the Security Level of the page. -class SSLStatusInputEventData : public SSLStatus::UserData { - public: - SSLStatusInputEventData(); - explicit SSLStatusInputEventData( - const security_state::InsecureInputEventData& initial_data); - ~SSLStatusInputEventData() override; - - security_state::InsecureInputEventData* input_events(); - - // SSLStatus::UserData: - std::unique_ptr<SSLStatus::UserData> Clone() override; - - private: - security_state::InsecureInputEventData data_; - - DISALLOW_COPY_AND_ASSIGN(SSLStatusInputEventData); -}; - -} // namespace security_state - -#endif // COMPONENTS_SECURITY_STATE_IOS_SSL_STATUS_INPUT_EVENT_DATA_H_
diff --git a/components/security_state/ios/ssl_status_input_event_data.mm b/components/security_state/ios/ssl_status_input_event_data.mm deleted file mode 100644 index eb728d4..0000000 --- a/components/security_state/ios/ssl_status_input_event_data.mm +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/security_state/ios/ssl_status_input_event_data.h" - -#include <memory> - -namespace security_state { - -SSLStatusInputEventData::SSLStatusInputEventData() {} - -SSLStatusInputEventData::SSLStatusInputEventData( - const security_state::InsecureInputEventData& initial_data) - : data_(initial_data) {} - -SSLStatusInputEventData::~SSLStatusInputEventData() {} - -security_state::InsecureInputEventData* -SSLStatusInputEventData::input_events() { - return &data_; -} - -std::unique_ptr<web::SSLStatus::UserData> SSLStatusInputEventData::Clone() { - return std::make_unique<SSLStatusInputEventData>(data_); -} - -} // namespace security_state
diff --git a/components/security_state_strings.grdp b/components/security_state_strings.grdp index 61654e0..9d90169 100644 --- a/components/security_state_strings.grdp +++ b/components/security_state_strings.grdp
@@ -10,12 +10,6 @@ <message name="IDS_HTTP_NONSECURE_SUMMARY" desc="Main summary for where the site is non-secure HTTP." translateable="false"> This page is insecure (unencrypted HTTP). </message> - <message name="IDS_EDITED_NONSECURE" desc="Summary phrase for a security problem where the site is non-secure (HTTP) and user has entered data in a form field." translateable="false"> - Form field edited on a non-secure page - </message> - <message name="IDS_EDITED_NONSECURE_DESCRIPTION" desc="Description of a security problem where the site is non-secure (HTTP) and user has entered data in a form field." translateable="false"> - Data was entered in a field on a non-secure page. A warning has been added to the URL bar. - </message> <message name="IDS_SAFEBROWSING_WARNING" desc="Main summary for page when it has been deemed unsafe by the SafeBrowsing service." translateable="false"> This page is dangerous (flagged by Google Safe Browsing). </message>
diff --git a/components/services/app_service/public/cpp/BUILD.gn b/components/services/app_service/public/cpp/BUILD.gn index ba640fb..9b80a6e 100644 --- a/components/services/app_service/public/cpp/BUILD.gn +++ b/components/services/app_service/public/cpp/BUILD.gn
@@ -179,6 +179,7 @@ "capability_access_update_unittest.cc", "icon_cache_unittest.cc", "icon_coalescer_unittest.cc", + "intent_filter_util_unittest.cc", "intent_util_unittest.cc", "preferred_apps_converter_unittest.cc", "preferred_apps_list_unittest.cc",
diff --git a/components/services/app_service/public/cpp/intent_filter_util.cc b/components/services/app_service/public/cpp/intent_filter_util.cc index b6e522ce..54b3f40 100644 --- a/components/services/app_service/public/cpp/intent_filter_util.cc +++ b/components/services/app_service/public/cpp/intent_filter_util.cc
@@ -170,18 +170,19 @@ // accept, to be used in listing all of the supported links for a given app. std::set<std::string> AppManagementGetSupportedLinks( const apps::mojom::IntentFilterPtr& intent_filter) { - std::set<std::string> supported_links; - std::set<std::string> schemes; std::set<std::string> hosts; + bool is_http_or_https = false; for (auto& condition : intent_filter->conditions) { - // For scheme conditions we add each value to the the |schemes| set. + // For scheme conditions we check if it's http or https and set a Boolean + // if this intent filter is for one of those schemes. if (condition->condition_type == apps::mojom::ConditionType::kScheme) { for (auto& condition_value : condition->condition_values) { // We only care about http and https schemes. if (condition_value->value == url::kHttpScheme || condition_value->value == url::kHttpsScheme) { - schemes.insert(condition_value->value); + is_http_or_https = true; + break; } } @@ -189,28 +190,20 @@ // aren't any http or https scheme values this indicates that no http or // https scheme exists in the intent filter and thus we will have to // return an empty list. - if (schemes.empty()) { + if (!is_http_or_https) { break; } } // For host conditions we add each value to the the |hosts| set. - if (condition->condition_type != apps::mojom::ConditionType::kHost) { + if (condition->condition_type == apps::mojom::ConditionType::kHost) { for (auto& condition_value : condition->condition_values) { hosts.insert(condition_value->value); } } } - // Loop through all combinations of scheme and host and add to - // supported links. - for (auto& scheme : schemes) { - for (auto& host : hosts) { - supported_links.insert(scheme + url::kStandardSchemeSeparator + host); - } - } - - return supported_links; + return is_http_or_https ? hosts : std::set<std::string>(); } } // namespace apps_util
diff --git a/components/services/app_service/public/cpp/intent_filter_util_unittest.cc b/components/services/app_service/public/cpp/intent_filter_util_unittest.cc new file mode 100644 index 0000000..0b7a6d3 --- /dev/null +++ b/components/services/app_service/public/cpp/intent_filter_util_unittest.cc
@@ -0,0 +1,167 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/services/app_service/public/cpp/intent_filter_util.h" + +#include "base/values.h" +#include "components/services/app_service/public/cpp/intent_test_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { +const char kHostUrlGoogle[] = "www.google.com"; +const char kHostUrlGmail[] = "www.gmail.com"; +} // namespace + +class IntentFilterUtilTest : public testing::Test {}; + +TEST_F(IntentFilterUtilTest, EmptyConditionList) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + EXPECT_EQ(apps_util::AppManagementGetSupportedLinks(intent_filter).size(), + 0u); +} + +TEST_F(IntentFilterUtilTest, SingleSchemeAndHost) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kScheme, url::kHttpScheme, + apps::mojom::PatternMatchType::kNone, intent_filter); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kHost, kHostUrlGoogle, + apps::mojom::PatternMatchType::kNone, intent_filter); + + std::set<std::string> links = + apps_util::AppManagementGetSupportedLinks(intent_filter); + + EXPECT_EQ(links.size(), 1u); + EXPECT_EQ(links.count(kHostUrlGoogle), 1u); +} + +TEST_F(IntentFilterUtilTest, InvalidScheme) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kScheme, url::kTelScheme, + apps::mojom::PatternMatchType::kNone, intent_filter); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kHost, kHostUrlGoogle, + apps::mojom::PatternMatchType::kNone, intent_filter); + + std::set<std::string> links = + apps_util::AppManagementGetSupportedLinks(intent_filter); + + EXPECT_EQ(links.size(), 0u); +} + +TEST_F(IntentFilterUtilTest, MultipleValidSchemeAndOneHost) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + std::vector<apps::mojom::ConditionValuePtr> condition_values; + + condition_values.push_back(apps_util::MakeConditionValue( + url::kHttpScheme, apps::mojom::PatternMatchType::kNone)); + + condition_values.push_back(apps_util::MakeConditionValue( + url::kHttpsScheme, apps::mojom::PatternMatchType::kNone)); + + intent_filter->conditions.push_back(apps_util::MakeCondition( + apps::mojom::ConditionType::kScheme, std::move(condition_values))); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kHost, kHostUrlGoogle, + apps::mojom::PatternMatchType::kNone, intent_filter); + + std::set<std::string> links = + apps_util::AppManagementGetSupportedLinks(intent_filter); + + EXPECT_EQ(links.size(), 1u); + EXPECT_EQ(links.count(kHostUrlGoogle), 1u); +} + +TEST_F(IntentFilterUtilTest, ValidAndInvalidSchemeAndOneHost) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + std::vector<apps::mojom::ConditionValuePtr> condition_values; + + condition_values.push_back(apps_util::MakeConditionValue( + url::kHttpScheme, apps::mojom::PatternMatchType::kNone)); + + condition_values.push_back(apps_util::MakeConditionValue( + url::kTelScheme, apps::mojom::PatternMatchType::kNone)); + + intent_filter->conditions.push_back(apps_util::MakeCondition( + apps::mojom::ConditionType::kScheme, std::move(condition_values))); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kHost, kHostUrlGoogle, + apps::mojom::PatternMatchType::kNone, intent_filter); + + std::set<std::string> links = + apps_util::AppManagementGetSupportedLinks(intent_filter); + + EXPECT_EQ(links.size(), 1u); + EXPECT_EQ(links.count(kHostUrlGoogle), 1u); +} + +TEST_F(IntentFilterUtilTest, OneSchemeAndMultipleHosts) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + apps_util::AddSingleValueCondition( + apps::mojom::ConditionType::kScheme, url::kHttpScheme, + apps::mojom::PatternMatchType::kNone, intent_filter); + + std::vector<apps::mojom::ConditionValuePtr> condition_values; + + condition_values.push_back(apps_util::MakeConditionValue( + kHostUrlGoogle, apps::mojom::PatternMatchType::kNone)); + + condition_values.push_back(apps_util::MakeConditionValue( + kHostUrlGmail, apps::mojom::PatternMatchType::kNone)); + + intent_filter->conditions.push_back(apps_util::MakeCondition( + apps::mojom::ConditionType::kHost, std::move(condition_values))); + + std::set<std::string> links = + apps_util::AppManagementGetSupportedLinks(intent_filter); + + EXPECT_EQ(links.size(), 2u); + EXPECT_EQ(links.count(kHostUrlGoogle), 1u); + EXPECT_EQ(links.count(kHostUrlGmail), 1u); +} + +TEST_F(IntentFilterUtilTest, MultipleSchemesAndMultipleHosts) { + auto intent_filter = apps::mojom::IntentFilter::New(); + + std::vector<apps::mojom::ConditionValuePtr> condition_values_scheme; + + condition_values_scheme.push_back(apps_util::MakeConditionValue( + url::kHttpScheme, apps::mojom::PatternMatchType::kNone)); + + condition_values_scheme.push_back(apps_util::MakeConditionValue( + url::kHttpsScheme, apps::mojom::PatternMatchType::kNone)); + + intent_filter->conditions.push_back(apps_util::MakeCondition( + apps::mojom::ConditionType::kScheme, std::move(condition_values_scheme))); + + std::vector<apps::mojom::ConditionValuePtr> condition_values_host; + + condition_values_host.push_back(apps_util::MakeConditionValue( + kHostUrlGoogle, apps::mojom::PatternMatchType::kNone)); + + condition_values_host.push_back(apps_util::MakeConditionValue( + kHostUrlGmail, apps::mojom::PatternMatchType::kNone)); + + intent_filter->conditions.push_back(apps_util::MakeCondition( + apps::mojom::ConditionType::kHost, std::move(condition_values_host))); + + std::set<std::string> links = + apps_util::AppManagementGetSupportedLinks(intent_filter); + + EXPECT_EQ(links.size(), 2u); + EXPECT_EQ(links.count(kHostUrlGoogle), 1u); + EXPECT_EQ(links.count(kHostUrlGmail), 1u); +}
diff --git a/components/services/storage/BUILD.gn b/components/services/storage/BUILD.gn index 3d540f5..ee08b3b 100644 --- a/components/services/storage/BUILD.gn +++ b/components/services/storage/BUILD.gn
@@ -12,8 +12,6 @@ "dom_storage/dom_storage_constants.h", "dom_storage/dom_storage_database.cc", "dom_storage/dom_storage_database.h", - "dom_storage/legacy_dom_storage_database.cc", - "dom_storage/legacy_dom_storage_database.h", "dom_storage/local_storage_impl.cc", "dom_storage/local_storage_impl.h", "dom_storage/session_storage_area_impl.cc", @@ -94,7 +92,6 @@ "//sql", "//third_party/blink/public/common", "//third_party/leveldatabase", - "//third_party/sqlite", "//url", ] @@ -144,7 +141,6 @@ sources = [ "dom_storage/dom_storage_database_unittest.cc", - "dom_storage/legacy_dom_storage_database_unittest.cc", "dom_storage/local_storage_impl_unittest.cc", "dom_storage/session_storage_area_impl_unittest.cc", "dom_storage/session_storage_data_map_unittest.cc", @@ -185,7 +181,6 @@ "//mojo/public/cpp/system", "//net", "//net:test_support", - "//sql:test_support", "//testing/gmock", "//testing/gtest", ]
diff --git a/components/services/storage/dom_storage/legacy_dom_storage_database.cc b/components/services/storage/dom_storage/legacy_dom_storage_database.cc deleted file mode 100644 index e953815..0000000 --- a/components/services/storage/dom_storage/legacy_dom_storage_database.cc +++ /dev/null
@@ -1,258 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" - -#include "base/bind.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h" -#include "sql/database.h" -#include "sql/statement.h" -#include "sql/transaction.h" -#include "third_party/sqlite/sqlite3.h" - -namespace storage { - -LegacyDomStorageDatabase::LegacyDomStorageDatabase( - const base::FilePath& file_path, - std::unique_ptr<FilesystemProxy> filesystem_proxy) - : file_path_(file_path), filesystem_proxy_(std::move(filesystem_proxy)) { - DCHECK(!file_path_.empty()); - Init(); -} - -LegacyDomStorageDatabase::LegacyDomStorageDatabase( - std::unique_ptr<FilesystemProxy> filesystem_proxy) - : filesystem_proxy_(std::move(filesystem_proxy)) { - Init(); -} - -void LegacyDomStorageDatabase::Init() { - failed_to_open_ = false; - tried_to_recreate_ = false; - known_to_be_empty_ = false; -} - -LegacyDomStorageDatabase::~LegacyDomStorageDatabase() { - if (known_to_be_empty_ && !file_path_.empty()) { - // Delete the db and any lingering journal file from disk. - Close(); - sql::Database::Delete(file_path_); - } -} - -void LegacyDomStorageDatabase::ReadAllValues( - LegacyDomStorageValuesMap* result) { - if (!LazyOpen(false)) - return; - - sql::Statement statement( - db_->GetCachedStatement(SQL_FROM_HERE, "SELECT * from ItemTable")); - DCHECK(statement.is_valid()); - - while (statement.Step()) { - std::u16string key = statement.ColumnString16(0); - std::u16string value; - statement.ColumnBlobAsString16(1, &value); - (*result)[key] = value; - } - known_to_be_empty_ = result->empty(); - - // Drop SQLite's caches. - db_->TrimMemory(); -} - -bool LegacyDomStorageDatabase::CommitChanges( - bool clear_all_first, - const LegacyDomStorageValuesMap& changes) { - if (!LazyOpen(!changes.empty())) { - // If we're being asked to commit changes that will result in an - // empty database, we return true if the database file doesn't exist. - return clear_all_first && changes.empty() && - !filesystem_proxy_->PathExists(file_path_); - } - - bool old_known_to_be_empty = known_to_be_empty_; - sql::Transaction transaction(db_.get()); - if (!transaction.Begin()) - return false; - - if (clear_all_first) { - if (!db_->Execute("DELETE FROM ItemTable")) - return false; - known_to_be_empty_ = true; - } - - bool did_delete = false; - bool did_insert = false; - auto it = changes.begin(); - for (; it != changes.end(); ++it) { - sql::Statement statement; - const std::u16string& key = it->first; - const absl::optional<std::u16string>& value = it->second; - if (!value.has_value()) { - statement.Assign(db_->GetCachedStatement( - SQL_FROM_HERE, "DELETE FROM ItemTable WHERE key=?")); - statement.BindString16(0, key); - did_delete = true; - } else { - statement.Assign(db_->GetCachedStatement( - SQL_FROM_HERE, "INSERT INTO ItemTable VALUES (?,?)")); - statement.BindString16(0, key); - statement.BindBlob(1, value.value().data(), - value.value().length() * sizeof(char16_t)); - known_to_be_empty_ = false; - did_insert = true; - } - DCHECK(statement.is_valid()); - statement.Run(); - } - - if (!known_to_be_empty_ && did_delete && !did_insert) { - sql::Statement statement(db_->GetCachedStatement( - SQL_FROM_HERE, "SELECT count(key) from ItemTable")); - if (statement.Step()) - known_to_be_empty_ = statement.ColumnInt(0) == 0; - } - - bool success = transaction.Commit(); - if (!success) - known_to_be_empty_ = old_known_to_be_empty; - - // Drop SQLite's caches. - db_->TrimMemory(); - - return success; -} - -void LegacyDomStorageDatabase::ReportMemoryUsage( - base::trace_event::ProcessMemoryDump* pmd, - const std::string& name) { - if (IsOpen()) - db_->ReportMemoryUsage(pmd, name); -} - -bool LegacyDomStorageDatabase::LazyOpen(bool create_if_needed) { - if (failed_to_open_) { - // Don't try to open a database that we know has failed - // already. - return false; - } - - if (IsOpen()) - return true; - - bool database_exists = filesystem_proxy_->PathExists(file_path_); - - if (!database_exists && !create_if_needed) { - // If the file doesn't exist already and we haven't been asked to create - // a file on disk, then we don't bother opening the database. This means - // we wait until we absolutely need to put something onto disk before we - // do so. - return false; - } - - db_ = std::make_unique<sql::Database>(sql::DatabaseOptions{ - // This database should only be accessed from the process hosting the - // storage service, so exclusive locking is appropriate. - .exclusive_locking = true, - .page_size = 4096, - .cache_size = 500}); - db_->set_histogram_tag("DOMStorageDatabase"); - - // This database is only opened to migrate DOMStorage data to a new backend. - // Given the use case, mmap()'s performance improvements are not worth the - // (tiny amount of) problems that mmap() may cause. - db_->set_mmap_disabled(); - - if (!db_->Open(file_path_)) { - LOG(ERROR) << "Unable to open DOM storage database at " - << file_path_.value() << " error: " << db_->GetErrorMessage(); - if (database_exists && !tried_to_recreate_) - return DeleteFileAndRecreate(); - failed_to_open_ = true; - return false; - } - - // sql::Database uses UTF-8 encoding, but WebCore style databases use - // UTF-16, so ensure we match. - ignore_result(db_->Execute("PRAGMA encoding=\"UTF-16\"")); - - if (!database_exists) { - // This is a new database, create the table and we're done! - if (CreateTableV2()) - return true; - } else { - // The database exists already - check if we need to upgrade - // and whether it's usable (i.e. not corrupted). - SchemaVersion current_version = DetectSchemaVersion(); - - if (current_version == V2) - return true; - } - - // This is the exceptional case - to try and recover we'll attempt - // to delete the file and start again. - Close(); - return DeleteFileAndRecreate(); -} - -LegacyDomStorageDatabase::SchemaVersion -LegacyDomStorageDatabase::DetectSchemaVersion() { - DCHECK(IsOpen()); - - // Connection::Open() may succeed even if the file we try and open is not a - // database, however in the case that the database is corrupted to the point - // that SQLite doesn't actually think it's a database, - // sql::Database::GetCachedStatement will DCHECK when we later try and - // run statements. So we run a query here that will not DCHECK but fail - // on an invalid database to verify that what we've opened is usable. - if (db_->ExecuteAndReturnErrorCode("PRAGMA auto_vacuum") != SQLITE_OK) - return INVALID; - - // Look at the current schema - if it doesn't look right, assume corrupt. - if (!db_->DoesTableExist("ItemTable") || - !db_->DoesColumnExist("ItemTable", "key") || - !db_->DoesColumnExist("ItemTable", "value")) - return INVALID; - - return V2; -} - -bool LegacyDomStorageDatabase::CreateTableV2() { - DCHECK(IsOpen()); - - return db_->Execute( - "CREATE TABLE ItemTable (" - "key TEXT UNIQUE ON CONFLICT REPLACE, " - "value BLOB NOT NULL ON CONFLICT FAIL)"); -} - -bool LegacyDomStorageDatabase::DeleteFileAndRecreate() { - DCHECK(!IsOpen()); - DCHECK(filesystem_proxy_->PathExists(file_path_)); - - // We should only try and do this once. - if (tried_to_recreate_) - return false; - - tried_to_recreate_ = true; - - absl::optional<base::File::Info> info = - filesystem_proxy_->GetFileInfo(file_path_); - // If it's not a directory and we can delete the file, try and open it again. - if (info && !info->is_directory && sql::Database::Delete(file_path_)) { - return LazyOpen(true); - } - - failed_to_open_ = true; - return false; -} - -void LegacyDomStorageDatabase::Close() { - db_.reset(nullptr); -} - -} // namespace storage
diff --git a/components/services/storage/dom_storage/legacy_dom_storage_database.h b/components/services/storage/dom_storage/legacy_dom_storage_database.h deleted file mode 100644 index f6ef243..0000000 --- a/components/services/storage/dom_storage/legacy_dom_storage_database.h +++ /dev/null
@@ -1,139 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_SERVICES_STORAGE_DOM_STORAGE_LEGACY_DOM_STORAGE_DATABASE_H_ -#define COMPONENTS_SERVICES_STORAGE_DOM_STORAGE_LEGACY_DOM_STORAGE_DATABASE_H_ - -#include <map> -#include <memory> -#include <string> - -#include "base/files/file_path.h" -#include "base/gtest_prod_util.h" -#include "sql/database.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace base { -namespace trace_event { -class ProcessMemoryDump; -} -} // namespace base - -namespace storage { - -class FilesystemProxy; - -using LegacyDomStorageValuesMap = - std::map<std::u16string, absl::optional<std::u16string>>; - -// Represents a SQLite based backing for DOM storage data. This -// class is designed to be used on a single thread. -class LegacyDomStorageDatabase { - public: - LegacyDomStorageDatabase(const base::FilePath& file_path, - std::unique_ptr<FilesystemProxy> filesystem_proxy); - virtual ~LegacyDomStorageDatabase(); // virtual for unit testing - - // Reads all the key, value pairs stored in the database and returns them. - // |result| is assumed to be empty and any duplicate keys will be overwritten. - // If the database exists on disk then it will be opened. If it does not exist - // then it will not be created and |result| will be unmodified. - void ReadAllValues(LegacyDomStorageValuesMap* result); - - // Updates the backing database. Will remove all keys before updating the - // database if |clear_all_first| is set. Then all entries in |changes| will be - // examined - keys mapped to a nullopt value will be removed and all others - // will be inserted/updated as appropriate. - bool CommitChanges(bool clear_all_first, - const LegacyDomStorageValuesMap& changes); - - // Adds memory statistics of the database to |pmd| for tracing. - void ReportMemoryUsage(base::trace_event::ProcessMemoryDump* pmd, - const std::string& name); - - // Simple getter for the path we were constructed with. - const base::FilePath& file_path() const { return file_path_; } - - protected: - // Constructor that uses an in-memory sqlite database, for testing. - explicit LegacyDomStorageDatabase( - std::unique_ptr<FilesystemProxy> filesystem_proxy); - - private: - friend class LocalStorageDatabaseAdapter; - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, SimpleOpenAndClose); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, TestLazyOpenIsLazy); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - TestDetectSchemaVersion); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - TestLazyOpenUpgradesDatabase); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - SimpleWriteAndReadBack); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, WriteWithClear); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - UpgradeFromV1ToV2WithData); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - TestSimpleRemoveOneValue); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - TestCanOpenAndReadWebCoreDatabase); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageDatabaseTest, - TestCanOpenFileThatIsNotADatabase); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageAreaTest, BackingDatabaseOpened); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageAreaParamTest, - ShallowCopyWithBacking); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageAreaTest, - EnableDisableCachingWithBacking); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageAreaTest, CommitTasks); - FRIEND_TEST_ALL_PREFIXES(LegacyDomStorageAreaTest, PurgeMemory); - - enum SchemaVersion { - INVALID, - - // V1 is deprecated. - - // 2011-07-15 - https://bugs.webkit.org/show_bug.cgi?id=58762 - V2, - }; - - // Open the database at file_path_ if it exists already and creates it if - // |create_if_needed| is true. - // Ensures we are at the correct database version and creates or updates - // tables as necessary. Returns false on failure. - bool LazyOpen(bool create_if_needed); - - // Analyses the database to verify that the connection that is open is indeed - // a valid database and works out the schema version. - SchemaVersion DetectSchemaVersion(); - - // Creates the database table at V2. Returns true if the table was created - // successfully, false otherwise. Will return false if the table already - // exists. - bool CreateTableV2(); - - // If we have issues while trying to open the file (corrupted databse, - // failing to upgrade, that sort of thing) this function will remove - // the file from disk and attempt to create a new database from - // scratch. - bool DeleteFileAndRecreate(); - - void Close(); - bool IsOpen() const { return db_.get() ? db_->is_open() : false; } - - // Initialization code shared between the two constructors of this class. - void Init(); - - // Path to the database on disk. - const base::FilePath file_path_; - const std::unique_ptr<FilesystemProxy> filesystem_proxy_; - std::unique_ptr<sql::Database> db_; - bool failed_to_open_; - bool tried_to_recreate_; - bool known_to_be_empty_; - - DISALLOW_COPY_AND_ASSIGN(LegacyDomStorageDatabase); -}; - -} // namespace storage - -#endif // COMPONENTS_SERVICES_STORAGE_DOM_STORAGE_LEGACY_DOM_STORAGE_DATABASE_H_
diff --git a/components/services/storage/dom_storage/legacy_dom_storage_database_unittest.cc b/components/services/storage/dom_storage/legacy_dom_storage_database_unittest.cc deleted file mode 100644 index da7794e..0000000 --- a/components/services/storage/dom_storage/legacy_dom_storage_database_unittest.cc +++ /dev/null
@@ -1,332 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" - -#include "base/cxx17_backports.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/path_service.h" -#include "base/strings/utf_string_conversions.h" -#include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h" -#include "sql/statement.h" -#include "sql/test/scoped_error_expecter.h" -#include "testing/gtest/include/gtest/gtest.h" - -using base::ASCIIToUTF16; - -namespace storage { - -namespace { - -std::unique_ptr<FilesystemProxy> MakeFilesystemProxy( - const base::FilePath& root = base::FilePath()) { - return std::make_unique<FilesystemProxy>(FilesystemProxy::UNRESTRICTED, root); -} - -} // namespace - -void CreateV2Table(sql::Database* db) { - ASSERT_TRUE(db->is_open()); - ASSERT_TRUE(db->Execute("DROP TABLE IF EXISTS ItemTable")); - ASSERT_TRUE( - db->Execute("CREATE TABLE ItemTable (" - "key TEXT UNIQUE ON CONFLICT REPLACE, " - "value BLOB NOT NULL ON CONFLICT FAIL)")); -} - -void CreateInvalidTable(sql::Database* db) { - // Create a table with out a key column - this is "invalid" - // as far as the DOM Storage db is concerned. - ASSERT_TRUE(db->is_open()); - ASSERT_TRUE(db->Execute("DROP TABLE IF EXISTS ItemTable")); - ASSERT_TRUE( - db->Execute("CREATE TABLE IF NOT EXISTS ItemTable (" - "value BLOB NOT NULL ON CONFLICT FAIL)")); -} - -void CheckValuesMatch(LegacyDomStorageDatabase* db, - const LegacyDomStorageValuesMap& expected) { - LegacyDomStorageValuesMap values_read; - db->ReadAllValues(&values_read); - EXPECT_EQ(expected.size(), values_read.size()); - - LegacyDomStorageValuesMap::const_iterator it = values_read.begin(); - for (; it != values_read.end(); ++it) { - const std::u16string& key = it->first; - const absl::optional<std::u16string>& value = it->second; - const absl::optional<std::u16string>& expected_value = - expected.find(key)->second; - EXPECT_EQ(expected_value, value); - } -} - -void CreateMapWithValues(LegacyDomStorageValuesMap* values) { - std::u16string kCannedKeys[] = {u"test", u"company", u"date", u"empty"}; - std::u16string kCannedValues[] = {u"123", u"Google", u"18-01-2012", u""}; - for (unsigned i = 0; i < base::size(kCannedKeys); i++) - (*values)[kCannedKeys[i]] = kCannedValues[i]; -} - -TEST(LegacyDomStorageDatabaseTest, SimpleOpenAndClose) { - LegacyDomStorageDatabase db(MakeFilesystemProxy()); - EXPECT_FALSE(db.IsOpen()); - ASSERT_TRUE(db.LazyOpen(true)); - EXPECT_TRUE(db.IsOpen()); - EXPECT_EQ(LegacyDomStorageDatabase::V2, db.DetectSchemaVersion()); - db.Close(); - EXPECT_FALSE(db.IsOpen()); -} - -TEST(LegacyDomStorageDatabaseTest, CloseEmptyDatabaseDeletesFile) { - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath file_name = - temp_dir.GetPath().AppendASCII("TestLegacyDomStorageDatabase.db"); - LegacyDomStorageValuesMap storage; - CreateMapWithValues(&storage); - - // First test the case that explicitly clearing the database will - // trigger its deletion from disk. - { - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - EXPECT_EQ(file_name, db.file_path()); - ASSERT_TRUE(db.CommitChanges(false, storage)); - } - EXPECT_TRUE(base::PathExists(file_name)); - - { - // Check that reading an existing db with data in it - // keeps the DB on disk on close. - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - LegacyDomStorageValuesMap values; - db.ReadAllValues(&values); - EXPECT_EQ(storage.size(), values.size()); - } - - EXPECT_TRUE(base::PathExists(file_name)); - storage.clear(); - - { - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - ASSERT_TRUE(db.CommitChanges(true, storage)); - } - EXPECT_FALSE(base::PathExists(file_name)); - - // Now ensure that a series of updates and removals whose net effect - // is an empty database also triggers deletion. - CreateMapWithValues(&storage); - { - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - ASSERT_TRUE(db.CommitChanges(false, storage)); - } - - EXPECT_TRUE(base::PathExists(file_name)); - - { - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - ASSERT_TRUE(db.CommitChanges(false, storage)); - auto it = storage.begin(); - for (; it != storage.end(); ++it) - it->second = absl::nullopt; - ASSERT_TRUE(db.CommitChanges(false, storage)); - } - EXPECT_FALSE(base::PathExists(file_name)); -} - -TEST(LegacyDomStorageDatabaseTest, TestLazyOpenIsLazy) { - // This test needs to operate with a file on disk to ensure that we will - // open a file that already exists when only invoking ReadAllValues. - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath file_name = - temp_dir.GetPath().AppendASCII("TestLegacyDomStorageDatabase.db"); - - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - EXPECT_FALSE(db.IsOpen()); - LegacyDomStorageValuesMap values; - db.ReadAllValues(&values); - // Reading an empty db should not open the database. - EXPECT_FALSE(db.IsOpen()); - - values[u"key"] = u"value"; - db.CommitChanges(false, values); - // Writing content should open the database. - EXPECT_TRUE(db.IsOpen()); - - db.Close(); - ASSERT_FALSE(db.IsOpen()); - - // Reading from an existing database should open the database. - CheckValuesMatch(&db, values); - EXPECT_TRUE(db.IsOpen()); -} - -TEST(LegacyDomStorageDatabaseTest, TestDetectSchemaVersion) { - LegacyDomStorageDatabase db(MakeFilesystemProxy()); - db.db_ = std::make_unique<sql::Database>(); - ASSERT_TRUE(db.db_->OpenInMemory()); - - CreateInvalidTable(db.db_.get()); - EXPECT_EQ(LegacyDomStorageDatabase::INVALID, db.DetectSchemaVersion()); - - CreateV2Table(db.db_.get()); - EXPECT_EQ(LegacyDomStorageDatabase::V2, db.DetectSchemaVersion()); -} - -TEST(LegacyDomStorageDatabaseTest, SimpleWriteAndReadBack) { - LegacyDomStorageDatabase db(MakeFilesystemProxy()); - - LegacyDomStorageValuesMap storage; - CreateMapWithValues(&storage); - - EXPECT_TRUE(db.CommitChanges(false, storage)); - CheckValuesMatch(&db, storage); -} - -TEST(LegacyDomStorageDatabaseTest, WriteWithClear) { - LegacyDomStorageDatabase db(MakeFilesystemProxy()); - - LegacyDomStorageValuesMap storage; - CreateMapWithValues(&storage); - - ASSERT_TRUE(db.CommitChanges(false, storage)); - CheckValuesMatch(&db, storage); - - // Insert some values, clearing the database first. - storage.clear(); - storage[u"another_key"] = u"test"; - ASSERT_TRUE(db.CommitChanges(true, storage)); - CheckValuesMatch(&db, storage); - - // Now clear the values without inserting any new ones. - storage.clear(); - ASSERT_TRUE(db.CommitChanges(true, storage)); - CheckValuesMatch(&db, storage); -} - -TEST(LegacyDomStorageDatabaseTest, TestSimpleRemoveOneValue) { - LegacyDomStorageDatabase db(MakeFilesystemProxy()); - - ASSERT_TRUE(db.LazyOpen(true)); - const std::u16string kCannedKey = u"test"; - const std::u16string kCannedValue = u"data"; - LegacyDomStorageValuesMap expected; - expected[kCannedKey] = kCannedValue; - - // First write some data into the database. - ASSERT_TRUE(db.CommitChanges(false, expected)); - CheckValuesMatch(&db, expected); - - LegacyDomStorageValuesMap values; - // A null string in the map should mean that that key gets - // removed. - values[kCannedKey] = absl::nullopt; - EXPECT_TRUE(db.CommitChanges(false, values)); - - expected.clear(); - CheckValuesMatch(&db, expected); -} - -TEST(LegacyDomStorageDatabaseTest, TestCanOpenAndReadWebCoreDatabase) { - base::FilePath dir_test_data; - ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &dir_test_data)); - base::FilePath test_data = dir_test_data.AppendASCII("components") - .AppendASCII("services") - .AppendASCII("storage") - .AppendASCII("test_data"); - test_data = test_data.AppendASCII("legacy_dom_storage_database.localstorage"); - ASSERT_TRUE(base::PathExists(test_data)); - - // Create a temporary copy of the WebCore test database, so as to avoid - // modifying the source file. - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath webcore_database = - temp_dir.GetPath().AppendASCII("dom_storage"); - ASSERT_TRUE(base::CopyFile(test_data, webcore_database)); - - LegacyDomStorageDatabase db(webcore_database, - MakeFilesystemProxy(temp_dir.GetPath())); - LegacyDomStorageValuesMap values; - db.ReadAllValues(&values); - EXPECT_TRUE(db.IsOpen()); - EXPECT_EQ(2u, values.size()); - - LegacyDomStorageValuesMap::const_iterator it = values.find(u"value"); - EXPECT_TRUE(it != values.end()); - EXPECT_EQ(u"I am in local storage!", it->second.value()); - - it = values.find(u"timestamp"); - EXPECT_TRUE(it != values.end()); - EXPECT_EQ(u"1326738338841", it->second.value()); - - it = values.find(u"not_there"); - EXPECT_TRUE(it == values.end()); -} - -TEST(LegacyDomStorageDatabaseTest, TestCanOpenFileThatIsNotADatabase) { - // Write into the temporary file first. - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - base::FilePath file_name = - temp_dir.GetPath().AppendASCII("TestLegacyDomStorageDatabase.db"); - - const char kData[] = "I am not a database."; - base::WriteFile(file_name, kData, strlen(kData)); - - { - sql::test::ScopedErrorExpecter expecter; - expecter.ExpectError(SQLITE_NOTADB); - - // Try and open the file. As it's not a database, we should end up deleting - // it and creating a new, valid file, so everything should actually - // succeed. - LegacyDomStorageDatabase db(file_name, - MakeFilesystemProxy(temp_dir.GetPath())); - LegacyDomStorageValuesMap values; - CreateMapWithValues(&values); - EXPECT_TRUE(db.CommitChanges(true, values)); - EXPECT_TRUE(db.CommitChanges(false, values)); - EXPECT_TRUE(db.IsOpen()); - - CheckValuesMatch(&db, values); - - ASSERT_TRUE(expecter.SawExpectedErrors()); - } - - { - sql::test::ScopedErrorExpecter expecter; - expecter.ExpectError(SQLITE_CANTOPEN); - - // Try to open a directory, we should fail gracefully and not attempt - // to delete it. - LegacyDomStorageDatabase db(temp_dir.GetPath(), - MakeFilesystemProxy(temp_dir.GetPath())); - LegacyDomStorageValuesMap values; - CreateMapWithValues(&values); - EXPECT_FALSE(db.CommitChanges(true, values)); - EXPECT_FALSE(db.CommitChanges(false, values)); - EXPECT_FALSE(db.IsOpen()); - - values.clear(); - - db.ReadAllValues(&values); - EXPECT_EQ(0u, values.size()); - EXPECT_FALSE(db.IsOpen()); - - EXPECT_TRUE(base::PathExists(temp_dir.GetPath())); - - ASSERT_TRUE(expecter.SawExpectedErrors()); - } -} - -} // namespace storage
diff --git a/components/services/storage/dom_storage/local_storage_impl.cc b/components/services/storage/dom_storage/local_storage_impl.cc index 53f4bcd..4c8dd65 100644 --- a/components/services/storage/dom_storage/local_storage_impl.cc +++ b/components/services/storage/dom_storage/local_storage_impl.cc
@@ -34,13 +34,11 @@ #include "components/services/storage/dom_storage/async_dom_storage_database.h" #include "components/services/storage/dom_storage/dom_storage_constants.h" #include "components/services/storage/dom_storage/dom_storage_database.h" -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" #include "components/services/storage/dom_storage/local_storage_database.pb.h" #include "components/services/storage/dom_storage/storage_area_impl.h" #include "components/services/storage/filesystem_proxy_factory.h" #include "components/services/storage/public/cpp/constants.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" -#include "sql/database.h" #include "storage/common/database/database_identifier.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/leveldatabase/env_chromium.h" @@ -85,9 +83,6 @@ const size_t kMaxLocalStorageCacheSize = 20 * 1024 * 1024; #endif -static const uint8_t kUTF16Format = 0; -static const uint8_t kLatin1Format = 1; - DomStorageDatabase::Key CreateMetaDataKey(const url::Origin& origin) { auto origin_str = origin.Serialize(); std::vector<uint8_t> serialized_origin(origin_str.begin(), origin_str.end()); @@ -117,29 +112,6 @@ std::move(callback).Run(); } -void MigrateStorageHelper( - base::FilePath db_path, - const scoped_refptr<base::SingleThreadTaskRunner> reply_task_runner, - base::OnceCallback<void(std::unique_ptr<StorageAreaImpl::ValueMap>)> - callback) { - LegacyDomStorageDatabase db(db_path, CreateFilesystemProxy()); - LegacyDomStorageValuesMap map; - db.ReadAllValues(&map); - auto values = std::make_unique<StorageAreaImpl::ValueMap>(); - for (const auto& it : map) { - (*values)[LocalStorageImpl::MigrateString(it.first)] = - LocalStorageImpl::MigrateString(it.second.value()); - } - reply_task_runner->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), std::move(values))); -} - -// Helper to convert from OnceCallback to Callback. -void CallMigrationCalback(StorageAreaImpl::ValueMapCallback callback, - std::unique_ptr<StorageAreaImpl::ValueMap> data) { - std::move(callback).Run(std::move(data)); -} - DomStorageDatabase::Key MakeOriginPrefix(const url::Origin& origin) { const char kDataPrefix = '_'; const std::string serialized_origin = origin.Serialize(); @@ -210,46 +182,6 @@ } } -const base::FilePath::CharType kLegacyDatabaseFileExtension[] = - FILE_PATH_LITERAL(".localstorage"); - -std::vector<mojom::StorageUsageInfoPtr> GetLegacyLocalStorageUsage( - const base::FilePath& directory) { - std::unique_ptr<FilesystemProxy> fs = CreateFilesystemProxy(); - FileErrorOr<std::vector<base::FilePath>> result = fs->GetDirectoryEntries( - directory, FilesystemProxy::DirectoryEntryType::kFilesOnly); - if (result.is_error()) - return {}; - - std::vector<mojom::StorageUsageInfoPtr> infos; - for (const auto& path : result.value()) { - if (!path.MatchesExtension(kLegacyDatabaseFileExtension)) - continue; - absl::optional<base::File::Info> info = fs->GetFileInfo(path); - if (!info) - continue; - infos.emplace_back(mojom::StorageUsageInfo::New( - LocalStorageImpl::OriginFromLegacyDatabaseFileName(path), info->size, - info->last_modified)); - } - return infos; -} - -void InvokeLocalStorageUsageCallbackHelper( - LocalStorageImpl::GetUsageCallback callback, - std::unique_ptr<std::vector<mojom::StorageUsageInfoPtr>> infos) { - std::move(callback).Run(std::move(*infos)); -} - -void CollectLocalStorageUsage(std::vector<mojom::StorageUsageInfoPtr>* out_info, - base::OnceClosure done_callback, - std::vector<mojom::StorageUsageInfoPtr> in_info) { - out_info->reserve(out_info->size() + in_info.size()); - for (auto& info : in_info) - out_info->push_back(std::move(info)); - std::move(done_callback).Run(); -} - } // namespace class LocalStorageImpl::StorageAreaHolder final @@ -328,83 +260,9 @@ leveldb_env::GetLevelDBStatusUMAValue(status), leveldb_env::LEVELDB_STATUS_MAX); - // Delete any old database that might still exist if we successfully wrote - // data to LevelDB, and our LevelDB is actually disk backed. - if (status.ok() && !deleted_old_data_ && !context_->directory_.empty() && - context_->legacy_task_runner_) { - deleted_old_data_ = true; - context_->legacy_task_runner_->PostTask( - FROM_HERE, base::BindOnce(base::IgnoreResult(&sql::Database::Delete), - sql_db_path())); - } - context_->OnCommitResult(status); } - void MigrateData(StorageAreaImpl::ValueMapCallback callback) override { - if (context_->legacy_task_runner_ && !context_->directory_.empty()) { - context_->legacy_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MigrateStorageHelper, sql_db_path(), - base::ThreadTaskRunnerHandle::Get(), - base::BindOnce(&CallMigrationCalback, - std::move(callback)))); - return; - } - std::move(callback).Run(nullptr); - } - - std::vector<StorageAreaImpl::Change> FixUpData( - const StorageAreaImpl::ValueMap& data) override { - std::vector<StorageAreaImpl::Change> changes; - // Chrome M61/M62 had a bug where keys that should have been encoded as - // Latin1 were instead encoded as UTF16. Fix this by finding any 8-bit only - // keys, and re-encode those. If two encodings of the key exist, the Latin1 - // encoded value should take precedence. - size_t fix_count = 0; - for (const auto& it : data) { - // Skip over any Latin1 encoded keys, or unknown encodings/corrupted data. - if (it.first.empty() || it.first[0] != kUTF16Format) - continue; - // Check if key is actually 8-bit safe. - bool is_8bit = true; - for (size_t i = 1; i < it.first.size(); i += sizeof(char16_t)) { - // Don't just cast to char16* as that could be undefined behavior. - // Instead use memcpy for the conversion, which compilers will generally - // optimize away anyway. - char16_t char_val; - memcpy(&char_val, it.first.data() + i, sizeof(char16_t)); - if (char_val & 0xff00) { - is_8bit = false; - break; - } - } - if (!is_8bit) - continue; - // Found a key that should have been encoded differently. Decode and - // re-encode. - std::vector<uint8_t> key(1 + (it.first.size() - 1) / 2); - key[0] = kLatin1Format; - for (size_t in = 1, out = 1; in < it.first.size(); - in += sizeof(char16_t), out++) { - char16_t char_val; - memcpy(&char_val, it.first.data() + in, sizeof(char16_t)); - key[out] = char_val; - } - // Delete incorrect key. - changes.push_back(std::make_pair(it.first, absl::nullopt)); - fix_count++; - // Check if correct key already exists in data. - auto new_it = data.find(key); - if (new_it != data.end()) - continue; - // Update value for correct key. - changes.push_back(std::make_pair(key, it.second)); - } - UMA_HISTOGRAM_BOOLEAN("LocalStorageContext.MigrationFixUpNeeded", - fix_count != 0); - return changes; - } - void OnMapLoaded(leveldb::Status status) override { if (!status.ok()) { UMA_HISTOGRAM_ENUMERATION("LocalStorageContext.MapLoadError", @@ -421,13 +279,6 @@ bool has_bindings() const { return has_bindings_; } private: - base::FilePath sql_db_path() const { - if (context_->directory_.empty()) - return base::FilePath(); - return context_->directory_.Append( - LocalStorageImpl::LegacyDatabaseFileNameFromOrigin(origin_)); - } - LocalStorageImpl* context_; url::Origin origin_; // Holds the same value as |area_|. The reason for this is that @@ -436,34 +287,12 @@ // could already be null, but this field should still be valid. StorageAreaImpl* area_ptr_; std::unique_ptr<StorageAreaImpl> area_; - bool deleted_old_data_ = false; bool has_bindings_ = false; }; -// static -base::FilePath LocalStorageImpl::LegacyDatabaseFileNameFromOrigin( - const url::Origin& origin) { - std::string filename = GetIdentifierFromOrigin(origin); - // There is no base::FilePath.AppendExtension() method, so start with just the - // extension as the filename, and then InsertBeforeExtension the desired - // name. - return base::FilePath() - .Append(kLegacyDatabaseFileExtension) - .InsertBeforeExtensionASCII(filename); -} - -// static -url::Origin LocalStorageImpl::OriginFromLegacyDatabaseFileName( - const base::FilePath& name) { - DCHECK(name.MatchesExtension(kLegacyDatabaseFileExtension)); - std::string origin_id = name.BaseName().RemoveExtension().MaybeAsASCII(); - return GetOriginFromIdentifier(origin_id); -} - LocalStorageImpl::LocalStorageImpl( const base::FilePath& storage_root, scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<base::SequencedTaskRunner> legacy_task_runner, mojo::PendingReceiver<mojom::LocalStorageControl> receiver) : directory_(storage_root.empty() ? storage_root : storage_root.Append(kLocalStoragePath)), @@ -472,7 +301,6 @@ base::TaskShutdownBehavior::BLOCK_SHUTDOWN})), memory_dump_id_(base::StringPrintf("LocalStorage/0x%" PRIXPTR, reinterpret_cast<uintptr_t>(this))), - legacy_task_runner_(std::move(legacy_task_runner)), is_low_end_device_(base::SysInfo::IsLowEndDevice()) { base::trace_event::MemoryDumpManager::GetInstance() ->RegisterDumpProviderWithSequencedTaskRunner( @@ -529,14 +357,6 @@ } else { std::move(callback).Run(); } - - if (!directory_.empty()) { - legacy_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - base::IgnoreResult(&sql::Database::Delete), - directory_.Append(LegacyDatabaseFileNameFromOrigin(origin)))); - } } void LocalStorageImpl::CleanUpStorage(CleanUpStorageCallback callback) { @@ -740,32 +560,6 @@ return true; } -// static -std::vector<uint8_t> LocalStorageImpl::MigrateString( - const std::u16string& input) { - // TODO(mek): Deduplicate this somehow with the code in - // LocalStorageCachedArea::String16ToUint8Vector. - bool is_8bit = true; - for (const auto& c : input) { - if (c & 0xff00) { - is_8bit = false; - break; - } - } - if (is_8bit) { - std::vector<uint8_t> result(input.size() + 1); - result[0] = kLatin1Format; - std::copy(input.begin(), input.end(), result.begin() + 1); - return result; - } - const uint8_t* data = reinterpret_cast<const uint8_t*>(input.data()); - std::vector<uint8_t> result; - result.reserve(input.size() * sizeof(char16_t) + 1); - result.push_back(kUTF16Format); - result.insert(result.end(), data, data + input.size() * sizeof(char16_t)); - return result; -} - void LocalStorageImpl::SetDatabaseOpenCallbackForTesting( base::OnceClosure callback) { RunWhenConnected(std::move(callback)); @@ -997,25 +791,6 @@ } void LocalStorageImpl::RetrieveStorageUsage(GetUsageCallback callback) { - auto infos = std::make_unique<std::vector<mojom::StorageUsageInfoPtr>>(); - auto* infos_ptr = infos.get(); - base::RepeatingClosure got_local_storage_usage = base::BarrierClosure( - 2, base::BindOnce(&InvokeLocalStorageUsageCallbackHelper, - std::move(callback), std::move(infos))); - auto collect_callback = base::BindRepeating( - CollectLocalStorageUsage, infos_ptr, std::move(got_local_storage_usage)); - - // Grab metadata about pre-migration Local Storage data in the background - // while we query |database_| below. - if (directory_.empty()) { - collect_callback.Run({}); - } else { - base::PostTaskAndReplyWithResult( - legacy_task_runner_.get(), FROM_HERE, - base::BindOnce(&GetLegacyLocalStorageUsage, directory_), - base::BindOnce(collect_callback)); - } - if (!database_) { // If for whatever reason no leveldb database is available, no storage is // used, so return an array only containing the current areas. @@ -1024,7 +799,7 @@ for (const auto& it : areas_) { result.emplace_back(mojom::StorageUsageInfo::New(it.first, 0, now)); } - collect_callback.Run(std::move(result)); + std::move(callback).Run(std::move(result)); } else { database_->RunDatabaseTask( base::BindOnce([](const DomStorageDatabase& db) { @@ -1033,8 +808,7 @@ return data; }), base::BindOnce(&LocalStorageImpl::OnGotMetaData, - weak_ptr_factory_.GetWeakPtr(), - base::BindOnce(collect_callback))); + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } }
diff --git a/components/services/storage/dom_storage/local_storage_impl.h b/components/services/storage/dom_storage/local_storage_impl.h index e2f7916..acb3cbc9 100644 --- a/components/services/storage/dom_storage/local_storage_impl.h +++ b/components/services/storage/dom_storage/local_storage_impl.h
@@ -38,11 +38,6 @@ class LocalStorageImpl : public base::trace_event::MemoryDumpProvider, public mojom::LocalStorageControl { public: - static base::FilePath LegacyDatabaseFileNameFromOrigin( - const url::Origin& origin); - static url::Origin OriginFromLegacyDatabaseFileName( - const base::FilePath& file_name); - // Constructs a Local Storage implementation which will create its root // "Local Storage" directory in |storage_root| if non-empty. |task_runner| // run tasks on the same sequence as the one which constructs this object. @@ -51,7 +46,6 @@ // object to allow for remote control via the LocalStorageControl interface. LocalStorageImpl(const base::FilePath& storage_root, scoped_refptr<base::SequencedTaskRunner> task_runner, - scoped_refptr<base::SequencedTaskRunner> legacy_task_runner, mojo::PendingReceiver<mojom::LocalStorageControl> receiver); ~LocalStorageImpl() override; @@ -91,9 +85,6 @@ bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, base::trace_event::ProcessMemoryDump* pmd) override; - // Converts a string from the old storage format to the new storage format. - static std::vector<uint8_t> MigrateString(const std::u16string& input); - // Access the underlying DomStorageDatabase. May be null if the database is // not yet open. const base::SequenceBound<DomStorageDatabase>& GetDatabaseForTesting() const { @@ -181,9 +172,6 @@ // Maps between an origin and its prefixed LevelDB view. std::map<url::Origin, std::unique_ptr<StorageAreaHolder>> areas_; - // Used to access old data for migration. - scoped_refptr<base::SequencedTaskRunner> legacy_task_runner_; - bool is_low_end_device_; // Counts consecutive commit errors. If this number reaches a threshold, the // whole database is thrown away.
diff --git a/components/services/storage/dom_storage/local_storage_impl_unittest.cc b/components/services/storage/dom_storage/local_storage_impl_unittest.cc index cee7810..46bd281 100644 --- a/components/services/storage/dom_storage/local_storage_impl_unittest.cc +++ b/components/services/storage/dom_storage/local_storage_impl_unittest.cc
@@ -17,7 +17,6 @@ #include "base/test/bind.h" #include "base/test/task_environment.h" #include "build/build_config.h" -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" #include "components/services/storage/dom_storage/storage_area_test_util.h" #include "components/services/storage/public/cpp/constants.h" #include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h" @@ -123,7 +122,7 @@ void InitializeStorage(const base::FilePath& path) { DCHECK(!storage_); storage_ = std::make_unique<LocalStorageImpl>( - path, base::ThreadTaskRunnerHandle::Get(), task_runner_, + path, base::ThreadTaskRunnerHandle::Get(), /*receiver=*/mojo::NullReceiver()); } @@ -289,9 +288,6 @@ base::test::TaskEnvironment task_environment_; base::ScopedTempDir temp_path_; - scoped_refptr<base::SequencedTaskRunner> task_runner_{ - base::ThreadTaskRunnerHandle::Get()}; - std::unique_ptr<LocalStorageImpl> storage_; DISALLOW_COPY_AND_ASSIGN(LocalStorageImplTest); @@ -674,138 +670,6 @@ } } -TEST_F(LocalStorageImplTest, Migration) { - url::Origin origin1 = url::Origin::Create(GURL("http://foobar.com")); - url::Origin origin2 = url::Origin::Create(GURL("http://example.com")); - std::u16string key = u"key"; - std::u16string value = u"value"; - std::u16string key2 = u"key2"; - key2.push_back(0xd83d); - key2.push_back(0xde00); - - // We want to populate the Local Storage directory before the implementation - // has created it, so we have to create it ourselves here. - const base::FilePath local_storage_path = - storage_path().Append(kLocalStoragePath); - ASSERT_TRUE(base::CreateDirectory(local_storage_path)); - - const base::FilePath old_db_path = local_storage_path.Append( - LocalStorageImpl::LegacyDatabaseFileNameFromOrigin(origin1)); - { - LegacyDomStorageDatabase db( - old_db_path, std::make_unique<FilesystemProxy>( - FilesystemProxy::UNRESTRICTED, local_storage_path)); - LegacyDomStorageValuesMap data; - data[key] = value; - data[key2] = value; - db.CommitChanges(false, data); - } - EXPECT_TRUE(base::PathExists(old_db_path)); - - // Opening origin2 and accessing its data should not migrate anything. - ResetStorage(storage_path()); - mojo::Remote<blink::mojom::StorageArea> area; - context()->BindStorageArea(origin2, area.BindNewPipeAndPassReceiver()); - - // To make sure values are cached. - mojo::Remote<blink::mojom::StorageArea> dummy_area; - context()->BindStorageArea(origin2, dummy_area.BindNewPipeAndPassReceiver()); - - area->Get(std::vector<uint8_t>(), base::DoNothing()); - area.reset(); - dummy_area.reset(); - RunUntilIdle(); - - EXPECT_TRUE(GetDatabaseContents().empty()); - - // Opening origin1 and accessing its data should migrate its storage. - context()->BindStorageArea(origin1, area.BindNewPipeAndPassReceiver()); - context()->BindStorageArea(origin1, dummy_area.BindNewPipeAndPassReceiver()); - - base::RunLoop loop; - area->Get(std::vector<uint8_t>(), - base::BindLambdaForTesting( - [&](bool, const std::vector<uint8_t>&) { loop.Quit(); })); - loop.Run(); - - EXPECT_FALSE(GetDatabaseContents().empty()); - - { - std::vector<uint8_t> result; - bool success = test::GetSync(area.get(), - LocalStorageImpl::MigrateString(key), &result); - EXPECT_TRUE(success); - EXPECT_EQ(LocalStorageImpl::MigrateString(value), result); - } - - { - std::vector<uint8_t> result; - bool success = test::GetSync( - area.get(), LocalStorageImpl::MigrateString(key2), &result); - EXPECT_TRUE(success); - EXPECT_EQ(LocalStorageImpl::MigrateString(value), result); - } - - // Origin1 should no longer exist in old storage. - EXPECT_FALSE(base::PathExists(old_db_path)); -} - -static std::string EncodeKeyAsUTF16(const std::string& origin, - const std::u16string& key) { - std::string result = '_' + origin + '\x00' + '\x00'; - std::copy( - reinterpret_cast<const char*>(key.data()), - reinterpret_cast<const char*>(key.data()) + key.size() * sizeof(char16_t), - std::back_inserter(result)); - return result; -} - -TEST_F(LocalStorageImplTest, FixUp) { - SetDatabaseEntry("VERSION", "1"); - // Add mock data for the "key" key, with both possible encodings for key. - // We expect the value of the correctly encoded key to take precedence over - // the incorrectly encoded key (and expect the incorrectly encoded key to be - // deleted. - SetDatabaseEntry(std::string("_http://foobar.com") + '\x00' + "\x01key", - "value1"); - SetDatabaseEntry(EncodeKeyAsUTF16("http://foobar.com", u"key"), "value2"); - // Also add mock data for the "foo" key, this time only with the incorrec - // encoding. This should be updated to the correct encoding. - SetDatabaseEntry(EncodeKeyAsUTF16("http://foobar.com", u"foo"), "value3"); - - mojo::Remote<blink::mojom::StorageArea> area; - mojo::Remote<blink::mojom::StorageArea> - dummy_area; // To make sure values are cached. - context()->BindStorageArea(url::Origin::Create(GURL("http://foobar.com")), - area.BindNewPipeAndPassReceiver()); - context()->BindStorageArea(url::Origin::Create(GURL("http://foobar.com")), - dummy_area.BindNewPipeAndPassReceiver()); - - { - std::vector<uint8_t> result; - bool success = - test::GetSync(area.get(), StdStringToUint8Vector("\x01key"), &result); - EXPECT_TRUE(success); - EXPECT_EQ(StdStringToUint8Vector("value1"), result); - } - { - std::vector<uint8_t> result; - bool success = test::GetSync(area.get(), - StdStringToUint8Vector("\x01" - "foo"), - &result); - EXPECT_TRUE(success); - EXPECT_EQ(StdStringToUint8Vector("value3"), result); - } - - // Expect 4 rows in the database: VERSION, meta-data for the origin, and two - // rows of actual data. - auto contents = GetDatabaseContents(); - EXPECT_EQ(4u, contents.size()); - EXPECT_EQ("value1", contents.rbegin()->second); - EXPECT_EQ("value3", std::next(contents.rbegin())->second); -} - TEST_F(LocalStorageImplTest, ShutdownClearsData) { url::Origin origin1 = url::Origin::Create(GURL("http://foobar.com")); url::Origin origin2 = url::Origin::Create(GURL("http://example.com"));
diff --git a/components/services/storage/dom_storage/session_storage_impl_unittest.cc b/components/services/storage/dom_storage/session_storage_impl_unittest.cc index ea367d1..0067a10 100644 --- a/components/services/storage/dom_storage/session_storage_impl_unittest.cc +++ b/components/services/storage/dom_storage/session_storage_impl_unittest.cc
@@ -25,7 +25,6 @@ #include "base/task/thread_pool.h" #include "base/test/bind.h" #include "base/test/task_environment.h" -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" #include "components/services/storage/dom_storage/storage_area_test_util.h" #include "components/services/storage/dom_storage/testing_legacy_session_storage_database.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/components/services/storage/dom_storage/session_storage_metadata_unittest.cc b/components/services/storage/dom_storage/session_storage_metadata_unittest.cc index f0cfef3e..c873af7 100644 --- a/components/services/storage/dom_storage/session_storage_metadata_unittest.cc +++ b/components/services/storage/dom_storage/session_storage_metadata_unittest.cc
@@ -20,7 +20,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "components/services/storage/dom_storage/async_dom_storage_database.h" #include "components/services/storage/dom_storage/dom_storage_database.h" -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" #include "components/services/storage/dom_storage/testing_legacy_session_storage_database.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/services/storage/dom_storage/storage_area_impl.cc b/components/services/storage/dom_storage/storage_area_impl.cc index c0b8c3d..fbba1e7 100644 --- a/components/services/storage/dom_storage/storage_area_impl.cc +++ b/components/services/storage/dom_storage/storage_area_impl.cc
@@ -24,16 +24,6 @@ std::vector<DomStorageDatabase::KeyValuePair>* extra_entries_to_add, std::vector<DomStorageDatabase::Key>* extra_keys_to_delete) {} -void StorageAreaImpl::Delegate::MigrateData( - base::OnceCallback<void(std::unique_ptr<ValueMap>)> callback) { - std::move(callback).Run(nullptr); -} - -std::vector<StorageAreaImpl::Change> StorageAreaImpl::Delegate::FixUpData( - const ValueMap& data) { - return std::vector<Change>(); -} - void StorageAreaImpl::Delegate::OnMapLoaded(leveldb::Status) {} bool StorageAreaImpl::s_aggressive_flushing_enabled_ = false; @@ -613,12 +603,6 @@ DCHECK(keys_values_map_.empty()); DCHECK_EQ(map_state_, MapState::LOADING_FROM_DATABASE); - if (data.empty() && status.ok()) { - delegate_->MigrateData(base::BindOnce(&StorageAreaImpl::OnGotMigrationData, - weak_ptr_factory_.GetWeakPtr())); - return; - } - keys_only_map_.clear(); map_state_ = MapState::LOADED_KEYS_AND_VALUES; @@ -631,31 +615,6 @@ } CalculateStorageAndMemoryUsed(); - std::vector<Change> changes = delegate_->FixUpData(keys_values_map_); - if (!changes.empty()) { - DCHECK(database_); - CreateCommitBatchIfNeeded(); - for (auto& change : changes) { - auto it = keys_values_map_.find(change.first); - if (!change.second) { - DCHECK(it != keys_values_map_.end()); - keys_values_map_.erase(it); - } else { - if (it != keys_values_map_.end()) { - it->second = std::move(*change.second); - } else { - keys_values_map_[change.first] = std::move(*change.second); - } - } - // No need to store values in |commit_batch_| if values are already - // available in |keys_values_map_|, since CommitChanges() will take values - // from there. - commit_batch_->changed_keys.insert(std::move(change.first)); - } - CalculateStorageAndMemoryUsed(); - CommitChanges(); - } - // We proceed without using a backing store, nothing will be persisted but the // class is functional for the lifetime of the object. delegate_->OnMapLoaded(status); @@ -670,23 +629,6 @@ OnLoadComplete(); } -void StorageAreaImpl::OnGotMigrationData(std::unique_ptr<ValueMap> data) { - keys_only_map_.clear(); - keys_values_map_ = data ? std::move(*data) : ValueMap(); - map_state_ = MapState::LOADED_KEYS_AND_VALUES; - CalculateStorageAndMemoryUsed(); - delegate_->OnMapLoaded(leveldb::Status::OK()); - - if (database_ && !empty()) { - CreateCommitBatchIfNeeded(); - // CommitChanges() will take values from |keys_values_map_|. - for (const auto& it : keys_values_map_) - commit_batch_->changed_keys.insert(it.first); - CommitChanges(); - } - OnLoadComplete(); -} - void StorageAreaImpl::CalculateStorageAndMemoryUsed() { memory_used_ = 0; storage_used_ = 0;
diff --git a/components/services/storage/dom_storage/storage_area_impl.h b/components/services/storage/dom_storage/storage_area_impl.h index 9bc8a4c..f994103 100644 --- a/components/services/storage/dom_storage/storage_area_impl.h +++ b/components/services/storage/dom_storage/storage_area_impl.h
@@ -58,11 +58,6 @@ std::vector<DomStorageDatabase::KeyValuePair>* extra_entries_to_add, std::vector<DomStorageDatabase::Key>* extra_keys_to_delete); virtual void DidCommit(leveldb::Status error) = 0; - // Called during loading if no data was found. Needs to call |callback|. - virtual void MigrateData(ValueMapCallback callback); - // Called during loading to give delegate a chance to modify the data as - // stored in the database. - virtual std::vector<Change> FixUpData(const ValueMap& data); virtual void OnMapLoaded(leveldb::Status status); }; @@ -286,7 +281,6 @@ void LoadMap(base::OnceClosure completion_callback); void OnMapLoaded(leveldb::Status status, std::vector<DomStorageDatabase::KeyValuePair> data); - void OnGotMigrationData(std::unique_ptr<ValueMap> data); void CalculateStorageAndMemoryUsed(); void OnLoadComplete();
diff --git a/components/services/storage/dom_storage/storage_area_impl_unittest.cc b/components/services/storage/dom_storage/storage_area_impl_unittest.cc index 0ff2e31..bac70a4e 100644 --- a/components/services/storage/dom_storage/storage_area_impl_unittest.cc +++ b/components/services/storage/dom_storage/storage_area_impl_unittest.cc
@@ -85,15 +85,8 @@ std::move(committed_).Run(); } void OnMapLoaded(leveldb::Status) override { map_load_count_++; } - std::vector<StorageAreaImpl::Change> FixUpData( - const StorageAreaImpl::ValueMap& data) override { - return std::move(mock_changes_); - } int map_load_count() const { return map_load_count_; } - void set_mock_changes(std::vector<StorageAreaImpl::Change> changes) { - mock_changes_ = std::move(changes); - } void SetDidCommitCallback(base::OnceClosure committed) { committed_ = std::move(committed); @@ -101,7 +94,6 @@ private: int map_load_count_ = 0; - std::vector<StorageAreaImpl::Change> mock_changes_; base::OnceClosure committed_; }; @@ -776,28 +768,6 @@ EXPECT_EQ(delegate()->map_load_count(), 1); } -TEST_P(StorageAreaImplParamTest, FixUpData) { - storage_area_impl()->SetCacheModeForTesting(GetParam()); - std::vector<StorageAreaImpl::Change> changes; - changes.push_back(std::make_pair(test_key1_bytes_, ToBytes("foo"))); - changes.push_back(std::make_pair(test_key2_bytes_, absl::nullopt)); - changes.push_back(std::make_pair(test_prefix_bytes_, ToBytes("bla"))); - delegate()->set_mock_changes(std::move(changes)); - - std::vector<blink::mojom::KeyValuePtr> data; - EXPECT_TRUE(test::GetAllSync(storage_area(), &data)); - - ASSERT_EQ(2u, data.size()); - EXPECT_EQ(test_prefix_, ToString(data[0]->key)); - EXPECT_EQ("bla", ToString(data[0]->value)); - EXPECT_EQ(test_key1_, ToString(data[1]->key)); - EXPECT_EQ("foo", ToString(data[1]->value)); - - EXPECT_FALSE(HasDatabaseEntry(test_prefix_ + test_key2_)); - EXPECT_EQ("foo", GetDatabaseEntry(test_prefix_ + test_key1_)); - EXPECT_EQ("bla", GetDatabaseEntry(test_prefix_ + test_prefix_)); -} - TEST_F(StorageAreaImplTest, SetOnlyKeysWithoutDatabase) { std::vector<uint8_t> key = test_key2_bytes_; std::vector<uint8_t> value = ToBytes("foo");
diff --git a/components/services/storage/dom_storage/testing_legacy_session_storage_database.h b/components/services/storage/dom_storage/testing_legacy_session_storage_database.h index 21dd47af..34b535b 100644 --- a/components/services/storage/dom_storage/testing_legacy_session_storage_database.h +++ b/components/services/storage/dom_storage/testing_legacy_session_storage_database.h
@@ -22,7 +22,7 @@ #include "base/sequenced_task_runner.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/leveldatabase/src/include/leveldb/status.h" namespace url { @@ -43,6 +43,9 @@ namespace storage { +using LegacyDomStorageValuesMap = + std::map<std::u16string, absl::optional<std::u16string>>; + // A legacy implementation of Session Storage used only in tests to provide // coverage of session storage migration code. //
diff --git a/components/services/storage/partition_impl.cc b/components/services/storage/partition_impl.cc index a462d52..c41a0b5 100644 --- a/components/services/storage/partition_impl.cc +++ b/components/services/storage/partition_impl.cc
@@ -104,9 +104,6 @@ mojo::PendingReceiver<mojom::LocalStorageControl> receiver) { local_storage_ = std::make_unique<LocalStorageImpl>( path_.value_or(base::FilePath()), base::SequencedTaskRunnerHandle::Get(), - base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::WithBaseSyncPrimitives(), - base::TaskShutdownBehavior::BLOCK_SHUTDOWN}), std::move(receiver)); }
diff --git a/components/sessions/core/command_storage_backend.cc b/components/sessions/core/command_storage_backend.cc index 3b59e31..c96d82fd 100644 --- a/components/sessions/core/command_storage_backend.cc +++ b/components/sessions/core/command_storage_backend.cc
@@ -30,6 +30,8 @@ namespace { // File version number. +// TODO(sky): remove these in ~1 year. They are no longer written as of +// ~5/2021. constexpr int32_t kFileVersion1 = 1; constexpr int32_t kEncryptedFileVersion = 2; // The versions that are used if `use_marker` is true. @@ -430,12 +432,10 @@ scoped_refptr<base::SequencedTaskRunner> owning_task_runner, const base::FilePath& path, SessionType type, - bool use_marker, const std::vector<uint8_t>& decryption_key) : RefCountedDeleteOnSequence(owning_task_runner), type_(type), supplied_path_(path), - use_marker_(use_marker), initial_decryption_key_(decryption_key), callback_task_runner_(base::ThreadTaskRunnerHandle::Get()) { // This is invoked on the main thread, don't do file access here. @@ -459,22 +459,16 @@ DCHECK_NE(kInitialStateMarkerCommandId, command->id()); #endif - // If `use_marker` is true, the consumer must call this with `truncate` set - // to true to indicate the initial state has been supplied. To do otherwise - // would mean the file never contains the marker, and would not be considered + // The consumer must call this with `truncate` set to true to indicate the + // initial state has been supplied. To do otherwise would mean the file never + // contains the marker, and would not be considered // valid. This includes first time through. - if (use_marker_ && !truncate && (!file_ || !file_->IsValid())) + if (!truncate && (!file_ || !file_->IsValid())) return; if (truncate) { - const bool was_encrypted = IsEncrypted(); + CloseFile(); const bool encrypt = !crypto_key.empty(); - - // The header is different when encrypting, so the file needs to be - // recreated. - if (use_marker_ || (was_encrypted != encrypt)) - CloseFile(); - if (encrypt) { aead_ = std::make_unique<crypto::Aead>(crypto::Aead::AES_256_GCM); crypto_key_ = crypto_key; @@ -482,10 +476,8 @@ } else { aead_.reset(); } - if (use_marker_) { - commands.push_back( - std::make_unique<SessionCommand>(kInitialStateMarkerCommandId, 0)); - } + commands.push_back( + std::make_unique<SessionCommand>(kInitialStateMarkerCommandId, 0)); } else { // |crypto_key| is only used when |truncate| is true. DCHECK(crypto_key.empty()); @@ -502,7 +494,7 @@ CloseFile(); } - if (use_marker_ && truncate && file_ && file_->IsValid()) { + if (truncate && file_ && file_->IsValid()) { did_write_marker_ = true; if (last_file_with_valid_marker_) { DCHECK_NE(*last_file_with_valid_marker_, current_path_); @@ -573,14 +565,10 @@ // Move current session to last. absl::optional<SessionInfo> new_last_session_info; - if (use_marker_) { - if (last_file_with_valid_marker_) { - new_last_session_info = - SessionInfo{*last_file_with_valid_marker_, timestamp_}; - last_file_with_valid_marker_.reset(); - } - } else if (base::PathExists(current_path_)) { - new_last_session_info = SessionInfo{current_path_, timestamp_}; + if (last_file_with_valid_marker_) { + new_last_session_info = + SessionInfo{*last_file_with_valid_marker_, timestamp_}; + last_file_with_valid_marker_.reset(); } last_session_info_ = new_last_session_info; @@ -624,7 +612,7 @@ inited_ = true; base::CreateDirectory(GetSessionDirName(type_, supplied_path_)); - // TODO(sky): with `use_marker_` this is expensive. See if it can be delayed. + // TODO(sky): this is expensive. See if it can be delayed. last_session_info_ = FindLastSessionFile(); // Best effort delete all sessions except the current & last. @@ -652,47 +640,30 @@ file_.reset(); // If a marker wasn't written, no need to keep the current file. - if (use_marker_ && !did_write_marker_ && !current_path_.empty()) + if (!did_write_marker_ && !current_path_.empty()) base::DeleteFile(current_path_); } void CommandStorageBackend::TruncateOrOpenFile() { DCHECK(inited_); - if (use_marker_) - CloseFile(); - if (use_marker_ || current_path_.empty()) { - DCHECK(!file_); - base::Time new_timestamp = base::Time::Now(); - // Ensure we don't reuse the current file (this is extremely unlikely to - // ever be true). - if (new_timestamp == timestamp_) - new_timestamp += base::TimeDelta::FromMicroseconds(1); - if (last_session_info_) { - // Ensure that the last session's timestamp is before the current file's. - // This might not be true if the system clock has changed. - if (last_session_info_->timestamp > new_timestamp) { - new_timestamp = last_session_info_->timestamp + - base::TimeDelta::FromMicroseconds(1); - } + CloseFile(); + DCHECK(!file_); + base::Time new_timestamp = base::Time::Now(); + // Ensure we don't reuse the current file (this is extremely unlikely to + // ever be true). + if (new_timestamp == timestamp_) + new_timestamp += base::TimeDelta::FromMicroseconds(1); + if (last_session_info_) { + // Ensure that the last session's timestamp is before the current file's. + // This might not be true if the system clock has changed. + if (last_session_info_->timestamp > new_timestamp) { + new_timestamp = + last_session_info_->timestamp + base::TimeDelta::FromMicroseconds(1); } - timestamp_ = new_timestamp; - current_path_ = FilePathFromTime(type_, supplied_path_, timestamp_); } - if (file_) { - // If `use_marker_` is true, the file is always closed before being - // truncated. - DCHECK(!use_marker_); - // File is already open, truncate it. We truncate instead of closing and - // reopening to avoid the possibility of scanners locking the file out - // from under us once we close it. If truncation fails, we'll try to - // recreate. - const int header_size = static_cast<int>(sizeof(FileHeader)); - if (file_->Seek(base::File::FROM_BEGIN, header_size) != header_size || - !file_->SetLength(header_size)) - file_.reset(); - } - if (!file_) - file_ = OpenAndWriteHeader(current_path_); + timestamp_ = new_timestamp; + current_path_ = FilePathFromTime(type_, supplied_path_, timestamp_); + file_ = OpenAndWriteHeader(current_path_); commands_written_ = 0; did_write_marker_ = false; } @@ -708,12 +679,8 @@ return nullptr; FileHeader header; header.signature = kFileSignature; - if (use_marker_) { - header.version = IsEncrypted() ? kEncryptedFileVersionWithMarker - : kFileVersionWithMarker; - } else { - header.version = IsEncrypted() ? kEncryptedFileVersion : kFileVersion1; - } + header.version = + IsEncrypted() ? kEncryptedFileVersionWithMarker : kFileVersionWithMarker; if (file->WriteAtCurrentPos(reinterpret_cast<char*>(&header), sizeof(header)) != sizeof(header)) { return nullptr; @@ -866,9 +833,6 @@ bool CommandStorageBackend::CanUseFileForLastSession( const base::FilePath& path) const { - if (!use_marker_) - return true; - const SessionFileReader::MarkerStatus status = SessionFileReader::GetMarkerStatus(path, initial_decryption_key_); return !status.supports_marker || status.has_marker;
diff --git a/components/sessions/core/command_storage_backend.h b/components/sessions/core/command_storage_backend.h index d6029cc8..1c7576d 100644 --- a/components/sessions/core/command_storage_backend.h +++ b/components/sessions/core/command_storage_backend.h
@@ -34,8 +34,6 @@ // CommandStorageBackend (mostly) does not interpret the commands in any way, it // simply reads/writes them. // -// The following comment applies when `use_marker` is true, which will -// eventually be the default (and there will not be an option to disable it). // CommandStorageBackend writes to a file with a suffix that indicates the // time the file was opened. The time stamp allows this code to determine the // most recently written file. When AppendCommands() is supplied a value of true @@ -89,7 +87,6 @@ scoped_refptr<base::SequencedTaskRunner> owning_task_runner, const base::FilePath& path, CommandStorageManager::SessionType type, - bool use_marker, const std::vector<uint8_t>& decryption_key = {}); CommandStorageBackend(const CommandStorageBackend&) = delete; CommandStorageBackend& operator=(const CommandStorageBackend&) = delete; @@ -235,8 +232,6 @@ // constructor for details. const base::FilePath supplied_path_; - const bool use_marker_; - // Used to decode the initial last session file. // TODO(sky): this is currently required because InitIfNecessary() determines // the last file. If that can be delayed, then this can be supplied to
diff --git a/components/sessions/core/command_storage_backend_unittest.cc b/components/sessions/core/command_storage_backend_unittest.cc index 1dcc6f40..98ce68dd 100644 --- a/components/sessions/core/command_storage_backend_unittest.cc +++ b/components/sessions/core/command_storage_backend_unittest.cc
@@ -50,7 +50,7 @@ } // namespace -class CommandStorageBackendTest : public testing::TestWithParam<bool> { +class CommandStorageBackendTest : public testing::Test { protected: // testing::TestWithParam: void SetUp() override { @@ -83,16 +83,14 @@ const std::vector<uint8_t>& decryption_key = {}) { return MakeRefCounted<CommandStorageBackend>( task_environment_.GetMainThreadTaskRunner(), file_path_, - CommandStorageManager::SessionType::kOther, IsUsingMarker(), - decryption_key); + CommandStorageManager::SessionType::kOther, decryption_key); } scoped_refptr<CommandStorageBackend> CreateBackendWithRestoreType() { const CommandStorageManager::SessionType type = CommandStorageManager::SessionType::kSessionRestore; return MakeRefCounted<CommandStorageBackend>( - task_environment_.GetMainThreadTaskRunner(), restore_path_, type, - IsUsingMarker()); + task_environment_.GetMainThreadTaskRunner(), restore_path_, type); } // Functions that call into private members of CommandStorageBackend. @@ -112,8 +110,6 @@ return result; } - bool IsUsingMarker() const { return GetParam(); } - static base::FilePath FilePathFromTime( CommandStorageManager::SessionType type, const base::FilePath& path, @@ -134,7 +130,7 @@ base::ScopedTempDir temp_dir_; }; -TEST_P(CommandStorageBackendTest, MigrateOther) { +TEST_F(CommandStorageBackendTest, MigrateOther) { scoped_refptr<CommandStorageBackend> backend = CreateBackend(); struct TestData data = {1, "a"}; SessionCommands commands; @@ -173,7 +169,7 @@ AssertCommandEqualsData(data2, commands[0].get()); } -TEST_P(CommandStorageBackendTest, SimpleReadWriteEncrypted) { +TEST_F(CommandStorageBackendTest, SimpleReadWriteEncrypted) { std::vector<uint8_t> key = CommandStorageManager::CreateCryptoKey(); scoped_refptr<CommandStorageBackend> backend = CreateBackend(); struct TestData data = {1, "a"}; @@ -197,7 +193,7 @@ EXPECT_TRUE(commands.empty()); } -TEST_P(CommandStorageBackendTest, RandomDataEncrypted) { +TEST_F(CommandStorageBackendTest, RandomDataEncrypted) { struct TestData data[] = { {1, "a"}, {2, "ab"}, @@ -235,7 +231,7 @@ } } -TEST_P(CommandStorageBackendTest, BigDataEncrypted) { +TEST_F(CommandStorageBackendTest, BigDataEncrypted) { struct TestData data[] = { {1, "a"}, {2, "ab"}, @@ -272,7 +268,7 @@ reinterpret_cast<char*>(commands[1]->contents())[big_size - 1]); } -TEST_P(CommandStorageBackendTest, MarkerOnlyEncrypted) { +TEST_F(CommandStorageBackendTest, MarkerOnlyEncrypted) { std::vector<uint8_t> key = CommandStorageManager::CreateCryptoKey(); scoped_refptr<CommandStorageBackend> backend = CreateBackend(); SessionCommands commands; @@ -288,7 +284,7 @@ // Writes a command, appends another command with reset to true, then reads // making sure we only get back the second command. -TEST_P(CommandStorageBackendTest, TruncateEncrypted) { +TEST_F(CommandStorageBackendTest, TruncateEncrypted) { std::vector<uint8_t> key = CommandStorageManager::CreateCryptoKey(); scoped_refptr<CommandStorageBackend> backend = CreateBackend(); struct TestData first_data = {1, "a"}; @@ -323,7 +319,7 @@ return command; } -TEST_P(CommandStorageBackendTest, MaxSizeTypeEncrypted) { +TEST_F(CommandStorageBackendTest, MaxSizeTypeEncrypted) { std::vector<uint8_t> key = CommandStorageManager::CreateCryptoKey(); scoped_refptr<CommandStorageBackend> backend = CreateBackend(); @@ -349,7 +345,7 @@ expected_size) == 0); } -TEST_P(CommandStorageBackendTest, MaxSizeType) { +TEST_F(CommandStorageBackendTest, MaxSizeType) { scoped_refptr<CommandStorageBackend> backend = CreateBackend(); SessionCommands commands; @@ -371,7 +367,7 @@ expected_size) == 0); } -TEST_P(CommandStorageBackendTest, IsValidFileWithInvalidFiles) { +TEST_F(CommandStorageBackendTest, IsValidFileWithInvalidFiles) { base::WriteFile(file_path(), "z"); EXPECT_FALSE(CommandStorageBackend::IsValidFile(file_path())); @@ -379,11 +375,7 @@ EXPECT_FALSE(CommandStorageBackend::IsValidFile(file_path())); } -TEST_P(CommandStorageBackendTest, IsNotValidFileWithoutMarker) { - // This test is only applicable when the marker is used. - if (!IsUsingMarker()) - return; - +TEST_F(CommandStorageBackendTest, IsNotValidFileWithoutMarker) { scoped_refptr<CommandStorageBackend> backend = CreateBackend(); const auto path = backend->current_path(); backend->AppendCommands({}, true, base::DoNothing()); @@ -392,20 +384,7 @@ EXPECT_FALSE(CommandStorageBackend::IsValidFile(path)); } -TEST_P(CommandStorageBackendTest, IsValidFileWithValidFile) { - // This test is only applicable when the marker is not used. - if (IsUsingMarker()) - return; - - scoped_refptr<CommandStorageBackend> backend = CreateBackend(); - backend->AppendCommands({}, true, base::DoNothing()); - const auto path = backend->current_path(); - backend = nullptr; - - EXPECT_TRUE(CommandStorageBackend::IsValidFile(path)); -} - -TEST_P(CommandStorageBackendTest, SimpleReadWriteWithRestoreType) { +TEST_F(CommandStorageBackendTest, SimpleReadWriteWithRestoreType) { scoped_refptr<CommandStorageBackend> backend = CreateBackendWithRestoreType(); struct TestData data = {1, "a"}; SessionCommands commands; @@ -434,7 +413,7 @@ ASSERT_EQ(0U, commands.size()); } -TEST_P(CommandStorageBackendTest, RandomDataWithRestoreType) { +TEST_F(CommandStorageBackendTest, RandomDataWithRestoreType) { struct TestData data[] = { {1, "a"}, {2, "ab"}, @@ -471,7 +450,7 @@ } } -TEST_P(CommandStorageBackendTest, BigDataWithRestoreType) { +TEST_F(CommandStorageBackendTest, BigDataWithRestoreType) { struct TestData data[] = { {1, "a"}, {2, "ab"}, @@ -507,7 +486,7 @@ reinterpret_cast<char*>(commands[1]->contents())[big_size - 1]); } -TEST_P(CommandStorageBackendTest, CommandWithRestoreType) { +TEST_F(CommandStorageBackendTest, CommandWithRestoreType) { scoped_refptr<CommandStorageBackend> backend = CreateBackendWithRestoreType(); SessionCommands commands; backend->AppendCommands(std::move(commands), true, base::DoNothing()); @@ -519,7 +498,7 @@ // Writes a command, appends another command with reset to true, then reads // making sure we only get back the second command. -TEST_P(CommandStorageBackendTest, TruncateWithRestoreType) { +TEST_F(CommandStorageBackendTest, TruncateWithRestoreType) { scoped_refptr<CommandStorageBackend> backend = CreateBackendWithRestoreType(); struct TestData first_data = {1, "a"}; SessionCommands commands; @@ -543,7 +522,7 @@ } // Test parsing the timestamp of a session from the path. -TEST_P(CommandStorageBackendTest, TimestampFromPathWithRestoreType) { +TEST_F(CommandStorageBackendTest, TimestampFromPathWithRestoreType) { const auto base_dir = base::FilePath(kSessionsDirectory); // Test parsing the timestamp from a valid session. @@ -576,7 +555,7 @@ } // Test serializing a timestamp to string. -TEST_P(CommandStorageBackendTest, FilePathFromTimeWithRestoreType) { +TEST_F(CommandStorageBackendTest, FilePathFromTimeWithRestoreType) { const auto base_dir = base::FilePath(kSessionsDirectory); const auto test_time_1 = base::Time(); const auto result_path_1 = @@ -594,14 +573,14 @@ } // Test that the previous session is empty if no session files exist. -TEST_P(CommandStorageBackendTest, +TEST_F(CommandStorageBackendTest, DeterminePreviousSessionEmptyWithRestoreType) { scoped_refptr<CommandStorageBackend> backend = CreateBackendWithRestoreType(); ASSERT_FALSE(GetLastSessionInfo(backend.get())); } // Test that the previous session is selected correctly when a file is present. -TEST_P(CommandStorageBackendTest, +TEST_F(CommandStorageBackendTest, DeterminePreviousSessionSingleWithRestoreType) { const auto prev_path = restore_path().Append( base::FilePath(kSessionsDirectory) @@ -617,7 +596,7 @@ // Test that the previous session is selected correctly when multiple session // files are present. -TEST_P(CommandStorageBackendTest, +TEST_F(CommandStorageBackendTest, DeterminePreviousSessionMultipleWithRestoreType) { const auto sessions_dir = restore_path().Append(base::FilePath(kSessionsDirectory)); @@ -638,7 +617,7 @@ } // Test that the a file with an invalid name won't be used. -TEST_P(CommandStorageBackendTest, +TEST_F(CommandStorageBackendTest, DeterminePreviousSessionInvalidWithRestoreType) { const auto prev_path = restore_path().Append(base::FilePath(kSessionsDirectory) @@ -652,7 +631,7 @@ } // Tests that MoveCurrentSessionToLastSession deletes the last session file. -TEST_P(CommandStorageBackendTest, +TEST_F(CommandStorageBackendTest, MoveCurrentSessionToLastDeletesLastSessionWithRestoreType) { const auto sessions_dir = restore_path().Append(base::FilePath(kSessionsDirectory)); @@ -668,7 +647,7 @@ ASSERT_EQ(-1, base::ReadFile(last_session, buffer, 0)); } -TEST_P(CommandStorageBackendTest, GetSessionFiles) { +TEST_F(CommandStorageBackendTest, GetSessionFiles) { EXPECT_TRUE(CommandStorageBackend::GetSessionFilePaths( file_path(), CommandStorageManager::kOther) .empty()); @@ -688,12 +667,12 @@ EXPECT_EQ("Session_124", paths.begin()->BaseName().MaybeAsASCII()); } -TEST_P(CommandStorageBackendTest, TimestampSeparatorIsAscii) { +TEST_F(CommandStorageBackendTest, TimestampSeparatorIsAscii) { // Code in WebLayer relies on the timestamp separator being ascii. ASSERT_TRUE(!base::FilePath(kTimestampSeparator).MaybeAsASCII().empty()); } -TEST_P(CommandStorageBackendTest, GetSessionFilesAreSortedByReverseTimestamp) { +TEST_F(CommandStorageBackendTest, GetSessionFilesAreSortedByReverseTimestamp) { ASSERT_EQ(0, base::WriteFile(file_path().DirName().AppendASCII("Session_130"), "", 0)); ASSERT_EQ(0, base::WriteFile(file_path().DirName().AppendASCII("Session_120"), @@ -710,11 +689,7 @@ EXPECT_EQ("Session_120", paths[3].BaseName().MaybeAsASCII()); } -TEST_P(CommandStorageBackendTest, UseMarkerWithoutValidMarker) { - // This test is only interesting when the marker is used. - if (!IsUsingMarker()) - return; - +TEST_F(CommandStorageBackendTest, UseMarkerWithoutValidMarker) { scoped_refptr<CommandStorageBackend> backend = CreateBackend(); struct TestData data = {1, "a"}; SessionCommands commands; @@ -735,7 +710,7 @@ // This test moves a previously written file into the expected location and // ensures it's read. This is to verify reading hasn't changed in an // incompatible manner. -TEST_P(CommandStorageBackendTest, ReadPreviouslyWrittenData) { +TEST_F(CommandStorageBackendTest, ReadPreviouslyWrittenData) { base::FilePath test_data_path; ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_path)); test_data_path = test_data_path.AppendASCII("components") @@ -766,11 +741,7 @@ backend->ReadLastSessionCommands().commands); } -TEST_P(CommandStorageBackendTest, NewFileOnTruncate) { - // This test is only applicable with marker. - if (!IsUsingMarker()) - return; - +TEST_F(CommandStorageBackendTest, NewFileOnTruncate) { scoped_refptr<CommandStorageBackend> backend = CreateBackendWithRestoreType(); struct TestData data = {1, "a"}; SessionCommands commands; @@ -793,7 +764,7 @@ EXPECT_FALSE(base::PathExists(path1)); } -TEST_P(CommandStorageBackendTest, AppendCommandsCallbackRunOnError) { +TEST_F(CommandStorageBackendTest, AppendCommandsCallbackRunOnError) { scoped_refptr<CommandStorageBackend> backend = CreateBackend(); backend->ForceAppendCommandsToFailForTesting(); base::RunLoop run_loop; @@ -801,11 +772,7 @@ run_loop.Run(); } -TEST_P(CommandStorageBackendTest, RestoresFileWithMarkerAfterFailure) { - // This test is only applicable with marker. - if (!IsUsingMarker()) - return; - +TEST_F(CommandStorageBackendTest, RestoresFileWithMarkerAfterFailure) { // Write `data` and a marker. scoped_refptr<CommandStorageBackend> backend = CreateBackend(); struct TestData data = {11, "X"}; @@ -835,8 +802,4 @@ AssertCommandEqualsData(data, commands[0].get()); } -INSTANTIATE_TEST_SUITE_P(, - CommandStorageBackendTest, - testing::Values(false, true)); - } // namespace sessions
diff --git a/components/sessions/core/command_storage_manager.cc b/components/sessions/core/command_storage_manager.cc index a8546d51..8c7980f 100644 --- a/components/sessions/core/command_storage_manager.cc +++ b/components/sessions/core/command_storage_manager.cc
@@ -36,7 +36,6 @@ SessionType type, const base::FilePath& path, CommandStorageManagerDelegate* delegate, - bool use_marker, bool enable_crypto, const std::vector<uint8_t>& decryption_key, scoped_refptr<base::SequencedTaskRunner> backend_task_runner) @@ -45,10 +44,8 @@ : CreateDefaultBackendTaskRunner(), path, type, - use_marker, decryption_key)), use_crypto_(enable_crypto), - pending_reset_(use_marker), delegate_(delegate), backend_task_runner_(backend_->owning_task_runner()) {}
diff --git a/components/sessions/core/command_storage_manager.h b/components/sessions/core/command_storage_manager.h index 9b2dd8d..94c1c2b 100644 --- a/components/sessions/core/command_storage_manager.h +++ b/components/sessions/core/command_storage_manager.h
@@ -54,13 +54,10 @@ // `kOther`, then it is a path to a directory. The actual file name used // depends upon the type. Once SessionType can be removed, this logic can // standardize on that of `kOther`. - // - // See CommandStorageBackend for details on `use_marker`. CommandStorageManager( SessionType type, const base::FilePath& path, CommandStorageManagerDelegate* delegate, - bool use_marker = false, bool enable_crypto = false, const std::vector<uint8_t>& decryption_key = {}, scoped_refptr<base::SequencedTaskRunner> backend_task_runner = nullptr); @@ -151,7 +148,7 @@ // Whether the backend file should be recreated the next time we send // over the commands. - bool pending_reset_; + bool pending_reset_ = true; // The number of commands sent to the backend before doing a reset. int commands_since_reset_ = 0;
diff --git a/components/sessions/core/command_storage_manager_unittest.cc b/components/sessions/core/command_storage_manager_unittest.cc index 2545f7dd..092826f79 100644 --- a/components/sessions/core/command_storage_manager_unittest.cc +++ b/components/sessions/core/command_storage_manager_unittest.cc
@@ -47,8 +47,8 @@ TEST_F(CommandStorageManagerTest, OnErrorWritingSessionCommands) { TestCommandStorageManagerDelegate delegate; - CommandStorageManager manager(CommandStorageManager::kOther, path_, &delegate, - /* use_marker */ true); + CommandStorageManager manager(CommandStorageManager::kOther, path_, + &delegate); CommandStorageManagerTestHelper test_helper(&manager); manager.set_pending_reset(true); // Write a command, the delegate should not be notified of an error.
diff --git a/components/sessions/core/tab_restore_service_impl.cc b/components/sessions/core/tab_restore_service_impl.cc index ac99ffa..00ec6a5a 100644 --- a/components/sessions/core/tab_restore_service_impl.cc +++ b/components/sessions/core/tab_restore_service_impl.cc
@@ -512,8 +512,7 @@ command_storage_manager_(std::make_unique<CommandStorageManager>( CommandStorageManager::kTabRestore, client_->GetPathToSaveTo(), - this, - /* use_marker */ true)), + this)), tab_restore_service_helper_(nullptr), entries_to_write_(0), entries_written_(0),
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 7dd5c028..a80ca3a 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -225,9 +225,9 @@ LOG(ERROR) << ax_tree()->error(); LOG(ERROR) << tree_update.ToString(); - static auto* ax_tree_error = base::debug::AllocateCrashKeyString( + static auto* const ax_tree_error = base::debug::AllocateCrashKeyString( "ax_tree_error", base::debug::CrashKeySize::Size256); - static auto* ax_tree_update = base::debug::AllocateCrashKeyString( + static auto* const ax_tree_update = base::debug::AllocateCrashKeyString( "ax_tree_update", base::debug::CrashKeySize::Size256); // Temporarily log some additional crash keys so we can try to // figure out why we're getting bad accessibility trees here.
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 73a989cb..228bc70 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -2332,6 +2332,10 @@ RunHtmlTest(FILE_PATH_LITERAL("main.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityMapAnyContents) { + RunHtmlTest(FILE_PATH_LITERAL("map-any-contents.html")); +} + IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityMapUnused) { RunHtmlTest(FILE_PATH_LITERAL("map-unused.html")); }
diff --git a/content/browser/appcache/appcache_host.cc b/content/browser/appcache/appcache_host.cc index 67b5d05..99b4eb3 100644 --- a/content/browser/appcache/appcache_host.cc +++ b/content/browser/appcache/appcache_host.cc
@@ -73,8 +73,9 @@ } base::debug::CrashKeyString* GetDocumentUrlCrashKey() { - static auto* appcache_document_url_key = base::debug::AllocateCrashKeyString( - "appcache_document_url", base::debug::CrashKeySize::Size256); + static auto* const appcache_document_url_key = + base::debug::AllocateCrashKeyString("appcache_document_url", + base::debug::CrashKeySize::Size256); return appcache_document_url_key; }
diff --git a/content/browser/appcache/appcache_subresource_url_factory.cc b/content/browser/appcache/appcache_subresource_url_factory.cc index 9b51af2..7b6c294e 100644 --- a/content/browser/appcache/appcache_subresource_url_factory.cc +++ b/content/browser/appcache/appcache_subresource_url_factory.cc
@@ -372,10 +372,8 @@ if (request.request_initiator.has_value() && appcache_host_ && !appcache_host_->security_policy_handle()->CanAccessDataForOrigin( request.request_initiator.value())) { - static auto* initiator_origin_key = base::debug::AllocateCrashKeyString( - "initiator_origin", base::debug::CrashKeySize::Size64); - base::debug::SetCrashKeyString( - initiator_origin_key, request.request_initiator.value().Serialize()); + SCOPED_CRASH_KEY_STRING64("AppCacheURLLoader", "initiator_origin", + request.request_initiator.value().Serialize()); mojo::ReportBadMessage( "APPCACHE_SUBRESOURCE_URL_FACTORY_INVALID_INITIATOR");
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index b3e07c4..3a71829 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -8478,8 +8478,17 @@ // On the Android test environments, the test might fail due to IP restrictions. // See the discussion at http://crrev.com/c/2564926. #if !defined(OS_ANDROID) + +// TODO(https://crbug.com/1213145): The test is consistently failing on some Mac +// bots. +#if defined(OS_MAC) +#define MAYBE_TrivialRTCPeerConnectionCached \ + DISABLED_TrivialRTCPeerConnectionCached +#else +#define MAYBE_TrivialRTCPeerConnectionCached TrivialRTCPeerConnectionCached +#endif IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, - TrivialRTCPeerConnectionCached) { + MAYBE_TrivialRTCPeerConnectionCached) { ASSERT_TRUE(CreateHttpsServer()->Start()); GURL url_a(https_server()->GetURL("/title1.html")); @@ -8552,8 +8561,18 @@ // On the Android test environments, the test might fail due to IP restrictions. // See the discussion at http://crrev.com/c/2564926. #if !defined(OS_ANDROID) + +// TODO(https://crbug.com/1213145): The test is consistently failing on some Mac +// bots. +#if defined(OS_MAC) +#define MAYBE_NonTrivialRTCPeerConnectionNotCached \ + DISABLED_NonTrivialRTCPeerConnectionNotCached +#else +#define MAYBE_NonTrivialRTCPeerConnectionNotCached \ + NonTrivialRTCPeerConnectionNotCached +#endif IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, - NonTrivialRTCPeerConnectionNotCached) { + MAYBE_NonTrivialRTCPeerConnectionNotCached) { ASSERT_TRUE(CreateHttpsServer()->Start()); GURL url_a(https_server()->GetURL("/title1.html"));
diff --git a/content/browser/bad_message.cc b/content/browser/bad_message.cc index 1759ee2..bde4a3ab 100644 --- a/content/browser/bad_message.cc +++ b/content/browser/bad_message.cc
@@ -21,7 +21,7 @@ namespace { void LogBadMessage(BadMessageReason reason) { - static auto* bad_message_reason = base::debug::AllocateCrashKeyString( + static auto* const bad_message_reason = base::debug::AllocateCrashKeyString( "bad_message_reason", base::debug::CrashKeySize::Size64); TRACE_EVENT_INSTANT1("ipc,security", "content::ReceivedBadMessage", @@ -73,7 +73,7 @@ } base::debug::CrashKeyString* GetRequestedSiteInfoKey() { - static auto* crash_key = base::debug::AllocateCrashKeyString( + static auto* const crash_key = base::debug::AllocateCrashKeyString( "requested_site_info", base::debug::CrashKeySize::Size256); return crash_key; }
diff --git a/content/browser/browser_context_impl.cc b/content/browser/browser_context_impl.cc index 08134909..c3e97f5 100644 --- a/content/browser/browser_context_impl.cc +++ b/content/browser/browser_context_impl.cc
@@ -86,10 +86,8 @@ if (!rph_crash_key_value.empty()) { NOTREACHED() << "rph_with_bc_reference : " << rph_crash_key_value; - static auto* crash_key = base::debug::AllocateCrashKeyString( - "rph_with_bc_reference", base::debug::CrashKeySize::Size256); - base::debug::ScopedCrashKeyString auto_clear(crash_key, - rph_crash_key_value); + SCOPED_CRASH_KEY_STRING256("BrowserContext", "dangling_rph", + rph_crash_key_value); base::debug::DumpWithoutCrashing(); }
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 3a9417b0..7b1c3d6 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -118,7 +118,6 @@ #include "third_party/blink/public/mojom/idle/idle_manager.mojom.h" #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h" #include "third_party/blink/public/mojom/input/input_host.mojom.h" -#include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom.h" #include "third_party/blink/public/mojom/keyboard_lock/keyboard_lock.mojom.h" #include "third_party/blink/public/mojom/loader/content_security_notifier.mojom.h" #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom.h" @@ -870,8 +869,6 @@ // by blink. // This avoids renderer kills when no binder is found in the absence of the // production embedder (such as in tests). - map->Add<blink::mojom::InsecureInputService>(base::BindRepeating( - &EmptyBinderForFrame<blink::mojom::InsecureInputService>)); map->Add<blink::mojom::NoStatePrefetchProcessor>(base::BindRepeating( &EmptyBinderForFrame<blink::mojom::NoStatePrefetchProcessor>)); map->Add<payments::mojom::PaymentCredential>(base::BindRepeating(
diff --git a/content/browser/conversions/conversion_storage_sql_migrations.cc b/content/browser/conversions/conversion_storage_sql_migrations.cc index cee3b56f..dd6043e 100644 --- a/content/browser/conversions/conversion_storage_sql_migrations.cc +++ b/content/browser/conversions/conversion_storage_sql_migrations.cc
@@ -4,29 +4,36 @@ #include "content/browser/conversions/conversion_storage_sql_migrations.h" +#include <vector> + #include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "content/browser/conversions/conversion_storage_sql.h" #include "content/browser/conversions/sql_utils.h" #include "content/browser/conversions/storable_impression.h" +#include "net/base/schemeful_site.h" #include "sql/database.h" #include "sql/meta_table.h" #include "sql/statement.h" #include "sql/transaction.h" +#include "url/origin.h" namespace content { namespace { -// |ConversionStorageSql::GetActiveImpressions()| cannot be used for migration -// logic as it may use columns that are not present in older versions. -std::vector<StorableImpression> GetImpressions(sql::Database* db, - int64_t start_impression_id, - int num_impressions) { +struct ImpressionIdAndConversionOrigin { + int64_t impression_id; + url::Origin conversion_origin; +}; + +std::vector<ImpressionIdAndConversionOrigin> +GetImpressionIdAndConversionOrigins(sql::Database* db, + int64_t start_impression_id, + int num_impressions) { DCHECK_GE(num_impressions, 0); const char kGetImpressionsSql[] = - "SELECT impression_data, impression_origin, conversion_origin, " - "reporting_origin, impression_time, expiry_time, impression_id " + "SELECT impression_id, conversion_origin " "FROM impressions " "WHERE impression_id >= ? " "ORDER BY impression_id " @@ -37,26 +44,13 @@ statement.BindInt64(0, start_impression_id); statement.BindInt(1, num_impressions); - std::vector<StorableImpression> impressions; + std::vector<ImpressionIdAndConversionOrigin> impressions; while (statement.Step()) { - std::string impression_data = statement.ColumnString(0); - url::Origin impression_origin = + int64_t impression_id = statement.ColumnInt64(0); + url::Origin conversion_origin = DeserializeOrigin(statement.ColumnString(1)); - url::Origin conversion_destination = - DeserializeOrigin(statement.ColumnString(2)); - url::Origin reporting_origin = DeserializeOrigin(statement.ColumnString(3)); - base::Time impression_time = statement.ColumnTime(4); - base::Time expiry_time = statement.ColumnTime(5); - int64_t impression_id = statement.ColumnInt64(6); - // All impressions prior to the addition of the |source_type| column are - // |kNavigation|. - StorableImpression impression(impression_data, impression_origin, - conversion_destination, reporting_origin, - impression_time, expiry_time, - StorableImpression::SourceType::kNavigation, - /*priority=*/0, impression_id); - impressions.push_back(std::move(impression)); + impressions.push_back({impression_id, std::move(conversion_origin)}); } if (!statement.Succeeded()) return {}; @@ -161,8 +155,9 @@ // entire impressions table into memory. int64_t start_impression_id = 0; const size_t kNumImpressionsPerUpdate = 100u; - std::vector<StorableImpression> impressions = - GetImpressions(db, start_impression_id, kNumImpressionsPerUpdate); + std::vector<ImpressionIdAndConversionOrigin> impressions = + GetImpressionIdAndConversionOrigins(db, start_impression_id, + kNumImpressionsPerUpdate); const char kUpdateDestinationSql[] = "UPDATE impressions SET conversion_destination = ? WHERE impression_id = " @@ -178,20 +173,20 @@ // The conversion destination is derived from the conversion origin // dynamically. update_destination_statement.BindString( - 0, impression.ConversionDestination().Serialize()); - update_destination_statement.BindInt64(1, *impression.impression_id()); + 0, net::SchemefulSite(impression.conversion_origin).Serialize()); + update_destination_statement.BindInt64(1, impression.impression_id); update_destination_statement.Run(); // Track the largest row id. This is more efficient than sorting all the // rows. - if (*impression.impression_id() > start_impression_id) - start_impression_id = *impression.impression_id(); + if (impression.impression_id > start_impression_id) + start_impression_id = impression.impression_id; } // Fetch the next batch of rows from the database. start_impression_id += 1; - impressions = - GetImpressions(db, start_impression_id, kNumImpressionsPerUpdate); + impressions = GetImpressionIdAndConversionOrigins(db, start_impression_id, + kNumImpressionsPerUpdate); } // Create the pre-existing impression table indices on the new table.
diff --git a/content/browser/dom_storage/dom_storage_browsertest.cc b/content/browser/dom_storage/dom_storage_browsertest.cc index 2e1595ec..bce98a2 100644 --- a/content/browser/dom_storage/dom_storage_browsertest.cc +++ b/content/browser/dom_storage/dom_storage_browsertest.cc
@@ -9,7 +9,6 @@ #include "base/test/bind.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" -#include "components/services/storage/dom_storage/legacy_dom_storage_database.h" #include "components/services/storage/dom_storage/local_storage_impl.h" #include "components/services/storage/public/cpp/constants.h" #include "components/services/storage/public/cpp/filesystem/filesystem_proxy.h" @@ -163,36 +162,4 @@ } #endif -IN_PROC_BROWSER_TEST_F(DOMStorageBrowserTest, DataMigrates) { - const base::FilePath legacy_local_storage_path = - partition()->GetPath().Append(storage::kLocalStoragePath); - base::FilePath db_path = legacy_local_storage_path.Append( - storage::LocalStorageImpl::LegacyDatabaseFileNameFromOrigin( - url::Origin::Create(GetTestUrl("dom_storage", "store_data.html")))); - { - base::ScopedAllowBlockingForTesting allow_blocking; - EXPECT_TRUE(base::CreateDirectory(legacy_local_storage_path)); - storage::LegacyDomStorageDatabase db( - db_path, - std::make_unique<storage::FilesystemProxy>( - storage::FilesystemProxy::UNRESTRICTED, legacy_local_storage_path)); - storage::LegacyDomStorageValuesMap data; - data[u"foo"] = u"bar"; - db.CommitChanges(false, data); - EXPECT_TRUE(base::PathExists(db_path)); - } - std::vector<StorageUsageInfo> usage = GetUsage(); - ASSERT_EQ(1U, usage.size()); - EXPECT_GT(usage[0].total_size_bytes, 6u); - - SimpleTest(GetTestUrl("dom_storage", "verify_data.html"), kNotIncognito); - usage = GetUsage(); - ASSERT_EQ(1U, usage.size()); - EXPECT_GT(usage[0].total_size_bytes, 6u); - { - base::ScopedAllowBlockingForTesting allow_blocking; - EXPECT_FALSE(base::PathExists(db_path)); - } -} - } // namespace content
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 178a234..16d8ef1 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -948,10 +948,8 @@ // URLLoaderClient has already been transferred to the renderer process and // OnComplete is not expected to be called here. if (status.error_code == net::OK) { - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("navigate_url", - base::debug::CrashKeySize::Size256), - url_.spec()); + SCOPED_CRASH_KEY_STRING256("NavigationURLLoader::Complete", "url", + url_.spec()); base::debug::DumpWithoutCrashing(); return; }
diff --git a/content/browser/loader/object_navigation_fallback_body_loader.cc b/content/browser/loader/object_navigation_fallback_body_loader.cc index 4290ddfd..d3f79cd 100644 --- a/content/browser/loader/object_navigation_fallback_body_loader.cc +++ b/content/browser/loader/object_navigation_fallback_body_loader.cc
@@ -188,21 +188,21 @@ } // namespace +NAVIGATION_HANDLE_USER_DATA_KEY_IMPL(ObjectNavigationFallbackBodyLoader) + // static void ObjectNavigationFallbackBodyLoader::CreateAndStart( + NavigationRequest& navigation_request, const mojom::CommonNavigationParams& common_params, const mojom::CommitNavigationParams& commit_params, const network::mojom::URLResponseHead& response_head, mojo::ScopedDataPipeConsumerHandle response_body, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - base::WeakPtr<NavigationRequest> navigation_request, base::OnceClosure completion_closure) { // This should only be called for HTTP errors. DCHECK(response_head.headers); - // And `navigation_request` should certainly be live at this point. - DCHECK(navigation_request); RenderFrameHostImpl* render_frame_host = - navigation_request->frame_tree_node()->current_frame_host(); + navigation_request.frame_tree_node()->current_frame_host(); // A frame owned by <object> should always have a parent. DCHECK(render_frame_host->GetParent()); // It's safe to snapshot the parent origin in the calculation here; if the @@ -214,22 +214,23 @@ std::string server_timing_value = ExtractServerTimingValueIfNeeded(response_head); - new ObjectNavigationFallbackBodyLoader( - std::move(timing_info), std::move(server_timing_value), - std::move(response_body), std::move(url_loader_client_endpoints), - std::move(navigation_request), std::move(completion_closure)); + CreateForNavigationHandle( + navigation_request, std::move(timing_info), + std::move(server_timing_value), std::move(response_body), + std::move(url_loader_client_endpoints), std::move(completion_closure)); } ObjectNavigationFallbackBodyLoader::~ObjectNavigationFallbackBodyLoader() {} ObjectNavigationFallbackBodyLoader::ObjectNavigationFallbackBodyLoader( + NavigationHandle& navigation_handle, blink::mojom::ResourceTimingInfoPtr timing_info, std::string server_timing_value, mojo::ScopedDataPipeConsumerHandle response_body, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - base::WeakPtr<NavigationRequest> navigation_request, base::OnceClosure completion_closure) - : url_loader_(std::move(url_loader_client_endpoints->url_loader)), + : navigation_request_(static_cast<NavigationRequest&>(navigation_handle)), + url_loader_(std::move(url_loader_client_endpoints->url_loader)), url_loader_client_receiver_( this, std::move(url_loader_client_endpoints->url_loader_client)), @@ -238,12 +239,12 @@ std::move(response_body))), timing_info_(std::move(timing_info)), server_timing_value_(std::move(server_timing_value)), - navigation_request_(std::move(navigation_request)), completion_closure_(std::move(completion_closure)) { // Unretained is safe; `url_loader_` is owned by `this` and will not dispatch // callbacks after it is destroyed. - url_loader_client_receiver_.set_disconnect_handler(base::BindOnce( - &ObjectNavigationFallbackBodyLoader::DeleteThis, base::Unretained(this))); + url_loader_client_receiver_.set_disconnect_handler( + base::BindOnce(&ObjectNavigationFallbackBodyLoader::BodyLoadFailed, + base::Unretained(this))); } void ObjectNavigationFallbackBodyLoader::MaybeComplete() { @@ -252,24 +253,18 @@ if (!status_ || response_body_drainer_) return; - // At this point, `this` is done and should be deleted no matter what. Ensure - // that this happens, even with early returns. - base::ScopedClosureRunner cleanup(base::BindOnce( - &ObjectNavigationFallbackBodyLoader::DeleteThis, base::Unretained(this))); - - // If the navigation request is gone, the navigation was replaced with a new - // navigation, and there's no point in reporting the performance entry - // anymore. - if (!navigation_request_) { - return; - } + // At this point, `this` is done and the associated NavigationRequest and + // `this` must be cleaned up, no matter what else happens. Running + // `completion_closure_` will delete the NavigationRequest, which will delete + // `this`. + base::ScopedClosureRunner cleanup(std::move(completion_closure_)); timing_info_->response_end = status_->completion_time; timing_info_->encoded_body_size = status_->encoded_body_length; timing_info_->decoded_body_size = status_->decoded_body_length; RenderFrameHostManager* render_manager = - navigation_request_->frame_tree_node()->render_manager(); + navigation_request_.frame_tree_node()->render_manager(); if (RenderFrameProxyHost* proxy = render_manager->GetProxyToParent()) { proxy->GetAssociatedRemoteFrame()->RenderFallbackContentWithResourceTiming( std::move(timing_info_), server_timing_value_); @@ -279,13 +274,19 @@ ->RenderFallbackContentWithResourceTiming(std::move(timing_info_), server_timing_value_); } - - // Clean up the NavigationRequest that `this` was bound to. - std::move(completion_closure_).Run(); } -void ObjectNavigationFallbackBodyLoader::DeleteThis() { - delete this; +void ObjectNavigationFallbackBodyLoader::BodyLoadFailed() { + // At this point, `this` is done and the associated NavigationRequest and + // `this` must be cleaned up, no matter what else happens. Running + // `completion_closure_` will delete the NavigationRequest, which will delete + // `this`. + base::ScopedClosureRunner cleanup(std::move(completion_closure_)); + + // The endpoint for the URL loader client was closed before the body load + // completed. This is considered failure, so trigger the fallback content, but + // without any timing info, since it can't be calculated. + navigation_request_.RenderFallbackContentForObjectTag(); } void ObjectNavigationFallbackBodyLoader::OnReceiveEarlyHints(
diff --git a/content/browser/loader/object_navigation_fallback_body_loader.h b/content/browser/loader/object_navigation_fallback_body_loader.h index 4f80c47..007f89a 100644 --- a/content/browser/loader/object_navigation_fallback_body_loader.h +++ b/content/browser/loader/object_navigation_fallback_body_loader.h
@@ -9,6 +9,7 @@ #include <string> #include "base/callback.h" +#include "content/public/browser/navigation_handle_user_data.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/data_pipe.h" @@ -57,7 +58,8 @@ // duplicating significant amounts of the resource timing code in the browser. // It would be nice to do better somehow in the future... class ObjectNavigationFallbackBodyLoader - : public network::mojom::URLLoaderClient, + : public NavigationHandleUserData<ObjectNavigationFallbackBodyLoader>, + public network::mojom::URLLoaderClient, public mojo::DataPipeDrainer::Client { public: // `common_params, `commit_params`, and `response_head` are used to @@ -75,27 +77,30 @@ // `completion_closure` is used to clean up the navigation request if the // response body is successfully loaded. static void CreateAndStart( + NavigationRequest& navigation_request, const mojom::CommonNavigationParams& common_params, const mojom::CommitNavigationParams& commit_params, const network::mojom::URLResponseHead& response_head, mojo::ScopedDataPipeConsumerHandle response_body, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - base::WeakPtr<NavigationRequest> navigation_request, base::OnceClosure completion_closure); ~ObjectNavigationFallbackBodyLoader() override; private: + friend NavigationHandleUserData<ObjectNavigationFallbackBodyLoader>; + NAVIGATION_HANDLE_USER_DATA_KEY_DECL(); + ObjectNavigationFallbackBodyLoader( + NavigationHandle& navigation_handle, blink::mojom::ResourceTimingInfoPtr timing_info, std::string server_timing_value, mojo::ScopedDataPipeConsumerHandle response_body, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - base::WeakPtr<NavigationRequest> navigation_request, base::OnceClosure completion_closure); void MaybeComplete(); - void DeleteThis(); + void BodyLoadFailed(); // URLLoaderClient overrides: void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr) override; @@ -115,6 +120,7 @@ void OnDataAvailable(const void* data, size_t num_bytes) override; void OnDataComplete() override; + NavigationRequest& navigation_request_; // `url_loader_` must be kept alive while reading the response body. mojo::Remote<network::mojom::URLLoader> url_loader_; mojo::Receiver<network::mojom::URLLoaderClient> url_loader_client_receiver_; @@ -124,7 +130,6 @@ absl::optional<network::URLLoaderCompletionStatus> status_; blink::mojom::ResourceTimingInfoPtr timing_info_; std::string server_timing_value_; - base::WeakPtr<NavigationRequest> navigation_request_; base::OnceClosure completion_closure_; };
diff --git a/content/browser/media/capture/aura_window_video_capture_device.cc b/content/browser/media/capture/aura_window_video_capture_device.cc index 90f2ba7..947367f0 100644 --- a/content/browser/media/capture/aura_window_video_capture_device.cc +++ b/content/browser/media/capture/aura_window_video_capture_device.cc
@@ -126,7 +126,6 @@ target_window_->RemoveObserver(this); target_window_ = nullptr; - capture_request_ = aura::ScopedWindowCaptureRequest(); #if BUILDFLAG(IS_CHROMEOS_ASH) force_visible_.reset(); #endif
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.cc b/content/browser/renderer_host/agent_scheduling_group_host.cc index 5249e91..05c5d45 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.cc +++ b/content/browser/renderer_host/agent_scheduling_group_host.cc
@@ -342,13 +342,14 @@ const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, int32_t parent_routing_id, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { DCHECK_EQ(state_, LifecycleState::kBound); mojo_remote_.get()->CreateFrameProxy( token, routing_id, opener_frame_token, view_routing_id, parent_routing_id, - std::move(replicated_state), devtools_frame_token, + tree_scope_type, std::move(replicated_state), devtools_frame_token, std::move(remote_main_frame_interfaces)); }
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.h b/content/browser/renderer_host/agent_scheduling_group_host.h index 066e796..aea3625 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.h +++ b/content/browser/renderer_host/agent_scheduling_group_host.h
@@ -98,6 +98,7 @@ const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, int32_t parent_routing_id, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces);
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc index f9c12cf..1faf917 100644 --- a/content/browser/renderer_host/frame_tree_node.cc +++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -108,7 +108,7 @@ FrameTreeNode::FrameTreeNode( FrameTree* frame_tree, RenderFrameHostImpl* parent, - blink::mojom::TreeScopeType scope, + blink::mojom::TreeScopeType tree_scope_type, const std::string& name, const std::string& unique_name, bool is_created_by_script, @@ -120,6 +120,7 @@ parent_(parent), depth_(parent ? parent->frame_tree_node()->depth_ + 1 : 0u), frame_owner_element_type_(owner_type), + tree_scope_type_(tree_scope_type), replication_state_(blink::mojom::FrameReplicationState::New( url::Origin(), name, @@ -127,7 +128,6 @@ blink::ParsedPermissionsPolicy(), network::mojom::WebSandboxFlags::kNone, blink::FramePolicy(), - scope, // should enforce strict mixed content checking blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone, // hashes of hosts for insecure request upgrades
diff --git a/content/browser/renderer_host/frame_tree_node.h b/content/browser/renderer_host/frame_tree_node.h index f494c69..a14ddd69 100644 --- a/content/browser/renderer_host/frame_tree_node.h +++ b/content/browser/renderer_host/frame_tree_node.h
@@ -27,6 +27,7 @@ #include "third_party/blink/public/mojom/frame/frame_owner_element_type.mojom.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom-forward.h" +#include "third_party/blink/public/mojom/frame/tree_scope_type.mojom.h" #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h" @@ -79,7 +80,7 @@ FrameTreeNode( FrameTree* frame_tree, RenderFrameHostImpl* parent, - blink::mojom::TreeScopeType scope, + blink::mojom::TreeScopeType tree_scope_type, const std::string& name, const std::string& unique_name, bool is_created_by_script, @@ -423,6 +424,10 @@ return frame_owner_element_type_; } + blink::mojom::TreeScopeType tree_scope_type() const { + return tree_scope_type_; + } + void SetAdFrameType(blink::mojom::AdFrameType ad_frame_type); // The initial popup URL for new window opened using: @@ -538,10 +543,18 @@ // Whether the frame's owner element in the parent document is collapsed. bool is_collapsed_ = false; - // The type of frame owner for this frame, if any. + // The type of frame owner for this frame. This is only relevant for non-main + // frames. const blink::mojom::FrameOwnerElementType frame_owner_element_type_ = blink::mojom::FrameOwnerElementType::kNone; + // The tree scope type of frame owner element, i.e. whether the element is in + // the document tree (https://dom.spec.whatwg.org/#document-trees) or the + // shadow tree (https://dom.spec.whatwg.org/#shadow-trees). This is only + // relevant for non-main frames. + const blink::mojom::TreeScopeType tree_scope_type_ = + blink::mojom::TreeScopeType::kDocument; + // Track information that needs to be replicated to processes that have // proxies for this frame. blink::mojom::FrameReplicationStatePtr replication_state_;
diff --git a/content/browser/renderer_host/navigation_entry_impl_unittest.cc b/content/browser/renderer_host/navigation_entry_impl_unittest.cc index e7a0ed1e..0994418 100644 --- a/content/browser/renderer_host/navigation_entry_impl_unittest.cc +++ b/content/browser/renderer_host/navigation_entry_impl_unittest.cc
@@ -28,30 +28,6 @@ namespace { -// A test class for testing SSLStatus user data. -class TestSSLStatusData : public SSLStatus::UserData { - public: - TestSSLStatusData() {} - ~TestSSLStatusData() override {} - - void set_user_data_flag(bool user_data_flag) { - user_data_flag_ = user_data_flag; - } - bool user_data_flag() { return user_data_flag_; } - - // SSLStatus implementation: - std::unique_ptr<SSLStatus::UserData> Clone() override { - std::unique_ptr<TestSSLStatusData> cloned = - std::make_unique<TestSSLStatusData>(); - cloned->set_user_data_flag(user_data_flag_); - return std::move(cloned); - } - - private: - bool user_data_flag_ = false; - DISALLOW_COPY_AND_ASSIGN(TestSSLStatusData); -}; - blink::PageState CreateTestPageState() { blink::ExplodedPageState exploded_state; std::string encoded_data; @@ -198,25 +174,6 @@ EXPECT_FALSE(!!(content_status & SSLStatus::RAN_INSECURE_CONTENT)); } -// Tests that SSLStatus user data can be added, retrieved, and copied. -TEST_F(NavigationEntryTest, SSLStatusUserData) { - // Set up an SSLStatus with some user data on it. - SSLStatus ssl; - ssl.user_data = std::make_unique<TestSSLStatusData>(); - TestSSLStatusData* ssl_data = - static_cast<TestSSLStatusData*>(ssl.user_data.get()); - ASSERT_TRUE(ssl_data); - ssl_data->set_user_data_flag(true); - - // Clone the SSLStatus and test that the user data has been cloned. - SSLStatus cloned(ssl); - TestSSLStatusData* cloned_ssl_data = - static_cast<TestSSLStatusData*>(cloned.user_data.get()); - ASSERT_TRUE(cloned_ssl_data); - EXPECT_TRUE(cloned_ssl_data->user_data_flag()); - EXPECT_NE(cloned_ssl_data, ssl_data); -} - // Test other basic accessors TEST_F(NavigationEntryTest, NavigationEntryAccessors) { // SiteInstance
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 9049e1a..29fec4d 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -3577,16 +3577,13 @@ // helper will request fallback content (triggering completion) and report // the resource timing info once the entire response body is drained. // - // The response body fetcher has a lifetime that's weakly associated with - // `this`. The helper will check if `this` is still live before requesting - // fallback content and reporting the timing info to the renderer. - // - // TODO(dcheng): Migrate this to be a NavigationRequest::UserData once - // that's implemented. + // The response body fetcher takes advantage of base::SupportsUserData to + // ensure that the fetcher does not outlive `this`. This ensures that the + // fallback / resource timing are only reported if the navigation request + // is logically still pending. ObjectNavigationFallbackBodyLoader::CreateAndStart( - *common_params_, *commit_params_, *response(), + *this, *common_params_, *commit_params_, *response(), std::move(response_body_), std::move(url_loader_client_endpoints_), - weak_factory_.GetWeakPtr(), base::BindOnce(&NavigationRequest::OnRequestFailedInternal, weak_factory_.GetWeakPtr(), network::URLLoaderCompletionStatus(net::ERR_ABORTED),
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index f5a5260..cc1fb8b 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -614,6 +614,11 @@ complete_callback_for_testing_ = std::move(callback); } + network::mojom::URLLoaderClientEndpointsPtr& + mutable_url_loader_client_endpoints_for_testing() { + return url_loader_client_endpoints_; + } + void set_ready_to_commit_callback_for_testing(base::OnceClosure callback) { ready_to_commit_callback_for_testing_ = std::move(callback); } @@ -881,6 +886,8 @@ return prerender_frame_tree_node_id_; } + void RenderFallbackContentForObjectTag(); + private: friend class NavigationRequestTest; @@ -1320,7 +1327,6 @@ bool ShouldRenderFallbackContentForResponse( const net::HttpResponseHeaders& response_head) const; - void RenderFallbackContentForObjectTag(); // Never null. The pointee node owns this navigation request instance. FrameTreeNode* const frame_tree_node_;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 65b5806..b0b606b 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -661,13 +661,13 @@ // kill. Note that the commit URL is already reported in a crash key, and // additional keys are logged in RenderProcessHostImpl::ShutdownForBadMessage. void LogRendererKillCrashKeys(const SiteInfo& site_info) { - static auto* site_info_key = base::debug::AllocateCrashKeyString( + static auto* const site_info_key = base::debug::AllocateCrashKeyString( "current_site_info", base::debug::CrashKeySize::Size256); base::debug::SetCrashKeyString(site_info_key, site_info.GetDebugString()); } void LogCanCommitOriginAndUrlFailureReason(const std::string& failure_reason) { - static auto* failure_reason_key = base::debug::AllocateCrashKeyString( + static auto* const failure_reason_key = base::debug::AllocateCrashKeyString( "rfhi_can_commit_failure_reason", base::debug::CrashKeySize::Size64); base::debug::SetCrashKeyString(failure_reason_key, failure_reason); } @@ -2807,6 +2807,7 @@ params->opener_frame_token = opener_frame_token; params->parent_routing_id = parent_routing_id; params->previous_sibling_routing_id = previous_sibling_routing_id; + params->tree_scope_type = frame_tree_node()->tree_scope_type(); params->replication_state = frame_tree_node()->current_replication_state().Clone(); params->token = frame_token_; @@ -6489,9 +6490,11 @@ // If an MHTML subframe commits in a different process (even one that // appears correct for the subframe's URL), then we aren't correctly // loading it from the archive and should kill the renderer. - base::debug::SetCrashKeyString( + static auto* const oopif_in_mhtml_page_key = base::debug::AllocateCrashKeyString( - "oopif_in_mhtml_page", base::debug::CrashKeySize::Size32), + "oopif_in_mhtml_page", base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + oopif_in_mhtml_page_key, is_mhtml_document() ? "is_mhtml_doc" : "not_mhtml_doc"); LogCanCommitOriginAndUrlFailureReason("oopif_in_mhtml_page"); return CanCommitStatus::CANNOT_COMMIT_URL; @@ -6984,18 +6987,12 @@ // the origin to commit calculated on the browser side. !policy->CanAccessDataForOrigin( GetProcess()->GetID(), url::Origin::Create(common_params->url))) { - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("lock_url", - base::debug::CrashKeySize::Size64), - process_lock.ToString()); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("commit_origin", - base::debug::CrashKeySize::Size64), - common_params->url.GetOrigin().spec()); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_main_frame", - base::debug::CrashKeySize::Size32), - frame_tree_node_->IsMainFrame() ? "true" : "false"); + SCOPED_CRASH_KEY_STRING64("CommitNavigation", "lock_url", + process_lock.ToString()); + SCOPED_CRASH_KEY_STRING64("CommitNavigation", "commit_origin", + common_params->url.GetOrigin().spec()); + SCOPED_CRASH_KEY_BOOL("CommitNavigation", "is_main_frame", + frame_tree_node_->IsMainFrame()); NOTREACHED() << "Commiting in incompatible process for URL: " << process_lock.lock_url() << " lock vs " << common_params->url.GetOrigin(); @@ -8758,14 +8755,13 @@ mojo::PendingReceiver<blink::mojom::AppCacheBackend> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(StoragePartition::IsAppCacheEnabled()); - static auto* crash_key = base::debug::AllocateCrashKeyString( - "CreateAppCacheBackend-data", base::debug::CrashKeySize::Size64); - std::string data = base::StringPrintf( - "f=%d br=%d irfl=%d iiand=%d fid=%d", frame_.is_bound(), - broker_receiver_.is_bound(), IsRenderFrameLive(), - GetProcess()->IsInitializedAndNotDead(), - RenderProcessHost::FromID(GetProcess()->GetID()) != nullptr); - base::debug::ScopedCrashKeyString scoped_crash_key(crash_key, data); + SCOPED_CRASH_KEY_STRING64( + "CreateAppCacheBackend", "data", + base::StringPrintf( + "f=%d br=%d irfl=%d iiand=%d fid=%d", frame_.is_bound(), + broker_receiver_.is_bound(), IsRenderFrameLive(), + GetProcess()->IsInitializedAndNotDead(), + RenderProcessHost::FromID(GetProcess()->GetID()) != nullptr)); auto* storage_partition_impl = static_cast<StoragePartitionImpl*>(GetProcess()->GetStoragePartition()); @@ -10192,112 +10188,132 @@ // terminations. See https://crbug.com/931895. auto bool_to_crash_key = [](bool b) { return b ? "true" : "false"; }; - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("navigation_url", - base::debug::CrashKeySize::Size256), - url.spec()); + static auto* const navigation_url_key = base::debug::AllocateCrashKeyString( + "navigation_url", base::debug::CrashKeySize::Size256); + base::debug::SetCrashKeyString(navigation_url_key, url.spec()); + static auto* const is_same_document_key = base::debug::AllocateCrashKeyString( + "is_same_document", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_same_document", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(is_same_document_navigation)); + is_same_document_key, bool_to_crash_key(is_same_document_navigation)); + static auto* const is_main_frame_key = base::debug::AllocateCrashKeyString( + "is_main_frame", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_main_frame", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(frame_tree_node_->IsMainFrame())); + is_main_frame_key, bool_to_crash_key(frame_tree_node_->IsMainFrame())); - base::debug::SetCrashKeyString( + static auto* const is_cross_process_subframe_key = base::debug::AllocateCrashKeyString("is_cross_process_subframe", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(IsCrossProcessSubframe())); + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(is_cross_process_subframe_key, + bool_to_crash_key(IsCrossProcessSubframe())); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_local_root", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(is_local_root())); + static auto* const is_local_root_key = base::debug::AllocateCrashKeyString( + "is_local_root", base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(is_local_root_key, + bool_to_crash_key(is_local_root())); + static auto* const site_lock_key = base::debug::AllocateCrashKeyString( + "site_lock", base::debug::CrashKeySize::Size256); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("site_lock", - base::debug::CrashKeySize::Size256), - GetSiteInstance()->GetProcessLock().ToString()); + site_lock_key, GetSiteInstance()->GetProcessLock().ToString()); if (!GetSiteInstance()->IsDefaultSiteInstance()) { - base::debug::SetCrashKeyString( + static auto* const original_url_origin_key = base::debug::AllocateCrashKeyString("original_url_origin", - base::debug::CrashKeySize::Size256), + base::debug::CrashKeySize::Size256); + base::debug::SetCrashKeyString( + original_url_origin_key, GetSiteInstance()->original_url().GetOrigin().spec()); } - base::debug::SetCrashKeyString( + static auto* const is_mhtml_document_key = base::debug::AllocateCrashKeyString("is_mhtml_document", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(is_mhtml_document())); + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(is_mhtml_document_key, + bool_to_crash_key(is_mhtml_document())); - base::debug::SetCrashKeyString( + static auto* const last_committed_url_origin_key = base::debug::AllocateCrashKeyString("last_committed_url_origin", - base::debug::CrashKeySize::Size256), - GetLastCommittedURL().GetOrigin().spec()); + base::debug::CrashKeySize::Size256); + base::debug::SetCrashKeyString(last_committed_url_origin_key, + GetLastCommittedURL().GetOrigin().spec()); - base::debug::SetCrashKeyString( + static auto* const last_successful_url_origin_key = base::debug::AllocateCrashKeyString("last_successful_url_origin", - base::debug::CrashKeySize::Size256), - last_successful_url().GetOrigin().spec()); + base::debug::CrashKeySize::Size256); + base::debug::SetCrashKeyString(last_successful_url_origin_key, + last_successful_url().GetOrigin().spec()); if (navigation_request && navigation_request->IsNavigationStarted()) { - base::debug::SetCrashKeyString( + static auto* const is_renderer_initiated_key = base::debug::AllocateCrashKeyString("is_renderer_initiated", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + is_renderer_initiated_key, bool_to_crash_key(navigation_request->IsRendererInitiated())); - base::debug::SetCrashKeyString( + static auto* const is_server_redirect_key = base::debug::AllocateCrashKeyString("is_server_redirect", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + is_server_redirect_key, bool_to_crash_key(navigation_request->WasServerRedirect())); - base::debug::SetCrashKeyString( + static auto* const is_form_submission_key = base::debug::AllocateCrashKeyString("is_form_submission", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + is_form_submission_key, bool_to_crash_key(navigation_request->IsFormSubmission())); + static auto* const is_error_page_key = base::debug::AllocateCrashKeyString( + "is_error_page", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_error_page", - base::debug::CrashKeySize::Size32), + is_error_page_key, bool_to_crash_key(navigation_request->IsErrorPage())); - base::debug::SetCrashKeyString( + static auto* const from_begin_navigation_key = base::debug::AllocateCrashKeyString("from_begin_navigation", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + from_begin_navigation_key, bool_to_crash_key(navigation_request->from_begin_navigation())); + static auto* const net_error_key = base::debug::AllocateCrashKeyString( + "net_error", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("net_error", - base::debug::CrashKeySize::Size32), + net_error_key, base::NumberToString(navigation_request->GetNetErrorCode())); - base::debug::SetCrashKeyString( + static auto* const initiator_origin_key = base::debug::AllocateCrashKeyString("initiator_origin", - base::debug::CrashKeySize::Size64), + base::debug::CrashKeySize::Size64); + base::debug::SetCrashKeyString( + initiator_origin_key, navigation_request->GetInitiatorOrigin() ? navigation_request->GetInitiatorOrigin()->GetDebugString() : "none"); - base::debug::SetCrashKeyString( + static auto* const starting_site_instance_key = base::debug::AllocateCrashKeyString("starting_site_instance", - base::debug::CrashKeySize::Size256), - navigation_request->GetStartingSiteInstance() - ->GetSiteInfo() - .GetDebugString()); + base::debug::CrashKeySize::Size256); + base::debug::SetCrashKeyString(starting_site_instance_key, + navigation_request->GetStartingSiteInstance() + ->GetSiteInfo() + .GetDebugString()); // Recompute the target SiteInstance to see if it matches the current // one at commit time. scoped_refptr<SiteInstance> dest_instance = frame_tree_node_->render_manager()->GetSiteInstanceForNavigationRequest( navigation_request); - base::debug::SetCrashKeyString( + static auto* const does_recomputed_site_instance_match_key = base::debug::AllocateCrashKeyString( "does_recomputed_site_instance_match", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + does_recomputed_site_instance_match_key, bool_to_crash_key(dest_instance == GetSiteInstance())); } } @@ -10881,70 +10897,81 @@ // Temporary instrumentation to debug the root cause of // https://crbug.com/923144. auto bool_to_crash_key = [](bool b) { return b ? "true" : "false"; }; + static auto* const is_same_document_key = base::debug::AllocateCrashKeyString( + "is_same_document", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_same_document", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(is_same_document_navigation)); + is_same_document_key, bool_to_crash_key(is_same_document_navigation)); + static auto* const is_subframe_key = base::debug::AllocateCrashKeyString( + "is_subframe", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_subframe", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(!frame_tree_node_->IsMainFrame())); + is_subframe_key, bool_to_crash_key(!frame_tree_node_->IsMainFrame())); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("lifecycle_state", - base::debug::CrashKeySize::Size32), - LifecycleStateImplToString(lifecycle_state())); + static auto* const lifecycle_state_key = base::debug::AllocateCrashKeyString( + "lifecycle_state", base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(lifecycle_state_key, + LifecycleStateImplToString(lifecycle_state())); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_current", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(IsCurrent())); + static auto* const is_current_key = base::debug::AllocateCrashKeyString( + "is_current", base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(is_current_key, + bool_to_crash_key(IsCurrent())); - base::debug::SetCrashKeyString( + static auto* const is_cross_process_subframe_key = base::debug::AllocateCrashKeyString("is_cross_process_subframe", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(IsCrossProcessSubframe())); + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(is_cross_process_subframe_key, + bool_to_crash_key(IsCrossProcessSubframe())); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_local_root", - base::debug::CrashKeySize::Size32), - bool_to_crash_key(is_local_root())); + static auto* const is_local_root_key = base::debug::AllocateCrashKeyString( + "is_local_root", base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString(is_local_root_key, + bool_to_crash_key(is_local_root())); if (navigation_request && navigation_request->IsNavigationStarted()) { - base::debug::SetCrashKeyString( + static auto* const is_renderer_initiated_key = base::debug::AllocateCrashKeyString("is_renderer_initiated", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + is_renderer_initiated_key, bool_to_crash_key(navigation_request->IsRendererInitiated())); - base::debug::SetCrashKeyString( + static auto* const is_server_redirect_key = base::debug::AllocateCrashKeyString("is_server_redirect", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + is_server_redirect_key, bool_to_crash_key(navigation_request->WasServerRedirect())); - base::debug::SetCrashKeyString( + static auto* const is_form_submission_key = base::debug::AllocateCrashKeyString("is_form_submission", - base::debug::CrashKeySize::Size32), + base::debug::CrashKeySize::Size32); + base::debug::SetCrashKeyString( + is_form_submission_key, bool_to_crash_key(navigation_request->IsFormSubmission())); + static auto* const is_error_page_key = base::debug::AllocateCrashKeyString( + "is_error_page", base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_error_page", - base::debug::CrashKeySize::Size32), + is_error_page_key, bool_to_crash_key(navigation_request->IsErrorPage())); - base::debug::SetCrashKeyString( + static auto* const initiator_origin_key = base::debug::AllocateCrashKeyString("initiator_origin", - base::debug::CrashKeySize::Size64), + base::debug::CrashKeySize::Size64); + base::debug::SetCrashKeyString( + initiator_origin_key, navigation_request->GetInitiatorOrigin() ? navigation_request->GetInitiatorOrigin()->GetDebugString() : "none"); - base::debug::SetCrashKeyString( + static auto* const starting_site_instance_key = base::debug::AllocateCrashKeyString("starting_site_instance", - base::debug::CrashKeySize::Size256), - navigation_request->GetStartingSiteInstance() - ->GetSiteInfo() - .GetDebugString()); + base::debug::CrashKeySize::Size256); + base::debug::SetCrashKeyString(starting_site_instance_key, + navigation_request->GetStartingSiteInstance() + ->GetSiteInfo() + .GetDebugString()); } }
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 62a3d251..eb92d5c5 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1099,22 +1099,14 @@ navigation_rfh->GetProcess()->GetID(), url::Origin::Create(request->common_params().url)) && !request->IsForMhtmlSubframe()) { - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("lock_url", - base::debug::CrashKeySize::Size256), - process_lock.ToString()); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("commit_origin", - base::debug::CrashKeySize::Size64), - request->common_params().url.GetOrigin().spec()); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("is_main_frame", - base::debug::CrashKeySize::Size32), - frame_tree_node_->IsMainFrame() ? "true" : "false"); - base::debug::SetCrashKeyString( - base::debug::AllocateCrashKeyString("use_current_rfh", - base::debug::CrashKeySize::Size32), - use_current_rfh ? "true" : "false"); + SCOPED_CRASH_KEY_STRING256("GetFrameHostForNav", "lock_url", + process_lock.ToString()); + SCOPED_CRASH_KEY_STRING64("GetFrameHostForNav", "commit_origin", + request->common_params().url.GetOrigin().spec()); + SCOPED_CRASH_KEY_BOOL("GetFrameHostForNav", "is_main_frame", + frame_tree_node_->IsMainFrame()); + SCOPED_CRASH_KEY_BOOL("GetFrameHostForNav", "use_current_rfh", + use_current_rfh); NOTREACHED() << "Picked an incompatible process for URL: " << process_lock.ToString() << " lock vs " << request->common_params().url.GetOrigin();
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc index 728f52c..9f4c72d 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.cc +++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -311,6 +311,7 @@ ->GetAgentSchedulingGroup() .CreateFrameProxy(frame_token_, routing_id_, opener_frame_token, view_routing_id, parent_routing_id, + frame_tree_node_->tree_scope_type(), frame_tree_node_->current_replication_state().Clone(), frame_tree_node_->devtools_frame_token(), BindAndPassRemoteMainFrameInterfaces());
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 8bcdeaa..cb45b60 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2956,9 +2956,8 @@ if (site_isolation_mode.empty()) site_isolation_mode = "(none)"; - static auto* isolation_mode_key = base::debug::AllocateCrashKeyString( - "site_isolation_mode", base::debug::CrashKeySize::Size32); - base::debug::SetCrashKeyString(isolation_mode_key, site_isolation_mode); + SCOPED_CRASH_KEY_STRING32("RPH.BadMessageKill", "isolation_mode", + site_isolation_mode); // Report a crash, since none will be generated by the killed renderer. base::debug::DumpWithoutCrashing();
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc index ce0a83f..804ea37b 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -832,13 +832,9 @@ if (RenderWidgetHostViewBase::IsValidRWHVBPointer(target) != 1 && !has_dumped_) { has_dumped_ = true; - auto* invalid_rwhvb_ptr_string = base::debug::AllocateCrashKeyString( - "invalid_rwhvb_pointer_status", base::debug::CrashKeySize::Size32); - base::debug::ScopedCrashKeyString key( - invalid_rwhvb_ptr_string, - base::StringPrintf( - "Invalid RWHVB ptr: status = %d", - RenderWidgetHostViewBase::IsValidRWHVBPointer(target))); + SCOPED_CRASH_KEY_NUMBER( + "DispatchTouchEvent", "ptr_status", + RenderWidgetHostViewBase::IsValidRWHVBPointer(target)); base::debug::DumpWithoutCrashing(); } touch_target_ = target;
diff --git a/content/browser/service_worker/service_worker_script_loader_factory.cc b/content/browser/service_worker/service_worker_script_loader_factory.cc index a9493be..575cf24 100644 --- a/content/browser/service_worker/service_worker_script_loader_factory.cc +++ b/content/browser/service_worker/service_worker_script_loader_factory.cc
@@ -167,10 +167,9 @@ network::mojom::RequestDestination::kServiceWorker && resource_request.destination != network::mojom::RequestDestination::kScript) { - static auto* key = base::debug::AllocateCrashKeyString( - "swslf_bad_type", base::debug::CrashKeySize::Size32); - base::debug::SetCrashKeyString( - key, network::RequestDestinationToString(resource_request.destination)); + SCOPED_CRASH_KEY_STRING32( + "ServiceWorkerSLF", "bad_type", + network::RequestDestinationToString(resource_request.destination)); mojo::ReportBadMessage("SWSLF_BAD_REQUEST_DESTINATION"); return false; }
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index cad85bc..1c9e03f6 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -875,12 +875,10 @@ CHECK(base::Contains(controllees_to_be_evicted_, client_uuid)); // TODO(crbug.com/1021718): Remove DumpWithoutCrashing once we confirm the // cause of the crash. - static auto* no_controllee_reason = base::debug::AllocateCrashKeyString( - "no_controllee_reason", base::debug::CrashKeySize::Size32); BackForwardCacheCanStoreDocumentResult can_store; can_store.No(controllees_to_be_evicted_.at(client_uuid)); - base::debug::ScopedCrashKeyString scoped_no_controllee_reason( - no_controllee_reason, can_store.ToString()); + SCOPED_CRASH_KEY_STRING32("RestoreForBFCache", "no_controllee_reason", + can_store.ToString()); base::debug::DumpWithoutCrashing(); return; }
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc index 00033b6..c555769 100644 --- a/content/browser/site_instance_impl.cc +++ b/content/browser/site_instance_impl.cc
@@ -443,10 +443,8 @@ // TODO(acolwell): Once we have confidence all callers are setting // |is_site_url| correctly, replace crash reporting with code that returns a // default config for this scheme in the non-site URL case. - static auto* guest_url_crash_key = base::debug::AllocateCrashKeyString( - "guest_url", base::debug::CrashKeySize::Size256); - base::debug::SetCrashKeyString(guest_url_crash_key, - url.possibly_invalid_spec()); + SCOPED_CRASH_KEY_STRING256("StoragePartitionConfigForUrl", "guest_url", + url.possibly_invalid_spec()); base::debug::DumpWithoutCrashing(); } @@ -1354,17 +1352,10 @@ storage_partition_config.partition_domain()) { // Trigger crash logging if we encounter a case that violates our // assumptions. - static auto* storage_partition_domain_key = - base::debug::AllocateCrashKeyString("storage_partition_domain", - base::debug::CrashKeySize::Size256); - static auto* storage_partition_config_domain_key = - base::debug::AllocateCrashKeyString( - "storage_partition_config_domain_key", - base::debug::CrashKeySize::Size256); - base::debug::SetCrashKeyString(storage_partition_domain_key, - storage_partition->GetPartitionDomain()); - base::debug::SetCrashKeyString(storage_partition_config_domain_key, - storage_partition_config.partition_domain()); + SCOPED_CRASH_KEY_STRING256("GetPartitionDomain", "domain", + storage_partition->GetPartitionDomain()); + SCOPED_CRASH_KEY_STRING256("GetPartitionDomain", "config_domain_key", + storage_partition_config.partition_domain()); base::debug::DumpWithoutCrashing();
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 4c8efe9..0001863 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -108,6 +108,8 @@ #include "content/public/test/render_frame_host_test_support.h" #include "content/public/test/test_frame_navigation_observer.h" #include "content/public/test/test_navigation_observer.h" +#include "content/public/test/test_navigation_throttle.h" +#include "content/public/test/test_navigation_throttle_inserter.h" #include "content/public/test/test_utils.h" #include "content/public/test/url_loader_interceptor.h" #include "content/shell/browser/shell.h" @@ -6223,7 +6225,8 @@ // anymore. agent_scheduling_group_a->CreateFrameProxy( blink::RemoteFrameToken(), new_routing_id, absl::nullopt, view_routing_id, - parent_routing_id, blink::mojom::FrameReplicationState::New(), + parent_routing_id, blink::mojom::TreeScopeType::kDocument, + blink::mojom::FrameReplicationState::New(), base::UnguessableToken::Create(), std::move(remote_main_frame_interfaces)); @@ -10631,10 +10634,30 @@ EXPECT_EQ(using_speculative_rfh, nav_manager.was_committed()); } -// Test that triggering fallback handling for <object> with an HTTP error does -// not result in the renderer ignoring a `CommitNavigation()` IPC. +namespace { + +// Helper for various <object> navigation test cases that trigger fallback +// handling. Fallback handling should never reach ready-to-commit navigation, so +// this helper forces test failure if a ReadyToCommitNavigation() is received. +class AssertNoReadyToCommitNavigationCalls : public WebContentsObserver { + public: + explicit AssertNoReadyToCommitNavigationCalls(WebContents* contents) + : WebContentsObserver(contents) {} + + private: + // WebContentsObserver overrides: + void ReadyToCommitNavigation(NavigationHandle* handle) override { + ASSERT_TRUE(false); + } +}; + +} // namespace + +// Test that a same-site navigation in <object> that fails with an HTTP error +// directly triggers fallback handling, rather than triggering fallback handling +// in the renderer after it receives a `CommitNavigation()` IPC. IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, - CommitNavigationWithHTTPErrorInObjectTag) { + ObjectTagSameSiteNavigationWithHTTPError) { // Set up a test page with a same-site child frame hosted in an <object> tag. // TODO(dcheng): In the future, it might be useful to also have a test where // the child frame is same-site but cross-origin, and have the parent @@ -10647,9 +10670,11 @@ // And there should be no fallback content displayed. EXPECT_EQ("", EvalJs(web_contents(), "document.body.innerText")); - // Now navigate the first child to another same-site page that will result in - // a 404. Note that with subframe RenderDocument, this will create a - // speculative RFH. + // <object> fallback handling should never reach ReadyToCommitNavigation. + AssertNoReadyToCommitNavigationCalls asserter(web_contents()); + + // Now navigate the first child to a same-site page that will result in a 404. + // Note that with subframe RenderDocument, this will create a speculative RFH. FrameTreeNode* root = web_contents()->GetFrameTree()->root(); GURL url2(embedded_test_server()->GetURL("a.com", "/page404.html")); TestNavigationManager nav_manager(web_contents(), url2); @@ -10657,6 +10682,11 @@ EXPECT_TRUE(BeginNavigateToURLFromRenderer( first_child->render_manager()->current_frame_host(), url2)); + const bool using_speculative_rfh = + !!first_child->render_manager()->speculative_frame_host(); + EXPECT_EQ(using_speculative_rfh, + GetRenderDocumentLevel() == RenderDocumentLevel::kSubframe); + nav_manager.WaitForNavigationFinished(); // There should be no commit... EXPECT_FALSE(nav_manager.was_committed()); @@ -10671,16 +10701,233 @@ EXPECT_EQ("fallback", EvalJs(web_contents(), "document.body.innerText")); } -// Test that triggering fallback handling for <object> with a network error that -// is routed via a `CommitFailedNavigation()` IPC ends up being ignored. +// Test that a cross-site navigation in <object> that fails with an HTTP error +// directly triggers fallback handling, rather than triggering fallback handling +// in the renderer after it receives a `CommitNavigation()` IPC. IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, - CommitFailedNavigationInObjectTag) { + ObjectTagCrossSiteNavigationWithHTTPError) { + // Set up a test page with a same-site child frame hosted in an <object> tag. + // TODO(dcheng): In the future, it might be useful to also have a test where + // the child frame is same-site but cross-origin, and have the parent + // initiate the navigation in the child frame. + GURL url1(embedded_test_server()->GetURL("a.com", "/object-frame.html")); + EXPECT_TRUE(NavigateToURL(web_contents(), url1)); + + // There should be one nested browsing context. + EXPECT_EQ(1, EvalJs(web_contents(), "window.length")); + // And there should be no fallback content displayed. + EXPECT_EQ("", EvalJs(web_contents(), "document.body.innerText")); + + // <object> fallback handling should never reach ReadyToCommitNavigation. + AssertNoReadyToCommitNavigationCalls asserter(web_contents()); + + // Now navigate the first child to a cross-site page that will result in a + // 404. + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); + GURL url2(embedded_test_server()->GetURL("b.com", "/page404.html")); + TestNavigationManager nav_manager(web_contents(), url2); + FrameTreeNode* first_child = root->child_at(0); + EXPECT_TRUE(BeginNavigateToURLFromRenderer( + first_child->render_manager()->current_frame_host(), url2)); + + // Cross-site navigations always force a speculative RFH to be created. + EXPECT_TRUE(first_child->render_manager()->speculative_frame_host()); + + nav_manager.WaitForNavigationFinished(); + // There should be no commit... + EXPECT_FALSE(nav_manager.was_committed()); + // .. and the navigation should have been aborted. + EXPECT_FALSE(nav_manager.was_successful()); + // Fallback handling should discard the child browsing context and render the + // fallback contents. + // TODO(dcheng): Chrome is not compliant with the spec. An HTTP error triggers + // fallback content, which is supposed to discard the nested browsing + // context... + EXPECT_EQ(1, EvalJs(web_contents(), "window.length")); + EXPECT_EQ("fallback", EvalJs(web_contents(), "document.body.innerText")); +} + +// Test that a same-site navigation in <object> that fails with an HTTP error +// and also subsequently fails to load the body still directly triggers fallback +// handling, rather than triggering fallback handling in the renderer after it +// receives a `CommitNavigation()` IPC. +IN_PROC_BROWSER_TEST_P( + SitePerProcessBrowserTest, + ObjectTagSameSiteNavigationWithHTTPErrorAndFailedBodyLoad) { + // Set up a test page with a same-site child frame hosted in an <object> tag. + // TODO(dcheng): In the future, it might be useful to also have a test where + // the child frame is same-site but cross-origin, and have the parent + // initiate the navigation in the child frame. + GURL url1(embedded_test_server()->GetURL("a.com", "/object-frame.html")); + EXPECT_TRUE(NavigateToURL(web_contents(), url1)); + + // There should be one nested browsing context. + EXPECT_EQ(1, EvalJs(web_contents(), "window.length")); + // And there should be no fallback content displayed. + EXPECT_EQ("", EvalJs(web_contents(), "document.body.innerText")); + + // This test differs from CommitNavigationWithHTTPErrorInObjectTag by + // triggering a body load failure. `ObjectNavigationFallbackBodyLoader` + // detects this by setting a disconnect handler on the `mojo::Receiver` for + // `network:;mojom::URLLoaderClient`. Exercise this code path by: + // 1. inserting a test `NavigationThrottle` + // 2. replacing the `network::mojom::URLLoaderClient` endpoint with one where + // the corresponding `mojo::Remote` is simply closed at + // `WILL_PROCESS_RESPONSE` time. + TestNavigationThrottleInserter navigation_throttle_inserter( + web_contents(), + base::BindRepeating( + [](NavigationHandle* handle) -> std::unique_ptr<NavigationThrottle> { + auto throttle = std::make_unique<TestNavigationThrottle>(handle); + throttle->SetCallback( + TestNavigationThrottle::WILL_PROCESS_RESPONSE, + base::BindLambdaForTesting([handle]() { + // Swap out the URL loader client endpoint and just drop the + // mojo::Remote. This will trigger the mojo::Receiver to be + // disconnected, which should still trigger fallback handling + // despite body loading failing. + mojo::Remote<network::mojom::URLLoaderClient> + remote_to_be_dropped; + auto* request = static_cast<NavigationRequest*>(handle); + request->mutable_url_loader_client_endpoints_for_testing() + ->url_loader_client = + remote_to_be_dropped.BindNewPipeAndPassReceiver(); + })); + return throttle; + })); + + // <object> fallback handling should never reach ReadyToCommitNavigation. + AssertNoReadyToCommitNavigationCalls asserter(web_contents()); + + // Now navigate the first child to a same-site page that will result in a 404, + // though the body loading will fail. Note that with subframe RenderDocument, + // this will create a speculative RFH. + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); + GURL url2(embedded_test_server()->GetURL("a.com", "/page404.html")); + TestNavigationManager nav_manager(web_contents(), url2); + FrameTreeNode* first_child = root->child_at(0); + EXPECT_TRUE(BeginNavigateToURLFromRenderer( + first_child->render_manager()->current_frame_host(), url2)); + + const bool using_speculative_rfh = + !!first_child->render_manager()->speculative_frame_host(); + EXPECT_EQ(using_speculative_rfh, + GetRenderDocumentLevel() == RenderDocumentLevel::kSubframe); + + nav_manager.WaitForNavigationFinished(); + // There should be no commit... + EXPECT_FALSE(nav_manager.was_committed()); + // .. and the navigation should have been aborted. + EXPECT_FALSE(nav_manager.was_successful()); + // Fallback handling should discard the child browsing context and render the + // fallback contents. + // TODO(dcheng): Chrome is not compliant with the spec. An HTTP error triggers + // fallback content, which is supposed to discard the nested browsing + // context... + EXPECT_EQ(1, EvalJs(web_contents(), "window.length")); + EXPECT_EQ("fallback", EvalJs(web_contents(), "document.body.innerText")); + + // `WaitForNavigationFinished()` should imply the `NavigationRequest` has been + // cleaned up as well, but check to be sure. + EXPECT_FALSE(first_child->navigation_request()); +} + +// Test that a cross-site navigation in <object> that fails with an HTTP error +// and also subsequently fails to load the body still directly triggers fallback +// handling, rather than triggering fallback handling in the renderer after it +// receives a `CommitNavigation()` IPC. +IN_PROC_BROWSER_TEST_P( + SitePerProcessBrowserTest, + ObjectTagCrossSiteNavigationWithHTTPErrorAndFailedBodyLoad) { + // Set up a test page with a same-site child frame hosted in an <object> tag. + // TODO(dcheng): In the future, it might be useful to also have a test where + // the child frame is same-site but cross-origin, and have the parent + // initiate the navigation in the child frame. + GURL url1(embedded_test_server()->GetURL("a.com", "/object-frame.html")); + EXPECT_TRUE(NavigateToURL(web_contents(), url1)); + + // There should be one nested browsing context. + EXPECT_EQ(1, EvalJs(web_contents(), "window.length")); + // And there should be no fallback content displayed. + EXPECT_EQ("", EvalJs(web_contents(), "document.body.innerText")); + + // This test differs from CommitNavigationWithHTTPErrorInObjectTag by + // triggering a body load failure. `ObjectNavigationFallbackBodyLoader` + // detects this by setting a disconnect handler on the `mojo::Receiver` for + // `network:;mojom::URLLoaderClient`. Exercise this code path by: + // 1. inserting a test `NavigationThrottle` + // 2. replacing the `network::mojom::URLLoaderClient` endpoint with one where + // the corresponding `mojo::Remote` is simply closed at + // `WILL_PROCESS_RESPONSE` time. + TestNavigationThrottleInserter navigation_throttle_inserter( + web_contents(), + base::BindRepeating( + [](NavigationHandle* handle) -> std::unique_ptr<NavigationThrottle> { + auto throttle = std::make_unique<TestNavigationThrottle>(handle); + throttle->SetCallback( + TestNavigationThrottle::WILL_PROCESS_RESPONSE, + base::BindLambdaForTesting([handle]() { + // Swap out the URL loader client endpoint and just drop the + // mojo::Remote. This will trigger the mojo::Receiver to be + // disconnected, which should still trigger fallback handling + // despite body loading failing. + mojo::Remote<network::mojom::URLLoaderClient> + remote_to_be_dropped; + auto* request = static_cast<NavigationRequest*>(handle); + request->mutable_url_loader_client_endpoints_for_testing() + ->url_loader_client = + remote_to_be_dropped.BindNewPipeAndPassReceiver(); + })); + return throttle; + })); + + // <object> fallback handling should never reach ReadyToCommitNavigation. + AssertNoReadyToCommitNavigationCalls asserter(web_contents()); + + // Now navigate the first child to a cross-site page that will result in a + // 404, though the body loading will fail. + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); + GURL url2(embedded_test_server()->GetURL("b.com", "/page404.html")); + TestNavigationManager nav_manager(web_contents(), url2); + FrameTreeNode* first_child = root->child_at(0); + EXPECT_TRUE(BeginNavigateToURLFromRenderer( + first_child->render_manager()->current_frame_host(), url2)); + + // Cross-site navigations always force a speculative RFH to be created. + EXPECT_TRUE(first_child->render_manager()->speculative_frame_host()); + + nav_manager.WaitForNavigationFinished(); + // There should be no commit... + EXPECT_FALSE(nav_manager.was_committed()); + // .. and the navigation should have been aborted. + EXPECT_FALSE(nav_manager.was_successful()); + // Fallback handling should discard the child browsing context and render the + // fallback contents. + // TODO(dcheng): Chrome is not compliant with the spec. An HTTP error triggers + // fallback content, which is supposed to discard the nested browsing + // context... + EXPECT_EQ(1, EvalJs(web_contents(), "window.length")); + EXPECT_EQ("fallback", EvalJs(web_contents(), "document.body.innerText")); + + // `WaitForNavigationFinished()` should imply the `NavigationRequest` has been + // cleaned up as well, but check to be sure. + EXPECT_FALSE(first_child->navigation_request()); +} + +// Test that a same-site navigation in <object> that fails with a network error +// directly triggers fallback handling, rather than triggering fallback handling +// in the renderer after it receives a `CommitFailedNavigation()` IPC. +IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, + ObjectTagSameSiteNavigationWithNetworkError) { // Set up a test page with a same-site child frame hosted in an <object> tag. GURL url1(embedded_test_server()->GetURL("a.com", "/object-frame.html")); EXPECT_TRUE(NavigateToURL(web_contents(), url1)); - // Now navigate the first child to another same-site page that will result in - // a network error. Note that with subframe RenderDocument, this will create a + // <object> fallback handling should never reach ReadyToCommitNavigation. + AssertNoReadyToCommitNavigationCalls asserter(web_contents()); + + // Now navigate the first child to a same-site page that will result in a + // network error. Note that with subframe RenderDocument, this will create a // speculative RFH. FrameTreeNode* root = web_contents()->GetFrameTree()->root(); GURL error_url(embedded_test_server()->GetURL("a.com", "/empty.html")); @@ -10692,15 +10939,51 @@ EXPECT_TRUE(BeginNavigateToURLFromRenderer( first_child->render_manager()->current_frame_host(), error_url)); - // Note: this needs to be checked before `WaitForResponse()`, as the - // `CommitFailedNavigation()` IPC is sent somewhere inside - // `WaitForResponse()`. - bool using_speculative_rfh = + const bool using_speculative_rfh = !!first_child->render_manager()->speculative_frame_host(); EXPECT_EQ(using_speculative_rfh, GetRenderDocumentLevel() == RenderDocumentLevel::kSubframe); - // Returns false the test server has already been shutdown. + // `WaitForResponse()` should signal failure by returning `false` false since + // the URLLoaderInterceptor forces a network error. + EXPECT_FALSE(nav_manager.WaitForResponse()); + + nav_manager.WaitForNavigationFinished(); + EXPECT_FALSE(nav_manager.was_committed()); + + // Make sure that the speculative RFH has been cleaned up, if needed. + EXPECT_EQ(nullptr, first_child->render_manager()->speculative_frame_host()); +} + +// Test that a cross-site navigation in <object> that fails with a network error +// directly triggers fallback handling, rather than triggering fallback handling +// in the renderer after it receives a `CommitFailedNavigation()` IPC. +IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, + ObjectTagCrossSiteNavigationWithNetworkError) { + // Set up a test page with a same-site child frame hosted in an <object> tag. + GURL url1(embedded_test_server()->GetURL("a.com", "/object-frame.html")); + EXPECT_TRUE(NavigateToURL(web_contents(), url1)); + + // <object> fallback handling should never reach ReadyToCommitNavigation. + AssertNoReadyToCommitNavigationCalls asserter(web_contents()); + + // Now navigate the first child to a cross-site page that will result in a + // network error. + FrameTreeNode* root = web_contents()->GetFrameTree()->root(); + GURL error_url(embedded_test_server()->GetURL("b.com", "/empty.html")); + std::unique_ptr<URLLoaderInterceptor> interceptor = + URLLoaderInterceptor::SetupRequestFailForURL(error_url, + net::ERR_CONNECTION_REFUSED); + TestNavigationManager nav_manager(web_contents(), error_url); + FrameTreeNode* first_child = root->child_at(0); + EXPECT_TRUE(BeginNavigateToURLFromRenderer( + first_child->render_manager()->current_frame_host(), error_url)); + + // Cross-site navigations always force a speculative RFH to be created. + EXPECT_TRUE(first_child->render_manager()->speculative_frame_host()); + + // `WaitForResponse()` should signal failure by returning `false` false since + // the URLLoaderInterceptor forces a network error. EXPECT_FALSE(nav_manager.WaitForResponse()); nav_manager.WaitForNavigationFinished();
diff --git a/content/browser/speech/speech_recognizer_impl.cc b/content/browser/speech/speech_recognizer_impl.cc index 87e8906..28dbb3c 100644 --- a/content/browser/speech/speech_recognizer_impl.cc +++ b/content/browser/speech/speech_recognizer_impl.cc
@@ -294,7 +294,9 @@ CHECK(audio_converter_->data_was_converted()); } -void SpeechRecognizerImpl::OnCaptureError(const std::string& message) { +void SpeechRecognizerImpl::OnCaptureError( + media::AudioCapturerSource::ErrorCode code, + const std::string& message) { FSMEventArgs event_args(EVENT_AUDIO_ERROR); GetIOThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(&SpeechRecognizerImpl::DispatchEvent,
diff --git a/content/browser/speech/speech_recognizer_impl.h b/content/browser/speech/speech_recognizer_impl.h index 43bfbd8..fd0acc4 100644 --- a/content/browser/speech/speech_recognizer_impl.h +++ b/content/browser/speech/speech_recognizer_impl.h
@@ -146,7 +146,8 @@ base::TimeTicks audio_capture_time, double volume, bool key_pressed) final; - void OnCaptureError(const std::string& message) final; + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) final; void OnCaptureMuted(bool is_muted) final {} // SpeechRecognitionEngineDelegate methods.
diff --git a/content/browser/speech/speech_recognizer_impl_unittest.cc b/content/browser/speech/speech_recognizer_impl_unittest.cc index a3c8e49..48f9788 100644 --- a/content/browser/speech/speech_recognizer_impl_unittest.cc +++ b/content/browser/speech/speech_recognizer_impl_unittest.cc
@@ -269,7 +269,8 @@ auto* capture_callback = static_cast<media::AudioCapturerSource::CaptureCallback*>( recognizer_.get()); - capture_callback->OnCaptureError(""); + capture_callback->OnCaptureError( + media::AudioCapturerSource::ErrorCode::kUnknown, ""); } void WaitForAudioThreadToPostDeviceInfo() {
diff --git a/content/browser/ssl/ssl_manager.cc b/content/browser/ssl/ssl_manager.cc index bb9873b97..677ad33 100644 --- a/content/browser/ssl/ssl_manager.cc +++ b/content/browser/ssl/ssl_manager.cc
@@ -198,9 +198,6 @@ // |entry| points to the NavigationEntry that has just committed and it may // contain existing ssl flags which we do not want to reset. remove_content_status_flags = ~0; - // Also clear any UserData from the SSLStatus. - if (entry) - entry->GetSSL().user_data = nullptr; } if (!UpdateEntry(entry, add_content_status_flags,
diff --git a/content/browser/webui/web_ui_controller_factory_registry.cc b/content/browser/webui/web_ui_controller_factory_registry.cc index 6c5061a0..c0cd3bc 100644 --- a/content/browser/webui/web_ui_controller_factory_registry.cc +++ b/content/browser/webui/web_ui_controller_factory_registry.cc
@@ -25,6 +25,12 @@ g_web_ui_controller_factories.Pointer()->push_back(factory); } +int WebUIControllerFactory::GetNumRegisteredFactoriesForTesting() { + if (!g_web_ui_controller_factories.IsCreated()) + return 0; + return g_web_ui_controller_factories.Get().size(); +} + WebUIControllerFactoryRegistry* WebUIControllerFactoryRegistry::GetInstance() { return base::Singleton<WebUIControllerFactoryRegistry>::get(); }
diff --git a/content/browser/webui/web_ui_url_loader_factory.cc b/content/browser/webui/web_ui_url_loader_factory.cc index d2b2a5b..82f318c 100644 --- a/content/browser/webui/web_ui_url_loader_factory.cc +++ b/content/browser/webui/web_ui_url_loader_factory.cc
@@ -266,9 +266,7 @@ (!request.url.has_host() || allowed_hosts_.find(request.url.host()) == allowed_hosts_.end())) { // Temporary reporting the bad WebUI host for for http://crbug.com/837328. - static auto* crash_key = base::debug::AllocateCrashKeyString( - "webui_url", base::debug::CrashKeySize::Size64); - base::debug::SetCrashKeyString(crash_key, request.url.spec()); + SCOPED_CRASH_KEY_STRING64("WebUIURLLoader", "url", request.url.spec()); DVLOG(1) << "Bad host: \"" << request.url.host() << '"'; mojo::ReportBadMessage("Incorrect host");
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc index 0aea845..2cd804b 100644 --- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc +++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -542,10 +542,10 @@ SCOPED_UMA_HISTOGRAM_TIMER("DirectWrite.Fonts.Proxy.LoadFamilyTime"); TRACE_EVENT0("dwrite,fonts", "DWriteFontFamilyProxy::LoadFamily"); - auto* font_key_name = base::debug::AllocateCrashKeyString( - "font_key_name", base::debug::CrashKeySize::Size32); - base::debug::ScopedCrashKeyString crash_key(font_key_name, - base::WideToUTF8(family_name_)); + // TODO(dcheng): Is this crash key still used? There does not appear to be + // anything obvious below that would trigger a crash report. + SCOPED_CRASH_KEY_STRING32("LoadFamily", "font_key_name", + base::WideToUTF8(family_name_)); mswr::ComPtr<IDWriteFontCollection> collection; if (!proxy_collection_->LoadFamily(family_index_, &collection)) {
diff --git a/content/common/agent_scheduling_group.mojom b/content/common/agent_scheduling_group.mojom index f99eb01..104949ea 100644 --- a/content/common/agent_scheduling_group.mojom +++ b/content/common/agent_scheduling_group.mojom
@@ -9,6 +9,7 @@ import "content/common/native_types.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom"; import "third_party/blink/public/mojom/frame/frame_replication_state.mojom"; +import "third_party/blink/public/mojom/frame/tree_scope_type.mojom"; import "third_party/blink/public/mojom/tokens/tokens.mojom"; // Interface for general communication between the renderer process's @@ -65,6 +66,10 @@ // Must not be `MSG_ROUTING_NONE`. // `parent_routing_id`: `MSG_ROUTING_NONE` for a top-level RenderFrameProxy; // otherwise, Identifies the parent frame of the RenderFrameProxy. + // `tree_scope_type`: Whether the owner element (e.g. <iframe>, <object>, et + // cetera) for this frame is in the document tree or the shadow tree. This + // parameter has no meaning for main frames, and any passed value will be + // ignored for main frames. // `devtools_frame_token`: Used for devtools instrumentation and // trace-ability. The token is shared across all frames (local or remotes) // representing the same logical frame tree node, and is used by Blink and @@ -77,6 +82,7 @@ CreateFrameProxy(blink.mojom.RemoteFrameToken token, int32 routing_id, blink.mojom.FrameToken? opener_frame_token, int32 view_routing_id, int32 parent_routing_id, + blink.mojom.TreeScopeType tree_scope_type, blink.mojom.FrameReplicationState replication_state, mojo_base.mojom.UnguessableToken devtools_frame_token, RemoteMainFrameInterfaces remote_main_frame_interfaces);
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index 642e02a6..e729348 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -231,6 +231,8 @@ pending_remote<blink.mojom.BrowserInterfaceBroker> interface_broker; + blink.mojom.TreeScopeType tree_scope_type; + // When the new frame has a parent, |replication_state| holds the new frame's // properties replicated from the process rendering the parent frame, such as // the new frame's sandbox flags.
diff --git a/content/ppapi_plugin/ppapi_thread.cc b/content/ppapi_plugin/ppapi_thread.cc index 7b56219..4e7967a9 100644 --- a/content/ppapi_plugin/ppapi_thread.cc +++ b/content/ppapi_plugin/ppapi_thread.cc
@@ -232,7 +232,9 @@ const ppapi::PpapiPermissions& permissions) { // In case of crashes, the crash dump doesn't indicate which plugin // it came from. - static auto* ppapi_path_key = base::debug::AllocateCrashKeyString( + // TODO(dcheng): Would a scoped crash key be sufficient here? It's probably a + // moot point, as this code is going to go away. + static auto* const ppapi_path_key = base::debug::AllocateCrashKeyString( "ppapi_path", base::debug::CrashKeySize::Size64); base::debug::SetCrashKeyString(ppapi_path_key, path.MaybeAsASCII());
diff --git a/content/public/browser/navigation_handle_user_data.h b/content/public/browser/navigation_handle_user_data.h index c38c177..5cd8374b 100644 --- a/content/public/browser/navigation_handle_user_data.h +++ b/content/public/browser/navigation_handle_user_data.h
@@ -32,7 +32,7 @@ // // ... more public stuff here ... // private: // explicit FooData(content::NavigationHandle& navigation_handle); -// friend class content::NavigationHandleUserData<FooData>; +// friend NavigationHandleUserData<FooData>; // NAVIGATION_HANDLE_USER_DATA_KEY_DECL(); // // ... more private stuff here ... // };
diff --git a/content/public/browser/ssl_status.cc b/content/public/browser/ssl_status.cc index bd9b1ff..9f6957e5 100644 --- a/content/public/browser/ssl_status.cc +++ b/content/public/browser/ssl_status.cc
@@ -4,7 +4,6 @@ #include "content/public/browser/ssl_status.h" -#include "net/cert/sct_status_flags.h" #include "net/ssl/ssl_info.h" namespace content { @@ -40,8 +39,7 @@ connection_status(other.connection_status), content_status(other.content_status), pkp_bypassed(other.pkp_bypassed), - ct_policy_compliance(other.ct_policy_compliance), - user_data(other.user_data ? other.user_data->Clone() : nullptr) {} + ct_policy_compliance(other.ct_policy_compliance) {} SSLStatus& SSLStatus::operator=(SSLStatus other) { initialized = other.initialized; @@ -53,7 +51,6 @@ content_status = other.content_status; pkp_bypassed = other.pkp_bypassed; ct_policy_compliance = other.ct_policy_compliance; - user_data = other.user_data ? other.user_data->Clone() : nullptr; return *this; }
diff --git a/content/public/browser/ssl_status.h b/content/public/browser/ssl_status.h index f177d33..f91c416b 100644 --- a/content/public/browser/ssl_status.h +++ b/content/public/browser/ssl_status.h
@@ -7,9 +7,6 @@ #include <stdint.h> -#include <memory> -#include <vector> - #include "content/common/content_export.h" #include "net/cert/cert_status_flags.h" #include "net/cert/ct_policy_status.h" @@ -24,20 +21,6 @@ // Collects the SSL information for this NavigationEntry. struct CONTENT_EXPORT SSLStatus { - // SSLStatus consumers can attach instances of derived UserData classes to an - // SSLStatus. This allows an embedder to attach data to the NavigationEntry - // without SSLStatus having to know about it. Derived UserData classes have to - // be cloneable since NavigationEntrys are cloned during navigations. - class UserData { - public: - UserData() {} - virtual ~UserData() = default; - virtual std::unique_ptr<UserData> Clone() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(UserData); - }; - // Flags used for the page security content status. enum ContentStatusFlags { // HTTP page, or HTTPS page with no insecure content. @@ -81,10 +64,6 @@ // Whether the page's main resource complied with the Certificate Transparency // policy. net::ct::CTPolicyCompliance ct_policy_compliance; - // Embedder-specific data attached to the SSLStatus is cloned when an - // |SSLStatus| is assigned or copy-constructed, and is cleared when a - // navigation commits. - std::unique_ptr<UserData> user_data; // If you add new fields here, be sure to add them in the copy constructor and // copy assignment operator definitions in ssl_status.cc.
diff --git a/content/public/browser/web_ui_controller_factory.h b/content/public/browser/web_ui_controller_factory.h index 0988b85..eb068fb9 100644 --- a/content/public/browser/web_ui_controller_factory.h +++ b/content/public/browser/web_ui_controller_factory.h
@@ -21,11 +21,14 @@ // and creates WebUIController instances for given URLs. class CONTENT_EXPORT WebUIControllerFactory { public: - virtual ~WebUIControllerFactory() {} + virtual ~WebUIControllerFactory() = default; // Call to register a factory. static void RegisterFactory(WebUIControllerFactory* factory); + // Returns the number of registered factories. + static int GetNumRegisteredFactoriesForTesting(); + // Returns a WebUIController instance for the given URL, or nullptr if the URL // doesn't correspond to a WebUI. virtual std::unique_ptr<WebUIController> CreateWebUIControllerForURL(
diff --git a/content/public/test/scoped_web_ui_controller_factory_registration.cc b/content/public/test/scoped_web_ui_controller_factory_registration.cc index 3aa5062..65f9d478 100644 --- a/content/public/test/scoped_web_ui_controller_factory_registration.cc +++ b/content/public/test/scoped_web_ui_controller_factory_registration.cc
@@ -29,4 +29,21 @@ content::WebUIControllerFactory::RegisterFactory(factory_to_replace_); } -} // namespace content \ No newline at end of file +void CheckForLeakedWebUIControllerFactoryRegistrations::OnTestStart( + const testing::TestInfo& test_info) { + initial_num_registered_ = + content::WebUIControllerFactory::GetNumRegisteredFactoriesForTesting(); +} + +void CheckForLeakedWebUIControllerFactoryRegistrations::OnTestEnd( + const testing::TestInfo& test_info) { + EXPECT_EQ( + initial_num_registered_, + content::WebUIControllerFactory::GetNumRegisteredFactoriesForTesting()) + << "A WebUIControllerFactory was registered by a test but never " + "unregistered. This can cause flakiness in later tests. Please use " + "ScopedWebUIControllerFactoryRegistration to ensure that registered " + "factories are unregistered."; +} + +} // namespace content
diff --git a/content/public/test/scoped_web_ui_controller_factory_registration.h b/content/public/test/scoped_web_ui_controller_factory_registration.h index 16fb9224..3e1110c 100644 --- a/content/public/test/scoped_web_ui_controller_factory_registration.h +++ b/content/public/test/scoped_web_ui_controller_factory_registration.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_PUBLIC_TEST_SCOPED_WEB_UI_CONTROLLER_FACTORY_REGISTRATION_H_ #define CONTENT_PUBLIC_TEST_SCOPED_WEB_UI_CONTROLLER_FACTORY_REGISTRATION_H_ +#include "testing/gtest/include/gtest/gtest.h" + namespace content { class WebUIControllerFactory; @@ -27,6 +29,21 @@ content::WebUIControllerFactory* factory_to_replace_; }; +// A class used in tests to ensure that registered WebUIControllerFactory +// instances are unregistered. This should be enforced on unit-test suites +// with tests that register WebUIControllerFactory instances, to prevent those +// tests from causing flakiness in later tests run in the same process. This is +// not needed for browser tests, which are each run in their own process. +class CheckForLeakedWebUIControllerFactoryRegistrations + : public testing::EmptyTestEventListener { + public: + void OnTestStart(const testing::TestInfo& test_info) override; + void OnTestEnd(const testing::TestInfo& test_info) override; + + private: + int initial_num_registered_; +}; + } // namespace content #endif // CONTENT_PUBLIC_TEST_SCOPED_WEB_UI_CONTROLLER_FACTORY_REGISTRATION_H_
diff --git a/content/public/test/unittest_test_suite.cc b/content/public/test/unittest_test_suite.cc index d5bd015..a8c70b6 100644 --- a/content/public/test/unittest_test_suite.cc +++ b/content/public/test/unittest_test_suite.cc
@@ -16,6 +16,7 @@ #include "content/browser/network_service_instance_impl.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/network_service_instance.h" +#include "content/public/test/scoped_web_ui_controller_factory_registration.h" #include "content/public/test/test_host_resolver.h" #include "content/test/test_blink_web_unit_test_support.h" #include "testing/gtest/include/gtest/gtest.h" @@ -74,6 +75,7 @@ testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners(); listeners.Append(new ResetNetworkServiceBetweenTests); + listeners.Append(new CheckForLeakedWebUIControllerFactoryRegistrations); // The ThreadPool created by the test launcher is never destroyed. // Similarly, the FeatureList created here is never destroyed so it
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc index 45b9613..c68b426 100644 --- a/content/renderer/accessibility/render_accessibility_impl.cc +++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -83,10 +83,9 @@ // least one renderer in the same process had that flag. // Examples of when multiple renderers could share the same process: // 1) Android, 2) When many tabs are open. - static auto* ax_mode_crash_key = base::debug::AllocateCrashKeyString( + static auto* const ax_mode_crash_key = base::debug::AllocateCrashKeyString( "ax_mode", base::debug::CrashKeySize::Size64); - if (ax_mode_crash_key) - base::debug::SetCrashKeyString(ax_mode_crash_key, mode.ToString()); + base::debug::SetCrashKeyString(ax_mode_crash_key, mode.ToString()); } } // namespace
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index dc537a3..a7202e9 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -209,7 +209,8 @@ std::move(params->interface_broker), params->previous_routing_id, params->opener_frame_token, params->parent_routing_id, params->previous_sibling_routing_id, params->devtools_frame_token, - std::move(params->replication_state), std::move(params->widget_params), + params->tree_scope_type, std::move(params->replication_state), + std::move(params->widget_params), std::move(params->frame_owner_properties), params->has_committed_real_load, std::move(params->policy_container)); } @@ -220,13 +221,14 @@ const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, int32_t parent_routing_id, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { RenderFrameProxy::CreateFrameProxy( *this, token, routing_id, opener_frame_token, view_routing_id, - parent_routing_id, std::move(replicated_state), devtools_frame_token, - std::move(remote_main_frame_interfaces)); + parent_routing_id, tree_scope_type, std::move(replicated_state), + devtools_frame_token, std::move(remote_main_frame_interfaces)); } void AgentSchedulingGroup::BindAssociatedInterfaces(
diff --git a/content/renderer/agent_scheduling_group.h b/content/renderer/agent_scheduling_group.h index cf259ff2d..9ddee24e 100644 --- a/content/renderer/agent_scheduling_group.h +++ b/content/renderer/agent_scheduling_group.h
@@ -96,6 +96,7 @@ const absl::optional<blink::FrameToken>& opener_frame_token, int32_t view_routing_id, int32_t parent_routing_id, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces)
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc index 2384f99..1126da2 100644 --- a/content/renderer/media/media_factory.cc +++ b/content/renderer/media/media_factory.cc
@@ -489,7 +489,9 @@ if (!fetch_context_) { fetch_context_ = std::make_unique<FrameFetchContext>(web_frame); DCHECK(!url_index_); - url_index_ = std::make_unique<media::UrlIndex>(fetch_context_.get()); + url_index_ = std::make_unique<media::UrlIndex>( + fetch_context_.get(), + render_frame_->GetTaskRunner(blink::TaskType::kInternalMedia)); } DCHECK_EQ(static_cast<FrameFetchContext*>(fetch_context_.get())->frame(), web_frame);
diff --git a/content/renderer/pepper/pepper_platform_audio_input.cc b/content/renderer/pepper/pepper_platform_audio_input.cc index 40a4c1f84..e1160185 100644 --- a/content/renderer/pepper/pepper_platform_audio_input.cc +++ b/content/renderer/pepper/pepper_platform_audio_input.cc
@@ -109,7 +109,8 @@ } } -void PepperPlatformAudioInput::OnError() {} +void PepperPlatformAudioInput::OnError( + media::AudioCapturerSource::ErrorCode code) {} void PepperPlatformAudioInput::OnMuted(bool is_muted) {}
diff --git a/content/renderer/pepper/pepper_platform_audio_input.h b/content/renderer/pepper/pepper_platform_audio_input.h index 1d9bb05..4815584 100644 --- a/content/renderer/pepper/pepper_platform_audio_input.h +++ b/content/renderer/pepper/pepper_platform_audio_input.h
@@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "ipc/ipc_message.h" #include "media/audio/audio_input_ipc.h" +#include "media/base/audio_capturer_source.h" #include "media/base/audio_parameters.h" #include "third_party/blink/public/common/tokens/tokens.h" @@ -60,7 +61,7 @@ void OnStreamCreated(base::ReadOnlySharedMemoryRegion shared_memory_region, base::SyncSocket::ScopedHandle socket_handle, bool initially_muted) override; - void OnError() override; + void OnError(media::AudioCapturerSource::ErrorCode code) override; void OnMuted(bool is_muted) override; void OnIPCClosed() override;
diff --git a/content/renderer/pepper/pepper_webplugin_impl.cc b/content/renderer/pepper/pepper_webplugin_impl.cc index 2f11012d..a765a58 100644 --- a/content/renderer/pepper/pepper_webplugin_impl.cc +++ b/content/renderer/pepper/pepper_webplugin_impl.cc
@@ -84,9 +84,8 @@ init_data_->url = params.url; // Set subresource URL for crash reporting. - static base::debug::CrashKeyString* subresource_url = - base::debug::AllocateCrashKeyString("subresource_url", - base::debug::CrashKeySize::Size256); + static auto* const subresource_url = base::debug::AllocateCrashKeyString( + "subresource_url", base::debug::CrashKeySize::Size256); base::debug::SetCrashKeyString(subresource_url, init_data_->url.spec()); }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index bdb030e..9e814d8 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -1503,6 +1503,7 @@ int parent_routing_id, int previous_sibling_routing_id, const base::UnguessableToken& devtools_frame_token, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, mojom::CreateFrameWidgetParamsPtr widget_params, blink::mojom::FrameOwnerPropertiesPtr frame_owner_properties, @@ -1549,7 +1550,7 @@ if (opener_frame_token) opener = WebFrame::FromFrameToken(opener_frame_token.value()); web_frame = parent_web_frame->CreateLocalChild( - replicated_state->scope, WebString::FromUTF8(replicated_state->name), + tree_scope_type, WebString::FromUTF8(replicated_state->name), replicated_state->frame_policy, render_frame, render_frame->blink_interface_registry_.get(), previous_sibling_web_frame, @@ -2075,7 +2076,7 @@ CHECK_NE(proxy_routing_id, MSG_ROUTING_NONE); RenderFrameProxy* proxy = RenderFrameProxy::CreateProxyToReplaceFrame( agent_scheduling_group_, this, proxy_routing_id, - replicated_frame_state->scope, proxy_frame_token); + frame_->GetTreeScopeType(), proxy_frame_token); RenderViewImpl* render_view = render_view_; bool is_main_frame = is_main_frame_; @@ -4503,15 +4504,10 @@ if (params->origin.scheme() != url::kFileScheme || !GetBlinkPreferences().allow_universal_access_from_file_urls) { if (!params->origin.IsSameOriginWith(url::Origin::Create(params->url))) { - base::debug::CrashKeyString* url = base::debug::AllocateCrashKeyString( - "mismatched_url", base::debug::CrashKeySize::Size256); - base::debug::CrashKeyString* origin = - base::debug::AllocateCrashKeyString( - "mismatched_origin", base::debug::CrashKeySize::Size256); - base::debug::ScopedCrashKeyString scoped_url( - url, params->url.possibly_invalid_spec()); - base::debug::ScopedCrashKeyString scoped_origin( - origin, params->origin.GetDebugString()); + SCOPED_CRASH_KEY_STRING256("MakeDCPLParams", "mismatched_url", + params->url.possibly_invalid_spec()); + SCOPED_CRASH_KEY_STRING256("MakeDCPLParams", "mismatched_origin", + params->origin.GetDebugString()); CHECK(false) << " url:" << params->url << " origin:" << params->origin; } }
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 4d6eacae..1e57b61 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -209,6 +209,7 @@ int parent_routing_id, int previous_sibling_routing_id, const base::UnguessableToken& devtools_frame_token, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, mojom::CreateFrameWidgetParamsPtr widget_params, blink::mojom::FrameOwnerPropertiesPtr frame_owner_properties,
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 748af347..e695796 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -50,6 +50,7 @@ #include "third_party/blink/public/common/widget/screen_infos.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom.h" +#include "third_party/blink/public/mojom/frame/tree_scope_type.mojom.h" #include "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom-blink.h" #include "third_party/blink/public/mojom/page/record_content_to_visible_time_request.mojom.h" #include "third_party/blink/public/mojom/page/widget.mojom.h" @@ -149,8 +150,10 @@ TestRenderFrame::CreateStubFrameReceiver(), TestRenderFrame::CreateStubBrowserInterfaceBrokerRemote(), MSG_ROUTING_NONE, absl::nullopt, kFrameProxyRouteId, MSG_ROUTING_NONE, - base::UnguessableToken::Create(), std::move(frame_replication_state), - std::move(widget_params), blink::mojom::FrameOwnerProperties::New(), + base::UnguessableToken::Create(), + blink::mojom::TreeScopeType::kDocument, + std::move(frame_replication_state), std::move(widget_params), + blink::mojom::FrameOwnerProperties::New(), /*has_committed_real_load=*/true, blink::mojom::PolicyContainer::New( blink::mojom::PolicyContainerPolicies::New(),
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index c8ce37ea..fb0f97b8 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc
@@ -61,7 +61,7 @@ AgentSchedulingGroup& agent_scheduling_group, RenderFrameImpl* frame_to_replace, int routing_id, - blink::mojom::TreeScopeType scope, + blink::mojom::TreeScopeType tree_scope_type, const blink::RemoteFrameToken& proxy_frame_token) { CHECK_NE(routing_id, MSG_ROUTING_NONE); @@ -72,7 +72,7 @@ // always come from WebRemoteFrame::create and a call to WebFrame::swap must // follow later. blink::WebRemoteFrame* web_frame = blink::WebRemoteFrame::Create( - scope, proxy.get(), proxy->blink_interface_registry_.get(), + tree_scope_type, proxy.get(), proxy->blink_interface_registry_.get(), proxy->GetRemoteAssociatedInterfaces(), proxy_frame_token); proxy->Init(web_frame, frame_to_replace->render_view()); @@ -87,6 +87,7 @@ const absl::optional<blink::FrameToken>& opener_frame_token, int render_view_routing_id, int parent_routing_id, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { @@ -128,8 +129,7 @@ // to be a RenderFrameProxy, because navigations initiated by local frames // should not wind up here. web_frame = parent->web_frame()->CreateRemoteChild( - replicated_state->scope, - blink::WebString::FromUTF8(replicated_state->name), + tree_scope_type, blink::WebString::FromUTF8(replicated_state->name), replicated_state->frame_policy, proxy.get(), proxy->blink_interface_registry_.get(), proxy->GetRemoteAssociatedInterfaces(), frame_token,
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h index 7196f04..9d4b66b 100644 --- a/content/renderer/render_frame_proxy.h +++ b/content/renderer/render_frame_proxy.h
@@ -70,7 +70,7 @@ AgentSchedulingGroup& agent_scheduling_group, RenderFrameImpl* frame_to_replace, int routing_id, - blink::mojom::TreeScopeType scope, + blink::mojom::TreeScopeType tree_scope_type, const blink::RemoteFrameToken& proxy_frame_token); // This method should be used to create a RenderFrameProxy, when there isn't @@ -93,6 +93,7 @@ const absl::optional<blink::FrameToken>& opener_frame_token, int render_view_routing_id, int parent_routing_id, + blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, const base::UnguessableToken& devtools_frame_token, mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces);
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 33a4391..5b5a71c 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -258,35 +258,35 @@ } void AddCrashKey(v8::CrashKeyId id, const std::string& value) { - namespace bd = base::debug; + using base::debug::AllocateCrashKeyString; + using base::debug::CrashKeySize; + using base::debug::SetCrashKeyString; + switch (id) { case v8::CrashKeyId::kIsolateAddress: - static bd::CrashKeyString* isolate_address = bd::AllocateCrashKeyString( - "v8_isolate_address", bd::CrashKeySize::Size32); - bd::SetCrashKeyString(isolate_address, value); + static auto* const isolate_address = + AllocateCrashKeyString("v8_isolate_address", CrashKeySize::Size32); + SetCrashKeyString(isolate_address, value); break; case v8::CrashKeyId::kReadonlySpaceFirstPageAddress: - static bd::CrashKeyString* ro_space_firstpage_address = - bd::AllocateCrashKeyString("v8_ro_space_firstpage_address", - bd::CrashKeySize::Size32); - bd::SetCrashKeyString(ro_space_firstpage_address, value); + static auto* const ro_space_firstpage_address = AllocateCrashKeyString( + "v8_ro_space_firstpage_address", CrashKeySize::Size32); + SetCrashKeyString(ro_space_firstpage_address, value); break; case v8::CrashKeyId::kMapSpaceFirstPageAddress: - static bd::CrashKeyString* map_space_firstpage_address = - bd::AllocateCrashKeyString("v8_map_space_firstpage_address", - bd::CrashKeySize::Size32); - bd::SetCrashKeyString(map_space_firstpage_address, value); + static auto* const map_space_firstpage_address = AllocateCrashKeyString( + "v8_map_space_firstpage_address", CrashKeySize::Size32); + SetCrashKeyString(map_space_firstpage_address, value); break; case v8::CrashKeyId::kCodeSpaceFirstPageAddress: - static bd::CrashKeyString* code_space_firstpage_address = - bd::AllocateCrashKeyString("v8_code_space_firstpage_address", - bd::CrashKeySize::Size32); - bd::SetCrashKeyString(code_space_firstpage_address, value); + static auto* const code_space_firstpage_address = AllocateCrashKeyString( + "v8_code_space_firstpage_address", CrashKeySize::Size32); + SetCrashKeyString(code_space_firstpage_address, value); break; case v8::CrashKeyId::kDumpType: - static bd::CrashKeyString* dump_type = - bd::AllocateCrashKeyString("dump-type", bd::CrashKeySize::Size32); - bd::SetCrashKeyString(dump_type, value); + static auto* const dump_type = + AllocateCrashKeyString("dump-type", CrashKeySize::Size32); + SetCrashKeyString(dump_type, value); break; default: // Doing nothing for new keys is a valid option. Having this case allows
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 2701354..f8e74033 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -79,6 +79,7 @@ #include "third_party/blink/public/common/widget/device_emulation_params.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom.h" +#include "third_party/blink/public/mojom/frame/tree_scope_type.mojom.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" @@ -1194,8 +1195,9 @@ TestRenderFrame::CreateStubFrameReceiver(), TestRenderFrame::CreateStubBrowserInterfaceBrokerRemote(), kProxyRoutingId, absl::nullopt, MSG_ROUTING_NONE, MSG_ROUTING_NONE, - base::UnguessableToken::Create(), std::move(replication_state), - std::move(widget_params), blink::mojom::FrameOwnerProperties::New(), + base::UnguessableToken::Create(), blink::mojom::TreeScopeType::kDocument, + std::move(replication_state), std::move(widget_params), + blink::mojom::FrameOwnerProperties::New(), /*has_committed_real_load=*/true, CreateStubPolicyContainer()); TestRenderFrame* provisional_frame = @@ -1254,7 +1256,8 @@ TestRenderFrame::CreateStubFrameReceiver(), TestRenderFrame::CreateStubBrowserInterfaceBrokerRemote(), kProxyRoutingId, absl::nullopt, frame()->GetRoutingID(), MSG_ROUTING_NONE, - base::UnguessableToken::Create(), std::move(replication_state), + base::UnguessableToken::Create(), blink::mojom::TreeScopeType::kDocument, + std::move(replication_state), /*widget_params=*/nullptr, blink::mojom::FrameOwnerProperties::New(), /*has_committed_real_load=*/true, CreateStubPolicyContainer()); {
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index be0a2a33..8cc8c14 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -151,6 +151,7 @@ agent_scheduling_group_, params->main_frame->get_remote_params()->token, params->main_frame->get_remote_params()->routing_id, params->opener_frame_token, GetRoutingID(), MSG_ROUTING_NONE, + blink::mojom::TreeScopeType::kDocument /* ignored for main frames */, std::move(params->replication_state), params->devtools_main_frame_token, std::move( params->main_frame->get_remote_params()->main_frame_interfaces));
diff --git a/content/test/data/accessibility/aria/aria-img-child-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-img-child-expected-auralinux.txt new file mode 100644 index 0000000..a0de7e1 --- /dev/null +++ b/content/test/data/accessibility/aria/aria-img-child-expected-auralinux.txt
@@ -0,0 +1,2 @@ +[document web] +++[image]
diff --git a/content/test/data/accessibility/aria/aria-img-child-expected-blink.txt b/content/test/data/accessibility/aria/aria-img-child-expected-blink.txt index 361ad03..80d76d4e9 100644 --- a/content/test/data/accessibility/aria/aria-img-child-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-img-child-expected-blink.txt
@@ -2,3 +2,6 @@ ++genericContainer ignored ++++genericContainer ignored ++++++image +++++++++genericContainer +++++++++++staticText name='Img.jpg' +++++++++++++inlineTextBox name='Img.jpg'
diff --git a/content/test/data/accessibility/aria/aria-img-expected-blink.txt b/content/test/data/accessibility/aria/aria-img-expected-blink.txt index 361ad03..c2bedfa 100644 --- a/content/test/data/accessibility/aria/aria-img-expected-blink.txt +++ b/content/test/data/accessibility/aria/aria-img-expected-blink.txt
@@ -2,3 +2,5 @@ ++genericContainer ignored ++++genericContainer ignored ++++++image +++++++++image +++++++++image
diff --git a/content/test/data/accessibility/css/alt-text-expected-auralinux.txt b/content/test/data/accessibility/css/alt-text-expected-auralinux.txt new file mode 100644 index 0000000..82c087d0b --- /dev/null +++ b/content/test/data/accessibility/css/alt-text-expected-auralinux.txt
@@ -0,0 +1,44 @@ +[document web] +++[section] +++++[static] name='item1item2' +++++[image] +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[static] name='code' +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[image] name='star' +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[image] +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[static] name='a list of items' +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[image] +++++[static] name=' ' +++++[section] +++++++[static] name='Some Text' +++[section] +++++[paragraph] +++++++[static] name='Some Text' +++[image] name='alt' +++[section] +++++[static] name='DOM Text' +++[section] +++++[static] name='DOM Text'
diff --git a/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt b/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt new file mode 100644 index 0000000..a5de671 --- /dev/null +++ b/content/test/data/accessibility/html/map-any-contents-expected-auralinux.txt
@@ -0,0 +1,12 @@ +[document web] +++[image map] name='pipe' +++++[heading] name='Headings are allowed in a map' +++++++[static] name='Headings are allowed in a map' +++++[link] name='pipe1' +++++[paragraph] +++++++[static] name='So are ' +++++++[static] +++++++++[static] name='other elements' +++++++[static] name='!' +++++[static] name='pipe2' +++++[push button] name='Even a button' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/map-any-contents-expected-blink.txt b/content/test/data/accessibility/html/map-any-contents-expected-blink.txt new file mode 100644 index 0000000..b4d6e31 --- /dev/null +++ b/content/test/data/accessibility/html/map-any-contents-expected-blink.txt
@@ -0,0 +1,20 @@ +rootWebArea +++genericContainer ignored +++++genericContainer ignored +++++++image name='pipe' +++++++++heading name='Headings are allowed in a map' +++++++++++staticText name='Headings are allowed in a map' +++++++++++++inlineTextBox name='Headings are allowed in a map' +++++++++link name='pipe1' +++++++++paragraph +++++++++++staticText name='So are ' +++++++++++++inlineTextBox name='So are ' +++++++++++mark +++++++++++++staticText name='other elements' +++++++++++++++inlineTextBox name='other elements' +++++++++++staticText name='!' +++++++++++++inlineTextBox name='!' +++++++++staticText name='pipe2' +++++++++button name='Even a button' +++++++++++staticText name='Even a button' +++++++++++++inlineTextBox name='Even a button' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/map-any-contents.html b/content/test/data/accessibility/html/map-any-contents.html new file mode 100644 index 0000000..8ca3a0c --- /dev/null +++ b/content/test/data/accessibility/html/map-any-contents.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> +<body> + +<img src="pipe.jpg" width="145" height="126" alt="pipe" usemap="#pipe"> +<map name="pipe"> + <h1>Headings are allowed in a map</h1> + <area shape="rect" coords="0,0,145,126" alt="pipe1" href="fake.htm"> + <p>So are <mark>other elements</mark>!</p> + <area shape="rect" coords="0,0,145,126" alt="pipe2"> + <button>Even a button</button> +</map> + +</body> +</html>
diff --git a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt index 87168af..f3b45557 100644 --- a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
@@ -87,8 +87,5 @@ crbug.com/1099576 [ mac amd ] GpuProcess_mac_webgl_backgrounded_high_performance [ Skip ] crbug.com/1099576 [ mac intel ] GpuProcess_mac_webgl_backgrounded_high_performance [ Skip ] -# Flaky on Fuchsia -crbug.com/1087298 [ fuchsia ] GpuProcess_webgl_disabled_extension [ Failure ] - # Flakily hits a DCHECK during shared image creation. crbug.com/1188437 [ linux intel display-server-wayland ] GpuProcess_webgl [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt index 52436c6..2dc6367 100644 --- a/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt
@@ -58,4 +58,3 @@ # results: [ Failure RetryOnFailure Skip ] # END TAG HEADER -crbug.com/1203234 [ fuchsia fuchsia-board-qemu-x64 ] HardwareAcceleratedFeature_canvas_accelerated [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt index 0598a50..ecd901f 100644 --- a/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt
@@ -62,7 +62,7 @@ crbug.com/1079393 [ win intel-0x3e92 ] InfoCollection_direct_composition [ Failure ] # NVIDIA bots need 456.38+ drivers to use SOFTWARE overlays. -crbug.com/1113893 [ win nvidia ] InfoCollection_direct_composition [ Failure ] +crbug.com/1113893 [ win10 nvidia ] InfoCollection_direct_composition [ Failure ] # InfoCollection_basic is flaky on Fuchsia. crbug.com/1154597 [ fuchsia ] InfoCollection_basic [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt index 568efb34..2dc6367 100644 --- a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt
@@ -58,4 +58,3 @@ # results: [ Failure RetryOnFailure Skip ] # END TAG HEADER -crbug.com/1009137 [ android android-nexus-5 ] Maps_maps [ RetryOnFailure ]
diff --git a/content/utility/utility_service_factory.cc b/content/utility/utility_service_factory.cc index 7cd30d34..b43f8dc6 100644 --- a/content/utility/utility_service_factory.cc +++ b/content/utility/utility_service_factory.cc
@@ -27,8 +27,9 @@ if (trace_log->IsProcessNameEmpty()) trace_log->set_process_name("Service: " + service_name); - static auto* service_name_crash_key = base::debug::AllocateCrashKeyString( - "service-name", base::debug::CrashKeySize::Size32); + static auto* const service_name_crash_key = + base::debug::AllocateCrashKeyString("service-name", + base::debug::CrashKeySize::Size32); base::debug::SetCrashKeyString(service_name_crash_key, service_name); if (GetContentClient()->utility()->HandleServiceRequestDeprecated(
diff --git a/content/utility/utility_thread_impl.cc b/content/utility/utility_thread_impl.cc index 363574f5..6c73929 100644 --- a/content/utility/utility_thread_impl.cc +++ b/content/utility/utility_thread_impl.cc
@@ -45,8 +45,9 @@ void BindServiceInterface(mojo::GenericPendingReceiver* receiver) { // Set a crash key so utility process crash reports indicate which service // was running in the process. - static auto* service_name_crash_key = base::debug::AllocateCrashKeyString( - "service-name", base::debug::CrashKeySize::Size32); + static auto* const service_name_crash_key = + base::debug::AllocateCrashKeyString("service-name", + base::debug::CrashKeySize::Size32); const std::string& service_name = receiver->interface_name().value(); base::debug::SetCrashKeyString(service_name_crash_key, service_name);
diff --git a/device/bluetooth/bluetooth_adapter_mac.mm b/device/bluetooth/bluetooth_adapter_mac.mm index c1b17a7..717daca 100644 --- a/device/bluetooth/bluetooth_adapter_mac.mm +++ b/device/bluetooth/bluetooth_adapter_mac.mm
@@ -25,7 +25,6 @@ #include "base/memory/ptr_util.h" #include "base/numerics/safe_conversions.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/strings/sys_string_conversions.h" #include "base/task/task_traits.h" #include "base/threading/thread_task_runner_handle.h"
diff --git a/device/bluetooth/bluetooth_device_winrt.cc b/device/bluetooth/bluetooth_device_winrt.cc index 1bc002ff..2ce8971 100644 --- a/device/bluetooth/bluetooth_device_winrt.cc +++ b/device/bluetooth/bluetooth_device_winrt.cc
@@ -12,7 +12,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/win/core_winrt_util.h"
diff --git a/device/bluetooth/dbus/bluetooth_admin_policy_client.cc b/device/bluetooth/dbus/bluetooth_admin_policy_client.cc index 2fa4b43..1609aafd 100644 --- a/device/bluetooth/dbus/bluetooth_admin_policy_client.cc +++ b/device/bluetooth/dbus/bluetooth_admin_policy_client.cc
@@ -9,7 +9,6 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/observer_list.h" -#include "base/stl_util.h" #include "dbus/bus.h" #include "dbus/message.h" #include "dbus/object_manager.h"
diff --git a/device/bluetooth/dbus/bluetooth_battery_client.cc b/device/bluetooth/dbus/bluetooth_battery_client.cc index 7a112e4..54e4bff 100644 --- a/device/bluetooth/dbus/bluetooth_battery_client.cc +++ b/device/bluetooth/dbus/bluetooth_battery_client.cc
@@ -7,7 +7,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "dbus/bus.h" #include "dbus/message.h" #include "dbus/object_manager.h"
diff --git a/device/bluetooth/dbus/bluetooth_device_client.cc b/device/bluetooth/dbus/bluetooth_device_client.cc index 2c63ddfc..1dab0bd 100644 --- a/device/bluetooth/dbus/bluetooth_device_client.cc +++ b/device/bluetooth/dbus/bluetooth_device_client.cc
@@ -11,7 +11,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "dbus/bus.h" #include "dbus/message.h" #include "dbus/object_manager.h"
diff --git a/device/bluetooth/dbus/bluetooth_input_client.cc b/device/bluetooth/dbus/bluetooth_input_client.cc index 08d75fb..1ac48939 100644 --- a/device/bluetooth/dbus/bluetooth_input_client.cc +++ b/device/bluetooth/dbus/bluetooth_input_client.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/check.h" #include "base/macros.h" -#include "base/stl_util.h" #include "dbus/bus.h" #include "dbus/message.h" #include "dbus/object_manager.h"
diff --git a/device/fido/auth_token_requester.cc b/device/fido/auth_token_requester.cc index 8ca8309..0b5aee6 100644 --- a/device/fido/auth_token_requester.cc +++ b/device/fido/auth_token_requester.cc
@@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/containers/contains.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "components/device_event_log/device_event_log.h" #include "device/fido/authenticator_supported_options.h"
diff --git a/device/fido/cable/fido_cable_discovery_unittest.cc b/device/fido/cable/fido_cable_discovery_unittest.cc index fc2ed269..c65dd661 100644 --- a/device/fido/cable/fido_cable_discovery_unittest.cc +++ b/device/fido/cable/fido_cable_discovery_unittest.cc
@@ -10,7 +10,6 @@ #include "base/containers/span.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/test/task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h"
diff --git a/device/fido/fido_task.cc b/device/fido/fido_task.cc index f0f48c95..609f99b3 100644 --- a/device/fido/fido_task.cc +++ b/device/fido/fido_task.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/bind.h" -#include "base/stl_util.h" #include "base/threading/sequenced_task_runner_handle.h" #include "device/fido/fido_constants.h"
diff --git a/device/fido/mac/authenticator.mm b/device/fido/mac/authenticator.mm index 8e2faf1..ac71d680 100644 --- a/device/fido/mac/authenticator.mm +++ b/device/fido/mac/authenticator.mm
@@ -12,7 +12,6 @@ #include "base/feature_list.h" #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "base/threading/sequenced_task_runner_handle.h" #include "components/device_event_log/device_event_log.h"
diff --git a/device/fido/mac/get_assertion_operation.mm b/device/fido/mac/get_assertion_operation.mm index 7870957..f444e1a 100644 --- a/device/fido/mac/get_assertion_operation.mm +++ b/device/fido/mac/get_assertion_operation.mm
@@ -13,7 +13,6 @@ #include "base/mac/foundation_util.h" #include "base/mac/mac_logging.h" #include "base/mac/scoped_cftyperef.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "components/device_event_log/device_event_log.h"
diff --git a/device/fido/win/authenticator.cc b/device/fido/win/authenticator.cc index a5dc2794..b38d593 100644 --- a/device/fido/win/authenticator.cc +++ b/device/fido/win/authenticator.cc
@@ -14,7 +14,6 @@ #include "base/containers/flat_map.h" #include "base/memory/ref_counted.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "base/task/task_traits.h"
diff --git a/device/fido/win/fake_webauthn_api.cc b/device/fido/win/fake_webauthn_api.cc index 072d002..040f48d9 100644 --- a/device/fido/win/fake_webauthn_api.cc +++ b/device/fido/win/fake_webauthn_api.cc
@@ -9,7 +9,6 @@ #include "base/check.h" #include "base/containers/span.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/string_piece_forward.h" #include "base/strings/utf_string_conversions.h" #include "components/cbor/values.h"
diff --git a/device/gamepad/gamepad_platform_data_fetcher_linux.cc b/device/gamepad/gamepad_platform_data_fetcher_linux.cc index a1c6ed5..842fe185 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_linux.cc +++ b/device/gamepad/gamepad_platform_data_fetcher_linux.cc
@@ -12,7 +12,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h"
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc index 133c11f..f5cfb9f 100644 --- a/device/gamepad/gamepad_standard_mappings_linux.cc +++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -8,7 +8,6 @@ #include <iterator> #include "base/macros.h" -#include "base/stl_util.h" #include "device/gamepad/gamepad_id_list.h" #include "device/gamepad/gamepad_standard_mappings.h"
diff --git a/device/gamepad/gamepad_standard_mappings_mac.mm b/device/gamepad/gamepad_standard_mappings_mac.mm index ce4f2559..44933a1 100644 --- a/device/gamepad/gamepad_standard_mappings_mac.mm +++ b/device/gamepad/gamepad_standard_mappings_mac.mm
@@ -8,7 +8,6 @@ #include <iterator> #include "base/macros.h" -#include "base/stl_util.h" #include "device/gamepad/gamepad_id_list.h" #include "device/gamepad/gamepad_standard_mappings.h"
diff --git a/device/gamepad/gamepad_standard_mappings_win.cc b/device/gamepad/gamepad_standard_mappings_win.cc index 8ace5d2..33955e1 100644 --- a/device/gamepad/gamepad_standard_mappings_win.cc +++ b/device/gamepad/gamepad_standard_mappings_win.cc
@@ -8,7 +8,6 @@ #include <iterator> #include "base/macros.h" -#include "base/stl_util.h" #include "device/gamepad/gamepad_id_list.h" #include "device/gamepad/gamepad_standard_mappings.h"
diff --git a/device/vr/android/arcore/ar_compositor_frame_sink.cc b/device/vr/android/arcore/ar_compositor_frame_sink.cc index bcf211e..dcc0637e 100644 --- a/device/vr/android/arcore/ar_compositor_frame_sink.cc +++ b/device/vr/android/arcore/ar_compositor_frame_sink.cc
@@ -289,7 +289,7 @@ void ArCompositorFrameSink::OnBeginFrame( const viz::BeginFrameArgs& args, const viz::FrameTimingDetailsMap& timing_details) { - on_begin_frame_.Run(args); + on_begin_frame_.Run(args, timing_details); } void ArCompositorFrameSink::OnFrameSubmitAck(const viz::BeginFrameAck& ack) {
diff --git a/device/vr/android/arcore/ar_compositor_frame_sink.h b/device/vr/android/arcore/ar_compositor_frame_sink.h index 32b1d6e..69f113a 100644 --- a/device/vr/android/arcore/ar_compositor_frame_sink.h +++ b/device/vr/android/arcore/ar_compositor_frame_sink.h
@@ -56,7 +56,8 @@ // Used when the compositor acknowledges that it is ready to begin processing // or working on the frame that previously requested to Begin. using BeginFrameCallback = - base::RepeatingCallback<void(const viz::BeginFrameArgs& args)>; + base::RepeatingCallback<void(const viz::BeginFrameArgs& args, + const viz::FrameTimingDetailsMap&)>; using CompositorReceivedFrameCallback = base::RepeatingClosure;
diff --git a/device/vr/android/arcore/arcore_gl.cc b/device/vr/android/arcore/arcore_gl.cc index c8114487..18bbb89d5 100644 --- a/device/vr/android/arcore/arcore_gl.cc +++ b/device/vr/android/arcore/arcore_gl.cc
@@ -1054,6 +1054,10 @@ } base::TimeTicks now = base::TimeTicks::Now(); + // Get the time when rendering completed from the render completion fence. + // TODO(klausw): This is an overestimate in AR compositor mode, the fence + // completes one frame late. The average_render_time_ calculation should use + // the WritesDone time reported via OnBeginFrame's timing_data instead. base::TimeTicks completion_time = now; DCHECK(frame->render_completion_fence); completion_time = static_cast<gl::GLFenceAndroidNativeFenceSync*>( @@ -1075,33 +1079,32 @@ average_render_time_.AddSample(completion_time - frame->time_copied); - // Save a GPU load estimate for use in GetFrameData. This is somewhat - // arbitrary, use the most recent rendering time divided by the nominal frame - // time. If this is greater than 1.0, it's not possible to hit the target - // framerate and the application should reduce its workload. - // (Intentionally not using averages here since the blink side is expected - // to do its own smoothing when using this data.) base::TimeDelta copied_to_completion = completion_time - frame->time_copied; - base::TimeDelta arcore_frametime = EstimatedArCoreFrameTime(); - DCHECK(!arcore_frametime.is_zero()); - // When using the ar_compositor, we tend to get our fences completed about one - // frame late. So assume that the copy actually took about half as much time. - // Since this is all multiplication/division, this results in just multiplying - // the new ratio by half. - // TODO(https://crbug.com/1188302): Improve ratio calculation so that this - // correction is not necessary. - float ratio_correction_factor = ar_compositor_ ? 0.5f : 1.0f; - rendering_time_ratio_ = - (copied_to_completion / arcore_frametime) * ratio_correction_factor; + if (ar_compositor_) { + // AR compositor mode uses timing data received in OnBeginFrame() for the + // GPU load estimate. + DVLOG(3) << __func__ << " time_js_submit=" << frame->time_js_submit + << " time_pose=" << frame->time_pose + << " time_copied=" << frame->time_copied + << " copied_to_completion=" << copied_to_completion; + } else { + // Save a GPU load estimate for use in GetFrameData. This is somewhat + // arbitrary, use the most recent rendering time divided by the nominal + // frame time. + base::TimeDelta arcore_frametime = EstimatedArCoreFrameTime(); + DCHECK(!arcore_frametime.is_zero()); - DVLOG(3) << __func__ << " time_js_submit=" << frame->time_js_submit - << " time_pose=" << frame->time_pose - << " time_copied=" << frame->time_copied - << " copied_to_completion=" << copied_to_completion - << " arcore_frametime=" << arcore_frametime - << ": rendering time ratio (%)=" << rendering_time_ratio_ * 100; - TRACE_COUNTER1("xr", "WebXR rendering time ratio (%)", - rendering_time_ratio_ * 100); + rendering_time_ratio_ = copied_to_completion / arcore_frametime; + TRACE_COUNTER1("xr", "WebXR rendering time ratio (%)", + rendering_time_ratio_ * 100); + + DVLOG(3) << __func__ << " time_js_submit=" << frame->time_js_submit + << " time_pose=" << frame->time_pose + << " time_copied=" << frame->time_copied + << " copied_to_completion=" << copied_to_completion + << " arcore_frametime=" << arcore_frametime + << " rendering_time_ratio_=" << rendering_time_ratio_; + } // Add Animating/Processing/Rendering async annotations to event traces. @@ -1819,7 +1822,8 @@ return weak_ptr_factory_.GetWeakPtr(); } -void ArCoreGl::OnBeginFrame(const viz::BeginFrameArgs& args) { +void ArCoreGl::OnBeginFrame(const viz::BeginFrameArgs& args, + const viz::FrameTimingDetailsMap& frame_timing) { // With the ExternalBeginFrameController driving our compositing, we shouldn't // request any frames unless we actually have a frame to animate. DCHECK(webxr_->HaveAnimatingFrame()); @@ -1829,6 +1833,40 @@ webxr_->GetAnimatingFrame()->begin_frame_args = std::make_unique<viz::BeginFrameArgs>(args); + // If we have information about frame timing from completed frames, use that + // to update GPU load heuristics. Typically, there will be one reported old + // frame for each OnBeginFrame once it reaches a steady state. + for (auto& timing_data : frame_timing) { + const viz::FrameTimingDetails& details = timing_data.second; + base::TimeTicks writes_done = + details.presentation_feedback.writes_done_timestamp; + + // The GPU driver isn't required to support writes_done timestamps, so + // this data may be unavailable. In that case, don't update the rendering + // time ratio estimate. This disables dynamic viewport scaling since that + // feature is only active when the ratio is nonzero. + if (writes_done.is_null()) + continue; + + // For the GPU load, use the drawing time (draw start to render completion) + // divided by the nominal frame time. + + base::TimeDelta delta = writes_done - details.draw_start_timestamp; + base::TimeDelta arcore_frametime = EstimatedArCoreFrameTime(); + DCHECK(!arcore_frametime.is_zero()); + rendering_time_ratio_ = delta / arcore_frametime; + + DVLOG(3) << __func__ << ": frame_token=" << timing_data.first + << " draw_start_timestamp=" << details.draw_start_timestamp + << " writes_done=" + << details.presentation_feedback.writes_done_timestamp + << " delta=" << delta + << " rendering_time_ratio_=" << rendering_time_ratio_; + TRACE_COUNTER1("xr", "WebXR rendering time ratio (%)", + rendering_time_ratio_ * 100); + } + webxr_->TryDeferredProcessing(); } + } // namespace device
diff --git a/device/vr/android/arcore/arcore_gl.h b/device/vr/android/arcore/arcore_gl.h index 7137ddc..c6254412 100644 --- a/device/vr/android/arcore/arcore_gl.h +++ b/device/vr/android/arcore/arcore_gl.h
@@ -237,7 +237,8 @@ void SubmitVizFrame(int16_t frame_index, ArCompositorFrameSink::FrameType frame_type); void DidNotProduceVizFrame(int16_t frame_index); - void OnBeginFrame(const viz::BeginFrameArgs& args); + void OnBeginFrame(const viz::BeginFrameArgs& args, + const viz::FrameTimingDetailsMap&); void OnReclaimedGpuFenceAvailable(WebXrFrame* frame, std::unique_ptr<gfx::GpuFence> gpu_fence); void ClearRenderingFrame(WebXrFrame* frame); @@ -336,6 +337,13 @@ device::SlidingTimeDeltaAverage average_process_time_; device::SlidingTimeDeltaAverage average_render_time_; + // The rendering time ratio is an estimate of recent GPU utilization that's + // reported to blink through the GetFrameData response. If this is greater + // than 1.0, it's not possible to hit the target framerate and the application + // should reduce its workload. If utilization data is unavailable, it remains + // at zero which disables dynamic viewport scaling. (This value is an + // instantaneous snapshot and not an average, the blink side is expected to do + // its own smoothing when using this data.) float rendering_time_ratio_ = 0.0f; FPSMeter fps_meter_;
diff --git a/device/vr/openxr/openxr_input_helper.cc b/device/vr/openxr/openxr_input_helper.cc index ec8b742..cb876d3e 100644 --- a/device/vr/openxr/openxr_input_helper.cc +++ b/device/vr/openxr/openxr_input_helper.cc
@@ -4,7 +4,6 @@ #include "device/vr/openxr/openxr_input_helper.h" -#include "base/stl_util.h" #include "device/gamepad/public/cpp/gamepad.h" #include "device/vr/openxr/openxr_util.h" #include "device/vr/util/xr_standard_gamepad_builder.h"
diff --git a/device/vr/openxr/openxr_path_helper.cc b/device/vr/openxr/openxr_path_helper.cc index e96bdab..5f5c4c6 100644 --- a/device/vr/openxr/openxr_path_helper.cc +++ b/device/vr/openxr/openxr_path_helper.cc
@@ -5,7 +5,6 @@ #include "device/vr/openxr/openxr_path_helper.h" #include "base/check.h" -#include "base/stl_util.h" #include "device/vr/openxr/openxr_util.h" namespace device {
diff --git a/device/vr/util/gamepad_builder.cc b/device/vr/util/gamepad_builder.cc index 6721c38..8cd7e48 100644 --- a/device/vr/util/gamepad_builder.cc +++ b/device/vr/util/gamepad_builder.cc
@@ -5,7 +5,6 @@ #include "base/check_op.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" namespace device {
diff --git a/extensions/browser/api/declarative/declarative_rule.h b/extensions/browser/api/declarative/declarative_rule.h index 1f1e63a..6781327 100644 --- a/extensions/browser/api/declarative/declarative_rule.h +++ b/extensions/browser/api/declarative/declarative_rule.h
@@ -19,7 +19,6 @@ #include "base/callback.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "base/time/time.h" #include "components/url_matcher/url_matcher.h" #include "extensions/common/api/events.h"
diff --git a/extensions/browser/api/idle/idle_manager.cc b/extensions/browser/api/idle/idle_manager.cc index 61fc3e5..7f9397e2 100644 --- a/extensions/browser/api/idle/idle_manager.cc +++ b/extensions/browser/api/idle/idle_manager.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "base/stl_util.h" #include "build/chromeos_buildflags.h" #include "content/public/browser/browser_context.h" #include "extensions/browser/api/idle/idle_api_constants.h"
diff --git a/extensions/browser/api/storage/settings_storage_quota_enforcer.cc b/extensions/browser/api/storage/settings_storage_quota_enforcer.cc index 6523da9..6fff22fd 100644 --- a/extensions/browser/api/storage/settings_storage_quota_enforcer.cc +++ b/extensions/browser/api/storage/settings_storage_quota_enforcer.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/json/json_writer.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "extensions/common/extension_api.h"
diff --git a/extensions/browser/api/system_storage/storage_info_provider.cc b/extensions/browser/api/system_storage/storage_info_provider.cc index bee914f..8faa97d 100644 --- a/extensions/browser/api/system_storage/storage_info_provider.cc +++ b/extensions/browser/api/system_storage/storage_info_provider.cc
@@ -4,7 +4,6 @@ #include "extensions/browser/api/system_storage/storage_info_provider.h" -#include "base/stl_util.h" #include "base/system/sys_info.h" #include "components/storage_monitor/storage_info.h" #include "components/storage_monitor/storage_monitor.h"
diff --git a/extensions/browser/device_local_account_util.cc b/extensions/browser/device_local_account_util.cc index 2a0207b..60af0bb 100644 --- a/extensions/browser/device_local_account_util.cc +++ b/extensions/browser/device_local_account_util.cc
@@ -47,7 +47,6 @@ "kgimkbnclbekdkabkpjhpakhhalfanda", // Bejeweled demo "joodangkbfjnajiiifokapkpmhfnpleo", // Calculator "fpgfohogebplgnamlafljlcidjedbdeb", // Calendar demo - "cdjikkcakjcdjemakobkmijmikhkegcj", // Chrome Remote Desktop demo "jkoildpomkimndcphjpffmephmcmkfhn", // Chromebook Demo App "lbhdhapagjhalobandnbdnmblnmocojh", // Crackle demo "ielkookhdphmgbipcfmafkaiagademfp", // Custom bookmarks @@ -118,7 +117,6 @@ "ongnjlefhnoajpbodoldndkbkdgfomlp", // Show Managed Storage "ilnpadgckeacioehlommkaafedibdeob", // Enterprise DeviceAttributes "oflckobdemeldmjddmlbaiaookhhcngo", // Citrix Receiver QA version - "ljacajndfccfgnfohlgkdphmbnpkjflk", // Chrome Remote Desktop (Dev Build) "behllobkkfkfnphdnhnkndlbkcpglgmj", // Autotest // Google Apps: @@ -141,7 +139,6 @@ "khpfeaanjngmcnplbdlpegiifgpfgdco", // Smart Card Connector "hmjkmjkepdijhoojdojkdfohbdgmmhki", // Google Keep - notes and lists "felcaaldnbdncclmgdcncolpebgiejap", // Google Sheets - "gbchcmhmhahfdphkhkmpfmihenigjmpp", // Chrome Remote Desktop "khkjfddibboofomnlkndfedpoccieiee", // Study Kit "becloognjehhioodmnimnehjcibkloed", // Coding with Chrome "hfhhnacclhffhdffklopdkcgdhifgngh", // Camera
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc index cf697b1..75c28a1 100644 --- a/extensions/browser/event_router.cc +++ b/extensions/browser/event_router.cc
@@ -13,7 +13,6 @@ #include "base/bind.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/task/post_task.h" #include "base/values.h" #include "components/crx_file/id_util.h"
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc index 671a88f..235683b 100644 --- a/extensions/browser/updater/extension_downloader.cc +++ b/extensions/browser/updater/extension_downloader.cc
@@ -16,7 +16,6 @@ #include "base/metrics/histogram.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h"
diff --git a/extensions/browser/verified_contents_unittest.cc b/extensions/browser/verified_contents_unittest.cc index 358610f3..7bd95f3 100644 --- a/extensions/browser/verified_contents_unittest.cc +++ b/extensions/browser/verified_contents_unittest.cc
@@ -11,7 +11,6 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/path_service.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "extensions/browser/content_verifier/content_verifier_utils.h" #include "extensions/browser/verified_contents.h"
diff --git a/extensions/common/extension.cc b/extensions/common/extension.cc index 3e6b0b2c..6678fa9 100644 --- a/extensions/common/extension.cc +++ b/extensions/common/extension.cc
@@ -19,7 +19,6 @@ #include "base/i18n/rtl.h" #include "base/json/json_writer.h" #include "base/memory/singleton.h" -#include "base/stl_util.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h"
diff --git a/extensions/common/manifest_handler_unittest.cc b/extensions/common/manifest_handler_unittest.cc index 623fc47..1b196d6 100644 --- a/extensions/common/manifest_handler_unittest.cc +++ b/extensions/common/manifest_handler_unittest.cc
@@ -11,7 +11,6 @@ #include <vector> #include "base/files/file_path.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "extensions/common/extension.h" #include "extensions/common/extension_builder.h"
diff --git a/extensions/common/permissions/api_permission_set.cc b/extensions/common/permissions/api_permission_set.cc index 2c32f9b..c5086f4 100644 --- a/extensions/common/permissions/api_permission_set.cc +++ b/extensions/common/permissions/api_permission_set.cc
@@ -7,7 +7,6 @@ #include "base/containers/contains.h" #include "base/logging.h" #include "base/ranges/algorithm.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "extensions/common/error_utils.h"
diff --git a/extensions/renderer/bindings/argument_spec_unittest.cc b/extensions/renderer/bindings/argument_spec_unittest.cc index 312205d1..7665dcd 100644 --- a/extensions/renderer/bindings/argument_spec_unittest.cc +++ b/extensions/renderer/bindings/argument_spec_unittest.cc
@@ -6,7 +6,6 @@ #include "base/bind.h" #include "base/callback.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/values.h" #include "extensions/renderer/bindings/api_binding_test_util.h"
diff --git a/extensions/renderer/safe_builtins.cc b/extensions/renderer/safe_builtins.cc index 8b891cb..86d8795 100644 --- a/extensions/renderer/safe_builtins.cc +++ b/extensions/renderer/safe_builtins.cc
@@ -6,7 +6,6 @@ #include "base/check.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "extensions/renderer/script_context.h" #include "extensions/renderer/v8_helpers.h"
diff --git a/extensions/test/test_extensions_client.cc b/extensions/test/test_extensions_client.cc index 9fad578..9bb4c3f 100644 --- a/extensions/test/test_extensions_client.cc +++ b/extensions/test/test_extensions_client.cc
@@ -10,7 +10,6 @@ #include "base/command_line.h" #include "base/files/file_path.h" -#include "base/stl_util.h" #include "extensions/common/core_extensions_api_provider.h" #include "extensions/common/extension_urls.h" #include "extensions/common/url_pattern_set.h"
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn index 52bc13e..5adfa24 100644 --- a/fuchsia/engine/BUILD.gn +++ b/fuchsia/engine/BUILD.gn
@@ -104,7 +104,7 @@ "//base/util/memory_pressure", "//components/cast/message_port:message_port_fuchsia", "//components/cast_streaming/browser", - "//components/cast_streaming/mojo:mojom", + "//components/cast_streaming/public/mojom", "//components/cast_streaming/renderer", "//components/cdm/renderer", "//components/keyed_service/content", @@ -524,7 +524,7 @@ ":web_engine_core", ":web_engine_unittests_fake_instance_manifest", "//base/test:test_support", - "//components/cast_streaming/mojo:mojom", + "//components/cast_streaming/public/mojom", "//content/test:test_support", "//fuchsia/base/test:test_support", "//fuchsia/engine/web_instance_host",
diff --git a/headless/lib/browser/headless_clipboard.cc b/headless/lib/browser/headless_clipboard.cc index e076898..7f4f04c 100644 --- a/headless/lib/browser/headless_clipboard.cc +++ b/headless/lib/browser/headless_clipboard.cc
@@ -10,6 +10,7 @@ #include "base/strings/utf_string_conversions.h" #include "ui/base/clipboard/clipboard_constants.h" #include "ui/base/data_transfer_policy/data_transfer_endpoint.h" +#include "ui/gfx/codec/png_codec.h" namespace headless { @@ -63,7 +64,7 @@ if (IsFormatAvailable(ui::ClipboardFormatType::GetRtfType(), buffer, data_dst)) types->push_back(base::UTF8ToUTF16(ui::kMimeTypeRTF)); - if (IsFormatAvailable(ui::ClipboardFormatType::GetBitmapType(), buffer, + if (IsFormatAvailable(ui::ClipboardFormatType::GetPngType(), buffer, data_dst)) types->push_back(base::UTF8ToUTF16(ui::kMimeTypePNG)); } @@ -155,8 +156,7 @@ void HeadlessClipboard::ReadPng(ui::ClipboardBuffer buffer, const ui::DataTransferEndpoint* data_dst, ReadPngCallback callback) const { - // TODO(crbug.com/1201018): Implement this. - NOTIMPLEMENTED(); + std::move(callback).Run(GetStore(buffer).png); } // |data_dst| is not used. It's only passed to be consistent with other @@ -164,7 +164,10 @@ void HeadlessClipboard::ReadImage(ui::ClipboardBuffer buffer, const ui::DataTransferEndpoint* data_dst, ReadImageCallback callback) const { - std::move(callback).Run(GetStore(buffer).image); + const std::vector<uint8_t>& png_data = GetStore(buffer).png; + SkBitmap bitmap; + gfx::PNGCodec::Decode(png_data.data(), png_data.size(), &bitmap); + std::move(callback).Run(bitmap); } // |data_dst| is not used. It's only passed to be consistent with other @@ -287,11 +290,9 @@ void HeadlessClipboard::WriteBitmap(const SkBitmap& bitmap) { // Create a dummy entry. - GetDefaultStore().data[ui::ClipboardFormatType::GetBitmapType()]; - SkBitmap& dst = GetDefaultStore().image; - if (dst.tryAllocPixels(bitmap.info())) { - bitmap.readPixels(dst.info(), dst.getPixels(), dst.rowBytes(), 0, 0); - } + GetDefaultStore().data[ui::ClipboardFormatType::GetPngType()]; + gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, /*discard_transparency=*/false, + &GetDefaultStore().png); } void HeadlessClipboard::WriteData(const ui::ClipboardFormatType& format, @@ -310,7 +311,7 @@ data.clear(); url_title.clear(); html_src_url.clear(); - image = SkBitmap(); + png.clear(); } const HeadlessClipboard::DataStore& HeadlessClipboard::GetStore(
diff --git a/headless/lib/browser/headless_clipboard.h b/headless/lib/browser/headless_clipboard.h index 198984953..dd24323 100644 --- a/headless/lib/browser/headless_clipboard.h +++ b/headless/lib/browser/headless_clipboard.h
@@ -114,7 +114,7 @@ std::map<ui::ClipboardFormatType, std::string> data; std::string url_title; std::string html_src_url; - SkBitmap image; + std::vector<uint8_t> png; std::vector<ui::FileInfo> filenames; };
diff --git a/infra/DIR_METADATA b/infra/DIR_METADATA index d2d9af5..c9e376bb 100644 --- a/infra/DIR_METADATA +++ b/infra/DIR_METADATA
@@ -1,10 +1,10 @@ # Metadata information for this directory. # # For more information on DIR_METADATA files, see: -# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/README.md +# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/README.md # # For the schema of this file, see Metadata message: -# https://source.chromium.org/chromium/infra/infra/+/master:go/src/infra/tools/dirmd/proto/dir_metadata.proto +# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/proto/dir_metadata.proto monorail { component: "Infra>Client>Chrome"
diff --git a/infra/config/PRESUBMIT.py b/infra/config/PRESUBMIT.py index 906654e..8b6cd0e4 100644 --- a/infra/config/PRESUBMIT.py +++ b/infra/config/PRESUBMIT.py
@@ -122,19 +122,19 @@ for k, v in sorted(outages_config.items())] return [ output_api.PresubmitError('\n'.join([ - 'The following outages configuration is in effect:\n {}' - .format('\n '.join(outages_config_lines)), + 'The following outages configuration is in effect:\n {}'.format( + '\n '.join(outages_config_lines)), ('The effect of your change may not be visible ' 'in the generated configuration.'), ('If your change is addressing the outage, ' - 'please add the footer {} with a link for the outage.') - .format(_OUTAGE_ACTION_FOOTER), + 'please add the footer {} with a link for the outage.' + ).format(_OUTAGE_ACTION_FOOTER), ('If your change is not addressing the outage ' 'but you still wish to land it, please add the footer ' - '{} with a reason.') - .format(_IGNORE_OUTAGE_FOOTER), + '{} with a reason.').format(_IGNORE_OUTAGE_FOOTER), ('For more information on outages configuration, ' - 'see https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/outages'), + 'see https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/outages' + ), ])), ]
diff --git a/infra/config/README.md b/infra/config/README.md index 7314c84..0d236b0 100644 --- a/infra/config/README.md +++ b/infra/config/README.md
@@ -1,6 +1,6 @@ **IMPORTANT:** This branch only has an effect for branches that have projects set up in -https://chrome-internal.googlesource.com/infradata/config/+/refs/heads/master/configs/luci-config/projects.cfg +https://chrome-internal.googlesource.com/infradata/config/+/refs/heads/main/configs/luci-config/projects.cfg This directory contains chromium project-wide configurations for Chrome Operations services.
diff --git a/infra/config/dev/chromium-header.textpb b/infra/config/dev/chromium-header.textpb index 521cc65f..a6ed7cb 100644 --- a/infra/config/dev/chromium-header.textpb +++ b/infra/config/dev/chromium-header.textpb
@@ -93,7 +93,7 @@ } links: { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/master/infra/config/luci-milo-dev.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/main/infra/config/luci-milo-dev.cfg" alt: "Customize this console" } }
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 1439a26..07c6a99 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -1380,8 +1380,7 @@ location_regexp: ".+/[+]/third_party/blink/renderer/core/svg/.+" location_regexp: ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+" location_regexp: ".+/[+]/third_party/blink/renderer/platform/graphics/.+" - location_regexp: ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng" - location_regexp: ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+" + location_regexp: ".+/[+]/third_party/blink/web_tests/.+" location_regexp_exclude: ".+/[+]/docs/.+" location_regexp_exclude: ".+/[+]/infra/config/.+" }
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index c8173f78..815a336 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -310,8 +310,7 @@ * [`//third_party/blink/renderer/core/svg/.+`](https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/svg/) * [`//third_party/blink/renderer/platform/fonts/shaping/.+`](https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/fonts/shaping/) * [`//third_party/blink/renderer/platform/graphics/.+`](https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/graphics/) - * [`//third_party/blink/web_tests/FlagExpectations/disable-layout-ng`](https://cs.chromium.org/chromium/src/third_party/blink/web_tests/FlagExpectations/disable-layout-ng) - * [`//third_party/blink/web_tests/flag-specific/disable-layout-ng/.+`](https://cs.chromium.org/chromium/src/third_party/blink/web_tests/flag-specific/disable-layout-ng/) + * [`//third_party/blink/web_tests/.+`](https://cs.chromium.org/chromium/src/third_party/blink/web_tests/) * [linux_optional_gpu_tests_rel](https://ci.chromium.org/p/chromium/builders/try/linux_optional_gpu_tests_rel) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+linux_optional_gpu_tests_rel)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+linux_optional_gpu_tests_rel))
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index cc795fd..132d26e 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -58,7 +58,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -124,7 +124,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -190,7 +190,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -256,7 +256,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -322,7 +322,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -388,7 +388,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -454,7 +454,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -520,7 +520,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -586,7 +586,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -652,7 +652,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -719,7 +719,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -786,7 +786,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -853,7 +853,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -919,7 +919,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -986,7 +986,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1053,7 +1053,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1120,7 +1120,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1187,7 +1187,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1254,7 +1254,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1321,7 +1321,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1388,7 +1388,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1455,7 +1455,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1522,7 +1522,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1589,7 +1589,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1656,7 +1656,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1723,7 +1723,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1789,7 +1789,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1855,7 +1855,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1921,7 +1921,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -1987,7 +1987,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2053,7 +2053,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2119,7 +2119,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2185,7 +2185,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2251,7 +2251,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2321,7 +2321,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2388,7 +2388,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2454,7 +2454,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2520,7 +2520,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2587,7 +2587,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2653,7 +2653,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2719,7 +2719,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2785,7 +2785,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2851,7 +2851,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2917,7 +2917,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -2984,7 +2984,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3051,7 +3051,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3117,7 +3117,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3187,7 +3187,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3257,7 +3257,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3323,7 +3323,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3389,7 +3389,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3454,7 +3454,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3519,7 +3519,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3584,7 +3584,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3649,7 +3649,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3717,7 +3717,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3785,7 +3785,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3850,7 +3850,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3915,7 +3915,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -3980,7 +3980,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4045,7 +4045,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4115,7 +4115,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4185,7 +4185,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4255,7 +4255,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4320,7 +4320,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4385,7 +4385,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4450,7 +4450,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4515,7 +4515,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4585,7 +4585,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4655,7 +4655,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4720,7 +4720,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4785,7 +4785,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4850,7 +4850,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4915,7 +4915,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -4981,7 +4981,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5047,7 +5047,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5113,7 +5113,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5179,7 +5179,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5245,7 +5245,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5311,7 +5311,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5377,7 +5377,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5444,7 +5444,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5511,7 +5511,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5578,7 +5578,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5645,7 +5645,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5714,7 +5714,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5783,7 +5783,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5850,7 +5850,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5921,7 +5921,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -5992,7 +5992,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6063,7 +6063,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6134,7 +6134,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6205,7 +6205,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6276,7 +6276,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6342,7 +6342,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6408,7 +6408,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6476,7 +6476,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6544,7 +6544,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6614,7 +6614,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6684,7 +6684,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6750,7 +6750,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6816,7 +6816,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6882,7 +6882,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -6948,7 +6948,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7014,7 +7014,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7080,7 +7080,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7146,7 +7146,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7211,7 +7211,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7277,7 +7277,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7343,7 +7343,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7409,7 +7409,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7475,7 +7475,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7541,7 +7541,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7607,7 +7607,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7676,7 +7676,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7745,7 +7745,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7811,7 +7811,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7877,7 +7877,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -7943,7 +7943,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8013,7 +8013,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8079,7 +8079,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8145,7 +8145,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8211,7 +8211,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8277,7 +8277,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8343,7 +8343,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8409,7 +8409,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8475,7 +8475,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8541,7 +8541,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8607,7 +8607,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8673,7 +8673,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8739,7 +8739,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8805,7 +8805,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8871,7 +8871,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -8937,7 +8937,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9002,7 +9002,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9068,7 +9068,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9134,7 +9134,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9200,7 +9200,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9267,7 +9267,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9333,7 +9333,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9399,7 +9399,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9465,7 +9465,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9531,7 +9531,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9598,7 +9598,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9664,7 +9664,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9730,7 +9730,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9796,7 +9796,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9862,7 +9862,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9928,7 +9928,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -9994,7 +9994,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10060,7 +10060,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10126,7 +10126,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10192,7 +10192,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10257,7 +10257,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10323,7 +10323,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10389,7 +10389,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10455,7 +10455,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10521,7 +10521,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10587,7 +10587,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10653,7 +10653,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10719,7 +10719,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10785,7 +10785,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10850,7 +10850,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10916,7 +10916,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -10982,7 +10982,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11048,7 +11048,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11114,7 +11114,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11180,7 +11180,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11246,7 +11246,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11315,7 +11315,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11384,7 +11384,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11452,7 +11452,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11521,7 +11521,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11589,7 +11589,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11657,7 +11657,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11720,7 +11720,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11785,7 +11785,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11851,7 +11851,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11917,7 +11917,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -11983,7 +11983,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12049,7 +12049,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12118,7 +12118,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12184,7 +12184,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12250,7 +12250,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12316,7 +12316,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12382,7 +12382,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12448,7 +12448,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12514,7 +12514,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12583,7 +12583,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12649,7 +12649,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12714,7 +12714,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12779,7 +12779,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12844,7 +12844,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12912,7 +12912,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -12980,7 +12980,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13045,7 +13045,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13110,7 +13110,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13175,7 +13175,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13240,7 +13240,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13305,7 +13305,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13370,7 +13370,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13435,7 +13435,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13501,7 +13501,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13567,7 +13567,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13633,7 +13633,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13699,7 +13699,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13765,7 +13765,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13834,7 +13834,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13900,7 +13900,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -13966,7 +13966,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14032,7 +14032,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14098,7 +14098,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14164,7 +14164,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14230,7 +14230,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14296,7 +14296,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14362,7 +14362,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14428,7 +14428,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14494,7 +14494,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14560,7 +14560,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14626,7 +14626,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14692,7 +14692,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14758,7 +14758,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14824,7 +14824,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14890,7 +14890,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -14956,7 +14956,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15022,7 +15022,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15088,7 +15088,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15154,7 +15154,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15220,7 +15220,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15286,7 +15286,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15352,7 +15352,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15418,7 +15418,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15484,7 +15484,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15549,7 +15549,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15615,7 +15615,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15681,7 +15681,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15747,7 +15747,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15813,7 +15813,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15879,7 +15879,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -15950,7 +15950,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16021,7 +16021,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16092,7 +16092,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16163,7 +16163,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16232,7 +16232,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16302,7 +16302,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16372,7 +16372,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16442,7 +16442,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16511,7 +16511,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16581,7 +16581,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16651,7 +16651,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16721,7 +16721,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16795,7 +16795,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16869,7 +16869,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -16935,7 +16935,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17001,7 +17001,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17067,7 +17067,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17133,7 +17133,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17199,7 +17199,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17265,7 +17265,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17331,7 +17331,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17397,7 +17397,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17466,7 +17466,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17535,7 +17535,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17605,7 +17605,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17674,7 +17674,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17743,7 +17743,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17812,7 +17812,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17881,7 +17881,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -17950,7 +17950,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18020,7 +18020,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18090,7 +18090,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18156,7 +18156,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18222,7 +18222,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18288,7 +18288,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18354,7 +18354,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18420,7 +18420,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18486,7 +18486,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18552,7 +18552,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18618,7 +18618,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18684,7 +18684,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18750,7 +18750,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18821,7 +18821,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18887,7 +18887,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -18956,7 +18956,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19025,7 +19025,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19090,7 +19090,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19155,7 +19155,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19225,7 +19225,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19291,7 +19291,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19357,7 +19357,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19423,7 +19423,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19493,7 +19493,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19563,7 +19563,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19632,7 +19632,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19698,7 +19698,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19764,7 +19764,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19829,7 +19829,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19896,7 +19896,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -19962,7 +19962,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20029,7 +20029,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20095,7 +20095,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20162,7 +20162,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20228,7 +20228,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20295,7 +20295,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20361,7 +20361,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20428,7 +20428,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20494,7 +20494,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20560,7 +20560,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20626,7 +20626,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20692,7 +20692,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20758,7 +20758,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20824,7 +20824,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20890,7 +20890,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -20956,7 +20956,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21022,7 +21022,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21088,7 +21088,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21155,7 +21155,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21222,7 +21222,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21288,7 +21288,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21354,7 +21354,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21420,7 +21420,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21486,7 +21486,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21552,7 +21552,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21618,7 +21618,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21684,7 +21684,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21750,7 +21750,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21813,7 +21813,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21879,7 +21879,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -21945,7 +21945,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22011,7 +22011,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22077,7 +22077,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22143,7 +22143,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22209,7 +22209,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22275,7 +22275,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22341,7 +22341,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22406,7 +22406,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22472,7 +22472,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22538,7 +22538,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22604,7 +22604,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22670,7 +22670,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22736,7 +22736,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22802,7 +22802,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22868,7 +22868,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -22934,7 +22934,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23000,7 +23000,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23066,7 +23066,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23132,7 +23132,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23198,7 +23198,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23264,7 +23264,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23330,7 +23330,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23396,7 +23396,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23462,7 +23462,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23528,7 +23528,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23594,7 +23594,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23660,7 +23660,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23726,7 +23726,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23792,7 +23792,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23858,7 +23858,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23924,7 +23924,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -23990,7 +23990,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24056,7 +24056,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24122,7 +24122,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24188,7 +24188,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24255,7 +24255,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24321,7 +24321,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24388,7 +24388,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24454,7 +24454,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24520,7 +24520,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24586,7 +24586,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24652,7 +24652,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24718,7 +24718,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24784,7 +24784,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24850,7 +24850,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24924,7 +24924,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -24990,7 +24990,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25063,7 +25063,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25136,7 +25136,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25209,7 +25209,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25284,7 +25284,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25357,7 +25357,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25430,7 +25430,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25503,7 +25503,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25576,7 +25576,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25649,7 +25649,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25722,7 +25722,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25795,7 +25795,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25868,7 +25868,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -25941,7 +25941,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26014,7 +26014,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26081,7 +26081,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26147,7 +26147,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26213,7 +26213,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26279,7 +26279,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26346,7 +26346,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26413,7 +26413,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26479,7 +26479,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26545,7 +26545,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26611,7 +26611,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26677,7 +26677,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26743,7 +26743,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26809,7 +26809,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26875,7 +26875,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -26942,7 +26942,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27009,7 +27009,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27075,7 +27075,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27141,7 +27141,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27207,7 +27207,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27273,7 +27273,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27339,7 +27339,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27405,7 +27405,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27471,7 +27471,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27537,7 +27537,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27604,7 +27604,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27670,7 +27670,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27737,7 +27737,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27803,7 +27803,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27869,7 +27869,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -27935,7 +27935,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28002,7 +28002,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28068,7 +28068,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28134,7 +28134,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28200,7 +28200,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28265,7 +28265,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28331,7 +28331,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28397,7 +28397,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28464,7 +28464,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28530,7 +28530,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28596,7 +28596,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28662,7 +28662,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28727,7 +28727,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28793,7 +28793,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28859,7 +28859,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28925,7 +28925,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -28991,7 +28991,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29057,7 +29057,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29123,7 +29123,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29189,7 +29189,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29255,7 +29255,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29321,7 +29321,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29387,7 +29387,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29454,7 +29454,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29521,7 +29521,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29588,7 +29588,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29654,7 +29654,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29720,7 +29720,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29789,7 +29789,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29855,7 +29855,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29924,7 +29924,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -29990,7 +29990,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30056,7 +30056,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30122,7 +30122,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30191,7 +30191,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30260,7 +30260,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30329,7 +30329,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30398,7 +30398,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30466,7 +30466,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30531,7 +30531,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30597,7 +30597,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30668,7 +30668,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30737,7 +30737,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30806,7 +30806,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30874,7 +30874,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -30940,7 +30940,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31009,7 +31009,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31078,7 +31078,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31146,7 +31146,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31214,7 +31214,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31282,7 +31282,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31351,7 +31351,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31417,7 +31417,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31483,7 +31483,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31549,7 +31549,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31615,7 +31615,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31681,7 +31681,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31747,7 +31747,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31813,7 +31813,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31875,7 +31875,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -31935,7 +31935,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32006,7 +32006,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32077,7 +32077,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32148,7 +32148,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32219,7 +32219,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32289,7 +32289,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32358,7 +32358,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32427,7 +32427,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32497,7 +32497,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32567,7 +32567,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32637,7 +32637,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32710,7 +32710,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32783,7 +32783,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32852,7 +32852,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32921,7 +32921,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -32987,7 +32987,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33057,7 +33057,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33127,7 +33127,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33197,7 +33197,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33267,7 +33267,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33337,7 +33337,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33407,7 +33407,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33477,7 +33477,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33547,7 +33547,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33617,7 +33617,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33687,7 +33687,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33753,7 +33753,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33819,7 +33819,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33885,7 +33885,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -33951,7 +33951,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34022,7 +34022,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34088,7 +34088,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34154,7 +34154,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34223,7 +34223,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34292,7 +34292,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34361,7 +34361,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34430,7 +34430,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34500,7 +34500,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34570,7 +34570,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34636,7 +34636,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34702,7 +34702,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34768,7 +34768,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34834,7 +34834,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34900,7 +34900,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -34966,7 +34966,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -35032,7 +35032,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms" @@ -37183,7 +37183,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 20 + value: 50 } experiments { key: "luci.use_realms"
diff --git a/infra/config/generated/luci-milo-dev.cfg b/infra/config/generated/luci-milo-dev.cfg index 958fb36..6dbecb5 100644 --- a/infra/config/generated/luci-milo-dev.cfg +++ b/infra/config/generated/luci-milo-dev.cfg
@@ -116,7 +116,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/master/infra/config/luci-milo-dev.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/main/infra/config/luci-milo-dev.cfg" alt: "Customize this console" } } @@ -226,7 +226,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/master/infra/config/luci-milo-dev.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/main/infra/config/luci-milo-dev.cfg" alt: "Customize this console" } }
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index 12c43e97..c8cfc402 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -8,7 +8,7 @@ id: "main" name: "Chromium Main Console" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/android-archive-dbg" @@ -842,7 +842,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -875,7 +875,7 @@ id: "mirrors" name: "Chromium CQ Mirrors Console" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Win x64 Builder" @@ -1595,7 +1595,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -1628,7 +1628,7 @@ id: "sheriff.fuchsia" name: "Fuchsia Sheriff Console" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Fuchsia ARM64" @@ -1959,7 +1959,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -1992,7 +1992,7 @@ id: "sheriff.ios" name: "iOS Sheriff Console" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/ios-device" @@ -2288,7 +2288,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -2518,7 +2518,7 @@ id: "chromium" name: "chromium" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/android-archive-dbg" @@ -2859,7 +2859,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -2893,7 +2893,7 @@ id: "chromium.android" name: "chromium.android" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/android-cronet-arm-dbg" @@ -3397,7 +3397,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -3430,7 +3430,7 @@ id: "chromium.android.fyi" name: "chromium.android.fyi" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Android WebView P FYI (rel)" @@ -3751,7 +3751,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -3784,7 +3784,7 @@ id: "chromium.angle" name: "chromium.angle" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/android-angle-arm64-builder" @@ -4230,7 +4230,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -4263,7 +4263,7 @@ id: "chromium.chromiumos" name: "chromium.chromiumos" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/linux-ash-chromium-generator-rel" @@ -4612,7 +4612,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -4645,7 +4645,7 @@ id: "chromium.clang" name: "chromium.clang" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/ToTLinux" @@ -5121,7 +5121,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -5154,7 +5154,7 @@ id: "chromium.dawn" name: "chromium.dawn" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Dawn Linux x64 Builder" @@ -5540,7 +5540,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -5573,7 +5573,7 @@ id: "chromium.fuzz" name: "chromium.fuzz" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Afl Upload Linux ASan" @@ -5988,7 +5988,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -6021,7 +6021,7 @@ id: "chromium.fyi" name: "chromium.fyi" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/android-code-coverage" @@ -6732,7 +6732,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -7123,7 +7123,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -7478,7 +7478,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -7512,7 +7512,7 @@ id: "chromium.gpu" name: "chromium.gpu" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/GPU Win x64 Builder" @@ -7833,7 +7833,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -7866,7 +7866,7 @@ id: "chromium.gpu.fyi" name: "chromium.gpu.fyi" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/GPU FYI Win Builder" @@ -8492,7 +8492,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -8525,7 +8525,7 @@ id: "chromium.linux" name: "chromium.linux" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Linux Builder" @@ -8921,7 +8921,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -8954,7 +8954,7 @@ id: "chromium.mac" name: "chromium.mac" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Mac Builder" @@ -9285,7 +9285,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -9318,7 +9318,7 @@ id: "chromium.memory" name: "chromium.memory" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/win-asan" @@ -9684,7 +9684,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -9717,7 +9717,7 @@ id: "chromium.mojo" name: "chromium.mojo" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Mojo Android" @@ -9998,7 +9998,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -10031,7 +10031,7 @@ id: "chromium.packager" name: "chromium.packager" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/3pp-linux-amd64-packager" @@ -10317,7 +10317,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -10616,7 +10616,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -10650,7 +10650,7 @@ id: "chromium.swangle" name: "chromium.swangle" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/win-swangle-x86" @@ -10971,7 +10971,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -11004,7 +11004,7 @@ id: "chromium.updater" name: "chromium.updater" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/mac10.15-updater-tester-dbg" @@ -11390,7 +11390,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -11734,7 +11734,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -12118,7 +12118,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -12151,7 +12151,7 @@ id: "chromium.win" name: "chromium.win" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/Win Builder" @@ -12472,7 +12472,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -12840,7 +12840,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -13152,7 +13152,7 @@ } links { text: "customize" - url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/master/infra/config/generated/luci-milo.cfg" + url: "https://chromium.googlesource.com/chromium/src/+/refs/heads/main/infra/config/generated/luci-milo.cfg" alt: "Customize this console" } } @@ -14166,7 +14166,7 @@ id: "metadata.exporter" name: "metadata.exporter" repo_url: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" manifest_name: "REVISION" builders { name: "buildbucket/luci.chromium.ci/metadata-exporter"
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index 530a0e02..65e9c8aa 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -7263,7 +7263,7 @@ triggers: "WebRTC Chromium Win Builder" gitiles { repo: "https://chromium.googlesource.com/chromium/src" - refs: "regexp:refs/heads/master" + refs: "regexp:refs/heads/main" } } trigger {
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index 61d0129e..52b1676 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -381,7 +381,7 @@ attribute with a `lucicfg.var` for all of the fields defined here as well as all of the parameters of `luci.builder` that support module-level defaults. - See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.builder + See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/main/lucicfg/doc/README.md#luci.builder for more information. Arguments:
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index 01e6ff79..b30238af 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -99,7 +99,7 @@ experiments.setdefault("chromium.resultdb.result_sink.gtests_local", 100) # Migrate executable to bbagent incrementally. - experiments.setdefault("luci.buildbucket.use_bbagent", 20) + experiments.setdefault("luci.buildbucket.use_bbagent", 50) goma_enable_ats = defaults.get_value_from_kwargs("goma_enable_ats", kwargs) if goma_enable_ats == args.COMPUTE:
diff --git a/infra/config/lib/consoles.star b/infra/config/lib/consoles.star index 2c870043..107a781 100644 --- a/infra/config/lib/consoles.star +++ b/infra/config/lib/consoles.star
@@ -319,7 +319,7 @@ short_name = None): """Specifies the details of a console view entry. - See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.console_view_entry + See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/main/lucicfg/doc/README.md#luci.console_view_entry for more details on the arguments. Args:
diff --git a/infra/config/lib/headers.star b/infra/config/lib/headers.star index 0557799..321d370d 100644 --- a/infra/config/lib/headers.star +++ b/infra/config/lib/headers.star
@@ -76,7 +76,7 @@ text - The display text for the link. alt - The alt text for the link. This is supposed to be the hover text according to the proto - https://chromium.googlesource.com/infra/luci/luci-go/+/master/milo/api/config/project.proto, + https://chromium.googlesource.com/infra/luci/luci-go/+/main/milo/api/config/project.proto, but doesn't appear to produce any hover text. branch_selector - A branch selector value controlling whether the link definition is executed. See branches.star for more information.
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star index 85bb40d..6fcb839 100644 --- a/infra/config/lib/try.star +++ b/infra/config/lib/try.star
@@ -46,7 +46,7 @@ add_default_excludes = True): """Specifies the details of a tryjob verifier. - See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.cq_tryjob_verifier + See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/main/lucicfg/doc/README.md#luci.cq_tryjob_verifier for details on the most of the arguments. Arguments:
diff --git a/infra/config/settings.json b/infra/config/settings.json index 5c879c2..610343f 100644 --- a/infra/config/settings.json +++ b/infra/config/settings.json
@@ -3,6 +3,6 @@ "project_title": "Chromium", "is_main": true, "is_lts_branch": false, - "ref": "refs/heads/master", + "ref": "refs/heads/main", "chrome_project": "chrome" }
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star index 193ef51e..529cc8f 100644 --- a/infra/config/subprojects/chromium/try.star +++ b/infra/config/subprojects/chromium/try.star
@@ -1492,8 +1492,7 @@ ".+/[+]/third_party/blink/renderer/core/svg/.+", ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+", ".+/[+]/third_party/blink/renderer/platform/graphics/.+", - ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng", - ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+", + ".+/[+]/third_party/blink/web_tests/.+", ], ), )
diff --git a/ios/build/bots/scripts/xcode_util.py b/ios/build/bots/scripts/xcode_util.py index dfe45696..0d2b1d5 100644 --- a/ios/build/bots/scripts/xcode_util.py +++ b/ios/build/bots/scripts/xcode_util.py
@@ -43,8 +43,9 @@ def _is_legacy_xcode_package(xcode_app_path): """Checks and returns if the installed Xcode package is legacy version. - Legacy Xcode package are uploaded with legacy version of mac_toolchain. iOS - runtimes are packaged into legacy Xcode packages but not into new packages. + Legacy Xcode package are uploaded with legacy version of mac_toolchain. + Typically, multiple iOS runtimes are bundled into legacy Xcode packages. No + runtime is bundled into new format Xcode packages. Args: xcode_app_path: (string) Path to install the contents of Xcode.app. @@ -52,11 +53,20 @@ Returns: (bool) True if the package is legacy(with runtime bundled). False otherwise. """ - # Existence of default iOS runtime indicates the downloaded Xcode is a legacy - # one (with runtime bundled). - return os.path.exists( + # More than one iOS runtimes indicate the downloaded Xcode is a legacy one. + # If no runtimes are found in the package, it's a new format package. If only + # one runtime is found in package, it typically means it's an incorrectly + # cached new format Xcode package. (The single runtime wasn't moved out from + # Xcode in the end of last task, because last task was killed before moving.) + runtimes_in_xcode = glob.glob( os.path.join(xcode_app_path, XcodeIOSSimulatorRuntimeRelPath, - XcodeIOSSimulatorDefaultRuntimeFilename)) + '*.simruntime')) + is_legacy = len(runtimes_in_xcode) >= 2 + if not is_legacy: + for runtime in runtimes_in_xcode: + LOGGER.warning('Removing %s from incorrectly cached Xcode.', runtime) + shutil.rmtree(runtime) + return is_legacy def _install_runtime(mac_toolchain, install_path, xcode_build_version, @@ -104,8 +114,12 @@ def move_runtime(runtime_cache_folder, xcode_app_path, into_xcode): """Moves runtime from runtime cache into xcode or vice versa. + The function is intended to only work with new Xcode packages. + The function assumes that there's exactly one *.simruntime file in the source - folder. It's intended to only work with new Xcode packages. + folder. It also removes existing runtimes in the destination folder. The above + assumption & handling can ensure no incorrect Xcode package is cached from + corner cases. Args: runtime_cache_folder: (string) Path to the runtime cache directory. @@ -128,14 +142,14 @@ 'Not exactly one runtime files (files: %s) to move from %s!' % (runtimes_in_src, src_folder)) + runtimes_in_dst = glob.glob(os.path.join(dst_folder, '*.simruntime')) + for runtime in runtimes_in_dst: + LOGGER.warning('Removing existing %s in destination folder.', runtime) + shutil.rmtree(runtime) + # Get the runtime package filename. It might not be the default name. runtime_name = os.path.basename(runtimes_in_src[0]) dst_runtime = os.path.join(dst_folder, runtime_name) - - # Remove if the runtime package already exists in dst. - if os.path.exists(dst_runtime): - shutil.rmtree(dst_runtime) - LOGGER.debug('Moving %s from %s to %s.' % (runtime_name, src_folder, dst_folder)) shutil.move(os.path.join(src_folder, runtime_name), dst_runtime)
diff --git a/ios/build/bots/scripts/xcode_util_test.py b/ios/build/bots/scripts/xcode_util_test.py index 202450a..9203982 100644 --- a/ios/build/bots/scripts/xcode_util_test.py +++ b/ios/build/bots/scripts/xcode_util_test.py
@@ -5,6 +5,7 @@ import logging import mock +import os import unittest import test_runner_errors @@ -146,6 +147,10 @@ def setUp(self): super(HelperFunctionTests, self).setUp() + self.xcode_runtime_dir_rel_path = ( + 'Contents/Developer/' + 'Platforms/iPhoneOS.platform/Library/Developer/' + 'CoreSimulator/Profiles/Runtimes') self.xcode_runtime_rel_path = ( 'Contents/Developer/' 'Platforms/iPhoneOS.platform/Library/Developer/' @@ -186,17 +191,51 @@ Use "mac_toolchain help [command]" for more information about a command.""" self.assertFalse(xcode_util._using_new_mac_toolchain('mac_toolchain')) - @mock.patch('os.path.exists', autospec=True, return_value=True) - def test_is_legacy_xcode_package_legacy(self, mock_exists): - self.assertTrue(xcode_util._is_legacy_xcode_package('test/path/Xcode.app')) - mock_exists.assert_called_with('test/path/Xcode.app/' + - self.xcode_runtime_rel_path) + @mock.patch('shutil.rmtree', autospec=True) + @mock.patch('glob.glob', autospec=True) + def test_is_legacy_xcode_package_legacy(self, mock_glob, mock_rmtree): + test_xcode_path = 'test/path/Xcode.app/' + runtime_names = ['iOS.simruntime', 'iOS 12.4.simruntime'] + xcode_runtime_paths = [ + os.path.join(test_xcode_path, self.xcode_runtime_dir_rel_path, + runtime_name) for runtime_name in runtime_names + ] + mock_glob.return_value = xcode_runtime_paths + self.assertTrue(xcode_util._is_legacy_xcode_package(test_xcode_path)) + mock_glob.assert_called_with( + os.path.join(test_xcode_path, self.xcode_runtime_dir_rel_path, + '*.simruntime')) + self.assertFalse(mock_rmtree.called) - @mock.patch('os.path.exists', autospec=True, return_value=False) - def test_is_legacy_xcode_package_not_legacy(self, mock_exists): - self.assertFalse(xcode_util._is_legacy_xcode_package('test/path/Xcode.app')) - mock_exists.assert_called_with('test/path/Xcode.app/' + - self.xcode_runtime_rel_path) + @mock.patch('shutil.rmtree', autospec=True) + @mock.patch('glob.glob', autospec=True) + def test_is_legacy_xcode_package_no_runtime(self, mock_glob, mock_rmtree): + test_xcode_path = 'test/path/Xcode.app/' + xcode_runtime_paths = [] + mock_glob.return_value = xcode_runtime_paths + self.assertFalse(xcode_util._is_legacy_xcode_package(test_xcode_path)) + mock_glob.assert_called_with( + os.path.join(test_xcode_path, self.xcode_runtime_dir_rel_path, + '*.simruntime')) + self.assertFalse(mock_rmtree.called) + + @mock.patch('shutil.rmtree', autospec=True) + @mock.patch('glob.glob', autospec=True) + def test_is_legacy_xcode_package_single_runtime(self, mock_glob, mock_rmtree): + test_xcode_path = 'test/path/Xcode.app/' + runtime_names = ['iOS.simruntime'] + xcode_runtime_paths = [ + os.path.join(test_xcode_path, self.xcode_runtime_dir_rel_path, + runtime_name) for runtime_name in runtime_names + ] + mock_glob.return_value = xcode_runtime_paths + self.assertFalse(xcode_util._is_legacy_xcode_package(test_xcode_path)) + mock_glob.assert_called_with( + os.path.join(test_xcode_path, self.xcode_runtime_dir_rel_path, + '*.simruntime')) + mock_rmtree.assert_called_with( + os.path.join(test_xcode_path, self.xcode_runtime_dir_rel_path, + 'iOS.simruntime')) class MoveRuntimeTests(XcodeUtilTest): @@ -209,12 +248,10 @@ @mock.patch('shutil.move', autospec=True) @mock.patch('shutil.rmtree', autospec=True) - @mock.patch('os.path.exists', autospec=True) @mock.patch('glob.glob', autospec=True) - def test_move_runtime_into_xcode(self, mock_glob, mock_exists, mock_rmtree, - mock_move): - mock_glob.return_value = ['test/path/Runtime/iOS.simruntime'] - mock_exists.return_value = False + def test_move_runtime_into_xcode(self, mock_glob, mock_rmtree, mock_move): + + mock_glob.side_effect = [['test/path/Runtime/iOS.simruntime'], []] xcode_util.move_runtime(self.runtime_cache_folder, self.xcode_app_path, True) @@ -222,60 +259,68 @@ xcode_runtime_path = ('test/path/Xcode.app/Contents/Developer/' 'Platforms/iPhoneOS.platform/Library/Developer/' 'CoreSimulator/Profiles/Runtimes/iOS.simruntime') - mock_glob.assert_called_with('test/path/Runtime/*.simruntime') - mock_exists.assert_called_with(xcode_runtime_path) + calls = [ + mock.call('test/path/Runtime/*.simruntime'), + mock.call(('test/path/Xcode.app/Contents/Developer/' + 'Platforms/iPhoneOS.platform/Library/Developer/' + 'CoreSimulator/Profiles/Runtimes/*.simruntime')) + ] + mock_glob.assert_has_calls(calls) self.assertFalse(mock_rmtree.called) mock_move.assert_called_with('test/path/Runtime/iOS.simruntime', xcode_runtime_path) @mock.patch('shutil.move', autospec=True) @mock.patch('shutil.rmtree', autospec=True) - @mock.patch('os.path.exists', autospec=True) @mock.patch('glob.glob', autospec=True) - def test_move_runtime_outside_xcode(self, mock_glob, mock_exists, mock_rmtree, - mock_move): + def test_move_runtime_outside_xcode(self, mock_glob, mock_rmtree, mock_move): xcode_runtime_folder = ('test/path/Xcode.app/Contents/Developer/' 'Platforms/iPhoneOS.platform/Library/Developer/' 'CoreSimulator/Profiles/Runtimes') - mock_glob.return_value = [xcode_runtime_folder + '/iOS.simruntime'] - mock_exists.return_value = False + mock_glob.side_effect = [[xcode_runtime_folder + '/iOS.simruntime'], []] xcode_util.move_runtime(self.runtime_cache_folder, self.xcode_app_path, False) - mock_glob.assert_called_with(xcode_runtime_folder + '/*.simruntime') - mock_exists.assert_called_with('test/path/Runtime/iOS.simruntime') + calls = [ + mock.call(('test/path/Xcode.app/Contents/Developer/' + 'Platforms/iPhoneOS.platform/Library/Developer/' + 'CoreSimulator/Profiles/Runtimes/*.simruntime')), + mock.call('test/path/Runtime/*.simruntime') + ] + mock_glob.assert_has_calls(calls) self.assertFalse(mock_rmtree.called) mock_move.assert_called_with(xcode_runtime_folder + '/iOS.simruntime', 'test/path/Runtime/iOS.simruntime') @mock.patch('shutil.move', autospec=True) @mock.patch('shutil.rmtree', autospec=True) - @mock.patch('os.path.exists', autospec=True) @mock.patch('glob.glob', autospec=True) - def test_move_runtime_multiple_in_src(self, mock_glob, mock_exists, - mock_rmtree, mock_move): - mock_glob.return_value = [ + def test_move_runtime_multiple_in_src(self, mock_glob, mock_rmtree, + mock_move): + mock_glob.side_effect = [[ 'test/path/Runtime/iOS.simruntime', 'test/path/Runtime/iOS 13.4.simruntime' - ] + ], []] with self.assertRaises(test_runner_errors.IOSRuntimeHandlingError): xcode_util.move_runtime(self.runtime_cache_folder, self.xcode_app_path, True) mock_glob.assert_called_with('test/path/Runtime/*.simruntime') - self.assertFalse(mock_exists.called) self.assertFalse(mock_rmtree.called) self.assertFalse(mock_move.called) @mock.patch('shutil.move', autospec=True) @mock.patch('shutil.rmtree', autospec=True) - @mock.patch('os.path.exists', autospec=True) @mock.patch('glob.glob', autospec=True) - def test_move_runtime_remove_from_dst(self, mock_glob, mock_exists, - mock_rmtree, mock_move): - mock_glob.return_value = ['test/path/Runtime/iOS.simruntime'] - mock_exists.return_value = True + def test_move_runtime_remove_from_dst(self, mock_glob, mock_rmtree, + mock_move): + + mock_glob.side_effect = [['test/path/Runtime/iOS.simruntime'], + [('test/path/Xcode.app/Contents/Developer/' + 'Platforms/iPhoneOS.platform/Library/Developer/' + 'CoreSimulator/Profiles/Runtimes/iOS.simruntime') + ]] xcode_util.move_runtime(self.runtime_cache_folder, self.xcode_app_path, True) @@ -283,8 +328,13 @@ xcode_runtime_path = ('test/path/Xcode.app/Contents/Developer/' 'Platforms/iPhoneOS.platform/Library/Developer/' 'CoreSimulator/Profiles/Runtimes/iOS.simruntime') - mock_glob.assert_called_with('test/path/Runtime/*.simruntime') - mock_exists.assert_called_with(xcode_runtime_path) + calls = [ + mock.call('test/path/Runtime/*.simruntime'), + mock.call(('test/path/Xcode.app/Contents/Developer/' + 'Platforms/iPhoneOS.platform/Library/Developer/' + 'CoreSimulator/Profiles/Runtimes/*.simruntime')) + ] + mock_glob.assert_has_calls(calls) mock_rmtree.assert_called_with(xcode_runtime_path) mock_move.assert_called_with('test/path/Runtime/iOS.simruntime', xcode_runtime_path)
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/BUILD.gn b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/BUILD.gn index fa16ba1..49f6528c 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/BUILD.gn
@@ -17,6 +17,7 @@ deps = [ "//base", "//ios/chrome/browser/infobars", + "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/infobars/overlays", "//ios/chrome/browser/infobars/overlays:util", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers",
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_overlay_request_callback_installer.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_overlay_request_callback_installer.mm index 98abbaf1..a3474702 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_overlay_request_callback_installer.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_overlay_request_callback_installer.mm
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/check.h" +#import "ios/chrome/browser/infobars/infobar_controller_delegate.h" #include "ios/chrome/browser/infobars/infobar_ios.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler.h" @@ -68,10 +69,13 @@ OverlayRequest* request, OverlayResponse* response) { InfoBarIOS* infobar = GetOverlayRequestInfobar(request); - if (!infobar) + InfoBarControllerDelegate* infobar_controller_delegate = + static_cast<InfoBarControllerDelegate*>(infobar); + if (!infobar || !infobar_controller_delegate->IsOwned() || + !infobar->delegate()) return; - static_cast<InfoBarControllerDelegate*>(infobar)->RemoveInfoBar(); + infobar_controller_delegate->RemoveInfoBar(); } #pragma mark - OverlayRequestCallbackInstaller
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm index 9fad3af..975ce9b 100644 --- a/ios/chrome/browser/tabs/tab_helper_util.mm +++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -19,7 +19,6 @@ #import "components/language/ios/browser/ios_language_detection_tab_helper.h" #include "components/safe_browsing/core/features.h" #import "components/safe_browsing/ios/browser/safe_browsing_url_allow_list.h" -#import "components/security_state/ios/insecure_input_tab_helper.h" #import "components/ukm/ios/ukm_url_recorder.h" #import "ios/chrome/browser/app_launcher/app_launcher_tab_helper.h" #import "ios/chrome/browser/autofill/autofill_tab_helper.h" @@ -177,8 +176,6 @@ AutofillTabHelper::FromWebState(web_state)->GetSuggestionProvider(), ]); - InsecureInputTabHelper::CreateForWebState(web_state); - ukm::InitializeSourceUrlRecorderForWebState(web_state); ARQuickLookTabHelper::CreateForWebState(web_state);
diff --git a/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm b/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm index 9a46276c8..dbacf379 100644 --- a/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm +++ b/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm
@@ -109,7 +109,6 @@ _imageView = [[UIImageView alloc] init]; _imageView.translatesAutoresizingMaskIntoConstraints = NO; - _imageView.contentMode = UIViewContentModeCenter; _imageView.layer.masksToBounds = YES; _imageView.contentMode = UIViewContentModeScaleAspectFit; // Creates the image rounded corners.
diff --git a/ios/chrome/browser/ui/default_promo/BUILD.gn b/ios/chrome/browser/ui/default_promo/BUILD.gn index 1126d55..532a9fbe 100644 --- a/ios/chrome/browser/ui/default_promo/BUILD.gn +++ b/ios/chrome/browser/ui/default_promo/BUILD.gn
@@ -107,3 +107,29 @@ ] frameworks = [ "UIKit.framework" ] } + +source_set("eg2_tests") { + defines = [ "CHROME_EARL_GREY_2" ] + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ "default_browser_promo_non_modal_egtest.mm" ] + deps = [ + "//base", + "//base/test:test_support", + "//components/strings:components_strings_grit", + "//ios/chrome/app/strings:ios_chromium_strings_grit", + "//ios/chrome/app/strings:ios_strings_grit", + "//ios/chrome/browser/ui:feature_flags", + "//ios/chrome/browser/ui/infobars/banners:public", + "//ios/chrome/test:eg_test_support+eg2", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ios/third_party/earl_grey2:test_lib", + "//net:test_support", + "//ui/base", + ] + frameworks = [ "UIKit.framework" ] +}
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_egtest.mm b/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_egtest.mm new file mode 100644 index 0000000..9216d7f1 --- /dev/null +++ b/ios/chrome/browser/ui/default_promo/default_browser_promo_non_modal_egtest.mm
@@ -0,0 +1,94 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "base/ios/ios_util.h" +#import "base/test/ios/wait_util.h" +#include "components/strings/grit/components_strings.h" +#import "ios/chrome/browser/ui/infobars/banners/infobar_banner_constants.h" +#include "ios/chrome/browser/ui/ui_feature_flags.h" +#include "ios/chrome/grit/ios_chromium_strings.h" +#include "ios/chrome/grit/ios_strings.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" +#import "ios/chrome/test/earl_grey/chrome_test_case.h" +#import "ios/testing/earl_grey/app_launch_manager.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_request.h" +#include "net/test/embedded_test_server/http_response.h" +#include "ui/base/l10n/l10n_util_mac.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::WaitUntilConditionOrTimeout; +using base::test::ios::kWaitForDownloadTimeout; + +namespace { + +// Returns a matcher to "Link You Copied" row. +id<GREYMatcher> LinkYouCopiedMatcher() { + NSString* a11yLabelText = l10n_util::GetNSString(IDS_LINK_FROM_CLIPBOARD); + return grey_accessibilityLabel(a11yLabelText); +} + +// Returns a matcher for the non modal promo title. +id<GREYMatcher> NonModalTitleMatcher() { + NSString* a11yLabelText = + l10n_util::GetNSString(IDS_IOS_DEFAULT_BROWSER_NON_MODAL_TITLE); + return grey_accessibilityLabel(a11yLabelText); +} + +// Returns a matcher for Omnibox in NTP. +id<GREYMatcher> FakeOmniboxMatcher() { + NSString* a11yLabelText = l10n_util::GetNSString(IDS_OMNIBOX_EMPTY_HINT); + return grey_allOf(grey_accessibilityLabel(a11yLabelText), + grey_kindOfClass([UIButton class]), nil); +} + +} // namespace + +// Tests Non Modal Default Promo. +@interface NonModalEGTest : ChromeTestCase +@end + +@implementation NonModalEGTest + +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + config.features_enabled.push_back(kDefaultPromoNonModal); + return config; +} + +- (void)setUp { + [super setUp]; + [ChromeEarlGreyAppInterface clearDefaultBrowserPromoData]; +} + +- (void)tearDown { + [super tearDown]; + [ChromeEarlGreyAppInterface clearDefaultBrowserPromoData]; +} + +// Test that a non modal default modal promo appears when it is triggered by +// pasting a copied link. +- (void)testNonModalAppears { + // Promos only appear on iOS 14 and up. + if (!base::ios::IsRunningOnIOS14OrLater()) { + return; + } + + [ChromeEarlGreyAppInterface copyURLToPasteBoard]; + [[EarlGrey selectElementWithMatcher:FakeOmniboxMatcher()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:LinkYouCopiedMatcher()] + performAction:grey_tap()]; + [[EarlGrey selectElementWithMatcher:NonModalTitleMatcher()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + +@end
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_utils.mm b/ios/chrome/browser/ui/default_promo/default_browser_utils.mm index dc5cf2b..2df0a99 100644 --- a/ios/chrome/browser/ui/default_promo/default_browser_utils.mm +++ b/ios/chrome/browser/ui/default_promo/default_browser_utils.mm
@@ -72,11 +72,11 @@ "show_switch_description"; // Time threshold before activity timestamps should be removed. Currently set to -// seven days. -const NSTimeInterval kUserActivityTimestampExpiration = 7 * 24 * 60 * 60; +// 21 days. +const NSTimeInterval kUserActivityTimestampExpiration = 21 * 24 * 60 * 60; // Time threshold for the last URL open before no URL opens likely indicates // Chrome is no longer the default browser. -const NSTimeInterval kLatestURLOpenForDefaultBrowser = 7 * 24 * 60 * 60; +const NSTimeInterval kLatestURLOpenForDefaultBrowser = 21 * 24 * 60 * 60; // Delay for the user to be reshown the fullscreen promo when the user taps on // the "Remind Me Later" button. 50 hours. const NSTimeInterval kRemindMeLaterPresentationDelay = 50 * 60 * 60; @@ -84,7 +84,7 @@ // Cool down between fullscreen promos. Currently set to 14 days. const NSTimeInterval kFullscreenPromoCoolDown = 14 * 24 * 60 * 60; -// Helper function to clear all timestamps that occur later than 7 days ago and +// Helper function to clear all timestamps that occur later than 21 days ago and // keep it only to 10 timestamps. NSMutableArray<NSDate*>* SanitizePastUserEvents( NSMutableArray<NSDate*>* pastUserEvents) {
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm index 025b337..b4f9b82 100644 --- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -25,6 +25,7 @@ using chrome_test_util::ButtonWithAccessibilityLabel; using chrome_test_util::SyncSettingsConfirmButton; using chrome_test_util::MatchInWindowWithNumber; +using chrome_test_util::MatchInBlockerWindowWithNumber; using chrome_test_util::FakeOmnibox; namespace { @@ -177,12 +178,12 @@ [[EarlGrey selectElementWithMatcher:MatchInWindowWithNumber( 0, grey_accessibilityLabel( @"Terms of Service"))] - assertWithMatcher:grey_sufficientlyVisible()]; + assertWithMatcher:grey_notNil()]; // Check UI Blocked in second window and that message is a button. [[EarlGrey selectElementWithMatcher: - MatchInWindowWithNumber( + MatchInBlockerWindowWithNumber( 1, grey_text(l10n_util::GetNSString( IDS_IOS_UI_BLOCKED_USE_OTHER_WINDOW_SWITCH_WINDOW_ACTION)))]
diff --git a/ios/chrome/browser/ui/main/ui_blocker_scene_agent.mm b/ios/chrome/browser/ui/main/ui_blocker_scene_agent.mm index d5461ed..163af9f9 100644 --- a/ios/chrome/browser/ui/main/ui_blocker_scene_agent.mm +++ b/ios/chrome/browser/ui/main/ui_blocker_scene_agent.mm
@@ -9,7 +9,6 @@ #import "ios/chrome/app/blocking_scene_commands.h" #import "ios/chrome/browser/ui/blocking_overlay/blocking_overlay_view_controller.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" -#import "ios/chrome/common/ui/util/constraints_ui_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -17,10 +16,7 @@ @interface UIBlockerSceneAgent () -// TODO(crbug.com/1107873): Create a coordinator to own this view controller. -// The view controller that blocks all interactions with the scene. -@property(nonatomic, strong) - BlockingOverlayViewController* blockingOverlayViewController; +@property(nonatomic, strong) UIWindow* overlayWindow; @end @@ -33,12 +29,11 @@ } - (void)sceneStateWillHideModalOverlay:(SceneState*)sceneState { - if (!self.blockingOverlayViewController) { + if (!self.overlayWindow) { return; } - [self.blockingOverlayViewController.view removeFromSuperview]; - self.blockingOverlayViewController = nil; + self.overlayWindow = nil; // When the scene has displayed the blocking overlay and isn't in foreground // when it exits it, the cached app switcher snapshot will have the overlay on @@ -57,25 +52,34 @@ #pragma mark - private - (void)displayBlockingOverlay { - if (self.blockingOverlayViewController) { + if (self.overlayWindow) { // The overlay is already displayed, nothing to do. return; } - // Make the window visible. This is because in safe mode it's not visible yet. - if (self.sceneState.window.hidden) { - [self.sceneState.window makeKeyAndVisible]; + if (@available(iOS 13, *)) { + // No multiwindow before iOS 13 => no blocker necessary. + self.overlayWindow = + [[UIWindow alloc] initWithWindowScene:self.sceneState.scene]; } + // The blocker is above everything, including the alerts, but below the status + // bar. + self.overlayWindow.windowLevel = UIWindowLevelStatusBar - 1; + NSString* a11yIdentifier = [@"blocker-" + stringByAppendingString:self.sceneState.window.accessibilityIdentifier]; + self.overlayWindow.accessibilityIdentifier = a11yIdentifier; - self.blockingOverlayViewController = + // TODO(crbug.com/1107873): Create a coordinator to own this view controller. + // The view controller that blocks all interactions with the scene. + BlockingOverlayViewController* blockingOverlayViewController = + [[BlockingOverlayViewController alloc] init]; - self.blockingOverlayViewController.blockingSceneCommandHandler = + blockingOverlayViewController.blockingSceneCommandHandler = HandlerForProtocol(self.sceneState.appState.appCommandDispatcher, BlockingSceneCommands); - UIView* overlayView = self.blockingOverlayViewController.view; - [self.sceneState.window addSubview:overlayView]; - overlayView.translatesAutoresizingMaskIntoConstraints = NO; - AddSameConstraints(self.sceneState.window, overlayView); + + self.overlayWindow.rootViewController = blockingOverlayViewController; + [self.overlayWindow makeKeyAndVisible]; } @end
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h index 2798a2d..8dfc6d6 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.h
@@ -17,6 +17,13 @@ - (void)closeButtonTappedForCell:(GridCell*)cell; @end +// Values describing the editing state of the cell. +typedef NS_ENUM(NSUInteger, GridCellState) { + GridCellStateNotEditing = 1, + GridCellStateEditingUnselected, + GridCellStateEditingSelected, +}; + // A square-ish cell in a grid. Contains an icon, title, snapshot, and close // button. @interface GridCell : UICollectionViewCell @@ -33,6 +40,8 @@ @property(nonatomic, copy) NSString* title; @property(nonatomic, assign) BOOL titleHidden; @property(nonatomic, readonly) UIDragPreviewParameters* dragPreviewParameters; +// The current state which the cell should display. +@property(nonatomic, assign) GridCellState state; @end // A GridCell for use in animated transitions that only shows selection state
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm index c92f5c1..7c16885 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_cell.mm
@@ -9,6 +9,7 @@ #include "base/check.h" #include "base/notreached.h" #import "ios/chrome/browser/ui/elements/top_aligned_image_view.h" +#import "ios/chrome/browser/ui/tab_switcher/tab_grid/features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_constants.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" @@ -58,10 +59,13 @@ @property(nonatomic, weak) TopAlignedImageView* snapshotView; @property(nonatomic, weak) UILabel* titleLabel; @property(nonatomic, weak) UIImageView* closeIconView; +@property(nonatomic, weak) UIImageView* selectIconView; // Since the close icon dimensions are smaller than the recommended tap target // size, use an overlaid tap target button. @property(nonatomic, weak) UIButton* closeTapTargetButton; @property(nonatomic, weak) UIView* border; +// Whether or not the cell is currently displaying an editing state. +@property(nonatomic, readonly) BOOL isInSelectionMode; @end @implementation GridCell @@ -71,6 +75,8 @@ - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { + _state = GridCellStateNotEditing; + // The background color must be set to avoid the corners behind the rounded // layer from showing when dragging and dropping. Unfortunately, using // |UIColor.clearColor| here will not remain transparent, so a solid color @@ -294,12 +300,27 @@ UIImageView* closeIconView = [[UIImageView alloc] init]; closeIconView.translatesAutoresizingMaskIntoConstraints = NO; closeIconView.contentMode = UIViewContentModeCenter; + closeIconView.hidden = self.isInSelectionMode; closeIconView.image = [[UIImage imageNamed:@"grid_cell_close_button"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + if (IsTabsBulkActionsEnabled()) { + UIImageView* selectIconView = [[UIImageView alloc] init]; + selectIconView.translatesAutoresizingMaskIntoConstraints = NO; + selectIconView.contentMode = UIViewContentModeCenter; + selectIconView.hidden = !self.isInSelectionMode; + + selectIconView.image = [[self selectIconImageForCurrentState] + imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + + [topBar addSubview:selectIconView]; + _selectIconView = selectIconView; + } + [topBar addSubview:iconView]; [topBar addSubview:titleLabel]; [topBar addSubview:closeIconView]; + _iconView = iconView; _titleLabel = titleLabel; _closeIconView = closeIconView; @@ -342,6 +363,20 @@ constraintEqualToAnchor:topBar.trailingAnchor constant:-kGridCellCloseButtonContentInset], ]; + + if (_selectIconView) { + constraints = [constraints arrayByAddingObjectsFromArray:@[ + [closeIconView.leadingAnchor + constraintEqualToAnchor:_selectIconView.leadingAnchor], + [closeIconView.trailingAnchor + constraintEqualToAnchor:_selectIconView.trailingAnchor], + [closeIconView.topAnchor + constraintEqualToAnchor:_selectIconView.topAnchor], + [closeIconView.bottomAnchor + constraintEqualToAnchor:_selectIconView.bottomAnchor], + ]]; + } + [NSLayoutConstraint activateConstraints:constraints]; [titleLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow @@ -354,6 +389,17 @@ return topBar; } +- (UIImage*)selectIconImageForCurrentState { + if (@available(iOS 13, *)) { + if (_state == GridCellStateEditingUnselected) { + return [UIImage systemImageNamed:@"circle"]; + } + return [UIImage systemImageNamed:@"checkmark.circle.fill"]; + } + NOTREACHED(); + return nil; +} + // Update constraints of top bar when system font size changes. If accessibility // font size is chosen, the favicon will be hidden, and the title text will be // shown in two lines. @@ -371,6 +417,48 @@ } } +- (BOOL)isInSelectionMode { + return self.state != GridCellStateNotEditing; +} + +- (void)setState:(GridCellState)state { + if (state == _state) { + return; + } + + _state = state; + + _closeTapTargetButton.enabled = !self.isInSelectionMode; + self.selectIconView.image = [[self selectIconImageForCurrentState] + imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + + __weak GridCell* weakSelf = self; + [UIView animateWithDuration:0.02f + animations:^{ + GridCell* strongSelf = weakSelf; + if (strongSelf) { + if (strongSelf.isInSelectionMode) { + strongSelf.border.alpha = 0.0; + strongSelf.closeIconView.alpha = 0.0; + strongSelf.selectIconView.alpha = 1.0; + } else { + strongSelf.border.alpha = 1.0; + strongSelf.closeIconView.alpha = 1.0; + strongSelf.selectIconView.alpha = 0.0; + } + } + } + completion:^(BOOL finished) { + GridCell* strongSelf = weakSelf; + if (strongSelf) { + BOOL isInSelectionMode = strongSelf.isInSelectionMode; + strongSelf.border.hidden = isInSelectionMode; + strongSelf.closeIconView.hidden = isInSelectionMode; + strongSelf.selectIconView.hidden = !isInSelectionMode; + } + }]; +} + // Sets up the selection border. The tint color is set when the theme is // selected. - (void)setupSelectedBackgroundView { @@ -378,6 +466,7 @@ self.selectedBackgroundView.backgroundColor = [UIColor colorNamed:kGridBackgroundColor]; UIView* border = [[UIView alloc] init]; + border.hidden = self.isInSelectionMode; border.translatesAutoresizingMaskIntoConstraints = NO; border.backgroundColor = [UIColor colorNamed:kGridBackgroundColor]; border.layer.cornerRadius = kGridCellCornerRadius +
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h index 441d0fe..6e2f4fb0 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -592,6 +592,14 @@ // Clear the watcher list, stopping monitoring. + (void)stopWatcher; +#pragma mark - Default Browser Promo Utilities + +// Clears default browser promo data to restart capping for the promos. ++ (void)clearDefaultBrowserPromoData; + +// Copies a chrome:// URL that doesn't require internet connection. ++ (void)copyURLToPasteBoard; + @end #endif // IOS_CHROME_TEST_EARL_GREY_CHROME_EARL_GREY_APP_INTERFACE_H_
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm index e620a99..de82c2d 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -1206,4 +1206,25 @@ } } +#pragma mark - Default Browser Promo Utilities + ++ (void)clearDefaultBrowserPromoData { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSArray<NSString*>* keys = @[ + @"lastTimeUserInteractedWithFullscreenPromo", + @"userHasInteractedWithFullscreenPromo", + @"userHasInteractedWithTailoredFullscreenPromo", + @"userInteractedWithNonModalPromoCount", + @"remindMeLaterPromoActionInteraction", + ]; + for (NSString* key in keys) { + [defaults removeObjectForKey:key]; + } +} + ++ (void)copyURLToPasteBoard { + UIPasteboard* pasteboard = UIPasteboard.generalPasteboard; + pasteboard.URL = [NSURL URLWithString:@"chrome://version"]; +} + @end
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h index 3b14840..892b318b 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.h +++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -26,6 +26,11 @@ id<GREYMatcher> MatchInWindowWithNumber(int window_number, id<GREYMatcher> matcher); +// Same as above, but for the blocking window which only appears when a blocking +// UI is shown in another window. +id<GREYMatcher> MatchInBlockerWindowWithNumber(int window_number, + id<GREYMatcher> matcher); + // Matcher for element with accessibility label corresponding to |message_id| // and accessibility trait UIAccessibilityTraitButton. id<GREYMatcher> ButtonWithAccessibilityLabelId(int message_id);
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm index 64dc408..7a265c5 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -20,12 +20,22 @@ return [ChromeMatchersAppInterface windowWithNumber:window_number]; } +id<GREYMatcher> BlockerWindowWithNumber(int window_number) { + return [ChromeMatchersAppInterface blockerWindowWithNumber:window_number]; +} + id<GREYMatcher> MatchInWindowWithNumber(int window_number, id<GREYMatcher> matcher) { return grey_allOf(matcher, grey_ancestor(WindowWithNumber(window_number)), nil); } +id<GREYMatcher> MatchInBlockerWindowWithNumber(int window_number, + id<GREYMatcher> matcher) { + return grey_allOf(matcher, + grey_ancestor(BlockerWindowWithNumber(window_number)), nil); +} + id<GREYMatcher> ButtonWithAccessibilityLabel(NSString* label) { return [ChromeMatchersAppInterface buttonWithAccessibilityLabel:label]; }
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h index b0ec308..9f6a0edb 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
@@ -23,6 +23,10 @@ // test will have consecutive numbers. + (id<GREYMatcher>)windowWithNumber:(int)windowNumber; +// Same as above, but for the blocking window which only appears when a blocking +// UI is shown in another window. ++ (id<GREYMatcher>)blockerWindowWithNumber:(int)windowNumber; + // Matcher for element with accessibility label corresponding to |label| and // accessibility trait UIAccessibilityTraitButton. + (id<GREYMatcher>)buttonWithAccessibilityLabel:(NSString*)label;
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm index 8172812e..044ba8e 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -143,6 +143,12 @@ grey_kindOfClass([UIWindow class]), nil); } ++ (id<GREYMatcher>)blockerWindowWithNumber:(int)windowNumber { + return grey_allOf(grey_accessibilityID([NSString + stringWithFormat:@"blocker-%d", windowNumber]), + grey_kindOfClass([UIWindow class]), nil); +} + + (id<GREYMatcher>)buttonWithAccessibilityLabel:(NSString*)label { return grey_allOf(grey_accessibilityLabel(label), grey_accessibilityTrait(UIAccessibilityTraitButton), nil);
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn index 905ab4c..7ebe4e9 100644 --- a/ios/chrome/test/earl_grey2/BUILD.gn +++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -87,6 +87,7 @@ "//ios/chrome/browser/ui/autofill:eg2_tests", "//ios/chrome/browser/ui/autofill/manual_fill:eg2_tests", "//ios/chrome/browser/ui/content_suggestions:eg2_tests", + "//ios/chrome/browser/ui/default_promo:eg2_tests", "//ios/chrome/browser/ui/integration_tests:eg2_tests", ] data_deps = [ ":ios_chrome_eg2tests" ]
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index 1628b93..58fa0d8 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -c1330f74a101803f7a4608f42e720b8ae9b56d5e \ No newline at end of file +c264710ebd92f1ae10819084c4222c34133e4616 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index 67818c09..b36c03e 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -0fba4c7a8f73d583e6d5b63bc30a51d3f750561f \ No newline at end of file +56f58e50a8e8fab40a8cd4071d9c1927f9edbf8e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index a8f261d..26ef6fc 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -39762475023efcb71a580d966cd154bfc94428a0 \ No newline at end of file +8326a6c82e1368752fd0f70ea247cd4181c43211 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index acc28696..2c18738 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -182cd266f84620870ca6aa7aa0f5c2f37607e0c2 \ No newline at end of file +2533f45acec3a6ba710290fbf37a94c2ff1e2289 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index 0bab18d1..6aa1e334 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -32a9de047a6bb5d7fd95eedc2e53408ed46484ae \ No newline at end of file +6b79013456ace4ba51f8706b6822c242e0bdb5d2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index 9ebdac7..a9b72cbd 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -22264ef7acfd4a43651758e14fe264788feecced \ No newline at end of file +4c1f26c45e5bdb87351594a306bd8948a5e0961f \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index 5b25701..59c26cc8 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -bb2f3e0d0e2f6dd19cfd95bb8f530a68e11cc28d \ No newline at end of file +dc6c1a8b8dcc532253a05ffe26371a6cc7f51a8b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 448fa581..ede89f2 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -982b14152443d6da8024bbf3366c7f443f70207e \ No newline at end of file +4c5136e9f14b17937d6aa2f9237cd68230189cbf \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index ca3d966d..bfb1a2f7 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -5cfe103a0971a61984f18d1afeb5f1f7253741ec \ No newline at end of file +93264464e608adfee917c7c552876407cd00a5e9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index abaeaa21..79821cc3 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -c45a32ffd1d253a9ceda75d90dd5921b460cf25a \ No newline at end of file +21f73900f91723771e80228f2ec4f76d4de91b1c \ No newline at end of file
diff --git a/ios/web/public/security/ssl_status.h b/ios/web/public/security/ssl_status.h index cdb6cff..fb83491 100644 --- a/ios/web/public/security/ssl_status.h +++ b/ios/web/public/security/ssl_status.h
@@ -5,7 +5,6 @@ #ifndef IOS_WEB_PUBLIC_SECURITY_SSL_STATUS_H_ #define IOS_WEB_PUBLIC_SECURITY_SSL_STATUS_H_ -#include <memory> #include <string> #include "ios/web/public/security/security_style.h" @@ -16,20 +15,6 @@ // Collects the SSL information for this NavigationItem. struct SSLStatus { - // SSLStatus consumers can attach instances of derived UserData classes to an - // SSLStatus. This allows an embedder to attach data to the NavigationItem - // without SSLStatus having to know about it. Derived UserData classes have to - // be cloneable since NavigationItems are cloned during navigations. - class UserData { - public: - UserData() {} - virtual ~UserData() = default; - virtual std::unique_ptr<UserData> Clone() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(UserData); - }; - // Flags used for the page security content status. enum ContentStatusFlags { // HTTP page, or HTTPS page with no insecure content. @@ -56,7 +41,6 @@ cert_status == status.cert_status && content_status == status.content_status; // |cert_status_host| is not used for comparison intentionally. - // |user_data| also not used for comparison. } web::SecurityStyle security_style; @@ -69,10 +53,6 @@ // Used to check if |cert_status| is still valid or needs to be recalculated // (e.g. after redirect). std::string cert_status_host; - // Embedder-specific data attached to the SSLStatus is cloned when an - // |SSLStatus| is assigned or copy-constructed, and is cleared when a - // navigation commits. - std::unique_ptr<UserData> user_data; }; } // namespace web
diff --git a/ios/web/security/ssl_status.cc b/ios/web/security/ssl_status.cc index 52502d0a..c5d15044 100644 --- a/ios/web/security/ssl_status.cc +++ b/ios/web/security/ssl_status.cc
@@ -16,8 +16,7 @@ certificate(other.certificate), cert_status(other.cert_status), content_status(other.content_status), - cert_status_host(other.cert_status_host), - user_data(other.user_data ? other.user_data->Clone() : nullptr) {} + cert_status_host(other.cert_status_host) {} SSLStatus& SSLStatus::operator=(SSLStatus other) { security_style = other.security_style; @@ -25,7 +24,6 @@ cert_status = other.cert_status; content_status = other.content_status; cert_status_host = other.cert_status_host; - user_data = other.user_data ? other.user_data->Clone() : nullptr; return *this; }
diff --git a/ios/web/security/ssl_status_unittest.cc b/ios/web/security/ssl_status_unittest.cc index 542c959..fce7cd9 100644 --- a/ios/web/security/ssl_status_unittest.cc +++ b/ios/web/security/ssl_status_unittest.cc
@@ -11,25 +11,6 @@ using SSLStatusTest = PlatformTest; -// The TrivialUserData class stores an integer and copies that integer when -// its Clone() method is called. -class TrivialUserData : public SSLStatus::UserData { - public: - TrivialUserData() : value_(0) {} - explicit TrivialUserData(int value) : value_(value) {} - ~TrivialUserData() override {} - - int value() { return value_; } - - std::unique_ptr<SSLStatus::UserData> Clone() override { - return std::make_unique<TrivialUserData>(value_); - } - - private: - int value_; - DISALLOW_COPY_AND_ASSIGN(TrivialUserData); -}; - // Tests the Equals() method of the SSLStatus class. TEST_F(SSLStatusTest, SSLStatusEqualityTest) { SSLStatus status; @@ -49,28 +30,5 @@ SSLStatus copied_status = status; EXPECT_TRUE(status.Equals(copied_status)); EXPECT_TRUE(copied_status.Equals(status)); - - // Verify a copied SSLStatus still Equals() the original after a UserData is - // assigned to it. - copied_status.user_data = std::make_unique<TrivialUserData>(); - EXPECT_TRUE(status.Equals(copied_status)); - EXPECT_TRUE(copied_status.Equals(status)); } - -// Tests that copying a SSLStatus class clones its UserData. -TEST_F(SSLStatusTest, SSLStatusCloningTest) { - const int kMagic = 1234; - SSLStatus status; - status.user_data = std::make_unique<TrivialUserData>(kMagic); - - // Verify that copying a SSLStatus with a UserData assigned will Clone() - // the UserData to the new copy. - SSLStatus copied_status = status; - EXPECT_TRUE(status.Equals(copied_status)); - EXPECT_TRUE(copied_status.Equals(status)); - TrivialUserData* data = - static_cast<TrivialUserData*>(copied_status.user_data.get()); - EXPECT_EQ(kMagic, data->value()); -} - } // namespace web
diff --git a/media/audio/audio_input_device.cc b/media/audio/audio_input_device.cc index f6c15f61..803c1430 100644 --- a/media/audio/audio_input_device.cc +++ b/media/audio/audio_input_device.cc
@@ -290,7 +290,7 @@ alive_checker_->Start(); } -void AudioInputDevice::OnError() { +void AudioInputDevice::OnError(AudioCapturerSource::ErrorCode code) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT0("audio", "AudioInputDevice::OnError"); @@ -298,7 +298,6 @@ if (state_ < CREATING_STREAM) return; - if (state_ == CREATING_STREAM) { // At this point, we haven't attempted to start the audio thread. // Accessing the hardware might have failed or we may have reached @@ -308,7 +307,10 @@ // a local audio source). had_error_ = kErrorDuringCreation; callback_->OnCaptureError( - "Maximum allowed input device limit reached or OS failure."); + code, code == AudioCapturerSource::ErrorCode::kSystemPermissions + ? "Unable to open due to failing an OS Permissions check." + : "Maximum allowed input device limit reached or an OS " + "failure occured."); } else { // Don't dereference the callback object if the audio thread // is stopped or stopping. That could mean that the callback @@ -318,7 +320,7 @@ // a callback object via Start() and clear it in Stop(). had_error_ = kErrorDuringCapture; if (audio_thread_) - callback_->OnCaptureError("IPC delegate state error."); + callback_->OnCaptureError(code, "IPC delegate state error."); } } @@ -351,7 +353,8 @@ } void AudioInputDevice::DetectedDeadInputStream() { - callback_->OnCaptureError("No audio received from audio capture device."); + callback_->OnCaptureError(media::AudioCapturerSource::ErrorCode::kUnknown, + "No audio received from audio capture device."); } // AudioInputDevice::AudioThreadCallback @@ -431,14 +434,16 @@ "Incorrect buffer sequence. Expected = %u. Actual = %u.", last_buffer_id_ + 1, buffer->params.id); LOG(ERROR) << message; - capture_callback_->OnCaptureError(message); + capture_callback_->OnCaptureError( + media::AudioCapturerSource::ErrorCode::kUnknown, message); } if (current_segment_id_ != pending_data) { std::string message = base::StringPrintf( "Segment id not matching. Remote = %u. Local = %" PRIuS ".", pending_data, current_segment_id_); LOG(ERROR) << message; - capture_callback_->OnCaptureError(message); + capture_callback_->OnCaptureError( + media::AudioCapturerSource::ErrorCode::kUnknown, message); } last_buffer_id_ = buffer->params.id;
diff --git a/media/audio/audio_input_device.h b/media/audio/audio_input_device.h index a573c0d..ab9d0991 100644 --- a/media/audio/audio_input_device.h +++ b/media/audio/audio_input_device.h
@@ -116,7 +116,7 @@ void OnStreamCreated(base::ReadOnlySharedMemoryRegion shared_memory_region, base::SyncSocket::ScopedHandle socket_handle, bool initially_muted) override; - void OnError() override; + void OnError(AudioCapturerSource::ErrorCode code) override; void OnMuted(bool is_muted) override; void OnIPCClosed() override;
diff --git a/media/audio/audio_input_device_unittest.cc b/media/audio/audio_input_device_unittest.cc index d951d34..b0c1eba9 100644 --- a/media/audio/audio_input_device_unittest.cc +++ b/media/audio/audio_input_device_unittest.cc
@@ -57,7 +57,9 @@ double volume, bool key_pressed)); - MOCK_METHOD1(OnCaptureError, void(const std::string& message)); + MOCK_METHOD2(OnCaptureError, + void(AudioCapturerSource::ErrorCode code, + const std::string& message)); MOCK_METHOD1(OnCaptureMuted, void(bool is_muted)); }; @@ -77,7 +79,8 @@ } ACTION_P(ReportStateChange, device) { - static_cast<AudioInputIPCDelegate*>(device)->OnError(); + static_cast<AudioInputIPCDelegate*>(device)->OnError( + media::AudioCapturerSource::ErrorCode::kUnknown); } // Verify that we get an OnCaptureError() callback if CreateStream fails. @@ -93,7 +96,8 @@ device->Initialize(params, &callback); EXPECT_CALL(*input_ipc, CreateStream(_, _, _, _)) .WillOnce(ReportStateChange(device.get())); - EXPECT_CALL(callback, OnCaptureError(_)); + EXPECT_CALL(callback, + OnCaptureError(AudioCapturerSource::ErrorCode::kUnknown, _)); EXPECT_CALL(*input_ipc, CloseStream()); device->Start(); device->Stop();
diff --git a/media/audio/audio_input_ipc.h b/media/audio/audio_input_ipc.h index 1f2192a..28663a9 100644 --- a/media/audio/audio_input_ipc.h +++ b/media/audio/audio_input_ipc.h
@@ -9,6 +9,7 @@ #include "base/memory/read_only_shared_memory_region.h" #include "base/sync_socket.h" +#include "media/base/audio_capturer_source.h" #include "media/base/audio_parameters.h" #include "media/base/media_export.h" @@ -30,7 +31,7 @@ bool initially_muted) = 0; // Called when state of an audio stream has changed. - virtual void OnError() = 0; + virtual void OnError(AudioCapturerSource::ErrorCode code) = 0; // Called when an audio stream is muted or unmuted. virtual void OnMuted(bool is_muted) = 0;
diff --git a/media/base/audio_capturer_source.h b/media/base/audio_capturer_source.h index ca91a598..7ec2136e 100644 --- a/media/base/audio_capturer_source.h +++ b/media/base/audio_capturer_source.h
@@ -23,6 +23,11 @@ class AudioCapturerSource : public base::RefCountedThreadSafe<media::AudioCapturerSource> { public: + enum class ErrorCode { + kUnknown = 0, + kSystemPermissions = 1, + }; + class CaptureCallback { public: // Signals that audio recording has been started. Called asynchronously @@ -40,7 +45,7 @@ bool key_pressed) = 0; // Signals an error has occurred. - virtual void OnCaptureError(const std::string& message) = 0; + virtual void OnCaptureError(ErrorCode code, const std::string& message) = 0; // Signals the muted state has changed. May be called before // OnCaptureStarted.
diff --git a/media/blink/multibuffer.cc b/media/blink/multibuffer.cc index 84bbc6b..d4d04e5 100644 --- a/media/blink/multibuffer.cc +++ b/media/blink/multibuffer.cc
@@ -52,11 +52,11 @@ // MultiBuffer::GlobalLRU // MultiBuffer::GlobalLRU::GlobalLRU( - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : max_size_(0), data_size_(0), background_pruning_pending_(false), - task_runner_(task_runner) {} + task_runner_(std::move(task_runner)) {} MultiBuffer::GlobalLRU::~GlobalLRU() { // By the time we're freed, all blocks should have been removed,
diff --git a/media/blink/multibuffer.h b/media/blink/multibuffer.h index 96d6f204..1701254 100644 --- a/media/blink/multibuffer.h +++ b/media/blink/multibuffer.h
@@ -138,8 +138,7 @@ class MEDIA_BLINK_EXPORT GlobalLRU : public base::RefCounted<GlobalLRU> { public: typedef MultiBufferGlobalBlockId GlobalBlockId; - explicit GlobalLRU( - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); + explicit GlobalLRU(scoped_refptr<base::SingleThreadTaskRunner> task_runner); // Free elements from cache if possible. // Don't free more than |max_to_free| blocks.
diff --git a/media/blink/multibuffer_data_source.cc b/media/blink/multibuffer_data_source.cc index c157471..ad7f8395 100644 --- a/media/blink/multibuffer_data_source.cc +++ b/media/blink/multibuffer_data_source.cc
@@ -168,8 +168,8 @@ SetReader(new MultiBufferReader( url_data_->multibuffer(), first_byte_position, last_byte_position, - base::BindRepeating(&MultibufferDataSource::ProgressCallback, - weak_ptr_))); + base::BindRepeating(&MultibufferDataSource::ProgressCallback, weak_ptr_), + render_task_runner_)); reader_->SetIsClientAudioElement(is_client_audio_element_); UpdateBufferSizes(); } @@ -182,7 +182,8 @@ reader_ = std::make_unique<MultiBufferReader>( url_data_->multibuffer(), first_byte_position, last_byte_position, - base::BindRepeating(&MultibufferDataSource::ProgressCallback, weak_ptr_)); + base::BindRepeating(&MultibufferDataSource::ProgressCallback, weak_ptr_), + render_task_runner_); UpdateBufferSizes(); }
diff --git a/media/blink/multibuffer_data_source_unittest.cc b/media/blink/multibuffer_data_source_unittest.cc index bf7e74c..68191fa 100644 --- a/media/blink/multibuffer_data_source_unittest.cc +++ b/media/blink/multibuffer_data_source_unittest.cc
@@ -6,15 +6,20 @@ #include <stdint.h> #include <memory> +#include <utility> #include "base/bind.h" +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/single_thread_task_runner.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" +#include "base/test/task_environment.h" #include "media/base/media_switches.h" #include "media/base/media_util.h" #include "media/base/mock_filters.h" #include "media/base/test_helpers.h" +#include "media/blink/blink_platform_with_task_environment.h" #include "media/blink/buffered_data_source_host_impl.h" #include "media/blink/mock_resource_fetch_context.h" #include "media/blink/mock_webassociatedurlloader.h" @@ -48,10 +53,14 @@ class TestMultiBufferDataProvider : public ResourceMultiBufferDataProvider { public: - TestMultiBufferDataProvider(UrlData* url_data, MultiBuffer::BlockId pos) + TestMultiBufferDataProvider( + UrlData* url_data, + MultiBuffer::BlockId pos, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : ResourceMultiBufferDataProvider(url_data, pos, - false /* is_client_audio_element */) { + false /* is_client_audio_element */, + std::move(task_runner)) { CHECK(test_data_providers.insert(this).second); } ~TestMultiBufferDataProvider() override { @@ -82,12 +91,17 @@ class TestResourceMultiBuffer : public ResourceMultiBuffer { public: - explicit TestResourceMultiBuffer(UrlData* url_data, int shift) - : ResourceMultiBuffer(url_data, shift) {} + TestResourceMultiBuffer( + UrlData* url_data, + int shift, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : ResourceMultiBuffer(url_data, shift, task_runner), + task_runner_(std::move(task_runner)) {} std::unique_ptr<MultiBuffer::DataProvider> CreateWriter(const BlockId& pos, bool) override { - auto writer = std::make_unique<TestMultiBufferDataProvider>(url_data_, pos); + auto writer = std::make_unique<TestMultiBufferDataProvider>(url_data_, pos, + task_runner_); writer->Start(); return writer; } @@ -112,45 +126,55 @@ return false; return GetProvider()->loading(); } + + private: + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; class TestUrlData : public UrlData { public: - TestUrlData(const GURL& url, CorsMode cors_mode, UrlIndex* url_index) - : UrlData(url, cors_mode, url_index), - block_shift_(url_index->block_shift()) {} + TestUrlData(const GURL& url, + CorsMode cors_mode, + UrlIndex* url_index, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : UrlData(url, cors_mode, url_index, task_runner), + block_shift_(url_index->block_shift()), + task_runner_(std::move(task_runner)) {} ResourceMultiBuffer* multibuffer() override { if (!test_multibuffer_.get()) { - test_multibuffer_ = - std::make_unique<TestResourceMultiBuffer>(this, block_shift_); + test_multibuffer_ = std::make_unique<TestResourceMultiBuffer>( + this, block_shift_, task_runner_); } return test_multibuffer_.get(); } TestResourceMultiBuffer* test_multibuffer() { if (!test_multibuffer_.get()) { - test_multibuffer_ = - std::make_unique<TestResourceMultiBuffer>(this, block_shift_); + test_multibuffer_ = std::make_unique<TestResourceMultiBuffer>( + this, block_shift_, task_runner_); } return test_multibuffer_.get(); } - protected: + private: ~TestUrlData() override = default; - const int block_shift_; + const int block_shift_; std::unique_ptr<TestResourceMultiBuffer> test_multibuffer_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; class TestUrlIndex : public UrlIndex { public: - explicit TestUrlIndex(ResourceFetchContext* fetch_context) - : UrlIndex(fetch_context) {} + TestUrlIndex(ResourceFetchContext* fetch_context, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : UrlIndex(fetch_context, task_runner), + task_runner_(std::move(task_runner)) {} scoped_refptr<UrlData> NewUrlData(const GURL& url, UrlData::CorsMode cors_mode) override { - last_url_data_ = new TestUrlData(url, cors_mode, this); + last_url_data_ = new TestUrlData(url, cors_mode, this, task_runner_); return last_url_data_; } @@ -163,6 +187,7 @@ private: scoped_refptr<TestUrlData> last_url_data_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; class MockBufferedDataSourceHost : public BufferedDataSourceHost { @@ -221,8 +246,6 @@ .WillByDefault(Invoke([](const blink::WebAssociatedURLLoaderOptions&) { return std::make_unique<NiceMock<MockWebAssociatedURLLoader>>(); })); - - url_index_ = std::make_unique<TestUrlIndex>(&fetch_context_); } MOCK_METHOD1(OnInitialize, void(bool)); @@ -233,8 +256,8 @@ size_t file_size = kFileSize) { GURL gurl(url); data_source_ = std::make_unique<MockMultibufferDataSource>( - base::ThreadTaskRunnerHandle::Get(), - url_index_->GetByUrl(gurl, cors_mode, UrlIndex::kNormal), &host_); + task_runner_, url_index_.GetByUrl(gurl, cors_mode, UrlIndex::kNormal), + &host_); data_source_->SetPreload(preload_); response_generator_ = @@ -410,7 +433,7 @@ MultiBufferReader* loader() { return data_source_->reader_.get(); } TestResourceMultiBuffer* multibuffer() { - return url_index_->last_url_data()->test_multibuffer(); + return url_index_.last_url_data()->test_multibuffer(); } TestMultiBufferDataProvider* data_provider() { @@ -459,7 +482,10 @@ protected: MultibufferDataSource::Preload preload_; NiceMock<MockResourceFetchContext> fetch_context_; - std::unique_ptr<TestUrlIndex> url_index_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_ = + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment() + ->GetMainThreadTaskRunner(); + TestUrlIndex url_index_{&fetch_context_, task_runner_}; std::unique_ptr<MockMultibufferDataSource> data_source_; @@ -996,9 +1022,9 @@ StrictMock<MockBufferedDataSourceHost> host2; MockMultibufferDataSource source2( - base::ThreadTaskRunnerHandle::Get(), - url_index_->GetByUrl(GURL(kHttpUrl), UrlData::CORS_UNSPECIFIED, - UrlIndex::kNormal), + task_runner_, + url_index_.GetByUrl(GURL(kHttpUrl), UrlData::CORS_UNSPECIFIED, + UrlIndex::kNormal), &host2); source2.SetPreload(preload_); @@ -1363,8 +1389,8 @@ TEST_F(MultibufferDataSourceTest, SeekPastEOF) { GURL gurl(kHttpUrl); data_source_ = std::make_unique<MockMultibufferDataSource>( - base::ThreadTaskRunnerHandle::Get(), - url_index_->GetByUrl(gurl, UrlData::CORS_UNSPECIFIED, UrlIndex::kNormal), + task_runner_, + url_index_.GetByUrl(gurl, UrlData::CORS_UNSPECIFIED, UrlIndex::kNormal), &host_); data_source_->SetPreload(preload_); @@ -1742,8 +1768,8 @@ TEST_F(MultibufferDataSourceTest, Http_CheckLoadingTransition) { GURL gurl(kHttpUrl); data_source_ = std::make_unique<MockMultibufferDataSource>( - base::ThreadTaskRunnerHandle::Get(), - url_index_->GetByUrl(gurl, UrlData::CORS_UNSPECIFIED, UrlIndex::kNormal), + task_runner_, + url_index_.GetByUrl(gurl, UrlData::CORS_UNSPECIFIED, UrlIndex::kNormal), &host_); data_source_->SetPreload(preload_);
diff --git a/media/blink/multibuffer_reader.cc b/media/blink/multibuffer_reader.cc index 9d6b864..68149df 100644 --- a/media/blink/multibuffer_reader.cc +++ b/media/blink/multibuffer_reader.cc
@@ -4,11 +4,12 @@ #include <stddef.h> +#include <utility> + #include "base/bind.h" #include "base/callback_helpers.h" #include "base/location.h" #include "base/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" #include "media/blink/multibuffer_reader.h" #include "net/base/net_errors.h" @@ -18,7 +19,8 @@ MultiBuffer* multibuffer, int64_t start, int64_t end, - base::RepeatingCallback<void(int64_t, int64_t)> progress_callback) + base::RepeatingCallback<void(int64_t, int64_t)> progress_callback, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : multibuffer_(multibuffer), // If end is -1, we use a very large (but still supported) value instead. end_(end == -1LL ? (1LL << (multibuffer->block_size_shift() + 30)) : end), @@ -32,7 +34,8 @@ preload_pos_(-1), loading_(true), current_wait_size_(0), - progress_callback_(std::move(progress_callback)) { + progress_callback_(std::move(progress_callback)), + task_runner_(std::move(task_runner)) { DCHECK_GE(start, 0); DCHECK_GE(end_, 0); } @@ -149,7 +152,7 @@ // We redirect the call through a weak pointer to ourselves to guarantee // there are no callbacks from us after we've been destroyed. current_wait_size_ = 0; - base::ThreadTaskRunnerHandle::Get()->PostTask( + task_runner_->PostTask( FROM_HERE, base::BindOnce(&MultiBufferReader::Call, weak_factory_.GetWeakPtr(), std::move(cb_))); } @@ -178,7 +181,7 @@ } UpdateInternalState(); if (!progress_callback_.is_null()) { - base::ThreadTaskRunnerHandle::Get()->PostTask( + task_runner_->PostTask( FROM_HERE, base::BindOnce(progress_callback_, static_cast<int64_t>(range.begin)
diff --git a/media/blink/multibuffer_reader.h b/media/blink/multibuffer_reader.h index ae67cca..20c8181 100644 --- a/media/blink/multibuffer_reader.h +++ b/media/blink/multibuffer_reader.h
@@ -8,10 +8,15 @@ #include <stdint.h> #include "base/callback.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "media/blink/media_blink_export.h" #include "media/blink/multibuffer.h" +namespace base { +class SingleThreadTaskRunner; +} + namespace media { // Wrapper for MultiBuffer that offers a simple byte-reading @@ -34,7 +39,8 @@ MultiBuffer* multibuffer, int64_t start, int64_t end, - base::RepeatingCallback<void(int64_t, int64_t)> progress_callback); + base::RepeatingCallback<void(int64_t, int64_t)> progress_callback, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~MultiBufferReader() override; @@ -180,6 +186,8 @@ // Progress callback. base::RepeatingCallback<void(int64_t, int64_t)> progress_callback_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + base::WeakPtrFactory<MultiBufferReader> weak_factory_{this}; };
diff --git a/media/blink/multibuffer_unittest.cc b/media/blink/multibuffer_unittest.cc index 29d81549..ba2b65b7 100644 --- a/media/blink/multibuffer_unittest.cc +++ b/media/blink/multibuffer_unittest.cc
@@ -6,12 +6,14 @@ #include <stdint.h> #include <string> +#include <utility> #include <vector> #include "base/bind.h" #include "base/callback_helpers.h" #include "base/containers/circular_deque.h" #include "base/logging.h" +#include "base/single_thread_task_runner.h" #include "base/test/simple_test_tick_clock.h" #include "media/base/fake_single_thread_task_runner.h" #include "media/base/test_random.h" @@ -262,7 +264,8 @@ size_t end = 10000; multibuffer_.SetFileSize(10000); multibuffer_.SetMustReadWholeFile(true); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPinRange(2000, 5000); reader.SetPreload(1000, 1000); while (pos < end) { @@ -289,7 +292,8 @@ size_t end = 10000; multibuffer_.SetFileSize(10000); multibuffer_.SetMustReadWholeFile(true); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPinRange(2000, 5000); reader.SetPreload(1000, 1000); while (pos < end) { @@ -318,7 +322,8 @@ multibuffer_.SetFileSize(10000); multibuffer_.SetMaxBlocksAfterDefer(-10000); multibuffer_.SetRangeSupported(true); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPinRange(2000, 5000); reader.SetPreload(1000, 1000); while (pos < end) { @@ -348,7 +353,8 @@ multibuffer_.SetFileSize(10000); multibuffer_.SetMustReadWholeFile(true); multibuffer_.SetMaxBlocksAfterDefer(-10000); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPinRange(2000, 5000); reader.SetPreload(1000, 1000); while (pos < end) { @@ -377,7 +383,8 @@ size_t pos = 0; size_t end = 10000; multibuffer_.SetFileSize(10000); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPreload(10000, 10000); // Note, no pinning, all data should end up in LRU. EXPECT_EQ(current_size, lru_->Size()); @@ -405,7 +412,8 @@ size_t pos = 0; size_t end = 10000; multibuffer_.SetFileSize(10000); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPreload(10000, 10000); // Note, no pinning, all data should end up in LRU. EXPECT_EQ(current_size, lru_->Size()); @@ -434,7 +442,8 @@ size_t pos = 0; size_t end = 10000; multibuffer_.SetFileSize(10000); - MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback()); + MultiBufferReader reader(&multibuffer_, pos, end, base::NullCallback(), + task_runner_); reader.SetPreload(10000, 10000); // Note, no pinning, all data should end up in LRU. EXPECT_EQ(current_size, lru_->Size()); @@ -473,13 +482,18 @@ ReadHelper(size_t end, size_t max_read_size, MultiBuffer* multibuffer, - TestRandom* rnd) + TestRandom* rnd, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : pos_(0), end_(end), max_read_size_(max_read_size), read_size_(0), rnd_(rnd), - reader_(multibuffer, pos_, end_, base::NullCallback()) { + reader_(multibuffer, + pos_, + end_, + base::NullCallback(), + std::move(task_runner)) { reader_.SetPinRange(2000, 5000); reader_.SetPreload(1000, 1000); } @@ -536,7 +550,7 @@ std::vector<ReadHelper*> read_helpers; for (size_t i = 0; i < 20; i++) { read_helpers.push_back( - new ReadHelper(file_size, 1000, &multibuffer_, &rnd_)); + new ReadHelper(file_size, 1000, &multibuffer_, &rnd_, task_runner_)); } for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { @@ -567,7 +581,7 @@ multibuffer_.SetRangeSupported(true); for (size_t i = 0; i < 20; i++) { read_helpers.push_back( - new ReadHelper(file_size, 1000, &multibuffer_, &rnd_)); + new ReadHelper(file_size, 1000, &multibuffer_, &rnd_, task_runner_)); } for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) {
diff --git a/media/blink/resource_multibuffer_data_provider.cc b/media/blink/resource_multibuffer_data_provider.cc index 3b369c0..eceb0b90 100644 --- a/media/blink/resource_multibuffer_data_provider.cc +++ b/media/blink/resource_multibuffer_data_provider.cc
@@ -15,7 +15,6 @@ #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" -#include "base/threading/thread_task_runner_handle.h" #include "media/blink/cache_util.h" #include "media/blink/resource_fetch_context.h" #include "media/blink/url_index.h" @@ -58,13 +57,15 @@ ResourceMultiBufferDataProvider::ResourceMultiBufferDataProvider( UrlData* url_data, MultiBufferBlockId pos, - bool is_client_audio_element) + bool is_client_audio_element, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : pos_(pos), url_data_(url_data), retries_(0), cors_mode_(url_data->cors_mode()), origin_(url_data->url().GetOrigin()), - is_client_audio_element_(is_client_audio_element) { + is_client_audio_element_(is_client_audio_element), + task_runner_(std::move(task_runner)) { DCHECK(url_data_) << " pos = " << pos; DCHECK_GE(pos, 0); } @@ -74,7 +75,7 @@ void ResourceMultiBufferDataProvider::Start() { DVLOG(1) << __func__ << " @ " << byte_pos(); if (url_data_->length() > 0 && byte_pos() >= url_data_->length()) { - base::ThreadTaskRunnerHandle::Get()->PostTask( + task_runner_->PostTask( FROM_HERE, base::BindOnce(&ResourceMultiBufferDataProvider::Terminate, weak_factory_.GetWeakPtr())); return; @@ -444,7 +445,7 @@ if (retries_ < kMaxRetries) { DVLOG(1) << " Partial data received.... @ pos = " << size; retries_++; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, base::BindOnce(&ResourceMultiBufferDataProvider::Start, weak_factory_.GetWeakPtr()), @@ -476,7 +477,7 @@ if (retries_ < kMaxRetries && pos_ != 0) { retries_++; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, base::BindOnce(&ResourceMultiBufferDataProvider::Start, weak_factory_.GetWeakPtr()),
diff --git a/media/blink/resource_multibuffer_data_provider.h b/media/blink/resource_multibuffer_data_provider.h index 7e9271f..fdeb1210 100644 --- a/media/blink/resource_multibuffer_data_provider.h +++ b/media/blink/resource_multibuffer_data_provider.h
@@ -11,6 +11,7 @@ #include <string> #include "base/callback.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "media/blink/media_blink_export.h" #include "media/blink/multibuffer.h" @@ -20,6 +21,10 @@ #include "third_party/blink/public/web/web_frame.h" #include "url/gurl.h" +namespace base { +class SingleThreadTaskRunner; +} + namespace blink { class WebAssociatedURLLoader; } // namespace blink @@ -33,9 +38,11 @@ // NUmber of times we'll retry if the connection fails. enum { kMaxRetries = 30 }; - ResourceMultiBufferDataProvider(UrlData* url_data, - MultiBufferBlockId pos, - bool is_client_audio_element); + ResourceMultiBufferDataProvider( + UrlData* url_data, + MultiBufferBlockId pos, + bool is_client_audio_element, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~ResourceMultiBufferDataProvider() override; // Virtual for testing purposes. @@ -123,6 +130,8 @@ // Is the client an audio element? bool is_client_audio_element_ = false; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + base::WeakPtrFactory<ResourceMultiBufferDataProvider> weak_factory_{this}; };
diff --git a/media/blink/resource_multibuffer_data_provider_unittest.cc b/media/blink/resource_multibuffer_data_provider_unittest.cc index 56df066b..5187992 100644 --- a/media/blink/resource_multibuffer_data_provider_unittest.cc +++ b/media/blink/resource_multibuffer_data_provider_unittest.cc
@@ -12,10 +12,14 @@ #include "base/bind.h" #include "base/format_macros.h" #include "base/macros.h" +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/single_thread_task_runner.h" #include "base/strings/stringprintf.h" +#include "base/test/task_environment.h" #include "media/base/media_log.h" #include "media/base/seekable_buffer.h" +#include "media/blink/blink_platform_with_task_environment.h" #include "media/blink/mock_resource_fetch_context.h" #include "media/blink/mock_webassociatedurlloader.h" #include "media/blink/url_index.h" @@ -76,8 +80,7 @@ class ResourceMultiBufferDataProviderTest : public testing::Test { public: - ResourceMultiBufferDataProviderTest() - : url_index_(std::make_unique<UrlIndex>(&fetch_context_, 0)) { + ResourceMultiBufferDataProviderTest() { for (int i = 0; i < kDataSize; ++i) { data_[i] = i; } @@ -89,8 +92,8 @@ void Initialize(const char* url, int first_position) { want_frfr = false; gurl_ = GURL(url); - url_data_ = url_index_->GetByUrl(gurl_, UrlData::CORS_UNSPECIFIED, - UrlIndex::kNormal); + url_data_ = url_index_.GetByUrl(gurl_, UrlData::CORS_UNSPECIFIED, + UrlIndex::kNormal); url_data_->set_etag(kEtag); DCHECK(url_data_); url_data_->OnRedirect( @@ -102,7 +105,9 @@ std::unique_ptr<ResourceMultiBufferDataProvider> loader( new ResourceMultiBufferDataProvider( url_data_.get(), first_position_, - false /* is_client_audio_element */)); + false /* is_client_audio_element */, + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment() + ->GetMainThreadTaskRunner())); loader_ = loader.get(); url_data_->multibuffer()->AddProvider(std::move(loader)); } @@ -222,7 +227,9 @@ int64_t first_position_; NiceMock<MockResourceFetchContext> fetch_context_; - std::unique_ptr<UrlIndex> url_index_; + UrlIndex url_index_{&fetch_context_, 0, + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment() + ->GetMainThreadTaskRunner()}; scoped_refptr<UrlData> url_data_; scoped_refptr<UrlData> redirected_to_; // The loader is owned by the UrlData above.
diff --git a/media/blink/url_index.cc b/media/blink/url_index.cc index af704d1..f4e6616 100644 --- a/media/blink/url_index.cc +++ b/media/blink/url_index.cc
@@ -11,7 +11,6 @@ #include "base/feature_list.h" #include "base/location.h" #include "base/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "media/base/media_switches.h" #include "media/blink/resource_multibuffer_data_provider.h" @@ -21,9 +20,13 @@ const int kBlockSizeShift = 15; // 1<<15 == 32kb const int kUrlMappingTimeoutSeconds = 300; -ResourceMultiBuffer::ResourceMultiBuffer(UrlData* url_data, int block_shift) +ResourceMultiBuffer::ResourceMultiBuffer( + UrlData* url_data, + int block_shift, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : MultiBuffer(block_shift, url_data->url_index_->lru_), - url_data_(url_data) {} + url_data_(url_data), + task_runner_(std::move(task_runner)) {} ResourceMultiBuffer::~ResourceMultiBuffer() = default; @@ -31,7 +34,7 @@ const MultiBufferBlockId& pos, bool is_client_audio_element) { auto writer = std::make_unique<ResourceMultiBufferDataProvider>( - url_data_, pos, is_client_audio_element); + url_data_, pos, is_client_audio_element, task_runner_); writer->Start(); return writer; } @@ -44,7 +47,10 @@ url_data_->OnEmpty(); } -UrlData::UrlData(const GURL& url, CorsMode cors_mode, UrlIndex* url_index) +UrlData::UrlData(const GURL& url, + CorsMode cors_mode, + UrlIndex* url_index, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : url_(url), have_data_origin_(false), cors_mode_(cors_mode), @@ -53,8 +59,7 @@ length_(kPositionNotSpecified), range_supported_(false), cacheable_(false), - last_used_(), - multibuffer_(this, url_index_->block_shift_) {} + multibuffer_(this, url_index_->block_shift_, std::move(task_runner)) {} UrlData::~UrlData() = default; @@ -210,16 +215,20 @@ return multibuffer()->map().size(); } -UrlIndex::UrlIndex(ResourceFetchContext* fetch_context) - : UrlIndex(fetch_context, kBlockSizeShift) {} +UrlIndex::UrlIndex(ResourceFetchContext* fetch_context, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : UrlIndex(fetch_context, kBlockSizeShift, std::move(task_runner)) {} -UrlIndex::UrlIndex(ResourceFetchContext* fetch_context, int block_shift) +UrlIndex::UrlIndex(ResourceFetchContext* fetch_context, + int block_shift, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) : fetch_context_(fetch_context), - lru_(new MultiBuffer::GlobalLRU(base::ThreadTaskRunnerHandle::Get())), + lru_(new MultiBuffer::GlobalLRU(task_runner)), block_shift_(block_shift), memory_pressure_listener_(FROM_HERE, base::BindRepeating(&UrlIndex::OnMemoryPressure, - base::Unretained(this))) {} + base::Unretained(this))), + task_runner_(std::move(task_runner)) {} UrlIndex::~UrlIndex() { #if DCHECK_IS_ON() @@ -254,7 +263,7 @@ scoped_refptr<UrlData> UrlIndex::NewUrlData(const GURL& url, UrlData::CorsMode cors_mode) { - return new UrlData(url, cors_mode, this); + return new UrlData(url, cors_mode, this, task_runner_); } void UrlIndex::OnMemoryPressure(
diff --git a/media/blink/url_index.h b/media/blink/url_index.h index 88c595fc93..54da414 100644 --- a/media/blink/url_index.h +++ b/media/blink/url_index.h
@@ -14,12 +14,17 @@ #include "base/macros.h" #include "base/memory/memory_pressure_listener.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "media/blink/media_blink_export.h" #include "media/blink/multibuffer.h" #include "url/gurl.h" +namespace base { +class SingleThreadTaskRunner; +} + namespace media { const int64_t kPositionNotSpecified = -1; @@ -33,7 +38,9 @@ // into the cache. class MEDIA_BLINK_EXPORT ResourceMultiBuffer : public MultiBuffer { public: - ResourceMultiBuffer(UrlData* url_data_, int block_shift); + ResourceMultiBuffer(UrlData* url_data_, + int block_shift, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); ~ResourceMultiBuffer() override; // MultiBuffer implementation. @@ -47,6 +54,7 @@ // Do not access from destructor, it is a pointer to the // object that contains us. UrlData* url_data_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; class UrlIndex; @@ -151,7 +159,10 @@ int64_t BytesReadFromCache() const { return bytes_read_from_cache_; } protected: - UrlData(const GURL& url, CorsMode cors_mode, UrlIndex* url_index); + UrlData(const GURL& url, + CorsMode cors_mode, + UrlIndex* url_index, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); virtual ~UrlData(); private: @@ -222,8 +233,11 @@ // The UrlIndex lets you look up UrlData instances by url. class MEDIA_BLINK_EXPORT UrlIndex { public: - explicit UrlIndex(ResourceFetchContext* fetch_context); - UrlIndex(ResourceFetchContext* fetch_context, int block_shift); + UrlIndex(ResourceFetchContext* fetch_context, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + UrlIndex(ResourceFetchContext* fetch_context, + int block_shift, + scoped_refptr<base::SingleThreadTaskRunner> task_runner); virtual ~UrlIndex(); enum CacheMode { kNormal, kCacheDisabled }; @@ -288,6 +302,7 @@ std::deque<scoped_refptr<UrlData>> loading_queue_; base::MemoryPressureListener memory_pressure_listener_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; } // namespace media
diff --git a/media/blink/url_index_unittest.cc b/media/blink/url_index_unittest.cc index 3933710..c7125f4 100644 --- a/media/blink/url_index_unittest.cc +++ b/media/blink/url_index_unittest.cc
@@ -7,9 +7,13 @@ #include <list> #include <string> +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" +#include "base/test/task_environment.h" #include "media/base/media_switches.h" +#include "media/blink/blink_platform_with_task_environment.h" #include "media/blink/url_index.h" #include "testing/gtest/include/gtest/gtest.h" @@ -17,7 +21,7 @@ class UrlIndexTest : public testing::Test { public: - UrlIndexTest() : url_index_(nullptr) {} + UrlIndexTest() = default; scoped_refptr<UrlData> GetByUrl(const GURL& gurl, UrlData::CorsMode cors_mode) { @@ -28,7 +32,10 @@ return ret; } - UrlIndex url_index_; + protected: + UrlIndex url_index_{nullptr, + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment() + ->GetMainThreadTaskRunner()}; }; TEST_F(UrlIndexTest, SimpleTest) {
diff --git a/media/blink/video_decode_stats_reporter_unittest.cc b/media/blink/video_decode_stats_reporter_unittest.cc index 4661354b..e322227f 100644 --- a/media/blink/video_decode_stats_reporter_unittest.cc +++ b/media/blink/video_decode_stats_reporter_unittest.cc
@@ -7,15 +7,15 @@ #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/single_thread_task_runner.h" -#include "base/task/current_thread.h" -#include "base/test/test_mock_time_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" +#include "base/test/task_environment.h" #include "base/time/time.h" #include "media/base/cdm_config.h" #include "media/base/media_util.h" #include "media/base/video_codecs.h" #include "media/base/video_types.h" +#include "media/blink/blink_platform_with_task_environment.h" #include "media/blink/video_decode_stats_reporter.h" #include "media/capabilities/bucket_utility.h" #include "media/mojo/mojom/media_types.mojom.h" @@ -108,12 +108,6 @@ ~VideoDecodeStatsReporterTest() override = default; void SetUp() override { - // Do this first. Lots of pieces depend on the task runner. - auto message_loop = base::CurrentThread::Get(); - original_task_runner_ = base::ThreadTaskRunnerHandle::Get(); - task_runner_ = new base::TestMockTimeTaskRunner(); - message_loop.SetTaskRunner(task_runner_); - // Make reporter with default configuration. Connects RecordInterceptor as // remote mojo VideoDecodeStatsRecorder. MakeReporter(); @@ -130,8 +124,7 @@ reporter_.reset(); // Run task runner to have Mojo cleanup interceptor_. - task_runner_->RunUntilIdle(); - base::CurrentThread::Get().SetTaskRunner(original_task_runner_); + task_environment_->RunUntilIdle(); } PipelineStatistics MakeAdvancingDecodeStats() { @@ -191,13 +184,14 @@ SetupRecordInterceptor(&interceptor_), base::BindRepeating(&VideoDecodeStatsReporterTest::GetPipelineStatsCB, base::Unretained(this)), - profile, natural_size, key_system, cdm_config, task_runner_, - task_runner_->GetMockTickClock()); + profile, natural_size, key_system, cdm_config, + task_environment_->GetMainThreadTaskRunner(), + task_environment_->GetMockTickClock()); } // Fast forward the task runner (and associated tick clock) by |milliseconds|. void FastForward(base::TimeDelta delta) { - task_runner_->FastForwardBy(delta); + task_environment_->FastForwardBy(delta); } bool ShouldBeReporting() const { return reporter_->ShouldBeReporting(); } @@ -351,6 +345,9 @@ // expectations and return behavior. MOCK_METHOD0(GetPipelineStatsCB, PipelineStatistics()); + base::test::TaskEnvironment* task_environment_ = + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment(); + // These track the last values returned by MakeAdvancingDecodeStats(). See // SetUp() for initialization. uint32_t pipeline_decoded_frames_; @@ -361,12 +358,6 @@ // Placed as a class member to avoid static initialization costs. const gfx::Size kDefaultSize_; - // Task runner that allows for manual advancing of time. Instantiated during - // Setup(). |original_task_runner_| is a copy of the TaskRunner in place prior - // to the start of this test. It's restored after the test completes. - scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; - scoped_refptr<base::SingleThreadTaskRunner> original_task_runner_; - // Points to the interceptor that acts as a VideoDecodeStatsRecorder. The // object is owned by mojo::Remote<VideoDecodeStatsRecorder>, which is itself // owned by |reporter_|.
diff --git a/media/blink/video_frame_compositor_unittest.cc b/media/blink/video_frame_compositor_unittest.cc index e1491b2..b426f11c 100644 --- a/media/blink/video_frame_compositor_unittest.cc +++ b/media/blink/video_frame_compositor_unittest.cc
@@ -5,14 +5,17 @@ #include "media/blink/video_frame_compositor.h" #include "base/bind.h" #include "base/macros.h" +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/single_thread_task_runner.h" #include "base/synchronization/waitable_event.h" #include "base/test/gmock_callback_support.h" #include "base/test/simple_test_tick_clock.h" -#include "base/threading/thread_task_runner_handle.h" +#include "base/test/task_environment.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" #include "components/viz/common/surfaces/frame_sink_id.h" #include "media/base/video_frame.h" +#include "media/blink/blink_platform_with_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/web_video_frame_submitter.h" @@ -61,8 +64,8 @@ submitter_ = client_.get(); EXPECT_CALL(*submitter_, Initialize(_, _)); - compositor_ = std::make_unique<VideoFrameCompositor>( - base::ThreadTaskRunnerHandle::Get(), std::move(client_)); + compositor_ = std::make_unique<VideoFrameCompositor>(task_runner_, + std::move(client_)); base::RunLoop().RunUntilIdle(); EXPECT_CALL(*submitter_, SetRotation(Eq(media::VideoRotation::VIDEO_ROTATION_90))); @@ -139,6 +142,9 @@ StrictMock<MockWebVideoFrameSubmitter>* submitter_; std::unique_ptr<StrictMock<MockWebVideoFrameSubmitter>> client_; std::unique_ptr<VideoFrameCompositor> compositor_; + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_ = + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment() + ->GetMainThreadTaskRunner(); private: DISALLOW_COPY_AND_ASSIGN(VideoFrameCompositorTest); @@ -155,8 +161,7 @@ base::RunLoop run_loop; EXPECT_CALL(*submitter_, SetIsSurfaceVisible(true)); cb.Run(true, nullptr); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - run_loop.QuitClosure()); + task_runner_->PostTask(FROM_HERE, run_loop.QuitClosure()); run_loop.Run(); } @@ -164,8 +169,7 @@ base::RunLoop run_loop; EXPECT_CALL(*submitter_, SetIsSurfaceVisible(false)); cb.Run(false, nullptr); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - run_loop.QuitClosure()); + task_runner_->PostTask(FROM_HERE, run_loop.QuitClosure()); run_loop.Run(); } @@ -174,8 +178,7 @@ base::WaitableEvent true_event; EXPECT_CALL(*submitter_, SetIsSurfaceVisible(true)); cb.Run(true, &true_event); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - run_loop.QuitClosure()); + task_runner_->PostTask(FROM_HERE, run_loop.QuitClosure()); run_loop.Run(); EXPECT_TRUE(true_event.IsSignaled()); } @@ -186,8 +189,7 @@ EXPECT_CALL(*submitter_, SetIsSurfaceVisible(false)); cb.Run(false, &false_event); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, - run_loop.QuitClosure()); + task_runner_->PostTask(FROM_HERE, run_loop.QuitClosure()); run_loop.Run(); EXPECT_TRUE(false_event.IsSignaled()); }
diff --git a/media/blink/watch_time_reporter_unittest.cc b/media/blink/watch_time_reporter_unittest.cc index 5ebbaf60..7111207 100644 --- a/media/blink/watch_time_reporter_unittest.cc +++ b/media/blink/watch_time_reporter_unittest.cc
@@ -6,15 +6,15 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" -#include "base/task/current_thread.h" -#include "base/test/test_mock_time_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" +#include "base/test/task_environment.h" #include "base/time/time.h" #include "media/base/mock_media_log.h" #include "media/base/pipeline_status.h" #include "media/base/watch_time_keys.h" +#include "media/blink/blink_platform_with_task_environment.h" #include "media/mojo/mojom/media_metrics_provider.mojom.h" #include "media/mojo/mojom/watch_time_recorder.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -290,18 +290,10 @@ WatchTimeReporterTest() : has_video_(std::get<0>(GetParam())), has_audio_(std::get<1>(GetParam())), - fake_metrics_provider_(this) { - // Do this first. Lots of pieces depend on the task runner. - auto message_loop = base::CurrentThread::Get(); - original_task_runner_ = base::ThreadTaskRunnerHandle::Get(); - task_runner_ = new base::TestMockTimeTaskRunner(); - message_loop.SetTaskRunner(task_runner_); - } + fake_metrics_provider_(this) {} ~WatchTimeReporterTest() override { CycleReportingTimer(); - task_runner_->RunUntilIdle(); - base::CurrentThread::Get().SetTaskRunner(original_task_runner_); } protected: @@ -322,7 +314,7 @@ base::Unretained(this)), &fake_metrics_provider_, blink::scheduler::GetSequencedTaskRunnerForTesting(), - task_runner_->GetMockTickClock()); + task_environment_->GetMockTickClock()); reporting_interval_ = wtr_->reporting_interval_; // Most tests don't care about this. @@ -333,7 +325,7 @@ } void CycleReportingTimer() { - task_runner_->FastForwardBy(reporting_interval_); + task_environment_->FastForwardBy(reporting_interval_); } bool IsMonitoring() const { return wtr_->reporting_timer_.IsRunning(); } @@ -638,15 +630,11 @@ MOCK_METHOD2(OnUpdateVideoDecodeStats, void(uint32_t, uint32_t)); MOCK_METHOD1(OnCurrentTimestampChanged, void(base::TimeDelta)); + base::test::TaskEnvironment* task_environment_ = + BlinkPlatformWithTaskEnvironment::GetTaskEnvironment(); const bool has_video_; const bool has_audio_; - // Task runner that allows for manual advancing of time. Instantiated during - // construction. |original_task_runner_| is a copy of the TaskRunner in place - // prior to the start of this test. It's restored after the test completes. - scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; - scoped_refptr<base::SingleThreadTaskRunner> original_task_runner_; - FakeMediaMetricsProvider fake_metrics_provider_; std::unique_ptr<blink::WatchTimeReporter> wtr_; base::TimeDelta reporting_interval_;
diff --git a/media/blink/webcontentdecryptionmoduleaccess_impl.cc b/media/blink/webcontentdecryptionmoduleaccess_impl.cc index 1d822ef..a7450d1 100644 --- a/media/blink/webcontentdecryptionmoduleaccess_impl.cc +++ b/media/blink/webcontentdecryptionmoduleaccess_impl.cc
@@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/location.h" #include "base/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" #include "media/blink/webencryptedmediaclient_impl.h" namespace media {
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 96fbcd9..9ba69c4 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -27,7 +27,6 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/task_runner_util.h" -#include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h"
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 4dc4a84..2147c7e 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -12,8 +12,10 @@ #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" +#include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -24,7 +26,6 @@ #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "base/threading/thread.h" -#include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_manager.h" #include "build/build_config.h" #include "cc/layers/layer.h" @@ -424,12 +425,13 @@ audio_sink_ = base::WrapRefCounted(new NiceMock<MockAudioRendererSink>()); - url_index_ = std::make_unique<UrlIndex>(&mock_resource_fetch_context_); + url_index_ = std::make_unique<UrlIndex>(&mock_resource_fetch_context_, + media_thread_.task_runner()); auto params = std::make_unique<WebMediaPlayerParams>( std::move(media_log), WebMediaPlayerParams::DeferLoadCB(), audio_sink_, - media_thread_.task_runner(), base::ThreadTaskRunnerHandle::Get(), - base::ThreadTaskRunnerHandle::Get(), media_thread_.task_runner(), + media_thread_.task_runner(), media_thread_.task_runner(), + media_thread_.task_runner(), media_thread_.task_runner(), base::BindRepeating(&WebMediaPlayerImplTest::OnAdjustAllocatedMemory, base::Unretained(this)), nullptr, RequestRoutingTokenCallback(), nullptr, false, false,
diff --git a/media/fuchsia/audio/fuchsia_audio_capturer_source.cc b/media/fuchsia/audio/fuchsia_audio_capturer_source.cc index 259d6b1..01a0f97f 100644 --- a/media/fuchsia/audio/fuchsia_audio_capturer_source.cc +++ b/media/fuchsia/audio/fuchsia_audio_capturer_source.cc
@@ -172,7 +172,7 @@ void FuchsiaAudioCapturerSource::NotifyCaptureError( const std::string& message) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - callback_->OnCaptureError(message); + callback_->OnCaptureError(AudioCapturerSource::ErrorCode::kUnknown, message); } void FuchsiaAudioCapturerSource::NotifyCaptureStarted() {
diff --git a/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc b/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc index 2d5a9f9..3d9a04c 100644 --- a/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc +++ b/media/fuchsia/audio/fuchsia_audio_capturer_source_test.cc
@@ -156,7 +156,8 @@ packets_.push_back(std::move(bus)); } - void OnCaptureError(const std::string& message) final { + void OnCaptureError(AudioCapturerSource::ErrorCode code, + const std::string& message) final { EXPECT_FALSE(have_error_); have_error_ = true; }
diff --git a/media/gpu/vaapi/vaapi_unittest.cc b/media/gpu/vaapi/vaapi_unittest.cc index 79f4eec..3e53a8a 100644 --- a/media/gpu/vaapi/vaapi_unittest.cc +++ b/media/gpu/vaapi/vaapi_unittest.cc
@@ -113,6 +113,21 @@ /*disabled_features=*/{}); return scoped_feature_list; } + +unsigned int ToVaRTFormat(uint32_t va_fourcc) { + switch (va_fourcc) { + case VA_FOURCC_I420: + return VA_RT_FORMAT_YUV420; + case VA_FOURCC_YUY2: + return VA_RT_FORMAT_YUV422; + case VA_FOURCC_RGBA: + return VA_RT_FORMAT_RGB32; + case VA_FOURCC_P010: + return VA_RT_FORMAT_YUV420_10; + } + return kInvalidVaRtFormat; +} + } // namespace class VaapiTest : public testing::Test { @@ -353,6 +368,91 @@ } } } + +class VaapiVppTest + : public VaapiTest, + public testing::WithParamInterface<std::tuple<uint32_t, uint32_t>> { + public: + VaapiVppTest() = default; + ~VaapiVppTest() override = default; + + // Populate meaningful test suffixes instead of /0, /1, etc. + struct PrintToStringParamName { + template <class ParamType> + std::string operator()( + const testing::TestParamInfo<ParamType>& info) const { + std::stringstream ss; + ss << FourccToString(std::get<0>(info.param)) << "_to_" + << FourccToString(std::get<1>(info.param)); + return ss.str(); + } + }; +}; + +TEST_P(VaapiVppTest, BlitWithVAAllocatedSurfaces) { + const uint32_t va_fourcc_in = std::get<0>(GetParam()); + const uint32_t va_fourcc_out = std::get<1>(GetParam()); + + // TODO(b/187852384): enable the other two backends. + if (VaapiWrapper::GetImplementationType() != VAImplementation::kIntelIHD) + GTEST_SKIP() << "backend not supported"; + + if (!VaapiWrapper::IsVppFormatSupported(va_fourcc_in) || + !VaapiWrapper::IsVppFormatSupported(va_fourcc_out)) { + GTEST_SKIP() << FourccToString(va_fourcc_in) << " -> " + << FourccToString(va_fourcc_out) << " not supported"; + } + constexpr gfx::Size kInputSize(640, 320); + constexpr gfx::Size kOutputSize(320, 180); + ASSERT_TRUE(VaapiWrapper::IsVppResolutionAllowed(kInputSize)); + ASSERT_TRUE(VaapiWrapper::IsVppResolutionAllowed(kOutputSize)); + + auto wrapper = + VaapiWrapper::Create(VaapiWrapper::kVideoProcess, VAProfileNone, + EncryptionScheme::kUnencrypted, base::DoNothing()); + ASSERT_TRUE(!!wrapper); + // Size is unnecessary for a VPP context. + ASSERT_TRUE(wrapper->CreateContext(gfx::Size())); + + const unsigned int va_rt_format_in = ToVaRTFormat(va_fourcc_in); + ASSERT_NE(va_rt_format_in, kInvalidVaRtFormat); + const unsigned int va_rt_format_out = ToVaRTFormat(va_fourcc_out); + ASSERT_NE(va_rt_format_out, kInvalidVaRtFormat); + + std::unique_ptr<ScopedVASurface> scoped_surface_in = + wrapper->CreateScopedVASurface(va_rt_format_in, kInputSize); + ASSERT_TRUE(!!scoped_surface_in); + + std::unique_ptr<ScopedVASurface> scoped_surface_out = + wrapper->CreateScopedVASurface(va_rt_format_out, kOutputSize); + ASSERT_TRUE(!!scoped_surface_out); + + scoped_refptr<VASurface> surface_in = base::MakeRefCounted<VASurface>( + scoped_surface_in->id(), kInputSize, va_rt_format_in, base::DoNothing()); + scoped_refptr<VASurface> surface_out = + base::MakeRefCounted<VASurface>(scoped_surface_out->id(), kOutputSize, + va_rt_format_out, base::DoNothing()); + + ASSERT_TRUE(wrapper->BlitSurface(*surface_in, *surface_out, + gfx::Rect(kInputSize), + gfx::Rect(kOutputSize), VIDEO_ROTATION_0)); + ASSERT_TRUE(wrapper->SyncSurface(scoped_surface_out->id())); + wrapper->DestroyContext(); +} + +// TODO(b/187852384): Consider adding more VaapiVppTest cases, e.g. crops. + +// Note: vaCreateSurfaces() uses the RT version of the Four CC, so we don't need +// to consider swizzlings, since they'll end up mapped to the same RT format. +constexpr uint32_t kVAFourCCs[] = {VA_FOURCC_I420, VA_FOURCC_YUY2, + VA_FOURCC_RGBA, VA_FOURCC_P010}; + +INSTANTIATE_TEST_SUITE_P(, + VaapiVppTest, + ::testing::Combine(::testing::ValuesIn(kVAFourCCs), + ::testing::ValuesIn(kVAFourCCs)), + VaapiVppTest::PrintToStringParamName()); + } // namespace media int main(int argc, char** argv) {
diff --git a/media/mojo/common/BUILD.gn b/media/mojo/common/BUILD.gn index 1689347..a570c550 100644 --- a/media/mojo/common/BUILD.gn +++ b/media/mojo/common/BUILD.gn
@@ -6,6 +6,8 @@ sources = [ "audio_data_s16_converter.cc", "audio_data_s16_converter.h", + "input_error_code_converter.cc", + "input_error_code_converter.h", "media_type_converters.cc", "media_type_converters.h", "mojo_data_pipe_read_write.cc",
diff --git a/media/mojo/common/input_error_code_converter.cc b/media/mojo/common/input_error_code_converter.cc new file mode 100644 index 0000000..3829bb7 --- /dev/null +++ b/media/mojo/common/input_error_code_converter.cc
@@ -0,0 +1,18 @@ +// Copyright 2021 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 "media/mojo/common/input_error_code_converter.h" + +namespace media { +AudioCapturerSource::ErrorCode ConvertToCaptureCallbackCode( + mojom::InputStreamErrorCode code) { + switch (code) { + case mojom::InputStreamErrorCode::kSystemPermissions: + return AudioCapturerSource::ErrorCode::kSystemPermissions; + case mojom::InputStreamErrorCode::kUnknown: + break; + } + return AudioCapturerSource::ErrorCode::kUnknown; +} +} // namespace media
diff --git a/media/mojo/common/input_error_code_converter.h b/media/mojo/common/input_error_code_converter.h new file mode 100644 index 0000000..99a1f0b --- /dev/null +++ b/media/mojo/common/input_error_code_converter.h
@@ -0,0 +1,16 @@ +// Copyright 2021 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 MEDIA_MOJO_COMMON_INPUT_ERROR_CODE_CONVERTER_H_ +#define MEDIA_MOJO_COMMON_INPUT_ERROR_CODE_CONVERTER_H_ + +#include "media/base/audio_capturer_source.h" +#include "media/mojo/mojom/media_types.mojom.h" + +namespace media { +AudioCapturerSource::ErrorCode ConvertToCaptureCallbackCode( + mojom::InputStreamErrorCode code); +} + +#endif
diff --git a/media/mojo/mojom/speech_recognition_service.mojom b/media/mojo/mojom/speech_recognition_service.mojom index 55cf313f..d5ba43b0 100644 --- a/media/mojo/mojom/speech_recognition_service.mojom +++ b/media/mojo/mojom/speech_recognition_service.mojom
@@ -180,4 +180,7 @@ // In the case of web fallback (not for launch, used for development only), // this option will be ignored. SpeechRecognitionMode recognition_mode; + + // Whether to enable formatting and punctuation in the recognition results. + bool enable_formatting; };
diff --git a/media/remoting/BUILD.gn b/media/remoting/BUILD.gn index 7421c701..780b8d3 100644 --- a/media/remoting/BUILD.gn +++ b/media/remoting/BUILD.gn
@@ -111,7 +111,7 @@ "//url", ] - if (!is_android) { + if (enable_media_remoting_rpc) { sources += [ "courier_renderer_unittest.cc", "demuxer_stream_adapter_unittest.cc",
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl index 62e0aecd..8f9fad74 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl
@@ -44,7 +44,6 @@ {%- if not contains_only_enums %} #include "base/compiler_specific.h" -#include "base/containers/flat_map.h" #include "mojo/public/cpp/bindings/array_data_view.h" #include "mojo/public/cpp/bindings/enum_traits.h" #include "mojo/public/cpp/bindings/interface_data_view.h"
diff --git a/net/cert/cert_and_ct_verifier.h b/net/cert/cert_and_ct_verifier.h index b64502e..cfcefaa1 100644 --- a/net/cert/cert_and_ct_verifier.h +++ b/net/cert/cert_and_ct_verifier.h
@@ -45,6 +45,8 @@ const NetLogWithSource& net_log, int result); + // TODO(crbug.com/1211074): Expose CT log list as part of + // CertVerifier::Config. std::unique_ptr<CertVerifier> cert_verifier_; std::unique_ptr<CTVerifier> ct_verifier_; };
diff --git a/net/cert/multi_log_ct_verifier.cc b/net/cert/multi_log_ct_verifier.cc index dfd44a4e..bd503cf 100644 --- a/net/cert/multi_log_ct_verifier.cc +++ b/net/cert/multi_log_ct_verifier.cc
@@ -6,6 +6,8 @@ #include <vector> +#include "base/bind.h" +#include "base/callback.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/values.h" @@ -52,15 +54,37 @@ } // namespace -MultiLogCTVerifier::MultiLogCTVerifier() {} +base::CallbackListSubscription +MultiLogCTVerifier::CTLogProvider::RegisterLogsListCallback( + LogListCallbackList::CallbackType callback) { + return callback_list_.Add(std::move(callback)); +} + +void MultiLogCTVerifier::CTLogProvider::NotifyCallbacks( + const std::vector<scoped_refptr<const net::CTLogVerifier>>& log_verifiers) { + callback_list_.Notify(log_verifiers); +} + +MultiLogCTVerifier::CTLogProvider::CTLogProvider() = default; +MultiLogCTVerifier::CTLogProvider::~CTLogProvider() = default; + +MultiLogCTVerifier::MultiLogCTVerifier(CTLogProvider* notifier) { + // base::Unretained is safe since we are using a CallbackListSubscription that + // won't outlive |this|. + log_provider_subscription_ = + notifier->RegisterLogsListCallback(base::BindRepeating( + &MultiLogCTVerifier::SetLogs, base::Unretained(this))); +} MultiLogCTVerifier::~MultiLogCTVerifier() = default; -void MultiLogCTVerifier::AddLogs( +void MultiLogCTVerifier::SetLogs( const std::vector<scoped_refptr<const CTLogVerifier>>& log_verifiers) { + logs_.clear(); for (const auto& log_verifier : log_verifiers) { VLOG(1) << "Adding CT log: " << log_verifier->description(); - logs_[log_verifier->key_id()] = log_verifier; + std::string key_id = log_verifier->key_id(); + logs_[key_id] = log_verifier; } }
diff --git a/net/cert/multi_log_ct_verifier.h b/net/cert/multi_log_ct_verifier.h index 0d603eb..3d48182 100644 --- a/net/cert/multi_log_ct_verifier.h +++ b/net/cert/multi_log_ct_verifier.h
@@ -8,8 +8,11 @@ #include <map> #include <string> +#include "base/callback_forward.h" +#include "base/callback_list.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" #include "net/base/net_export.h" #include "net/cert/ct_verifier.h" @@ -28,10 +31,30 @@ // It must be initialized with a list of logs by calling AddLogs. class NET_EXPORT MultiLogCTVerifier : public CTVerifier { public: - MultiLogCTVerifier(); + class NET_EXPORT CTLogProvider { + public: + using LogListCallbackList = base::RepeatingCallbackList<void( + const std::vector<scoped_refptr<const CTLogVerifier>>& log_verifiers)>; + + base::CallbackListSubscription RegisterLogsListCallback( + LogListCallbackList::CallbackType callback); + + protected: + CTLogProvider(); + ~CTLogProvider(); + + void NotifyCallbacks( + const std::vector<scoped_refptr<const net::CTLogVerifier>>& + log_verifiers); + + private: + LogListCallbackList callback_list_; + }; + + explicit MultiLogCTVerifier(CTLogProvider* notifier); ~MultiLogCTVerifier() override; - void AddLogs( + void SetLogs( const std::vector<scoped_refptr<const CTLogVerifier>>& log_verifiers); // CTVerifier implementation: @@ -65,6 +88,8 @@ // of RFC6962. std::map<std::string, scoped_refptr<const CTLogVerifier>> logs_; + base::CallbackListSubscription log_provider_subscription_; + DISALLOW_COPY_AND_ASSIGN(MultiLogCTVerifier); };
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc index 006908b..f256e3a 100644 --- a/net/cert/multi_log_ct_verifier_unittest.cc +++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -41,6 +41,12 @@ const char kHostname[] = "example.com"; const char kLogDescription[] = "somelog"; +class DoNothingLogProvider : public MultiLogCTVerifier::CTLogProvider { + public: + DoNothingLogProvider() = default; + ~DoNothingLogProvider() = default; +}; + class MultiLogCTVerifierTest : public ::testing::Test { public: void SetUp() override { @@ -49,8 +55,9 @@ ASSERT_TRUE(log); log_verifiers_.push_back(log); - verifier_ = std::make_unique<MultiLogCTVerifier>(); - verifier_->AddLogs(log_verifiers_); + DoNothingLogProvider notifier; + verifier_ = std::make_unique<MultiLogCTVerifier>(¬ifier); + verifier_->SetLogs(log_verifiers_); std::string der_test_cert(ct::GetDerEncodedX509Cert()); chain_ = X509Certificate::CreateFromBytes( der_test_cert.data(), @@ -241,6 +248,29 @@ EXPECT_EQ(old_embedded_count + 1, NumEmbeddedSCTsInHistogram()); } +TEST_F(MultiLogCTVerifierTest, SetLogsRemovesOldLogs) { + log_verifiers_.clear(); + verifier_->SetLogs(log_verifiers_); + // Log list is now empty so verification should fail. + ASSERT_FALSE(CheckPrecertificateVerification(embedded_sct_chain_)); +} + +TEST_F(MultiLogCTVerifierTest, SetLogsAddsNewLogs) { + // Clear the log list. + log_verifiers_.clear(); + verifier_->SetLogs(log_verifiers_); + + // Add valid log again via SetLogs + scoped_refptr<const CTLogVerifier> log( + CTLogVerifier::Create(ct::GetTestPublicKey(), kLogDescription)); + ASSERT_TRUE(log); + log_verifiers_.push_back(log); + verifier_->SetLogs(log_verifiers_); + + // Verification should now succeed. + ASSERT_TRUE(CheckPrecertificateVerification(embedded_sct_chain_)); +} + } // namespace } // namespace net
diff --git a/net/quic/crypto/proof_verifier_chromium_test.cc b/net/quic/crypto/proof_verifier_chromium_test.cc index e62a038..9e3a503 100644 --- a/net/quic/crypto/proof_verifier_chromium_test.cc +++ b/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -300,6 +300,12 @@ ASSERT_EQ(quic::QUIC_FAILURE, status); } +class DoNothingLogNotifier : public MultiLogCTVerifier::CTLogProvider { + public: + DoNothingLogNotifier() = default; + ~DoNothingLogNotifier() = default; +}; + // Valid SCT and cert TEST_F(ProofVerifierChromiumTest, ValidSCTList) { // Use different certificates for SCT tests. @@ -322,8 +328,9 @@ CTLogVerifier::Create(ct::GetTestPublicKey(), kLogDescription)); ASSERT_TRUE(log); log_verifiers.push_back(log); - auto ct_verifier = std::make_unique<MultiLogCTVerifier>(); - ct_verifier->AddLogs(log_verifiers); + DoNothingLogNotifier notifier; + auto ct_verifier = std::make_unique<MultiLogCTVerifier>(¬ifier); + ct_verifier->SetLogs(log_verifiers); CertAndCTVerifier cert_verifier(std::move(dummy_verifier), std::move(ct_verifier)); @@ -364,8 +371,9 @@ CTLogVerifier::Create(ct::GetTestPublicKey(), kLogDescription)); ASSERT_TRUE(log); log_verifiers.push_back(log); - auto ct_verifier = std::make_unique<MultiLogCTVerifier>(); - ct_verifier->AddLogs(log_verifiers); + DoNothingLogNotifier notifier; + auto ct_verifier = std::make_unique<MultiLogCTVerifier>(¬ifier); + ct_verifier->SetLogs(log_verifiers); CertAndCTVerifier cert_verifier(std::move(dummy_verifier), std::move(ct_verifier));
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index d3140c0..cced331 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -7674,8 +7674,6 @@ // set if the cookie would have been rejected for other reasons. // Regression test for https://crbug.com/1027318. TEST_F(URLRequestTest, NoCookieInclusionStatusWarningIfWouldBeExcludedAnyway) { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kSameSiteByDefaultCookies); HttpTestServer test_server; ASSERT_TRUE(test_server.Start());
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn index 94c8f6c..6bbc1625 100644 --- a/pdf/BUILD.gn +++ b/pdf/BUILD.gn
@@ -276,6 +276,13 @@ "//ui/base/cursor/mojom:cursor_type", "//ui/gfx", ] + + if (is_linux || is_chromeos) { + sources += [ + "ppapi_migration/pdfium_font_linux.cc", + "ppapi_migration/pdfium_font_linux.h", + ] + } } source_set("out_of_process_instance") {
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index 333ce72..e8f76f7 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -50,6 +50,7 @@ #include "pdf/pdfium/pdfium_unsupported_features.h" #include "pdf/ppapi_migration/bitmap.h" #include "pdf/ppapi_migration/geometry_conversions.h" +#include "pdf/ppapi_migration/pdfium_font_linux.h" #include "pdf/ppapi_migration/url_loader.h" #include "pdf/url_loader_wrapper_impl.h" #include "ppapi/cpp/instance.h" @@ -545,10 +546,8 @@ IFSDK_PAUSE::user = nullptr; IFSDK_PAUSE::NeedToPauseNow = Pause_NeedToPauseNow; -#if defined(OS_LINUX) || defined(OS_CHROMEOS) // PreviewModeClient does not know its pp::Instance. - SetLastInstance(client_->GetPluginInstance()); -#endif + SetLastInstance(); } PDFiumEngine::~PDFiumEngine() { @@ -1003,9 +1002,7 @@ KillFormFocus(); -#if defined(OS_LINUX) || defined(OS_CHROMEOS) - SetLastInstance(client_->GetPluginInstance()); -#endif + SetLastInstance(); return ConvertPdfToBufferDev( print_.PrintPagesAsPdf(page_ranges, page_range_count, print_settings, @@ -3154,9 +3151,7 @@ DCHECK_LT(static_cast<size_t>(progressive_index), progressive_paints_.size()); last_progressive_start_time_ = base::Time::Now(); -#if defined(OS_LINUX) || defined(OS_CHROMEOS) - SetLastInstance(client_->GetPluginInstance()); -#endif + SetLastInstance(); int page_index = progressive_paints_[progressive_index].page_index(); DCHECK(PageIndexInBounds(page_index)); @@ -3643,9 +3638,7 @@ FORM_DoPageAAction(old_page, form(), FPDFPAGE_AACTION_CLOSE); } most_visible_page_ = index; -#if defined(OS_LINUX) || defined(OS_CHROMEOS) - SetLastInstance(client_->GetPluginInstance()); -#endif + SetLastInstance(); if (most_visible_page_ != -1 && called_do_document_action_) { FPDF_PAGE new_page = pages_[most_visible_page_]->GetPage(); FORM_DoPageAAction(new_page, form(), FPDFPAGE_AACTION_OPEN); @@ -4264,6 +4257,12 @@ std::move(send_callback)); } +void PDFiumEngine::SetLastInstance() { +#if defined(OS_LINUX) || defined(OS_CHROMEOS) + SetLastPepperInstance(client_->GetPluginInstance()); +#endif +} + PDFiumEngine::ProgressivePaint::ProgressivePaint(int index, const gfx::Rect& rect) : page_index_(index), rect_(rect) {}
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h index e920717..9bd6064f 100644 --- a/pdf/pdfium/pdfium_engine.h +++ b/pdf/pdfium/pdfium_engine.h
@@ -640,6 +640,10 @@ void UpdateLinkUnderCursor(const std::string& target_url); void SetLinkUnderCursorForAnnotation(FPDF_ANNOTATION annot, int page_index); + // Keeps track of the most recently used plugin instance. + // TODO(crbug.com/702993): Remove when PPAPI is gone. + void SetLastInstance(); + PDFEngine::Client* const client_; // The current document layout.
diff --git a/pdf/pdfium/pdfium_font_linux.cc b/pdf/pdfium/pdfium_font_linux.cc index 2f31779..c9bbebe 100644 --- a/pdf/pdfium/pdfium_font_linux.cc +++ b/pdf/pdfium/pdfium_font_linux.cc
@@ -13,6 +13,7 @@ #include "base/numerics/ranges.h" #include "base/stl_util.h" #include "base/strings/string_util.h" +#include "pdf/ppapi_migration/pdfium_font_linux.h" #include "ppapi/cpp/instance.h" #include "ppapi/cpp/module.h" #include "ppapi/cpp/private/pdf.h" @@ -23,8 +24,6 @@ namespace { -PP_Instance g_last_instance_id; - PP_BrowserFont_Trusted_Weight WeightToBrowserFontTrustedWeight(int weight) { static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_100 == 0, "PP_BrowserFont_Trusted_Weight min"); @@ -161,7 +160,7 @@ } PP_Resource font_resource = pp::PDF::GetFontFileWithFallback( - pp::InstanceHandle(g_last_instance_id), + pp::InstanceHandle(GetLastPepperInstance()), &description.pp_font_description(), static_cast<PP_PrivateFontCharset>(charset)); long res_id = font_resource; @@ -199,9 +198,4 @@ FPDF_SetSystemFontInfo(&g_font_info); } -void SetLastInstance(pp::Instance* last_instance) { - if (last_instance) - g_last_instance_id = last_instance->pp_instance(); -} - } // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_font_linux.h b/pdf/pdfium/pdfium_font_linux.h index 3e5decd..fbbb97d 100644 --- a/pdf/pdfium/pdfium_font_linux.h +++ b/pdf/pdfium/pdfium_font_linux.h
@@ -5,10 +5,6 @@ #ifndef PDF_PDFIUM_PDFIUM_FONT_LINUX_H_ #define PDF_PDFIUM_PDFIUM_FONT_LINUX_H_ -namespace pp { -class Instance; -} - namespace chrome_pdf { // Initializes a Linux-specific font mapper that proxies font requests via @@ -16,10 +12,6 @@ // Linux. void InitializeLinuxFontMapper(); -// Keeps track of the most recently used plugin instance. This is a no-op of -// `last_instance` is null. -void SetLastInstance(pp::Instance* last_instance); - } // namespace chrome_pdf #endif // PDF_PDFIUM_PDFIUM_FONT_LINUX_H_
diff --git a/pdf/ppapi_migration/pdfium_font_linux.cc b/pdf/ppapi_migration/pdfium_font_linux.cc new file mode 100644 index 0000000..d117050 --- /dev/null +++ b/pdf/ppapi_migration/pdfium_font_linux.cc
@@ -0,0 +1,26 @@ +// Copyright 2021 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 "pdf/ppapi_migration/pdfium_font_linux.h" + +#include "ppapi/cpp/instance.h" + +namespace chrome_pdf { + +namespace { + +PP_Instance g_last_instance_id; + +} // namespace + +void SetLastPepperInstance(pp::Instance* last_instance) { + if (last_instance) + g_last_instance_id = last_instance->pp_instance(); +} + +PP_Instance GetLastPepperInstance() { + return g_last_instance_id; +} + +} // namespace chrome_pdf
diff --git a/pdf/ppapi_migration/pdfium_font_linux.h b/pdf/ppapi_migration/pdfium_font_linux.h new file mode 100644 index 0000000..ab671410 --- /dev/null +++ b/pdf/ppapi_migration/pdfium_font_linux.h
@@ -0,0 +1,24 @@ +// Copyright 2021 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 PDF_PPAPI_MIGRATION_PDFIUM_FONT_LINUX_H_ +#define PDF_PPAPI_MIGRATION_PDFIUM_FONT_LINUX_H_ + +#include "ppapi/c/pp_instance.h" + +namespace pp { +class Instance; +} + +namespace chrome_pdf { + +// Keeps track of the most recently used plugin instance. This is a no-op if +// `last_instance` is null. +void SetLastPepperInstance(pp::Instance* last_instance); + +PP_Instance GetLastPepperInstance(); + +} // namespace chrome_pdf + +#endif // PDF_PPAPI_MIGRATION_PDFIUM_FONT_LINUX_H_
diff --git a/services/audio/group_coordinator.h b/services/audio/group_coordinator.h index a47f5019..e695a049 100644 --- a/services/audio/group_coordinator.h +++ b/services/audio/group_coordinator.h
@@ -13,7 +13,6 @@ #include "base/check.h" #include "base/macros.h" #include "base/sequence_checker.h" -#include "base/stl_util.h" #include "base/unguessable_token.h" namespace audio {
diff --git a/services/audio/public/cpp/BUILD.gn b/services/audio/public/cpp/BUILD.gn index b206da9f..3dbf5a8 100644 --- a/services/audio/public/cpp/BUILD.gn +++ b/services/audio/public/cpp/BUILD.gn
@@ -29,6 +29,7 @@ public_deps = [ "//base", "//media", + "//media/mojo/common", "//services/audio/public/mojom", ] }
diff --git a/services/audio/public/cpp/input_ipc.cc b/services/audio/public/cpp/input_ipc.cc index 53366c6..fd9e0d4 100644 --- a/services/audio/public/cpp/input_ipc.cc +++ b/services/audio/public/cpp/input_ipc.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/memory/read_only_shared_memory_region.h" +#include "media/mojo/common/input_error_code_converter.h" #include "media/mojo/mojom/audio_data_pipe.mojom.h" #include "mojo/public/cpp/bindings/remote.h" @@ -121,8 +122,8 @@ void InputIPC::OnError(media::mojom::InputStreamErrorCode code) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(delegate_); - // TODO(toprice): propagate the errorcode to the delegate_. - delegate_->OnError(); + + delegate_->OnError(media::ConvertToCaptureCallbackCode(code)); } void InputIPC::OnMutedStateChanged(bool is_muted) {
diff --git a/services/audio/public/cpp/input_ipc_unittest.cc b/services/audio/public/cpp/input_ipc_unittest.cc index 76747f9..92e8ec1 100644 --- a/services/audio/public/cpp/input_ipc_unittest.cc +++ b/services/audio/public/cpp/input_ipc_unittest.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/test/task_environment.h" +#include "media/base/audio_capturer_source.h" #include "media/mojo/mojom/audio_data_pipe.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -101,7 +102,7 @@ } MOCK_METHOD1(GotOnStreamCreated, void(bool initially_muted)); - MOCK_METHOD0(OnError, void()); + MOCK_METHOD1(OnError, void(media::AudioCapturerSource::ErrorCode)); MOCK_METHOD1(OnMuted, void(bool)); MOCK_METHOD0(OnIPCClosed, void()); }; @@ -230,7 +231,9 @@ TEST_F(InputIPCTest, FailedStreamCreationNullCallback) { StrictMock<MockDelegate> delegate; - EXPECT_CALL(delegate, OnError()).Times(2); + EXPECT_CALL(delegate, + OnError(media::AudioCapturerSource::ErrorCode::kUnknown)) + .Times(2); factory_->should_fail_ = true; ipc->CreateStream(&delegate, audioParameters, false, 0); task_environment.RunUntilIdle(); @@ -238,7 +241,8 @@ TEST_F(InputIPCTest, FailedStreamCreationDestuctedFactory) { StrictMock<MockDelegate> delegate; - EXPECT_CALL(delegate, OnError()); + EXPECT_CALL(delegate, + OnError(media::AudioCapturerSource::ErrorCode::kUnknown)); factory_ = nullptr; ipc->CreateStream(&delegate, audioParameters, false, 0); task_environment.RunUntilIdle();
diff --git a/services/audio/public/cpp/sounds/audio_stream_handler_unittest.cc b/services/audio/public/cpp/sounds/audio_stream_handler_unittest.cc index 06310ba4..577e558f 100644 --- a/services/audio/public/cpp/sounds/audio_stream_handler_unittest.cc +++ b/services/audio/public/cpp/sounds/audio_stream_handler_unittest.cc
@@ -13,7 +13,6 @@ #include "base/location.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/test/test_message_loop.h" #include "base/threading/thread_task_runner_handle.h" #include "media/audio/audio_io.h"
diff --git a/services/device/hid/hid_manager_impl.cc b/services/device/hid/hid_manager_impl.cc index aaca19b..7b441ec 100644 --- a/services/device/hid/hid_manager_impl.cc +++ b/services/device/hid/hid_manager_impl.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/lazy_instance.h" -#include "base/stl_util.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h"
diff --git a/services/device/public/cpp/hid/hid_collection.cc b/services/device/public/cpp/hid/hid_collection.cc index 3b66554..f4cf826 100644 --- a/services/device/public/cpp/hid/hid_collection.cc +++ b/services/device/public/cpp/hid/hid_collection.cc
@@ -9,7 +9,6 @@ #include <utility> #include "base/memory/ptr_util.h" -#include "base/stl_util.h" #include "services/device/public/cpp/hid/hid_item_state_table.h" namespace device {
diff --git a/services/device/serial/serial_port_impl_unittest.cc b/services/device/serial/serial_port_impl_unittest.cc index d98e78da..3501043 100644 --- a/services/device/serial/serial_port_impl_unittest.cc +++ b/services/device/serial/serial_port_impl_unittest.cc
@@ -4,7 +4,6 @@ #include "services/device/serial/serial_port_impl.h" -#include "base/stl_util.h" #include "base/test/bind.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/services/device/usb/usb_device_impl.cc b/services/device/usb/usb_device_impl.cc index 208606569..aca10158 100644 --- a/services/device/usb/usb_device_impl.cc +++ b/services/device/usb/usb_device_impl.cc
@@ -14,7 +14,6 @@ #include "base/posix/eintr_wrapper.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" -#include "base/stl_util.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h"
diff --git a/services/device/usb/webusb_descriptors.cc b/services/device/usb/webusb_descriptors.cc index d05d1f8..ddbd071 100644 --- a/services/device/usb/webusb_descriptors.cc +++ b/services/device/usb/webusb_descriptors.cc
@@ -10,7 +10,6 @@ #include "base/callback.h" #include "base/logging.h" #include "base/memory/ref_counted_memory.h" -#include "base/stl_util.h" #include "components/device_event_log/device_event_log.h" #include "services/device/usb/usb_device_handle.h" #include "url/gurl.h"
diff --git a/services/device/usb/webusb_descriptors_unittest.cc b/services/device/usb/webusb_descriptors_unittest.cc index 2bd9a54..d6b27f8 100644 --- a/services/device/usb/webusb_descriptors_unittest.cc +++ b/services/device/usb/webusb_descriptors_unittest.cc
@@ -10,7 +10,6 @@ #include <memory> #include "base/bind.h" -#include "base/stl_util.h" #include "services/device/usb/mock_usb_device_handle.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index 96eb95c..ad15938 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -257,6 +257,8 @@ if (is_ct_supported) { sources += [ + "ct_log_list_distributor.cc", + "ct_log_list_distributor.h", "expect_ct_reporter.cc", "expect_ct_reporter.h", "sct_auditing/sct_auditing_cache.cc", @@ -425,6 +427,7 @@ if (is_ct_supported) { sources += [ + "ct_log_list_distributor_unittest.cc", "expect_ct_reporter_unittest.cc", "sct_auditing/sct_auditing_cache_unittest.cc", ]
diff --git a/services/network/ct_log_list_distributor.cc b/services/network/ct_log_list_distributor.cc new file mode 100644 index 0000000..5b6ef113 --- /dev/null +++ b/services/network/ct_log_list_distributor.cc
@@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/network/ct_log_list_distributor.h" + +#include <string> + +#include "base/callback.h" +#include "base/callback_list.h" +#include "net/cert/ct_log_verifier.h" +#include "services/network/public/cpp/features.h" + +namespace network { + +CtLogListDistributor::CtLogListDistributor() = default; + +CtLogListDistributor::~CtLogListDistributor() = default; + +void CtLogListDistributor::OnNewCtConfig( + const std::vector<mojom::CTLogInfoPtr>& log_list) { + std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs; + for (auto& log : log_list) { + scoped_refptr<const net::CTLogVerifier> log_verifier = + net::CTLogVerifier::Create(log->public_key, log->name); + if (!log_verifier) { + // TODO(crbug.com/1211056): Signal bad configuration (such as bad key). + continue; + } + ct_logs.push_back(std::move(log_verifier)); + } + + NotifyCallbacks(ct_logs); +} + +} // namespace network
diff --git a/services/network/ct_log_list_distributor.h b/services/network/ct_log_list_distributor.h new file mode 100644 index 0000000..4df309b --- /dev/null +++ b/services/network/ct_log_list_distributor.h
@@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_NETWORK_CT_LOG_LIST_DISTRIBUTOR_H_ +#define SERVICES_NETWORK_CT_LOG_LIST_DISTRIBUTOR_H_ + +#include "base/callback_forward.h" +#include "base/callback_list.h" +#include "base/component_export.h" +#include "net/cert/multi_log_ct_verifier.h" +#include "services/network/public/mojom/ct_log_info.mojom.h" + +namespace network { + +// Handles distribution of component updater delivered Certificate +// Transparency enforcement configuration to classes that need to be +// notified about changes. + +// TODO(crbug.com/1211074): Once CT log list configuration is exposed via +// CertVerifier::Config, we should configure changes using that instead. +class COMPONENT_EXPORT(NETWORK_SERVICE) CtLogListDistributor + : public net::MultiLogCTVerifier::CTLogProvider { + public: + CtLogListDistributor(); + virtual ~CtLogListDistributor(); + + void OnNewCtConfig(const std::vector<mojom::CTLogInfoPtr>& log_list); +}; + +} // namespace network + +#endif // SERVICES_NETWORK_CT_LOG_LIST_DISTRIBUTOR_H_
diff --git a/services/network/ct_log_list_distributor_unittest.cc b/services/network/ct_log_list_distributor_unittest.cc new file mode 100644 index 0000000..9dee8097 --- /dev/null +++ b/services/network/ct_log_list_distributor_unittest.cc
@@ -0,0 +1,81 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "base/logging.h" + +#include "services/network/ct_log_list_distributor.h" + +#include "base/bind.h" +#include "base/callback.h" +#include "base/callback_list.h" +#include "base/test/task_environment.h" +#include "crypto/sha2.h" +#include "net/cert/ct_log_verifier.h" +#include "net/cert/multi_log_ct_verifier.h" +#include "net/test/ct_test_util.h" +#include "services/network/public/mojom/ct_log_info.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace network { + +class MockLogVerifier { + public: + MockLogVerifier() = default; + ~MockLogVerifier() = default; + + void SetLogs(const std::vector<scoped_refptr<const net::CTLogVerifier>>& + log_verifiers) { + logs_ = log_verifiers; + } + + std::vector<scoped_refptr<const net::CTLogVerifier>> GetLogs() { + return logs_; + } + + private: + std::vector<scoped_refptr<const net::CTLogVerifier>> logs_; +}; + +class CtLogListDistributorTest : public ::testing::Test { + public: + void SetUp() override { + subscription_ = distributor_.RegisterLogsListCallback(base::BindRepeating( + &MockLogVerifier::SetLogs, base::Unretained(&verifier_))); + } + void Wait() { task_environment_.RunUntilIdle(); } + + protected: + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::MainThreadType::DEFAULT, + base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED}; + CtLogListDistributor distributor_; + MockLogVerifier verifier_; + base::CallbackListSubscription subscription_; +}; + +TEST_F(CtLogListDistributorTest, TestOnNewCtConfig) { + const char kLogDescription[] = "somelog"; + + // Create log list with a single log. + std::vector<network::mojom::CTLogInfoPtr> log_list_mojo; + network::mojom::CTLogInfoPtr log_ptr = network::mojom::CTLogInfo::New(); + log_ptr->name = kLogDescription; + log_ptr->public_key = net::ct::GetTestPublicKey(); + log_list_mojo.push_back(std::move(log_ptr)); + + // Pass the log list to the distributor. + distributor_.OnNewCtConfig(log_list_mojo); + + // Wait for parsing to finish. + Wait(); + + // Verifier should have been notified and have the log list. + std::vector<scoped_refptr<const net::CTLogVerifier>> logs = + verifier_.GetLogs(); + EXPECT_EQ(logs.size(), 1u); + EXPECT_EQ(logs[0]->description(), kLogDescription); + EXPECT_EQ(logs[0]->key_id(), + crypto::SHA256HashString(net::ct::GetTestPublicKey())); +} + +} // namespace network
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index e606e81f..fa95b174 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -124,6 +124,7 @@ #include "net/cert/cert_and_ct_verifier.h" #include "net/cert/ct_log_verifier.h" #include "net/cert/multi_log_ct_verifier.h" +#include "services/network/ct_log_list_distributor.h" #include "services/network/expect_ct_reporter.h" #include "services/network/sct_auditing/sct_auditing_cache.h" #endif // BUILDFLAG(IS_CT_SUPPORTED) @@ -1900,21 +1901,20 @@ #if BUILDFLAG(IS_CT_SUPPORTED) std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs; - if (!params_->ct_logs.empty()) { - for (const auto& log : params_->ct_logs) { - scoped_refptr<const net::CTLogVerifier> log_verifier = - net::CTLogVerifier::Create(log->public_key, log->name); - if (!log_verifier) { - // TODO: Signal bad configuration (such as bad key). - continue; - } - ct_logs.push_back(std::move(log_verifier)); + for (const auto& log : network_service_->log_list()) { + scoped_refptr<const net::CTLogVerifier> log_verifier = + net::CTLogVerifier::Create(log->public_key, log->name); + if (!log_verifier) { + // TODO: Signal bad configuration (such as bad key). + continue; } - auto ct_verifier = std::make_unique<net::MultiLogCTVerifier>(); - ct_verifier->AddLogs(ct_logs); - cert_verifier = std::make_unique<net::CertAndCTVerifier>( - std::move(cert_verifier), std::move(ct_verifier)); + ct_logs.push_back(std::move(log_verifier)); } + auto ct_verifier = std::make_unique<net::MultiLogCTVerifier>( + network_service_->ct_log_list_distributor()); + ct_verifier->SetLogs(ct_logs); + cert_verifier = std::make_unique<net::CertAndCTVerifier>( + std::move(cert_verifier), std::move(ct_verifier)); #endif // BUILDFLAG(IS_CT_SUPPORTED) // Whether the cert verifier is remote or in-process, we should wrap it in @@ -1942,16 +1942,13 @@ if (params_->enforce_chrome_ct_policy) { std::vector<std::pair<std::string, base::TimeDelta>> disqualified_logs; std::vector<std::string> operated_by_google_logs; - if (!params_->ct_logs.empty()) { - for (const auto& log : params_->ct_logs) { - if (log->operated_by_google || log->disqualified_at) { - std::string log_id = crypto::SHA256HashString(log->public_key); - if (log->operated_by_google) - operated_by_google_logs.push_back(log_id); - if (log->disqualified_at) { - disqualified_logs.push_back( - std::make_pair(log_id, log->disqualified_at.value())); - } + for (const auto& log : network_service_->log_list()) { + if (log->operated_by_google || log->disqualified_at) { + std::string log_id = crypto::SHA256HashString(log->public_key); + if (log->operated_by_google) + operated_by_google_logs.push_back(log_id); + if (log->disqualified_at) { + disqualified_logs.emplace_back(log_id, log->disqualified_at.value()); } } }
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index 20c90d0..af6f09a 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -6040,9 +6040,8 @@ #if BUILDFLAG(IS_CT_SUPPORTED) TEST_F(NetworkContextTest, CertificateTransparencyConfig) { - mojom::NetworkContextParamsPtr params = CreateContextParams(); - params->enforce_chrome_ct_policy = true; - params->ct_log_update_time = base::Time::Now(); + // Configure CT logs in network service. + std::vector<network::mojom::CTLogInfoPtr> log_list_mojo; // The log public keys do not matter for the test, so invalid keys are used. // However, because the log IDs are derived from the SHA-256 hash of the log @@ -6057,7 +6056,7 @@ log_info->name = std::string(4, 0x30 + static_cast<char>(i)); log_info->operated_by_google = i % 2; - params->ct_logs.push_back(std::move(log_info)); + log_list_mojo.push_back(std::move(log_info)); } for (int i = 0; i < 3; ++i) { network::mojom::CTLogInfoPtr log_info = network::mojom::CTLogInfo::New(); @@ -6067,8 +6066,15 @@ log_info->operated_by_google = false; log_info->disqualified_at = base::TimeDelta::FromSeconds(i); - params->ct_logs.push_back(std::move(log_info)); + log_list_mojo.push_back(std::move(log_info)); } + network_service()->UpdateCtLogList(std::move(log_list_mojo)); + + // Configure CT params in network context. + mojom::NetworkContextParamsPtr params = CreateContextParams(); + params->enforce_chrome_ct_policy = true; + params->ct_log_update_time = base::Time::Now(); + std::unique_ptr<NetworkContext> network_context = CreateContextWithParams(std::move(params));
diff --git a/services/network/network_service.cc b/services/network/network_service.cc index 143c7bd..b2bd0ad 100644 --- a/services/network/network_service.cc +++ b/services/network/network_service.cc
@@ -83,6 +83,8 @@ #endif #if BUILDFLAG(IS_CT_SUPPORTED) +#include "components/certificate_transparency/ct_features.h" +#include "services/network/ct_log_list_distributor.h" #include "services/network/sct_auditing/sct_auditing_cache.h" #endif @@ -326,6 +328,10 @@ crl_set_distributor_ = std::make_unique<CRLSetDistributor>(); +#if BUILDFLAG(IS_CT_SUPPORTED) + ct_log_list_distributor_ = std::make_unique<CtLogListDistributor>(); +#endif + doh_probe_activator_ = std::make_unique<DelayedDohProbeActivator>(this); trust_token_key_commitments_ = std::make_unique<TrustTokenKeyCommitments>(); @@ -715,7 +721,25 @@ sct_auditing_cache_->set_traffic_annotation(traffic_annotation); sct_auditing_cache_->set_url_loader_factory(std::move(factory)); } -#endif + +void NetworkService::UpdateCtLogList( + std::vector<mojom::CTLogInfoPtr> log_list) { + log_list_ = std::move(log_list); + if (base::FeatureList::IsEnabled( + certificate_transparency::features:: + kCertificateTransparencyComponentUpdater)) { + ct_log_list_distributor_->OnNewCtConfig(log_list_); + } +} + +void NetworkService::SetCtEnforcementEnabled(bool enabled) { + // TODO(crbug.com/1211535): Implement Certificate Transparency killswitch. + DCHECK(base::FeatureList::IsEnabled( + certificate_transparency::features:: + kCertificateTransparencyComponentUpdater)); +} + +#endif // BUILDFLAG(IS_CT_SUPPORTED) #if defined(OS_ANDROID) void NetworkService::DumpWithoutCrashing(base::Time dump_request_time) {
diff --git a/services/network/network_service.h b/services/network/network_service.h index 3342648..5e0c0709 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h
@@ -17,6 +17,7 @@ #include "base/containers/flat_set.h" #include "base/containers/span.h" #include "base/containers/unique_ptr_adapters.h" +#include "base/feature_list.h" #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/time/time.h" @@ -47,6 +48,10 @@ #include "services/service_manager/public/cpp/binder_registry.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#if BUILDFLAG(IS_CT_SUPPORTED) +#include "services/network/public/mojom/ct_log_info.mojom.h" +#endif + namespace net { class FileNetLogObserver; class HostResolverManager; @@ -59,6 +64,7 @@ namespace network { class CRLSetDistributor; +class CtLogListDistributor; class DnsConfigChangeManager; class HttpAuthCacheCopier; class NetLogProxySink; @@ -184,6 +190,8 @@ const GURL& reporting_uri, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, mojo::PendingRemote<mojom::URLLoaderFactory> factory) override; + void UpdateCtLogList(std::vector<mojom::CTLogInfoPtr> log_list) override; + void SetCtEnforcementEnabled(bool enabled) override; #endif #if defined(OS_ANDROID) @@ -225,6 +233,12 @@ return crl_set_distributor_.get(); } +#if BUILDFLAG(IS_CT_SUPPORTED) + CtLogListDistributor* ct_log_list_distributor() { + return ct_log_list_distributor_.get(); + } +#endif + const FirstPartySets* first_party_sets() const { return first_party_sets_.get(); } @@ -250,6 +264,8 @@ #if BUILDFLAG(IS_CT_SUPPORTED) SCTAuditingCache* sct_auditing_cache() { return sct_auditing_cache_.get(); } + + const std::vector<mojom::CTLogInfoPtr>& log_list() const { return log_list_; } #endif mojom::URLLoaderNetworkServiceObserver* @@ -352,6 +368,10 @@ #if BUILDFLAG(IS_CT_SUPPORTED) std::unique_ptr<SCTAuditingCache> sct_auditing_cache_; + + std::vector<mojom::CTLogInfoPtr> log_list_; + + std::unique_ptr<CtLogListDistributor> ct_log_list_distributor_; #endif // Map from a renderer process id, to the set of plugin origins embedded by
diff --git a/services/network/proxy_resolver_factory_mojo.cc b/services/network/proxy_resolver_factory_mojo.cc index 87eb5487..e45c0f5 100644 --- a/services/network/proxy_resolver_factory_mojo.cc +++ b/services/network/proxy_resolver_factory_mojo.cc
@@ -14,7 +14,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/sequence_checker.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h"
diff --git a/services/network/proxy_resolver_factory_mojo_unittest.cc b/services/network/proxy_resolver_factory_mojo_unittest.cc index 249466317..6f900e1 100644 --- a/services/network/proxy_resolver_factory_mojo_unittest.cc +++ b/services/network/proxy_resolver_factory_mojo_unittest.cc
@@ -15,7 +15,6 @@ #include "base/callback_helpers.h" #include "base/containers/queue.h" #include "base/run_loop.h" -#include "base/stl_util.h" #include "base/test/task_environment.h" #include "base/values.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/services/network/public/cpp/network_isolation_key_mojom_traits_unittest.cc b/services/network/public/cpp/network_isolation_key_mojom_traits_unittest.cc index e2e1508..86601764 100644 --- a/services/network/public/cpp/network_isolation_key_mojom_traits_unittest.cc +++ b/services/network/public/cpp/network_isolation_key_mojom_traits_unittest.cc
@@ -4,7 +4,6 @@ #include "services/network/public/cpp/network_isolation_key_mojom_traits.h" -#include "base/stl_util.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "services/network/public/mojom/network_isolation_key.mojom.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/services/network/public/cpp/schemeful_site_mojom_traits_unittest.cc b/services/network/public/cpp/schemeful_site_mojom_traits_unittest.cc index 3515073..ee70f58 100644 --- a/services/network/public/cpp/schemeful_site_mojom_traits_unittest.cc +++ b/services/network/public/cpp/schemeful_site_mojom_traits_unittest.cc
@@ -4,7 +4,6 @@ #include "services/network/public/cpp/schemeful_site_mojom_traits.h" -#include "base/stl_util.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "services/network/public/mojom/schemeful_site.mojom.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom index e24ec4c..8b74f2f 100644 --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom
@@ -57,9 +57,6 @@ [EnableIf=is_chromeos_ash] import "services/network/public/mojom/dhcp_wpad_url_client.mojom"; -[EnableIf=is_ct_supported] -import "services/network/public/mojom/ct_log_info.mojom"; - const uint32 kWebSocketOptionNone = 0; // Disallow the request from sending cookies. Disallow the response from writing // cookies. @@ -363,18 +360,12 @@ [EnableIf=is_ct_supported] bool enable_sct_auditing = false; - // The Certificate Transparency logs that are known to the client. SCTs from - // these logs will be extracted and verified; other SCTs will be treated as - // unrecognized. - [EnableIf=is_ct_supported] - array<CTLogInfo> ct_logs; - // The initial CT policy to be used for requests. See // NetworkContext.SetCTPolicy() for more. [EnableIf=is_ct_supported] CTPolicy? ct_policy; - // When the Certificate Transparency logs in |ct_logs| were last updated. If + // When the built-in Certificate Transparency logs were last updated. If // |enforce_chrome_ct_policy| is set, and |ct_log_update_time| is not // sufficiently recent, enforcement of the "Certificate Transparency in // Chrome" policy will be disabled.
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index f7b1e99..17ade2c 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom
@@ -38,6 +38,9 @@ [EnableIf=is_android] import "mojo/public/mojom/base/application_state.mojom"; +[EnableIf=is_ct_supported] +import "services/network/public/mojom/ct_log_info.mojom"; + // Values for configuring HTTP authentication that can only be set once. struct HttpAuthStaticParams { // List of supported auth schemes. Unrecognized schemes are ignored. @@ -338,6 +341,15 @@ MutableNetworkTrafficAnnotationTag traffic_annotation, pending_remote<network.mojom.URLLoaderFactory> factory); + + // Updates the log list used for CT verification. + [EnableIf=is_ct_supported] + UpdateCtLogList(array<CTLogInfo> log_list); + + // Disables or enables CT Enforcement. + [EnableIf=is_ct_supported] + SetCtEnforcementEnabled(bool enabled); + // Calls base::debug::DumpWithoutCrashing for the network process. // TODO(http://crbug.com/934317): Remove this once done debugging renderer // hangs.
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper.cc b/services/network/trust_tokens/trust_token_request_issuance_helper.cc index 1d12c85..9b9b3f4 100644 --- a/services/network/trust_tokens/trust_token_request_issuance_helper.cc +++ b/services/network/trust_tokens/trust_token_request_issuance_helper.cc
@@ -10,7 +10,6 @@ #include "base/command_line.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "base/task/thread_pool.h" #include "net/base/load_flags.h" #include "net/http/http_response_headers.h"
diff --git a/services/network/trust_tokens/trust_token_request_redemption_helper.cc b/services/network/trust_tokens/trust_token_request_redemption_helper.cc index 511558e..ecf67b9 100644 --- a/services/network/trust_tokens/trust_token_request_redemption_helper.cc +++ b/services/network/trust_tokens/trust_token_request_redemption_helper.cc
@@ -9,7 +9,6 @@ #include "base/callback.h" #include "base/metrics/histogram_functions.h" -#include "base/stl_util.h" #include "net/base/load_flags.h" #include "net/http/http_response_headers.h" #include "net/url_request/url_request.h"
diff --git a/services/network/trust_tokens/trust_token_request_signing_helper.cc b/services/network/trust_tokens/trust_token_request_signing_helper.cc index a9809781..f89075127 100644 --- a/services/network/trust_tokens/trust_token_request_signing_helper.cc +++ b/services/network/trust_tokens/trust_token_request_signing_helper.cc
@@ -11,7 +11,6 @@ #include "base/base64.h" #include "base/containers/flat_set.h" #include "base/ranges/algorithm.h" -#include "base/stl_util.h" #include "base/strings/strcat.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h"
diff --git a/services/service_manager/public/cpp/manifest_unittest.cc b/services/service_manager/public/cpp/manifest_unittest.cc index 9c7a0da..057da4e 100644 --- a/services/service_manager/public/cpp/manifest_unittest.cc +++ b/services/service_manager/public/cpp/manifest_unittest.cc
@@ -9,7 +9,6 @@ #include "base/files/file_path.h" #include "base/no_destructor.h" -#include "base/stl_util.h" #include "services/service_manager/public/cpp/manifest_builder.h" #include "services/service_manager/public/mojom/connector.mojom.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 8c4ffce0..ed93a4d3 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -4581,12 +4581,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=89", + "--client-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" @@ -4596,11 +4596,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_client_from_89" + "weblayer_skew_tests_with_client_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_client_from_89", + "name": "weblayer_skew_tests_with_client_from_90", "resultdb": { "enable": true }, @@ -4609,8 +4609,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4768,7 +4768,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4820,10 +4820,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=89", + "--impl-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" @@ -4833,11 +4833,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_impl_from_89" + "weblayer_skew_tests_with_impl_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_impl_from_89", + "name": "weblayer_skew_tests_with_impl_from_90", "resultdb": { "enable": true }, @@ -4846,8 +4846,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5005,7 +5005,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 835be5d7..3ca7470 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -53743,12 +53743,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=89", + "--client-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" @@ -53758,11 +53758,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_chrome_with_client_from_89" + "weblayer_skew_tests_with_chrome_with_client_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_chrome_with_client_from_89", + "name": "weblayer_skew_tests_with_chrome_with_client_from_90", "resultdb": { "enable": true }, @@ -53771,8 +53771,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -53932,7 +53932,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -53985,10 +53985,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=89", + "--impl-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" @@ -53998,11 +53998,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_chrome_with_impl_from_89" + "weblayer_skew_tests_with_chrome_with_impl_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_chrome_with_impl_from_89", + "name": "weblayer_skew_tests_with_chrome_with_impl_from_90", "resultdb": { "enable": true }, @@ -54011,8 +54011,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54172,7 +54172,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54289,12 +54289,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=89", + "--client-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" @@ -54304,11 +54304,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_client_from_89" + "weblayer_skew_tests_with_client_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_client_from_89", + "name": "weblayer_skew_tests_with_client_from_90", "resultdb": { "enable": true }, @@ -54317,8 +54317,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54476,7 +54476,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54528,10 +54528,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=89", + "--impl-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" @@ -54541,11 +54541,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_impl_from_89" + "weblayer_skew_tests_with_impl_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_impl_from_89", + "name": "weblayer_skew_tests_with_impl_from_90", "resultdb": { "enable": true }, @@ -54554,8 +54554,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54713,7 +54713,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54830,12 +54830,12 @@ "--test-runner-outdir", ".", "--client-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--client-version=89", + "--client-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" @@ -54845,11 +54845,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_client_from_89" + "weblayer_skew_tests_with_client_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_client_from_89", + "name": "weblayer_skew_tests_with_client_from_90", "resultdb": { "enable": true }, @@ -54858,8 +54858,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -55017,7 +55017,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -55069,10 +55069,10 @@ "--client-outdir", ".", "--implementation-outdir", - "../../weblayer_instrumentation_test_M89/out/Release", + "../../weblayer_instrumentation_test_M90/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--impl-version=89", + "--impl-version=90", "--gs-results-bucket=chromium-result-details", "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" @@ -55082,11 +55082,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_skew_tests_with_impl_from_89" + "weblayer_skew_tests_with_impl_from_90" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_skew_tests_with_impl_from_89", + "name": "weblayer_skew_tests_with_impl_from_90", "resultdb": { "enable": true }, @@ -55095,8 +55095,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M89", - "revision": "version:89.0.4389.129" + "location": "weblayer_instrumentation_test_M90", + "revision": "version:90.0.4430.225" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -55254,7 +55254,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.11" + "revision": "version:92.0.4515.16" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 125fd9c..6a30495 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -424,7 +424,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M92', - 'revision': 'version:92.0.4515.11', + 'revision': 'version:92.0.4515.16', } ], }, @@ -461,18 +461,18 @@ '--client-outdir', '.', '--implementation-outdir', - '../../weblayer_instrumentation_test_M89/out/Release', + '../../weblayer_instrumentation_test_M90/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=89', + '--impl-version=90', ], - 'identifier': 'with_impl_from_89', + 'identifier': 'with_impl_from_90', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M89', - 'revision': 'version:89.0.4389.129', + 'location': 'weblayer_instrumentation_test_M90', + 'revision': 'version:90.0.4430.225', } ], }, @@ -496,7 +496,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M92', - 'revision': 'version:92.0.4515.11', + 'revision': 'version:92.0.4515.16', } ], }, @@ -533,18 +533,18 @@ '--client-outdir', '.', '--implementation-outdir', - '../../weblayer_instrumentation_test_M89/out/Release', + '../../weblayer_instrumentation_test_M90/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=89', + '--impl-version=90', ], - 'identifier': 'with_impl_from_89', + 'identifier': 'with_impl_from_90', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M89', - 'revision': 'version:89.0.4389.129', + 'location': 'weblayer_instrumentation_test_M90', + 'revision': 'version:90.0.4430.225', } ], }, @@ -568,7 +568,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M92', - 'revision': 'version:92.0.4515.11', + 'revision': 'version:92.0.4515.16', } ], }, @@ -603,20 +603,20 @@ '--test-runner-outdir', '.', '--client-outdir', - '../../weblayer_instrumentation_test_M89/out/Release', + '../../weblayer_instrumentation_test_M90/out/Release', '--implementation-outdir', '.', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--client-version=89', + '--client-version=90', ], - 'identifier': 'with_client_from_89', + 'identifier': 'with_client_from_90', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M89', - 'revision': 'version:89.0.4389.129', + 'location': 'weblayer_instrumentation_test_M90', + 'revision': 'version:90.0.4430.225', } ], },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 0a42b0a6..a01041e 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2241,16 +2241,19 @@ ], "experiments": [ { - "name": "EnabledWithTextShopSimilarProducts_20201022", + "name": "EnabledWithTextShopImageWithGoogleLens", "params": { "disableOnIncognito": "true", - "lensShopVariation": "ShopSimilarProducts", + "lensShopVariation": "ShopImageWithGoogleLens", + "logUkm": "true", "minAgsaVersionNameForShopping": "11.17" }, "enable_features": [ "ContextMenuEnableLensShoppingAllowlist", - "ContextMenuSearchAndShopWithGoogleLens", "ContextMenuShopWithGoogleLens" + ], + "disable_features": [ + "ContextMenuSearchAndShopWithGoogleLens" ] } ] @@ -2686,15 +2689,14 @@ ], "experiments": [ { - "name": "ShoppingTasksRecipeTasksChromeCart_Enabled", + "name": "RecipeTasksChromeCart_Enabled", "params": { "NtpModulesLoadTimeoutMillisecondsParam": "3000" }, "enable_features": [ "NtpChromeCartModule", "NtpModules", - "NtpRecipeTasksModule", - "NtpShoppingTasksModule" + "NtpRecipeTasksModule" ] } ] @@ -3738,6 +3740,27 @@ ] } ], + "HatsOnboardingExperience": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "prob": "0.05", + "survey_cycle_length": "2147483647", + "survey_start_date_ms": "1617260400000", + "trigger_id": "NAgJpJZhz0jBnuKU19R0UuVK5EA7" + }, + "enable_features": [ + "HappinessTrackingOnboardingExperience" + ] + } + ] + } + ], "HeapProfiling": [ { "platforms": [
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 8104656..b07a5850 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -88,7 +88,6 @@ "input/pointer_lock_result.mojom", "input/scroll_direction.mojom", "input/touch_event.mojom", - "insecure_input/insecure_input_service.mojom", "interest_group/ad_auction_service.mojom", "interest_group/interest_group_types.mojom", "interest_group/restricted_interest_group_store.mojom",
diff --git a/third_party/blink/public/mojom/frame/frame_replication_state.mojom b/third_party/blink/public/mojom/frame/frame_replication_state.mojom index 482fde3..b2418b7 100644 --- a/third_party/blink/public/mojom/frame/frame_replication_state.mojom +++ b/third_party/blink/public/mojom/frame/frame_replication_state.mojom
@@ -80,14 +80,6 @@ // frame. blink.mojom.FramePolicy frame_policy; - // Whether the frame is in a document tree or a shadow tree, per the Shadow - // DOM spec: https://w3c.github.io/webcomponents/spec/shadow/ - // Note: This should really be const, as it can never change once a frame is - // created. However, making it const makes it a pain to embed into IPC message - // params: having a const member implicitly deletes the copy assignment - // operator. - blink.mojom.TreeScopeType scope = blink.mojom.TreeScopeType.kDocument; - // The insecure request policy that a frame's current document is enforcing. // Updates are immediately sent to all frame proxies when frames live in // different processes.
diff --git a/third_party/blink/public/mojom/insecure_input/OWNERS b/third_party/blink/public/mojom/insecure_input/OWNERS deleted file mode 100644 index 08850f4..0000000 --- a/third_party/blink/public/mojom/insecure_input/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -per-file *.mojom=set noparent -per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom b/third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom deleted file mode 100644 index 3ee3591..0000000 --- a/third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module blink.mojom; - -// InsecureInputService receives per-frame notifications about insecure input -// operations (e.g. editing of any fields) on the page. -interface InsecureInputService { - DidEditFieldInInsecureContext(); -};
diff --git a/third_party/blink/public/web/web_frame.h b/third_party/blink/public/web/web_frame.h index a70289aff..2eeeafe1 100644 --- a/third_party/blink/public/web/web_frame.h +++ b/third_party/blink/public/web/web_frame.h
@@ -162,6 +162,10 @@ // the given node is not a frame, iframe or if the frame is empty. static WebFrame* FromFrameOwnerElement(const WebNode&); + // Whether the owner element of this frame is in the document tree or the + // shadow tree, per https://w3c.github.io/webcomponents/spec/shadow/. + mojom::TreeScopeType GetTreeScopeType() const { return scope_; } + // This identifier represents the stable identifier between a // LocalFrame <--> RenderFrameHostImpl or a // RemoteFrame <--> RenderFrameProxyHost in the browser process. @@ -170,8 +174,6 @@ #if INSIDE_BLINK static WebFrame* FromCoreFrame(Frame*); static Frame* ToCoreFrame(const WebFrame&); - - bool InShadowTree() const { return scope_ == mojom::TreeScopeType::kShadow; } #endif protected:
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 78a291d4..c5faaf9 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -66,7 +66,6 @@ #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom-blink-forward.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" -#include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom-blink.h" #include "third_party/blink/public/mojom/page_state/page_state.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" @@ -742,7 +741,6 @@ ? kAllowDeferredParsing : kAllowAsynchronousParsing), node_count_(0), - logged_field_edit_(false), // Use the source id from the document initializer if it is available. // Otherwise, generate a new source id to cover any cases that don't // receive a valid source id, this for example includes but is not limited @@ -5217,17 +5215,6 @@ return *access_entry_from_url_; } -void Document::SendDidEditFieldInInsecureContext() { - if (!GetFrame()) - return; - - mojo::Remote<mojom::blink::InsecureInputService> insecure_input_service; - GetFrame()->GetBrowserInterfaceBroker().GetInterface( - insecure_input_service.BindNewPipeAndPassReceiver()); - - insecure_input_service->DidEditFieldInInsecureContext(); -} - void Document::RegisterEventFactory( std::unique_ptr<EventFactoryBase> event_factory) { DCHECK(!EventFactories().Contains(event_factory.get())); @@ -7716,25 +7703,6 @@ return *property_registry_; } -void Document::MaybeQueueSendDidEditFieldInInsecureContext() { - if (logged_field_edit_ || sensitive_input_edited_task_.IsActive() || - execution_context_->IsSecureContext()) { - // Send a message on the first edit; the browser process doesn't care - // about the presence of additional edits. - // - // The browser process only cares about editing fields on pages where the - // top-level URL is not secure. Secure contexts must have a top-level URL - // that is secure, so there is no need to send notifications for editing - // in secure contexts. - return; - } - logged_field_edit_ = true; - sensitive_input_edited_task_ = PostCancellableTask( - *GetTaskRunner(TaskType::kUserInteraction), FROM_HERE, - WTF::Bind(&Document::SendDidEditFieldInInsecureContext, - WrapWeakPersistent(this))); -} - DocumentResourceCoordinator* Document::GetResourceCoordinator() { if (!resource_coordinator_ && GetFrame()) { resource_coordinator_ = DocumentResourceCoordinator::MaybeCreate(
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index e43a3945..89cc770 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1466,10 +1466,6 @@ } PropertyRegistry& EnsurePropertyRegistry(); - // Used to notify the embedder when the user edits the value of a - // text field in a non-secure context. - void MaybeQueueSendDidEditFieldInInsecureContext(); - // May return nullptr when PerformanceManager instrumentation is disabled. DocumentResourceCoordinator* GetResourceCoordinator(); @@ -1804,8 +1800,6 @@ const OriginAccessEntry& AccessEntryFromURL(); - void SendDidEditFieldInInsecureContext(); - void UpdateActiveState(bool is_active, bool update_active_chain, Element*); void UpdateHoverState(Element*); @@ -2108,10 +2102,6 @@ Member<PropertyRegistry> property_registry_; - bool logged_field_edit_; - - TaskHandle sensitive_input_edited_task_; - Member<NetworkStateObserver> network_state_observer_; // |ukm_recorder_| and |source_id_| will allow objects that are part of
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc index 5ec0951..077a726d 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -308,7 +308,7 @@ } bool LocalFrameClientImpl::InShadowTree() const { - return web_frame_->InShadowTree(); + return web_frame_->GetTreeScopeType() == mojom::blink::TreeScopeType::kShadow; } void LocalFrameClientImpl::WillBeDetached() {
diff --git a/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc b/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc index 9a78fa1..0bf4a9b 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc +++ b/third_party/blink/renderer/core/frame/remote_frame_client_impl.cc
@@ -34,7 +34,7 @@ } bool RemoteFrameClientImpl::InShadowTree() const { - return web_frame_->InShadowTree(); + return web_frame_->GetTreeScopeType() == mojom::blink::TreeScopeType::kShadow; } void RemoteFrameClientImpl::Detached(FrameDetachType type) {
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 51503e5..934a69e 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1930,10 +1930,8 @@ DCHECK(name.IsEmpty() || name.Equals(previous_frame->Tree().GetName())); auto* web_frame = MakeGarbageCollected<WebLocalFrameImpl>( base::PassKey<WebLocalFrameImpl>(), - previous_web_frame->InShadowTree() - ? mojom::blink::TreeScopeType::kShadow - : mojom::blink::TreeScopeType::kDocument, - client, interface_registry, frame_token); + previous_web_frame->GetTreeScopeType(), client, interface_registry, + frame_token); network::mojom::blink::WebSandboxFlags sandbox_flags = network::mojom::blink::WebSandboxFlags::kNone; PermissionsPolicyFeatureState feature_state;
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni index 69bb5d0..e56f712b 100644 --- a/third_party/blink/renderer/core/html/build.gni +++ b/third_party/blink/renderer/core/html/build.gni
@@ -662,7 +662,6 @@ "forms/html_text_area_element_test.cc", "forms/internal_popup_menu_test.cc", "forms/option_list_test.cc", - "forms/password_input_type_test.cc", "forms/step_range_test.cc", "forms/text_control_element_test.cc", "forms/type_ahead_test.cc",
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc b/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc index c5cd74e6..41dc7fba 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc +++ b/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc
@@ -169,7 +169,8 @@ // canvases per render task. measure_current_task_ = !(task_counter_++ % kSamplingProbabilityInv); - if (context->Host() + if (context->Host() && context->Host()->GetTopExecutionContext() && + context->Host() ->GetTopExecutionContext() ->IsInRequestAnimationFrame()) { call_type_ = CallType::kAnimation;
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type_test.cc b/third_party/blink/renderer/core/html/forms/password_input_type_test.cc deleted file mode 100644 index 025beb3..0000000 --- a/third_party/blink/renderer/core/html/forms/password_input_type_test.cc +++ /dev/null
@@ -1,89 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/html/forms/password_input_type.h" - -#include <memory> -#include <utility> - -#include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver_set.h" -#include "mojo/public/cpp/system/message_pipe.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/common/browser_interface_broker_proxy.h" -#include "third_party/blink/public/mojom/insecure_input/insecure_input_service.mojom-blink.h" -#include "third_party/blink/renderer/core/frame/local_dom_window.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/testing/dummy_page_holder.h" -#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" - -namespace blink { - -class MockInsecureInputService : public mojom::blink::InsecureInputService { - public: - explicit MockInsecureInputService(LocalFrame& frame) { - frame.GetBrowserInterfaceBroker().SetBinderForTesting( - mojom::blink::InsecureInputService::Name_, - WTF::BindRepeating(&MockInsecureInputService::BindReceiver, - WTF::Unretained(this))); - } - - ~MockInsecureInputService() override = default; - - void BindReceiver(mojo::ScopedMessagePipeHandle handle) { - receiver_set_.Add(this, - mojo::PendingReceiver<mojom::blink::InsecureInputService>( - std::move(handle))); - } - - unsigned DidEditFieldCalls() const { return num_did_edit_field_calls_; } - - private: - void DidEditFieldInInsecureContext() override { ++num_did_edit_field_calls_; } - - mojo::ReceiverSet<InsecureInputService> receiver_set_; - - unsigned num_did_edit_field_calls_ = 0; -}; - -// Tests that a Mojo message is sent when a password field is edited -// on the page. -TEST(PasswordInputTypeTest, DidEditFieldEvent) { - auto page_holder = std::make_unique<DummyPageHolder>(IntSize(2000, 2000)); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->setInnerHTML("<input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhasesForTest(); - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.DidEditFieldCalls()); - // Simulate a text field edit. - page_holder->GetDocument().MaybeQueueSendDidEditFieldInInsecureContext(); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.DidEditFieldCalls()); - // Ensure additional edits do not trigger additional notifications. - page_holder->GetDocument().MaybeQueueSendDidEditFieldInInsecureContext(); - blink::test::RunPendingTasks(); - EXPECT_EQ(1u, mock_service.DidEditFieldCalls()); -} - -// Tests that a Mojo message is not sent when a password field is edited -// in a secure context. -TEST(PasswordInputTypeTest, DidEditFieldEventNotSentFromSecureContext) { - auto page_holder = std::make_unique<DummyPageHolder>(IntSize(2000, 2000)); - page_holder->GetFrame().Loader().CommitNavigation( - WebNavigationParams::CreateWithHTMLBufferForTesting( - SharedBuffer::Create(), KURL("https://example.test")), - nullptr /* extra_data */); - blink::test::RunPendingTasks(); - MockInsecureInputService mock_service(page_holder->GetFrame()); - page_holder->GetDocument().body()->setInnerHTML("<input type='password'>"); - page_holder->GetDocument().View()->UpdateAllLifecyclePhasesForTest(); - // Simulate a text field edit. - page_holder->GetDocument().MaybeQueueSendDidEditFieldInInsecureContext(); - // No message should have been sent from a secure context. - blink::test::RunPendingTasks(); - EXPECT_EQ(0u, mock_service.DidEditFieldCalls()); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc index 716d5e9..7b70fa4 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -643,13 +643,9 @@ scoped_refptr<FileChooser> file_chooser) { NotifyPopupOpeningObservers(); - Document* doc = frame->GetDocument(); - if (doc) - doc->MaybeQueueSendDidEditFieldInInsecureContext(); - static const wtf_size_t kMaximumPendingFileChooseRequests = 4; if (file_chooser_queue_.size() > kMaximumPendingFileChooseRequests) { - // This sanity check prevents too many file choose requests from getting + // This check prevents too many file choose requests from getting // queued which could DoS the user. Getting these is most likely a // programming error (there are many ways to DoS the user so it's not // considered a "real" security check), either in JS requesting many file @@ -1083,7 +1079,6 @@ UseCounter::Count(doc, doc.GetExecutionContext()->IsSecureContext() ? WebFeature::kFieldEditInSecureContext : WebFeature::kFieldEditInNonSecureContext); - doc.MaybeQueueSendDidEditFieldInInsecureContext(); // The resource coordinator is not available in some tests. if (auto* rc = doc.GetResourceCoordinator()) rc->SetHadFormInteraction();
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc index 2b16f67..21c38947 100644 --- a/third_party/blink/renderer/core/page/create_window.cc +++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -158,7 +158,13 @@ } if (!ui_features_were_disabled && key_string != "noopener" && - key_string != "noreferrer") { + key_string != "noreferrer" && + (!conversion_measurement_enabled || + (key_string != "attributionsourceeventid" && + key_string != "attributiondestination" && + key_string != "attributionreportto" && + key_string != "attributionexpiry" && + key_string != "attributionsourcepriority"))) { ui_features_were_disabled = true; window_features.menu_bar_visible = false; window_features.status_bar_visible = false;
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 4eec5f3..f2a314a 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1763,7 +1763,7 @@ void PaintLayer::CollectFragments( PaintLayerFragments& fragments, const PaintLayer* root_layer, - const CullRect* cull_rect, + const CullRect* painting_cull_rect, OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior, ShouldRespectOverflowClipType respect_overflow_clip, const PhysicalOffset* offset_from_root, @@ -1794,58 +1794,64 @@ wtf_size_t physical_fragment_idx = 0u; for (auto* fragment_data = &first_fragment_data; fragment_data; fragment_data = fragment_data->NextFragment(), physical_fragment_idx++) { - const FragmentData* root_fragment_data; - if (root_layer == this) { - root_fragment_data = fragment_data; - } else if (should_match_fragments) { - for (root_fragment_data = &first_root_fragment_data; root_fragment_data; - root_fragment_data = root_fragment_data->NextFragment()) { - if (root_fragment_data->LogicalTopInFlowThread() == - fragment_data->LogicalTopInFlowThread()) - break; + // If CullRectUpdateEnabled, skip fragment geometry logic if we are + // collecting fragments for painting. + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled() || + !painting_cull_rect) { + const FragmentData* root_fragment_data; + if (root_layer == this) { + root_fragment_data = fragment_data; + } else if (should_match_fragments) { + for (root_fragment_data = &first_root_fragment_data; root_fragment_data; + root_fragment_data = root_fragment_data->NextFragment()) { + if (root_fragment_data->LogicalTopInFlowThread() == + fragment_data->LogicalTopInFlowThread()) + break; + } + } else { + root_fragment_data = &first_root_fragment_data; } - } else { - root_fragment_data = &first_root_fragment_data; + + bool cant_find_fragment = !root_fragment_data; + if (cant_find_fragment) { + DCHECK(should_match_fragments); + // Fall back to the first fragment, in order to have + // PaintLayerClipper at least compute |fragment.layer_bounds|. + root_fragment_data = &first_root_fragment_data; + } + + ClipRectsContext clip_rects_context( + root_layer, root_fragment_data, overlay_scrollbar_clip_behavior, + respect_overflow_clip, sub_pixel_accumulation); + + absl::optional<CullRect> fragment_cull_rect; + if (painting_cull_rect) { + // |cull_rect| is in the coordinate space of |root_layer| (i.e. the + // space of |root_layer|'s first fragment). Map the rect to the space of + // the current root fragment. + auto rect = painting_cull_rect->Rect(); + first_root_fragment_data.MapRectToFragment(*root_fragment_data, rect); + fragment_cull_rect.emplace(rect); + } + + Clipper(GeometryMapperOption::kUseGeometryMapper) + .CalculateRects( + clip_rects_context, fragment_data, + fragment_cull_rect ? &*fragment_cull_rect : nullptr, + fragment.layer_bounds, fragment.background_rect, + fragment.foreground_rect, + offset_from_root_can_be_used ? offset_from_root : nullptr); + + if (cant_find_fragment) { + // If we couldn't find a matching fragment when |should_match_fragments| + // was true, then fall back to no clip. + fragment.background_rect.Reset(); + fragment.foreground_rect.Reset(); + } + + fragment.root_fragment_data = root_fragment_data; } - bool cant_find_fragment = !root_fragment_data; - if (cant_find_fragment) { - DCHECK(should_match_fragments); - // Fall back to the first fragment, in order to have - // PaintLayerClipper at least compute |fragment.layer_bounds|. - root_fragment_data = &first_root_fragment_data; - } - - ClipRectsContext clip_rects_context( - root_layer, root_fragment_data, overlay_scrollbar_clip_behavior, - respect_overflow_clip, sub_pixel_accumulation); - - absl::optional<CullRect> fragment_cull_rect; - if (cull_rect) { - // |cull_rect| is in the coordinate space of |root_layer| (i.e. the - // space of |root_layer|'s first fragment). Map the rect to the space of - // the current root fragment. - auto rect = cull_rect->Rect(); - first_root_fragment_data.MapRectToFragment(*root_fragment_data, rect); - fragment_cull_rect.emplace(rect); - } - - Clipper(GeometryMapperOption::kUseGeometryMapper) - .CalculateRects( - clip_rects_context, fragment_data, - fragment_cull_rect ? &*fragment_cull_rect : nullptr, - fragment.layer_bounds, fragment.background_rect, - fragment.foreground_rect, - offset_from_root_can_be_used ? offset_from_root : nullptr); - - if (cant_find_fragment) { - // If we couldn't find a matching fragment when |should_match_fragments| - // was true, then fall back to no clip. - fragment.background_rect.Reset(); - fragment.foreground_rect.Reset(); - } - - fragment.root_fragment_data = root_fragment_data; fragment.fragment_data = fragment_data; if (GetLayoutObject().CanTraversePhysicalFragments()) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h index 9ec703a..debc59b38 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.h +++ b/third_party/blink/renderer/core/paint/paint_layer.h
@@ -1002,7 +1002,7 @@ void CollectFragments( PaintLayerFragments&, const PaintLayer* root_layer, - const CullRect* cull_rect, + const CullRect* painting_cull_rect, OverlayScrollbarClipBehavior = kIgnoreOverlayScrollbarSize, ShouldRespectOverflowClipType = kRespectOverflowClip, const PhysicalOffset* offset_from_root = nullptr,
diff --git a/third_party/blink/renderer/core/paint/paint_layer_fragment.h b/third_party/blink/renderer/core/paint/paint_layer_fragment.h index 9ffa07ab..ab911889 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_fragment.h +++ b/third_party/blink/renderer/core/paint/paint_layer_fragment.h
@@ -81,6 +81,7 @@ // Defines the coordinate space of the above rects: // root_fragment_data->LocalBorderBoxProperties().Transform() + // root_fragment_data.PaintOffset(). + // It's for legacy cull rect calculation (pre-CompositeAfterPaint) only. const FragmentData* root_fragment_data = nullptr; // The corresponding FragmentData of this structure.
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 34ef71b..d0fdd4a 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -458,17 +458,30 @@ if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { if (object.FirstFragment().NextFragment()) { result = kMayBeClippedByCullRect; - } else if (!object.FirstFragment().GetCullRect().Rect().Contains( - visual_rect)) { - result = kMayBeClippedByCullRect; - } else if (const auto* box = DynamicTo<LayoutBox>(object)) { - PhysicalRect contents_visual_rect = - box->PhysicalContentsVisualOverflowRect(); - contents_visual_rect.Move(object.FirstFragment().PaintOffset()); - if (!PhysicalRect(object.FirstFragment().GetContentsCullRect().Rect()) - .Contains(contents_visual_rect)) { + } else { + IntRect cull_rect = object.FirstFragment().GetCullRect().Rect(); + bool cull_rect_intersects_self = cull_rect.Intersects(visual_rect); + if (!cull_rect.Contains(visual_rect)) result = kMayBeClippedByCullRect; + + bool cull_rect_intersects_contents = true; + if (const auto* box = DynamicTo<LayoutBox>(object)) { + PhysicalRect contents_visual_rect = + box->PhysicalContentsVisualOverflowRect(); + contents_visual_rect.Move(object.FirstFragment().PaintOffset()); + PhysicalRect contents_cull_rect( + object.FirstFragment().GetContentsCullRect().Rect()); + cull_rect_intersects_contents = + contents_cull_rect.Intersects(contents_visual_rect); + if (!contents_cull_rect.Contains(contents_visual_rect)) + result = kMayBeClippedByCullRect; + } else { + cull_rect_intersects_contents = cull_rect_intersects_self; } + + if (!cull_rect_intersects_self && !cull_rect_intersects_contents) + should_paint_content = false; + // The above doesn't consider clips on non-self-painting contents. // Will update in ScopedBoxContentsPaintState. } @@ -485,25 +498,30 @@ if (should_paint_content || should_paint_self_outline || is_painting_overlay_overflow_controls) { - // Collect the fragments. This will compute the clip rectangles and paint - // offsets for each layer fragment. + // Collect the fragments. If CullRectUpdate is enabled, this will just + // create a light-weight adapter from FragmentData to PaintLayerFragment + // and we'll remove the adapter in the future. Otherwise this will compute + // the clip rectangles and paint offsets for each layer fragment. paint_layer_.CollectFragments( layer_fragments, local_painting_info.root_layer, &local_painting_info.cull_rect, kIgnoreOverlayScrollbarSize, respect_overflow_clip, &offset_from_root, local_painting_info.sub_pixel_accumulation); - // PaintLayer::CollectFragments depends on the paint dirty rect in - // complicated ways. For now, always assume a partially painted output - // for fragmented content. - if (layer_fragments.size() > 1) - result = kMayBeClippedByCullRect; - - if (should_paint_content) { - should_paint_content = AtLeastOneFragmentIntersectsDamageRect( - layer_fragments, local_painting_info, paint_flags, offset_from_root); - if (!should_paint_content) + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + // PaintLayer::CollectFragments depends on the paint dirty rect in + // complicated ways. For now, always assume a partially painted output + // for fragmented content. + if (layer_fragments.size() > 1) result = kMayBeClippedByCullRect; + + if (should_paint_content) { + should_paint_content = AtLeastOneFragmentIntersectsDamageRect( + layer_fragments, local_painting_info, paint_flags, + offset_from_root); + if (!should_paint_content) + result = kMayBeClippedByCullRect; + } } } @@ -623,6 +641,8 @@ const PaintLayerPaintingInfo& local_painting_info, PaintLayerFlags local_paint_flags, const PhysicalOffset& offset_from_root) { + DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); + if (&paint_layer_ == local_painting_info.root_layer && (local_paint_flags & kPaintLayerPaintingOverflowContents)) return true;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index 0c63efe..2b73990f 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -381,6 +381,7 @@ return kIncludeObject; // Anything with CSS alt should be included. + // Descendants are pruned: IsRelevantPseudoElementDescendant() returns false. // Note: this is duplicated from AXLayoutObject because CSS alt text may apply // to both Elements and pseudo-elements. absl::optional<String> alt_text = GetCSSAltText(GetNode()); @@ -482,7 +483,14 @@ return kDefaultBehavior; } +// static absl::optional<String> AXNodeObject::GetCSSAltText(const Node* node) { + // CSS alt text rules allow text to be assigned to ::before/::after content. + // For example, the following CSS assigns "bullet" text to bullet.png: + // .something::before { + // content: url(bullet.png) / "bullet"; + // } + if (!node || !node->GetComputedStyle() || node->GetComputedStyle()->ContentBehavesAsNormal()) { return absl::nullopt; @@ -718,18 +726,17 @@ return RoleFromLayoutObjectOrNode(); } - if (GetCSSAltText(GetNode())) { + if (GetNode()->IsPseudoElement() && GetCSSAltText(GetNode())) { const ComputedStyle* style = GetNode()->GetComputedStyle(); ContentData* content_data = style->GetContentData(); - // We just check the first item of the content list to determine the // appropriate role, should only ever be image or text. - // TODO(accessibility) Should it still be possible to use an ARIA role here? // TODO(accessibility) Is it possible to use CSS alt text on an HTML tag // with strong semantics? If so, why are we overriding the role here? // We only need to ensure the accessible name gets the CSS alt text. - // Note: by doing this, we are often hiding a child image, because - // CanHaveChildren() returns false for an image. + // Note: by doing this, we are often hiding child pseudo element content + // because IsRelevantPseudoElementDescendant() returns false when an + // ancestor has CSS alt text. if (content_data->IsImage()) return ax::mojom::blink::Role::kImage; @@ -2994,7 +3001,6 @@ AXObjectCache().GetAriaOwnedChildren(this, owned_children); // TODO(aleventhal) Why isn't this just using cached children? - AXNodeObject* parent = const_cast<AXNodeObject*>(this); for (Node* child = LayoutTreeBuilderTraversal::FirstChild(*node_); child; child = LayoutTreeBuilderTraversal::NextSibling(*child)) { auto* child_text_node = DynamicTo<Text>(child); @@ -3003,7 +3009,7 @@ // skip over empty text nodes continue; } - AXObject* child_obj = AXObjectCache().GetOrCreate(child, parent); + AXObject* child_obj = AXObjectCache().GetOrCreate(child); if (child_obj && !AXObjectCache().IsAriaOwned(child_obj)) children.push_back(child_obj); } @@ -3469,7 +3475,7 @@ AXObjectCache().GetOrCreate(primary_image_element); if (ax_primary_image && ax_primary_image->ChildCountIncludingIgnored() == 0 && - Traversal<HTMLAreaElement>::FirstWithin(*map)) { + NodeTraversal::FirstChild(*map)) { // The primary image still needs to add the area children, and there's at // least one to add. AXObjectCache().ChildrenChanged(primary_image_element); @@ -3478,28 +3484,24 @@ } // Yes, this is the primary image. - HTMLAreaElement* first_area = Traversal<HTMLAreaElement>::FirstWithin(*map); - if (first_area) { - // If the <area> children were part of a different parent, notify that - // parent that its children have changed. - if (AXObject* ax_preexisting = AXObjectCache().Get(first_area)) { - if (AXObject* ax_previous_parent = ax_preexisting->CachedParentObject()) { - if (ax_previous_parent != this) { - DCHECK(ax_previous_parent->GetNode()); - AXObjectCache().ChildrenChangedWithCleanLayout( - ax_previous_parent->GetNode(), ax_previous_parent); - ax_previous_parent->ClearChildren(); - } - } - } - // Add the area children to |this|. - for (HTMLAreaElement& area : - Traversal<HTMLAreaElement>::DescendantsOf(*map)) { - // Add an <area> element for this child if it has a link and is visible. - AddChildAndCheckIncluded(AXObjectCache().GetOrCreate(&area, this)); + // If the children were part of a different parent, notify that parent that + // its children have changed. + if (AXObject* ax_previous_parent = AXObjectCache().GetAXImageForMap(*map)) { + if (ax_previous_parent != this) { + DCHECK(ax_previous_parent->GetNode()); + AXObjectCache().ChildrenChangedWithCleanLayout( + ax_previous_parent->GetNode(), ax_previous_parent); + ax_previous_parent->ClearChildren(); } } + + // Add the children to |this|. + Node* child = LayoutTreeBuilderTraversal::FirstChild(*map); + while (child) { + AddChildAndCheckIncluded(AXObjectCache().GetOrCreate(child, this)); + child = LayoutTreeBuilderTraversal::NextSibling(*child); + } } void AXNodeObject::AddPopupChildren() { @@ -3741,11 +3743,6 @@ Node* child_node = child->GetNode(); - // An HTML image can only have area children. - DCHECK(!IsA<HTMLImageElement>(GetNode()) || IsA<HTMLAreaElement>(child_node)) - << "Image elements can only have area children, but this one has:\n" - << child->ToString(true, true); - // <area> children should only be added via AddImageMapChildren(), as the // children of an <image usemap>, and never alone or as children of a <map>. DCHECK(IsA<HTMLImageElement>(GetNode()) || !IsA<HTMLAreaElement>(child_node)) @@ -3905,9 +3902,6 @@ // Note: these can have AXInlineTextBox children, but when adding them, we // also check AXObjectCache().InlineTextBoxAccessibilityEnabled(). return true; - case ax::mojom::blink::Role::kImage: - // Can turn into an image map if gains children later. - return GetNode() && GetNode()->IsLink(); default: break; } @@ -3919,8 +3913,6 @@ return true; switch (AriaRoleAttribute()) { - case ax::mojom::blink::Role::kImage: - return false; case ax::mojom::blink::Role::kCheckBox: case ax::mojom::blink::Role::kListBoxOption: case ax::mojom::blink::Role::kMath: // role="math" is flat, unlike <math>
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h index abe50f67..2e4e353a 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -47,6 +47,9 @@ public: AXNodeObject(Node*, AXObjectCacheImpl&); ~AXNodeObject() override; + + static absl::optional<String> GetCSSAltText(const Node*); + void Trace(Visitor*) const override; protected: @@ -61,7 +64,6 @@ // The ARIA role, not taking the native role into account. ax::mojom::blink::Role aria_role_; - static absl::optional<String> GetCSSAltText(const Node*); AXObjectInclusion ShouldIncludeBasedOnSemantics( IgnoredReasons* = nullptr) const; bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const override;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 38b4dbe..f6623c21 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -56,6 +56,7 @@ #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" #include "third_party/blink/renderer/core/html/html_head_element.h" +#include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/html/html_script_element.h" #include "third_party/blink/renderer/core/html/html_slot_element.h" #include "third_party/blink/renderer/core/html/html_style_element.h" @@ -203,8 +204,13 @@ // Whenever null is returned from this function, then a parent cannot be // computed, and when a parent is not provided or computed, the accessible // object will not be created. - // TODO(aleventhal) Remove this method / inline, if proven to be this simple. - return LayoutTreeBuilderTraversal::Parent(*node); + Node* parent = LayoutTreeBuilderTraversal::Parent(*node); + HTMLMapElement* map_element = DynamicTo<HTMLMapElement>(parent); + if (!map_element) + return parent; + + // Special case, for a <map>, return the <img> associated with it. + return map_element->ImageElement(); } #if DCHECK_IS_ON() @@ -707,12 +713,13 @@ if (IsA<HTMLBRElement>(node)) return false; - // Image map parent-child relationships (from image to area) must be retrieved - // manually via AXImageMapLink::GetAXObjectForImageMap(). - if (IsA<HTMLMapElement>(node) || IsA<HTMLAreaElement>(node) || - IsA<HTMLImageElement>(node)) { + // Image map parent-child relationships work as follows: + // - The image is the parent + // - The DOM children of the ssociated <map> are the children + // This is accomplished by having GetParentNodeForComputeParent() return the + // <img> instead of the <map> for the map's children. + if (IsA<HTMLMapElement>(node)) return false; - } return true; } @@ -770,14 +777,6 @@ } } - // For <area>, return the image it is a child link of. - if (IsA<HTMLAreaElement>(current_node)) { - if (AXObject* ax_image = - AXImageMapLink::GetAXObjectForImageMap(cache, current_node)) { - return ax_image; - } - } - Node* parent_node = GetParentNodeForComputeParent(current_node); if (!parent_node) { // This occurs when a DOM child isn't visited by LayoutTreeBuilderTraversal, @@ -4260,7 +4259,8 @@ children_.clear(); - if (!GetNode()) + Node* node = GetNode(); + if (!node) return; if (GetDocument()->IsFlatTreeTraversalForbidden()) { @@ -4286,14 +4286,21 @@ // TODO(crbug.com/1209216): Figure out why removing this causes a // use-after-poison and possibly replace it with a better check. - HTMLSlotElement* slot = DynamicTo<HTMLSlotElement>(GetNode()); + HTMLSlotElement* slot = DynamicTo<HTMLSlotElement>(node); if (slot && slot->SupportsAssignment()) return; + if (auto* image = DynamicTo<HTMLImageElement>(node)) { + node = GetDocument()->GetImageMap( + image->FastGetAttribute(html_names::kUsemapAttr)); + if (!node) + return; + } + // Detach children that were not cleared from first loop. // These must have been an unincluded node who's parent is this, // although it may now be included since the children were last updated. - for (Node* child_node = LayoutTreeBuilderTraversal::FirstChild(*GetNode()); + for (Node* child_node = LayoutTreeBuilderTraversal::FirstChild(*node); child_node; child_node = LayoutTreeBuilderTraversal::NextSibling(*child_node)) { // Get the child object that should be detached from this parent.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 02882088..ddcff24 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -290,6 +290,12 @@ bool IsShadowContentRelevantForAccessibility(const Node* node) { DCHECK(node->ContainingShadowRoot()); + // Native <img> create extra child nodes to hold alt text. + if (node->IsInUserAgentShadowRoot() && + IsA<HTMLImageElement>(node->OwnerShadowHost())) { + return false; + } + // Don't use non-<option> descendants of an AXMenuList. // If the UseAXMenuList flag is on, we use a specialized class AXMenuList // for handling the user-agent shadow DOM exposed by a <select> element. @@ -809,11 +815,23 @@ } AXObject* AXObjectCacheImpl::GetAXImageForMap(HTMLMapElement& map) { - HTMLElement* first_area = Traversal<HTMLAreaElement>::FirstWithin(map); - AXObject* ax_child_area = Get(first_area); - if (!ax_child_area) - return nullptr; - return ax_child_area->CachedParentObject(); + // Find first child node of <map> that has an AXObject and return it's + // parent, which should be a native image. + Node* child = LayoutTreeBuilderTraversal::FirstChild(map); + while (child) { + if (AXObject* ax_child = Get(child)) { + if (AXObject* ax_image = ax_child->CachedParentObject()) { + DCHECK(!ax_image->IsDetached()); + DCHECK(IsA<HTMLImageElement>(ax_image->GetNode())) + << "Expected image AX parent of <map>'s DOM child, got: " + << ax_image->GetNode() << "\n* Map's DOM child was: " << child + << "\n* ax_image: " << ax_image->ToString(true, true); + return ax_image; + } + } + child = LayoutTreeBuilderTraversal::NextSibling(*child); + } + return nullptr; } AXObject* AXObjectCacheImpl::CreateFromRenderer(LayoutObject* layout_object) { @@ -925,8 +943,12 @@ ancestor = ancestor->Parent(); if (!ancestor) return false; - if (ancestor->IsPseudoElement()) + if (ancestor->IsPseudoElement()) { + // When an ancestor is exposed using CSS alt text, descendants are pruned. + if (AXNodeObject::GetCSSAltText(ancestor->GetNode())) + return false; return IsRelevantPseudoElement(*ancestor->GetNode()); + } if (!ancestor->IsAnonymous()) return false; } @@ -1767,41 +1789,6 @@ &AXObjectCacheImpl::UpdateCacheAfterNodeIsAttachedWithCleanLayout, node); } -bool AXObjectCacheImpl::IsStillInTree(AXObject* obj) { - // Return an AXObject for the node if the AXObject is still in the tree. - // If there is a viable included parent, that means it's still in the tree. - // Otherwise, repair missing parent, or prune the object if no viable parent - // can be found. For example, through CSS changes, an ancestor became an - // image, which is always a leaf; therefore, no descendants are "in the tree". - - if (!obj) - return false; - - if (obj->IsMissingParent()) { - // Parent is missing. Attempt to repair it with a viable recomputed parent. - AXObject* ax_parent = obj->ComputeParent(); - if (!IsStillInTree(ax_parent)) { - // Parent is unrepairable, meaning that this AXObject can no longer be - // attached to the tree and is no longer viable. Prune it now. - Remove(obj); - return false; - } - obj->SetParent(ax_parent); - return true; - } - - if (!obj->LastKnownIsIncludedInTreeValue()) { - // Current object was not included in the tree, therefore, recursively - // keep checking up a level until a viable included parent is found. - if (!IsStillInTree(obj->CachedParentObject())) { - Remove(obj); - return false; - } - } - - return true; -} - void AXObjectCacheImpl::UpdateCacheAfterNodeIsAttachedWithCleanLayout( Node* node) { if (!node || !node->isConnected()) @@ -1979,11 +1966,8 @@ << "Unclean document at lifecycle " << document->Lifecycle().ToString(); #endif // DCHECK_IS_ON() - if (obj) { - if (!IsStillInTree(obj)) - return; // Object is no longer in tree, and therefore not viable. + if (obj) obj->ChildrenChanged(); - } if (optional_node) relation_cache_->UpdateRelatedTree(optional_node, obj);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index d067b902..4677c4c7 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -289,6 +289,9 @@ void GetAriaOwnedChildren(const AXObject* owner, HeapVector<Member<AXObject>>& owned_children); + // Given a <map> element, get the image currently associated with it, if any. + AXObject* GetAXImageForMap(HTMLMapElement& map); + // Adds |object| to |fixed_or_sticky_node_ids_| if it has a fixed or sticky // position. void AddToFixedOrStickyNodeList(const AXObject* object); @@ -376,9 +379,6 @@ AXObject* CreateFromInlineTextBox(AbstractInlineTextBox*); void Remove(AXID); - // Given a <map> element, get the image currently associated with it, if any. - AXObject* GetAXImageForMap(HTMLMapElement& map); - private: struct AXEventParams final : public GarbageCollected<AXEventParams> { AXEventParams(AXObject* target,
diff --git a/third_party/blink/renderer/modules/breakout_box/BUILD.gn b/third_party/blink/renderer/modules/breakout_box/BUILD.gn index 0cededda..a53ecd6 100644 --- a/third_party/blink/renderer/modules/breakout_box/BUILD.gn +++ b/third_party/blink/renderer/modules/breakout_box/BUILD.gn
@@ -22,6 +22,8 @@ "media_stream_video_track_underlying_sink.h", "media_stream_video_track_underlying_source.cc", "media_stream_video_track_underlying_source.h", + "metrics.cc", + "metrics.h", "pushable_media_stream_audio_source.cc", "pushable_media_stream_audio_source.h", "pushable_media_stream_video_source.cc",
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.cc index 6f64374..902236b 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.cc
@@ -6,6 +6,8 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data.h" +#include "third_party/blink/renderer/core/streams/writable_stream_transferring_optimizer.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_audio_source.h" #include "third_party/blink/renderer/modules/webcodecs/audio_data.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -15,9 +17,22 @@ namespace blink { +namespace { +class PlaceholderTransferringOptimizer + : public WritableStreamTransferringOptimizer { + UnderlyingSinkBase* PerformInProcessOptimization( + ScriptState* script_state) override { + RecordBreakoutBoxUsage(BreakoutBoxUsage::kWritableAudioWorker); + return nullptr; + } +}; +} // namespace + MediaStreamAudioTrackUnderlyingSink::MediaStreamAudioTrackUnderlyingSink( PushableMediaStreamAudioSource* source) - : source_(source->GetWeakPtr()) {} + : source_(source->GetWeakPtr()) { + RecordBreakoutBoxUsage(BreakoutBoxUsage::kWritableAudio); +} ScriptPromise MediaStreamAudioTrackUnderlyingSink::start( ScriptState* script_state, @@ -74,4 +89,9 @@ return ScriptPromise::CastUndefined(script_state); } +std::unique_ptr<WritableStreamTransferringOptimizer> +MediaStreamAudioTrackUnderlyingSink::GetTransferringOptimizer() { + return std::make_unique<PlaceholderTransferringOptimizer>(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.h b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.h index 7ed1faf..4411d65b 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.h +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.h
@@ -13,6 +13,7 @@ class MediaStreamAudioSource; class PushableMediaStreamAudioSource; +class WritableStreamTransferringOptimizer; class MODULES_EXPORT MediaStreamAudioTrackUnderlyingSink : public UnderlyingSinkBase { @@ -35,6 +36,9 @@ ScriptPromise close(ScriptState* script_state, ExceptionState& exception_state) override; + std::unique_ptr<WritableStreamTransferringOptimizer> + GetTransferringOptimizer(); + private: base::WeakPtr<MediaStreamAudioSource> source_; };
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.cc index 5b3ac3c..218df8d 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.cc
@@ -5,11 +5,24 @@ #include "third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.h" #include "media/base/audio_buffer.h" +#include "third_party/blink/renderer/core/streams/readable_stream_transferring_optimizer.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h" #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h" namespace blink { +namespace { +class PlaceholderTransferringOptimizer + : public ReadableStreamTransferringOptimizer { + UnderlyingSourceBase* PerformInProcessOptimization( + ScriptState* script_state) override { + RecordBreakoutBoxUsage(BreakoutBoxUsage::kReadableAudioWorker); + return nullptr; + } +}; +} // namespace + MediaStreamAudioTrackUnderlyingSource::MediaStreamAudioTrackUnderlyingSource( ScriptState* script_state, MediaStreamComponent* track, @@ -19,6 +32,7 @@ media_stream_track_processor_(media_stream_track_processor), track_(track) { DCHECK(track_); + RecordBreakoutBoxUsage(BreakoutBoxUsage::kReadableAudio); } bool MediaStreamAudioTrackUnderlyingSource::StartFrameDelivery() { @@ -76,4 +90,9 @@ audio_parameters_ = params; } +std::unique_ptr<ReadableStreamTransferringOptimizer> +MediaStreamAudioTrackUnderlyingSource::GetTransferringOptimizer() { + return std::make_unique<PlaceholderTransferringOptimizer>(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.h b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.h index 283b8bc4..fb6ebe5 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.h +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source.h
@@ -14,6 +14,7 @@ namespace blink { class MediaStreamComponent; +class ReadableStreamTransferringOptimizer; class MODULES_EXPORT MediaStreamAudioTrackUnderlyingSource : public AudioDataQueueUnderlyingSource, @@ -39,6 +40,9 @@ MediaStreamComponent* Track() const { return track_.Get(); } + std::unique_ptr<ReadableStreamTransferringOptimizer> + GetTransferringOptimizer(); + void ContextDestroyed() override; void Trace(Visitor*) const override;
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc index 39a376ab..e3f6501 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/streams/readable_stream.h" #include "third_party/blink/renderer/core/streams/writable_stream.h" +#include "third_party/blink/renderer/core/streams/writable_stream_transferring_optimizer.h" #include "third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_sink.h" #include "third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_audio_source.h" @@ -206,7 +207,8 @@ video_underlying_sink_ = MakeGarbageCollected<MediaStreamVideoTrackUnderlyingSink>(source); writable_ = WritableStream::CreateWithCountQueueingStrategy( - script_state, video_underlying_sink_, /*high_water_mark=*/1); + script_state, video_underlying_sink_, /*high_water_mark=*/1, + video_underlying_sink_->GetTransferringOptimizer()); } void MediaStreamTrackGenerator::CreateAudioStream(ScriptState* script_state) { @@ -217,7 +219,8 @@ audio_underlying_sink_ = MakeGarbageCollected<MediaStreamAudioTrackUnderlyingSink>(source); writable_ = WritableStream::CreateWithCountQueueingStrategy( - script_state, audio_underlying_sink_, /*high_water_mark=*/1); + script_state, audio_underlying_sink_, /*high_water_mark=*/1, + audio_underlying_sink_->GetTransferringOptimizer()); } void MediaStreamTrackGenerator::CreateVideoControlStream(
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator_test.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator_test.cc index 8a1f05e0..2eefac01 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator_test.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator_test.cc
@@ -6,6 +6,7 @@ #include "base/run_loop.h" #include "base/test/gmock_callback_support.h" +#include "base/test/metrics/histogram_tester.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_track.h" #include "third_party/blink/public/web/web_heap.h" @@ -19,6 +20,7 @@ #include "third_party/blink/renderer/core/streams/writable_stream.h" #include "third_party/blink/renderer/core/streams/writable_stream_default_writer.h" #include "third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_video_source.h" #include "third_party/blink/renderer/modules/breakout_box/stream_test_utils.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h" @@ -73,6 +75,7 @@ }; TEST_F(MediaStreamTrackGeneratorTest, VideoFramesAreWritten) { + base::HistogramTester histogram_tester; V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); MediaStreamTrackGenerator* generator = MediaStreamTrackGenerator::Create( @@ -110,9 +113,13 @@ close_tester.WaitUntilSettled(); EXPECT_FALSE(exception_state.HadException()); EXPECT_TRUE(generator->Ended()); + histogram_tester.ExpectUniqueSample("Media.BreakoutBox.Usage", + BreakoutBoxUsage::kWritableVideo, 1); + histogram_tester.ExpectTotalCount("Media.BreakoutBox.Usage", 1); } TEST_F(MediaStreamTrackGeneratorTest, AudioDataAreWritten) { + base::HistogramTester histogram_tester; V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); MediaStreamTrackGenerator* generator = MediaStreamTrackGenerator::Create( @@ -153,9 +160,13 @@ WebMediaStreamAudioSink::RemoveFromAudioTrack( &media_stream_audio_sink, WebMediaStreamTrack(generator->Component())); + histogram_tester.ExpectUniqueSample("Media.BreakoutBox.Usage", + BreakoutBoxUsage::kWritableAudio, 1); + histogram_tester.ExpectTotalCount("Media.BreakoutBox.Usage", 1); } TEST_F(MediaStreamTrackGeneratorTest, SignalsAreRead) { + base::HistogramTester histogram_tester; V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); MediaStreamTrackGenerator* generator = MediaStreamTrackGenerator::Create( @@ -177,6 +188,9 @@ EXPECT_EQ(signal->signalType(), "set-min-frame-rate"); EXPECT_TRUE(signal->hasFrameRate()); EXPECT_EQ(signal->frameRate(), min_frame_rate); + histogram_tester.ExpectUniqueSample( + "Media.BreakoutBox.Usage", BreakoutBoxUsage::kReadableControlVideo, 1); + histogram_tester.ExpectTotalCount("Media.BreakoutBox.Usage", 1); } TEST_F(MediaStreamTrackGeneratorTest, FramesDoNotFlowOnStoppedGenerator) {
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc index f76567c..cc6e85c 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc
@@ -141,7 +141,9 @@ MakeGarbageCollected<MediaStreamAudioTrackUnderlyingSource>( script_state, input_track_->Component(), this, buffer_size_); source_stream_ = ReadableStream::CreateWithCountQueueingStrategy( - script_state, audio_underlying_source_, /*high_water_mark=*/0); + script_state, audio_underlying_source_, /*high_water_mark=*/0, + AllowPerChunkTransferring(false), + audio_underlying_source_->GetTransferringOptimizer()); } void MediaStreamTrackProcessor::CreateVideoControlStream(
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor_test.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor_test.cc index 1628772..701e159f 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor_test.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor_test.cc
@@ -6,6 +6,7 @@ #include "base/run_loop.h" #include "base/test/gmock_callback_support.h" +#include "base/test/metrics/histogram_tester.h" #include "media/base/video_frame.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" @@ -20,6 +21,7 @@ #include "third_party/blink/renderer/core/streams/writable_stream.h" #include "third_party/blink/renderer/core/streams/writable_stream_default_writer.h" #include "third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_audio_source.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_video_source.h" #include "third_party/blink/renderer/modules/breakout_box/stream_test_utils.h" @@ -118,6 +120,7 @@ }; TEST_F(MediaStreamTrackProcessorTest, VideoFramesAreExposed) { + base::HistogramTester histogram_tester; V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); @@ -163,9 +166,13 @@ sink_loop.Run(); EXPECT_EQ(mock_video_sink.number_of_frames(), 1); EXPECT_EQ(mock_video_sink.last_frame(), frame); + histogram_tester.ExpectUniqueSample("Media.BreakoutBox.Usage", + BreakoutBoxUsage::kReadableVideo, 1); + histogram_tester.ExpectTotalCount("Media.BreakoutBox.Usage", 1); } TEST_F(MediaStreamTrackProcessorTest, AudioDataAreExposed) { + base::HistogramTester histogram_tester; V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); @@ -211,9 +218,13 @@ WebMediaStreamAudioSink::RemoveFromAudioTrack(&mock_audio_sink, WebMediaStreamTrack(component)); + histogram_tester.ExpectUniqueSample("Media.BreakoutBox.Usage", + BreakoutBoxUsage::kReadableAudio, 1); + histogram_tester.ExpectTotalCount("Media.BreakoutBox.Usage", 1); } TEST_F(MediaStreamTrackProcessorTest, VideoControlSignalsAreForwarded) { + base::HistogramTester histogram_tester; V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); @@ -262,6 +273,9 @@ exception_state)); invalid_signal_tester.WaitUntilSettled(); EXPECT_TRUE(invalid_signal_tester.IsRejected()); + histogram_tester.ExpectUniqueSample( + "Media.BreakoutBox.Usage", BreakoutBoxUsage::kWritableControlVideo, 1); + histogram_tester.ExpectTotalCount("Media.BreakoutBox.Usage", 1); } TEST_F(MediaStreamTrackProcessorTest, AudioControlSignalsAreRejected) {
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.cc index 2024b8d..965f20a4 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.cc
@@ -5,14 +5,28 @@ #include "third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_frame.h" +#include "third_party/blink/renderer/core/streams/writable_stream_transferring_optimizer.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_video_source.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink { +namespace { +class PlaceholderTransferringOptimizer + : public WritableStreamTransferringOptimizer { + UnderlyingSinkBase* PerformInProcessOptimization( + ScriptState* script_state) override { + RecordBreakoutBoxUsage(BreakoutBoxUsage::kWritableVideoWorker); + return nullptr; + } +}; +} // namespace MediaStreamVideoTrackUnderlyingSink::MediaStreamVideoTrackUnderlyingSink( PushableMediaStreamVideoSource* source) - : source_(source->GetWeakPtr()) {} + : source_(source->GetWeakPtr()) { + RecordBreakoutBoxUsage(BreakoutBoxUsage::kWritableVideo); +} ScriptPromise MediaStreamVideoTrackUnderlyingSink::start( ScriptState* script_state, @@ -73,4 +87,9 @@ return ScriptPromise::CastUndefined(script_state); } +std::unique_ptr<WritableStreamTransferringOptimizer> +MediaStreamVideoTrackUnderlyingSink::GetTransferringOptimizer() { + return std::make_unique<PlaceholderTransferringOptimizer>(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.h b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.h index 210aae9..6a9d446 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.h +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_sink.h
@@ -12,6 +12,7 @@ class MediaStreamVideoSource; class PushableMediaStreamVideoSource; +class WritableStreamTransferringOptimizer; class MODULES_EXPORT MediaStreamVideoTrackUnderlyingSink : public UnderlyingSinkBase { @@ -33,6 +34,9 @@ ScriptPromise close(ScriptState* script_state, ExceptionState& exception_state) override; + std::unique_ptr<WritableStreamTransferringOptimizer> + GetTransferringOptimizer(); + private: base::WeakPtr<MediaStreamVideoSource> source_; };
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc index 6579b88..73906a5 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc
@@ -7,6 +7,7 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/breakout_box/frame_queue_transferring_optimizer.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" @@ -41,6 +42,7 @@ media_stream_track_processor_(media_stream_track_processor), track_(track) { DCHECK(track_); + RecordBreakoutBoxUsage(BreakoutBoxUsage::kReadableVideo); } void MediaStreamVideoTrackUnderlyingSource::Trace(Visitor* visitor) const { @@ -52,7 +54,6 @@ std::unique_ptr<ReadableStreamTransferringOptimizer> MediaStreamVideoTrackUnderlyingSource::GetStreamTransferOptimizer() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return std::make_unique<VideoFrameQueueTransferOptimizer>( this, GetRealmRunner(), MaxQueueSize(), CrossThreadBindOnce( @@ -91,6 +92,7 @@ WrapCrossThreadPersistent(source)), GetIOTaskRunner(), CrossThreadBindOnce(finalize_transfer, WrapCrossThreadPersistent(this))); + RecordBreakoutBoxUsage(BreakoutBoxUsage::kReadableVideoWorker); } void MediaStreamVideoTrackUnderlyingSource::OnFrameFromTrack(
diff --git a/third_party/blink/renderer/modules/breakout_box/metrics.cc b/third_party/blink/renderer/modules/breakout_box/metrics.cc new file mode 100644 index 0000000..9308d7dd --- /dev/null +++ b/third_party/blink/renderer/modules/breakout_box/metrics.cc
@@ -0,0 +1,14 @@ +// Copyright 2021 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 "third_party/blink/renderer/modules/breakout_box/metrics.h" +#include "base/metrics/histogram_functions.h" + +namespace blink { + +void RecordBreakoutBoxUsage(BreakoutBoxUsage usage) { + base::UmaHistogramEnumeration("Media.BreakoutBox.Usage", usage); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/breakout_box/metrics.h b/third_party/blink/renderer/modules/breakout_box/metrics.h new file mode 100644 index 0000000..6c211f7 --- /dev/null +++ b/third_party/blink/renderer/modules/breakout_box/metrics.h
@@ -0,0 +1,30 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BREAKOUT_BOX_METRICS_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_BREAKOUT_BOX_METRICS_H_ + +namespace blink { + +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class BreakoutBoxUsage { + kReadableVideo = 0, + kReadableVideoWorker = 1, + kReadableAudio = 2, + kReadableAudioWorker = 3, + kWritableVideo = 4, + kWritableVideoWorker = 5, + kWritableAudio = 6, + kWritableAudioWorker = 7, + kReadableControlVideo = 8, + kWritableControlVideo = 9, + kMaxValue = kWritableControlVideo, +}; + +void RecordBreakoutBoxUsage(BreakoutBoxUsage); + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_BREAKOUT_BOX_METRICS_H_
diff --git a/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_sink.cc b/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_sink.cc index d54757df..c645f04 100644 --- a/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_sink.cc +++ b/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_sink.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_track_signal.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_track_signal_type.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_video_source.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h" @@ -25,6 +26,8 @@ MediaStreamVideoSource::GetVideoSource(track->Component()->Source()); if (video_source) source_ = video_source->GetWeakPtr(); + + RecordBreakoutBoxUsage(BreakoutBoxUsage::kWritableControlVideo); } ScriptPromise VideoTrackSignalUnderlyingSink::start(
diff --git a/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_source.cc b/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_source.cc index d4ddbb4..eb7ed26 100644 --- a/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_source.cc +++ b/third_party/blink/renderer/modules/breakout_box/video_track_signal_underlying_source.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h" #include "third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.h" +#include "third_party/blink/renderer/modules/breakout_box/metrics.h" #include "third_party/blink/renderer/modules/breakout_box/pushable_media_stream_video_source.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_track.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h" @@ -32,6 +33,7 @@ generator_(generator), max_queue_size_(std::max(1u, max_queue_size)) { DCHECK(generator_); + RecordBreakoutBoxUsage(BreakoutBoxUsage::kReadableControlVideo); } ScriptPromise VideoTrackSignalUnderlyingSource::pull(
diff --git a/third_party/blink/renderer/modules/media/BUILD.gn b/third_party/blink/renderer/modules/media/BUILD.gn index 9f8410f4..a9855be 100644 --- a/third_party/blink/renderer/modules/media/BUILD.gn +++ b/third_party/blink/renderer/modules/media/BUILD.gn
@@ -20,7 +20,10 @@ "webmediaplayer_util.cc", ] - deps = [ "//build:chromeos_buildflags" ] + deps = [ + "//build:chromeos_buildflags", + "//media/mojo/common", + ] if (is_fuchsia) { sources += [ "audio/fuchsia_audio_device_factory.cc" ]
diff --git a/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc.cc b/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc.cc index f024d09..c44bb4a 100644 --- a/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc.cc +++ b/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc.cc
@@ -10,6 +10,7 @@ #include "base/callback_helpers.h" #include "base/metrics/histogram_macros.h" #include "media/audio/audio_device_description.h" +#include "media/mojo/common/input_error_code_converter.h" #include "media/mojo/mojom/audio_data_pipe.mojom-blink.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -117,7 +118,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(delegate_); - delegate_->OnError(); + delegate_->OnError(media::ConvertToCaptureCallbackCode(code)); } void MojoAudioInputIPC::OnMutedStateChanged(bool is_muted) {
diff --git a/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc_test.cc b/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc_test.cc index cf0cc55..d4e9d25 100644 --- a/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc_test.cc +++ b/third_party/blink/renderer/modules/media/audio/mojo_audio_input_ipc_test.cc
@@ -68,7 +68,7 @@ } MOCK_METHOD1(GotOnStreamCreated, void(bool initially_muted)); - MOCK_METHOD0(OnError, void()); + MOCK_METHOD1(OnError, void(media::AudioCapturerSource::ErrorCode)); MOCK_METHOD1(OnMuted, void(bool)); MOCK_METHOD0(OnIPCClosed, void()); }; @@ -173,7 +173,8 @@ bool automatic_gain_control, uint32_t total_segments) {}), base::BindRepeating(&AssociateOutputForAec)); - EXPECT_CALL(delegate, OnError()); + EXPECT_CALL(delegate, + OnError(media::AudioCapturerSource::ErrorCode::kUnknown)); ipc->CreateStream(&delegate, Params(), false, kTotalSegments); base::RunLoop().RunUntilIdle(); @@ -244,7 +245,8 @@ base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(&delegate); - EXPECT_CALL(delegate, OnError()); + EXPECT_CALL(delegate, + OnError(media::AudioCapturerSource::ErrorCode::kUnknown)); creator.SignalError(); base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(&delegate);
diff --git a/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc b/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc index a8b3db7..0bf0c1f 100644 --- a/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc +++ b/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.cc
@@ -119,8 +119,13 @@ DeliverDataToTracks(*audio_bus, audio_capture_time); } -void LocalMediaStreamAudioSource::OnCaptureError(const std::string& why) { - WebRtcLogMessage("LocalMediaStreamAudioSource::OnCaptureError: " + why); +void LocalMediaStreamAudioSource::OnCaptureError( + media::AudioCapturerSource::ErrorCode code, + const std::string& why) { + WebRtcLogMessage( + base::StringPrintf("LocalMediaStreamAudioSource::OnCaptureError: %d, %s", + code, why.c_str())); + StopSourceOnError(why); }
diff --git a/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.h b/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.h index f809d6b..c30fd4b 100644 --- a/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.h +++ b/third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.h
@@ -58,7 +58,8 @@ base::TimeTicks audio_capture_time, double volume, bool key_pressed) final; - void OnCaptureError(const std::string& message) final; + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) final; void OnCaptureMuted(bool is_muted) final; // The LocalFrame that will consume the audio data. Used when creating
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc index 91e09b1..5180df8 100644 --- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc +++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc
@@ -483,9 +483,11 @@ } } -void ProcessedLocalAudioSource::OnCaptureError(const std::string& message) { - SendLogMessageWithSessionId( - base::StringPrintf("OnCaptureError({message=%s})", message.c_str())); +void ProcessedLocalAudioSource::OnCaptureError( + media::AudioCapturerSource::ErrorCode code, + const std::string& message) { + SendLogMessageWithSessionId(base::StringPrintf( + "OnCaptureError({code=%d, message=%s})", code, message.c_str())); StopSourceOnError(message); }
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h index 96ca3bdd..311a4c1 100644 --- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h +++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h
@@ -108,7 +108,8 @@ base::TimeTicks audio_capture_time, double volume, bool key_pressed) override; - void OnCaptureError(const std::string& message) override; + void OnCaptureError(media::AudioCapturerSource::ErrorCode code, + const std::string& message) override; void OnCaptureMuted(bool is_muted) override; void OnCaptureProcessorCreated( media::AudioProcessorControls* controls) override;
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc index 29685c2..f14f72ae 100644 --- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc +++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
@@ -815,6 +815,14 @@ if (!decoder_) return false; + // For simplicity, use a hardcoded maxThreads of 2, independent of the image + // size and processor count. Note: even if we want maxThreads to depend on + // the image size, it is impossible to do so because maxThreads is passed to + // dav1d_open() inside avifDecoderParse(), but the image size is not known + // until avifDecoderParse() returns successfully. See + // https://github.com/AOMediaCodec/libavif/issues/636. + decoder_->maxThreads = 2; + // TODO(wtc): Currently libavif always prioritizes the animation, but that's // not correct. It should instead select animation or still image based on // the preferred and major brands listed in the file. @@ -998,10 +1006,12 @@ int clap_height; if (!ValidateClapProperty(container, clap_width, clap_height, clap_leftmost_, clap_topmost_)) { - return false; + DVLOG(1) << "Ignore the 'clap' property and show the full image"; + ignore_clap_ = true; + } else { + width = clap_width; + height = clap_height; } - width = clap_width; - height = clap_height; } return SetSize(width, height); } @@ -1034,7 +1044,7 @@ } decoded_image_ = image; - if (image->transformFlags & AVIF_TRANSFORM_CLAP) + if ((image->transformFlags & AVIF_TRANSFORM_CLAP) && !ignore_clap_) CropDecodedImage(); return AVIF_RESULT_OK; }
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h index 611a33b7..04320ac 100644 --- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h +++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.h
@@ -120,6 +120,9 @@ avifPixelFormat avif_yuv_format_ = AVIF_PIXEL_FORMAT_NONE; size_t decoded_frame_count_ = 0; SkYUVColorSpace yuv_color_space_ = SkYUVColorSpace::kIdentity_SkYUVColorSpace; + // Whether the 'clap' (clean aperture) property should be ignored, e.g. + // because the 'clap' property is invalid or unsupported. + bool ignore_clap_ = false; // The leftmost pixel and topmost line of the clean aperture. Used only when // the image has a 'clap' (clean aperture) property. int clap_leftmost_ = 0;
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc index 5b1511c..8a72a545 100644 --- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc +++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder_test.cc
@@ -897,6 +897,54 @@ EXPECT_TRUE(decoder->IsSizeAvailable()); } +// Verifies that an invalid 'clap' (clean aperture) image property is handled by +// ignoring the 'clap' property and showing the full image. +TEST(StaticAVIFTests, InvalidClapPropertyHandling) { + // The first image has a valid 'clap' property. The full image has size + // 320x280. The clean aperture has size 180x100, located at (40, 80) of the + // full image. + constexpr int kClapX = 40; + constexpr int kClapY = 80; + constexpr int kClapWidth = 180; + constexpr int kClapHeight = 100; + std::unique_ptr<ImageDecoder> decoder1 = CreateAVIFDecoder(); + decoder1->SetData( + ReadFile("/images/resources/avif/blue-and-magenta-crop.avif"), true); + ASSERT_TRUE(decoder1->IsSizeAvailable()); + IntSize size1 = decoder1->Size(); + ASSERT_EQ(size1.Width(), kClapWidth); + ASSERT_EQ(size1.Height(), kClapHeight); + ImageFrame* frame1 = decoder1->DecodeFrameBufferAtIndex(0); + ASSERT_TRUE(frame1); + EXPECT_EQ(ImageFrame::kFrameComplete, frame1->GetStatus()); + EXPECT_FALSE(decoder1->Failed()); + const SkBitmap& bitmap1 = frame1->Bitmap(); + + // The second image is the same as the first image except that the 'clap' + // property is invalid. In this case the full image is shown. + std::unique_ptr<ImageDecoder> decoder2 = CreateAVIFDecoder(); + decoder2->SetData( + ReadFile("/images/resources/avif/blue-and-magenta-crop-invalid.avif"), + true); + ASSERT_TRUE(decoder2->IsSizeAvailable()); + IntSize size2 = decoder2->Size(); + ASSERT_EQ(size2.Width(), 320); + ASSERT_EQ(size2.Height(), 280); + ImageFrame* frame2 = decoder2->DecodeFrameBufferAtIndex(0); + ASSERT_TRUE(frame2); + EXPECT_EQ(ImageFrame::kFrameComplete, frame2->GetStatus()); + EXPECT_FALSE(decoder2->Failed()); + const SkBitmap& bitmap2 = frame2->Bitmap(); + + // Compare pixel data. + for (int row = 0; row < kClapHeight; ++row) { + for (int col = 0; col < kClapWidth; ++col) { + EXPECT_EQ(bitmap1.getColor(/*x=*/col, /*y=*/row), + bitmap2.getColor(/*x=*/kClapX + col, /*y=*/kClapY + row)); + } + } +} + using StaticAVIFColorTests = ::testing::TestWithParam<StaticColorCheckParam>; INSTANTIATE_TEST_CASE_P(Parameterized,
diff --git a/third_party/blink/renderer/platform/scheduler/BUILD.gn b/third_party/blink/renderer/platform/scheduler/BUILD.gn index 9b65415..c833fdc7 100644 --- a/third_party/blink/renderer/platform/scheduler/BUILD.gn +++ b/third_party/blink/renderer/platform/scheduler/BUILD.gn
@@ -59,6 +59,7 @@ "common/unprioritized_resource_loading_task_runner_handle.cc", "common/unprioritized_resource_loading_task_runner_handle.h", "common/web_resource_loading_task_runner_handle.cc", + "common/web_scheduling_priority.cc", "common/web_thread_scheduler.cc", "common/worker_pool.cc", "main_thread/agent_group_scheduler_impl.cc", @@ -93,6 +94,8 @@ "main_thread/main_thread_scheduler_impl.h", "main_thread/main_thread_task_queue.cc", "main_thread/main_thread_task_queue.h", + "main_thread/main_thread_web_scheduling_task_queue_impl.cc", + "main_thread/main_thread_web_scheduling_task_queue_impl.h", "main_thread/memory_purge_manager.cc", "main_thread/memory_purge_manager.h", "main_thread/non_waking_time_domain.cc", @@ -113,9 +116,6 @@ "main_thread/user_model.cc", "main_thread/user_model.h", "main_thread/web_render_widget_scheduling_state.cc", - "main_thread/web_scheduling_priority.cc", - "main_thread/web_scheduling_task_queue_impl.cc", - "main_thread/web_scheduling_task_queue_impl.h", "main_thread/web_scoped_virtual_time_pauser.cc", "main_thread/widget_scheduler.cc", "main_thread/widget_scheduler.h", @@ -154,6 +154,8 @@ "worker/non_main_thread_scheduler_impl.h", "worker/non_main_thread_task_queue.cc", "worker/non_main_thread_task_queue.h", + "worker/non_main_thread_web_scheduling_task_queue_impl.cc", + "worker/non_main_thread_web_scheduling_task_queue_impl.h", "worker/worker_metrics_helper.cc", "worker/worker_metrics_helper.h", "worker/worker_scheduler.cc",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_priority.cc b/third_party/blink/renderer/platform/scheduler/common/web_scheduling_priority.cc similarity index 100% rename from third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_priority.cc rename to third_party/blink/renderer/platform/scheduler/common/web_scheduling_priority.cc
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc index 99e62ba0..080e1ea 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -30,11 +30,11 @@ #include "third_party/blink/renderer/platform/scheduler/main_thread/auto_advancing_virtual_time_domain.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/find_in_page_budget_pool_controller.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/page_visibility_state.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/resource_loading_task_runner_handle_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/task_type_names.h" -#include "third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.h" #include "third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value.h" @@ -1347,7 +1347,8 @@ scoped_refptr<MainThreadTaskQueue> task_queue = frame_task_queue_controller_->NewWebSchedulingTaskQueue( PausableTaskQueueTraits(), priority); - return std::make_unique<WebSchedulingTaskQueueImpl>(task_queue->AsWeakPtr()); + return std::make_unique<MainThreadWebSchedulingTaskQueueImpl>( + task_queue->AsWeakPtr()); } void FrameSchedulerImpl::OnWebSchedulingTaskQueuePriorityChanged(
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc index 00f4fd3..a0f7379 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
@@ -14,7 +14,6 @@ #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h" -#include "third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.h" #include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_priority.h" #include "third_party/blink/renderer/platform/wtf/vector.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value.h" @@ -69,7 +68,7 @@ QueueTraits queue_traits, WebSchedulingPriority priority) { // Note: we only track this |task_queue| in |all_task_queues_and_voters_|. - // It's interacted with through the WebSchedulingTaskQueueImpl that + // It's interacted with through the MainThreadWebSchedulingTaskQueueImpl that // will wrap it, rather than through this class like other task queues. scoped_refptr<MainThreadTaskQueue> task_queue = main_thread_scheduler_impl_->NewTaskQueue(
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.cc similarity index 74% rename from third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.cc rename to third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.cc index 30b6e4b4..0474a99 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h" @@ -10,19 +10,20 @@ namespace blink { namespace scheduler { -WebSchedulingTaskQueueImpl::WebSchedulingTaskQueueImpl( +MainThreadWebSchedulingTaskQueueImpl::MainThreadWebSchedulingTaskQueueImpl( base::WeakPtr<MainThreadTaskQueue> task_queue) : task_runner_( task_queue->CreateTaskRunner(TaskType::kExperimentalWebScheduling)), task_queue_(std::move(task_queue)) {} -void WebSchedulingTaskQueueImpl::SetPriority(WebSchedulingPriority priority) { +void MainThreadWebSchedulingTaskQueueImpl::SetPriority( + WebSchedulingPriority priority) { if (task_queue_) task_queue_->SetWebSchedulingPriority(priority); } scoped_refptr<base::SingleThreadTaskRunner> -WebSchedulingTaskQueueImpl::GetTaskRunner() { +MainThreadWebSchedulingTaskQueueImpl::GetTaskRunner() { return task_runner_; }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.h similarity index 77% rename from third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.h rename to third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.h index a4da9eaf..6b572faa 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/web_scheduling_task_queue_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ #include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_task_queue.h" @@ -18,11 +18,11 @@ class MainThreadTaskQueue; -class PLATFORM_EXPORT WebSchedulingTaskQueueImpl +class PLATFORM_EXPORT MainThreadWebSchedulingTaskQueueImpl : public WebSchedulingTaskQueue { public: - WebSchedulingTaskQueueImpl(base::WeakPtr<MainThreadTaskQueue>); - ~WebSchedulingTaskQueueImpl() override = default; + MainThreadWebSchedulingTaskQueueImpl(base::WeakPtr<MainThreadTaskQueue>); + ~MainThreadWebSchedulingTaskQueueImpl() override = default; void SetPriority(WebSchedulingPriority) override; @@ -36,4 +36,4 @@ } // namespace scheduler } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_
diff --git a/third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h index 8b7cf12..5df75545 100644 --- a/third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h
@@ -10,11 +10,13 @@ #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/scheduler/public/scheduling_lifecycle_state.h" #include "third_party/blink/renderer/platform/scheduler/public/scheduling_policy.h" +#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_priority.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" namespace blink { class FrameScheduler; +class WebSchedulingTaskQueue; // This is the base class of FrameScheduler and WorkerScheduler. class PLATFORM_EXPORT FrameOrWorkerScheduler { @@ -118,6 +120,9 @@ Observer*) WARN_UNUSED_RESULT; + virtual std::unique_ptr<WebSchedulingTaskQueue> CreateWebSchedulingTaskQueue( + WebSchedulingPriority) = 0; + virtual FrameScheduler* ToFrameScheduler() { return nullptr; } base::WeakPtr<FrameOrWorkerScheduler> GetWeakPtr();
diff --git a/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h index ffba694..4290034 100644 --- a/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h
@@ -17,7 +17,6 @@ #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h" -#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_priority.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -32,7 +31,6 @@ } // namespace scheduler class PageScheduler; -class WebSchedulingTaskQueue; class FrameScheduler : public FrameOrWorkerScheduler { public: @@ -130,9 +128,6 @@ virtual std::unique_ptr<scheduler::WebResourceLoadingTaskRunnerHandle> CreateResourceLoadingMaybeUnfreezableTaskRunnerHandle() = 0; - virtual std::unique_ptr<WebSchedulingTaskQueue> CreateWebSchedulingTaskQueue( - WebSchedulingPriority) = 0; - // Returns the parent PageScheduler. virtual PageScheduler* GetPageScheduler() const = 0;
diff --git a/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h index c422103..541ff1a 100644 --- a/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h
@@ -69,6 +69,8 @@ // FrameOrWorkerScheduler implementation: void SetPreemptedForCooperativeScheduling(Preempted) override {} + std::unique_ptr<WebSchedulingTaskQueue> CreateWebSchedulingTaskQueue( + WebSchedulingPriority) override; protected: scoped_refptr<NonMainThreadTaskQueue> ThrottleableTaskQueue();
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc index 0659860..28e4328d 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.cc
@@ -38,5 +38,28 @@ } } +void NonMainThreadTaskQueue::SetWebSchedulingPriority( + WebSchedulingPriority priority) { + if (web_scheduling_priority_ == priority) + return; + web_scheduling_priority_ = priority; + OnWebSchedulingPriorityChanged(); +} + +void NonMainThreadTaskQueue::OnWebSchedulingPriorityChanged() { + DCHECK(web_scheduling_priority_); + switch (web_scheduling_priority_.value()) { + case WebSchedulingPriority::kUserBlockingPriority: + SetQueuePriority(TaskQueue::QueuePriority::kHighPriority); + return; + case WebSchedulingPriority::kUserVisiblePriority: + SetQueuePriority(TaskQueue::QueuePriority::kNormalPriority); + return; + case WebSchedulingPriority::kBackgroundPriority: + SetQueuePriority(TaskQueue::QueuePriority::kLowPriority); + return; + } +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h index 12b2553..7baa97c3 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h
@@ -6,8 +6,10 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_NON_MAIN_THREAD_TASK_QUEUE_H_ #include "base/task/sequence_manager/task_queue_impl.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_priority.h" namespace blink { namespace scheduler { @@ -43,9 +45,17 @@ return task_runner(); } + void SetWebSchedulingPriority(WebSchedulingPriority priority); + private: + void OnWebSchedulingPriorityChanged(); + // Not owned. NonMainThreadSchedulerImpl* non_main_thread_scheduler_; + + // |web_scheduling_priority_| is the priority of the task queue within the web + // scheduling API. This priority is used to determine the task queue priority. + absl::optional<WebSchedulingPriority> web_scheduling_priority_; }; } // namespace scheduler
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.cc new file mode 100644 index 0000000..cc6320b --- /dev/null +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.cc
@@ -0,0 +1,31 @@ +// Copyright 2021 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 "third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.h" + +#include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/platform/scheduler/worker/non_main_thread_task_queue.h" + +namespace blink { +namespace scheduler { + +NonMainThreadWebSchedulingTaskQueueImpl:: + NonMainThreadWebSchedulingTaskQueueImpl( + scoped_refptr<NonMainThreadTaskQueue> task_queue) + : task_runner_( + task_queue->CreateTaskRunner(TaskType::kExperimentalWebScheduling)), + task_queue_(std::move(task_queue)) {} + +void NonMainThreadWebSchedulingTaskQueueImpl::SetPriority( + WebSchedulingPriority priority) { + task_queue_->SetWebSchedulingPriority(priority); +} + +scoped_refptr<base::SingleThreadTaskRunner> +NonMainThreadWebSchedulingTaskQueueImpl::GetTaskRunner() { + return task_runner_; +} + +} // namespace scheduler +} // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.h new file mode 100644 index 0000000..bd4e705 --- /dev/null +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.h
@@ -0,0 +1,42 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_NON_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_NON_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_ + +#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_task_queue.h" + +#include "base/memory/scoped_refptr.h" +#include "base/single_thread_task_runner.h" +#include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_priority.h" + +namespace blink { +namespace scheduler { + +class NonMainThreadTaskQueue; + +class PLATFORM_EXPORT NonMainThreadWebSchedulingTaskQueueImpl + : public WebSchedulingTaskQueue { + public: + explicit NonMainThreadWebSchedulingTaskQueueImpl( + scoped_refptr<NonMainThreadTaskQueue>); + ~NonMainThreadWebSchedulingTaskQueueImpl() override = default; + + void SetPriority(WebSchedulingPriority) override; + + scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override; + + private: + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + + // NonMainThreadWebSchedulingTaskQueueImpl owns this NonMainThreadTaskQueue + // and has the sole reference to it after its creation. + const scoped_refptr<NonMainThreadTaskQueue> task_queue_; +}; + +} // namespace scheduler +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_NON_MAIN_THREAD_WEB_SCHEDULING_TASK_QUEUE_IMPL_H_
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc index c55346e9..494ff34 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/platform/back_forward_cache_utils.h" #include "third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h" #include "third_party/blink/renderer/platform/scheduler/common/throttling/wake_up_budget_pool.h" +#include "third_party/blink/renderer/platform/scheduler/worker/non_main_thread_web_scheduling_task_queue_impl.h" #include "third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h" #include "third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h" @@ -264,5 +265,14 @@ void WorkerScheduler::OnStoppedUsingFeature(SchedulingPolicy::Feature feature, const SchedulingPolicy& policy) {} +std::unique_ptr<WebSchedulingTaskQueue> +WorkerScheduler::CreateWebSchedulingTaskQueue(WebSchedulingPriority priority) { + scoped_refptr<NonMainThreadTaskQueue> task_queue = + thread_scheduler_->CreateTaskQueue("worker_web_scheduling_tq"); + task_queue->SetWebSchedulingPriority(priority); + return std::make_unique<NonMainThreadWebSchedulingTaskQueueImpl>( + std::move(task_queue)); +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc index 932a3418..e839905 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc
@@ -13,6 +13,8 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h" +#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_priority.h" +#include "third_party/blink/renderer/platform/scheduler/public/web_scheduling_task_queue.h" #include "third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -315,6 +317,83 @@ EXPECT_THAT(run_order, testing::ElementsAre("T1", "T2")); } +class NonMainThreadWebSchedulingTaskQueueTest : public WorkerSchedulerTest { + public: + void SetUp() override { + WorkerSchedulerTest::SetUp(); + + for (int i = 0; i <= static_cast<int>(WebSchedulingPriority::kLastPriority); + i++) { + WebSchedulingPriority priority = static_cast<WebSchedulingPriority>(i); + std::unique_ptr<WebSchedulingTaskQueue> task_queue = + worker_scheduler_->CreateWebSchedulingTaskQueue(priority); + task_queues_.push_back(std::move(task_queue)); + } + } + + void TearDown() override { + WorkerSchedulerTest::TearDown(); + task_queues_.clear(); + } + + protected: + // Helper for posting tasks to a WebSchedulingTaskQueue. |task_descriptor| is + // a string with space delimited task identifiers. The first letter of each + // task identifier specifies the task queue priority: + // - 'U': UserBlocking + // - 'V': UserVisible + // - 'B': Background + void PostWebSchedulingTestTasks(Vector<String>* run_order, + const String& task_descriptor) { + std::istringstream stream(task_descriptor.Utf8()); + while (!stream.eof()) { + std::string task; + stream >> task; + WebSchedulingPriority priority; + switch (task[0]) { + case 'U': + priority = WebSchedulingPriority::kUserBlockingPriority; + break; + case 'V': + priority = WebSchedulingPriority::kUserVisiblePriority; + break; + case 'B': + priority = WebSchedulingPriority::kBackgroundPriority; + break; + default: + EXPECT_FALSE(true); + return; + } + task_queues_[static_cast<int>(priority)]->GetTaskRunner()->PostTask( + FROM_HERE, base::BindOnce(&AppendToVectorTestTask, run_order, + String::FromUTF8(task))); + } + } + Vector<std::unique_ptr<WebSchedulingTaskQueue>> task_queues_; +}; + +TEST_F(NonMainThreadWebSchedulingTaskQueueTest, TasksRunInPriorityOrder) { + Vector<String> run_order; + + PostWebSchedulingTestTasks(&run_order, "B1 B2 V1 V2 U1 U2"); + + RunUntilIdle(); + EXPECT_THAT(run_order, + testing::ElementsAre("U1", "U2", "V1", "V2", "B1", "B2")); +} + +TEST_F(NonMainThreadWebSchedulingTaskQueueTest, DynamicTaskPriorityOrder) { + Vector<String> run_order; + + PostWebSchedulingTestTasks(&run_order, "B1 B2 V1 V2 U1 U2"); + task_queues_[static_cast<int>(WebSchedulingPriority::kUserBlockingPriority)] + ->SetPriority(WebSchedulingPriority::kBackgroundPriority); + + RunUntilIdle(); + EXPECT_THAT(run_order, + testing::ElementsAre("V1", "V2", "B1", "B2", "U1", "U2")); +} + } // namespace worker_scheduler_unittest } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index e78c157..f6a38a0 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1449,7 +1449,7 @@ crbug.com/876732 [ Win ] fast/dom/HTMLImageElement/image-srcset-w-onerror.html [ Failure Pass ] # These tests only pass with --enable-threaded-compositing. -crbug.com/770028 external/wpt/dom/events/document-level-touchmove-event-listener-passive-by-default.html [ Failure ] +crbug.com/770028 external/wpt/dom/events/document-level-touchmove-event-listener-passive-by-default.tentative.html [ Failure ] # Only virtual/threaded version of these tests pass (or running them with --enable-threaded-compositing). crbug.com/936891 fast/scrolling/document-level-touchmove-event-listener-passive-by-default.html [ Failure ] @@ -2492,6 +2492,182 @@ crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/css/css-contain/contain-body-overflow-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-dir-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-overflow-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-dir-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCSctpTransport-maxChannels.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCSctpTransport-maxChannels.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/getstats.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/getstats.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/simulcast/basic.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/simulcast/basic.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCPeerConnection-ondatachannel.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-ondatachannel.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-dir-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-bg-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-bg-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-send.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-send.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-bg-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/simplecall.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/simplecall.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-bg-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/protocol/rtp-clockrate.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/rtp-clockrate.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc-extensions/RTCRtpSynchronizationSource-captureTimestamp.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-extensions/RTCRtpSynchronizationSource-captureTimestamp.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-overflow-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-overflow-001.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-bg-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-overflow-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-track-stats.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-track-stats.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCSctpTransport-events.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCSctpTransport-events.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-bg-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/getstats.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/getstats.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-overflow-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-dir-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDataChannel-send.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDataChannel-send.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-w-m-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-w-m-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-w-m-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/simulcast/getStats.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/simulcast/getStats.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDataChannel-iceRestart.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDataChannel-iceRestart.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-w-m-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-dir-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-overflow-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-bg-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-dir-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-w-m-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-w-m-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-overflow-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCPeerConnection-createDataChannel.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-createDataChannel.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-legacy.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-legacy.https.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-bg-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-w-m-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-dir-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-overflow-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-overflow-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-bg-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-dir-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-dir-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCPeerConnection-videoDetectorTest.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-videoDetectorTest.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-overflow-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-bg-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-w-m-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-bg-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-overflow-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-dir-004.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/simulcast/h264.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/simulcast/h264.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/protocol/dtls-fingerprint-validation.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/dtls-fingerprint-validation.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-overflow-004.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc-encoded-transform/RTCEncodedAudioFrame-serviceworker-failure.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/RTCEncodedAudioFrame-serviceworker-failure.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCPeerConnection-track-stats.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCPeerConnection-track-stats.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDataChannel-send-blob-order.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDataChannel-send-blob-order.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/protocol/ice-state.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/ice-state.https.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-w-m-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-bg-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-w-m-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-videoDetectorTest.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-videoDetectorTest.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDataChannel-bufferedAmount.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDataChannel-bufferedAmount.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-dir-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-dir-001.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-w-m-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-dir-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-bg-003.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-overflow-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-dir-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-w-m-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-iceConnectionState-disconnected.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-bg-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-bg-001.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc-stats/getStats-remote-candidate-address.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-stats/getStats-remote-candidate-address.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-bg-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-w-m-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-overflow-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-w-m-004.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-iceRestart.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-iceRestart.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-bg-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-w-m-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-dir-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDtlsTransport-state.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDtlsTransport-state.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-bg-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-w-m-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-bg-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-overflow-004.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-overflow-002.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-dir-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCIceTransport.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCIceTransport.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-w-m-004.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/ice-state.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/ice-state.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-w-m-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-w-m-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-w-m-001.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-bg-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-bg-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-overflow-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-overflow-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-bg-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-dir-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-overflow-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-bg-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-dir-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-overflow-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-bg-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-dir-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-html-overflow-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-w-m-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/rtp-clockrate.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/protocol/rtp-clockrate.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-overflow-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-w-m-004.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-html-w-m-003.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-dir-003.html [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/simplecall.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/simplecall.https.html [ Timeout ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Timeout ] +crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Timeout ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-html-dir-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-dir-004.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-overflow-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-contain/contain-body-w-m-001.html [ Failure ] +crbug.com/626703 virtual/layout_ng_fragment_traversal/external/wpt/css/css-contain/contain-body-dir-002.html [ Failure ] +crbug.com/626703 virtual/layout_ng_block_frag/external/wpt/css/css-contain/contain-body-dir-002.html [ Failure ] crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc/protocol/split.https.html [ Timeout ] crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video.https.html [ Timeout ] crbug.com/626703 [ Mac11.0 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-insertDTMF.https.html [ Timeout ] @@ -3194,6 +3370,9 @@ crbug.com/626703 [ Win ] external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ] crbug.com/626703 [ Win ] external/wpt/websockets/Create-url-with-space.any.html [ Failure ] crbug.com/626703 [ Win ] virtual/plz-dedicated-worker/external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/webrtc/RTCDTMFSender-ontonechange-long.https.html [ Pass Failure ] +crbug.com/626703 [ Mac ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDTMFSender-ontonechange-long.https.html [ Pass Failure ] + ### See crbug.com/891427 comment near the top of this file: crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-margins-2.html [ Failure ] @@ -3651,7 +3830,6 @@ crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-alignment-implies-size-change-035.html [ Failure ] crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-alignment-implies-size-change-036.html [ Failure ] crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-baseline-004.html [ Failure ] -crbug.com/941987 external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure ] crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-001.html [ Failure ] crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-002.html [ Failure ] crbug.com/1045599 external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-003.html [ Failure ] @@ -3806,7 +3984,6 @@ ### Tests failing with LayoutNGGrid enabled: crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-safe-001.html [ Failure ] -crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-content-alignment-overflow-001.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-004.html [ Failure ] crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/alignment/grid-self-baseline-not-applied-if-sizing-cyclic-dependency-003.html [ Failure ] @@ -5249,13 +5426,6 @@ crbug.com/1031345 media/controls/overlay-play-button-tap-to-hide.html [ Timeout Pass ] -# TODO(michaelludwig): Suppressed for Skia roll requiring a rebaseline -crbug.com/1210861 svg/W3C-SVG-1.1/filters-image-01-b.svg [ Pass Failure ] -crbug.com/1210861 svg/W3C-SVG-1.1-SE/filters-image-03-f.svg [ Pass Failure ] -crbug.com/1210861 svg/W3C-SVG-1.1-SE/filters-image-05-f.svg [ Pass Failure ] -crbug.com/1210861 [ Mac ] svg/as-background-image/svg-as-tiled-background.html [ Pass Failure ] -crbug.com/1210861 svg/filters/feImage-preserveAspectRatio-all.svg [ Pass Failure ] - # Temporary SkiaRenderer regressions crbug.com/1029941 [ Linux ] external/wpt/css/css-paint-api/background-image-alpha.https.html [ Failure ] crbug.com/1029941 [ Linux ] transforms/3d/point-mapping/3d-point-mapping-deep.html [ Failure ] @@ -6835,3 +7005,5 @@ crbug.com/1209223 virtual/synchronous_html_parser/external/wpt/html/semantics/forms/the-textarea-element/wrapping-transformation.window.html [ Failure ] crbug.com/1209223 virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https.html [ Failure ] crbug.com/1209223 virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html [ Failure ] + +crbug.com/1213120 [ Mac ] virtual/scalefactor200/css3/filters/effect-reference-zoom-hw.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/WebDriverExpectations b/third_party/blink/web_tests/WebDriverExpectations index b98ce99c..1eed62a 100644 --- a/third_party/blink/web_tests/WebDriverExpectations +++ b/third_party/blink/web_tests/WebDriverExpectations
@@ -80,6 +80,8 @@ crbug.com/1167321 [ Linux ] external/wpt/webdriver/tests/find_elements_from_shadow_root/find.py [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/get_window_handle/get.py>>test_navigation_with_coop_headers[capabilities0] [ Failure ] +crbug.com/626703 [ Mac10.14 ] external/wpt/webdriver/tests/get_window_handle/get.py>>test_navigation_with_coop_headers[capabilities0] [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/back/back.py>>test_cross_origin[capabilities0] [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/navigate_to/navigate.py>>test_cross_origin[capabilities0] [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/forward/forward.py>>test_cross_origin[capabilities0] [ Failure ]
diff --git a/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations b/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations index 1a3f28fa..b5edce71 100644 --- a/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations +++ b/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations
@@ -751,6 +751,16 @@ crbug.com/1050754 external/wpt/eventsource/shared-worker/eventsource-onopen.htm [ Failure ] crbug.com/1050754 external/wpt/eventsource/shared-worker/eventsource-prototype.htm [ Failure ] crbug.com/1050754 external/wpt/eventsource/shared-worker/eventsource-url.htm [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.serviceworker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.sharedworker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.worker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/css/css-color-adjust/print-color-adjust-parsing.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/webtransport/idlharness.any.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/webtransport/idlharness.any.serviceworker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/webtransport/idlharness.any.sharedworker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/webtransport/idlharness.any.worker.html [ Failure ] crbug.com/1050754 external/wpt/feature-policy/picture-in-picture-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Failure ] crbug.com/1050754 external/wpt/feature-policy/picture-in-picture-allowed-by-feature-policy-attribute.https.sub.html [ Failure ] crbug.com/1050754 external/wpt/feature-policy/picture-in-picture-allowed-by-feature-policy.https.sub.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 8a67b9b0..172dc81 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -1,6 +1,17 @@ { "items": { "crashtest": { + "accessibility": { + "crashtests": { + "aom-in-destroyed-iframe.html": [ + "d412892983a48aca624fcffa4100eb94b8109919", + [ + null, + {} + ] + ] + } + }, "css": { "CSS2": { "floats": { @@ -953,6 +964,13 @@ }, "dom": { "events": { + "keypress-dispatch-crash.html": [ + "3207adbd8c891903b1c6edd65edc41de9b9e7312", + [ + null, + {} + ] + ], "replace-event-listener-null-browsing-context-crash.html": [ "f41955eedd39fbdb788b4e1bcdc454fb61f97277", [ @@ -47624,6 +47642,19 @@ {} ] ], + "background-image-table-cells-straddling-no-repeat.html": [ + "67f7937a3fcc93d1f4d0ce1806eea1e12e6078ee", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "background-image-table-cells-zoomed.html": [ "fc23dec322b2764be8b99fb87e5931682e7756a0", [ @@ -47637,6 +47668,19 @@ {} ] ], + "background-image-with-border-radius-fidelity.html": [ + "b0b494f50219eb1e6e72b2deed232a01f7582d12", + [ + null, + [ + [ + "/css/css-backgrounds/reference/background-image-with-border-radius-fidelity-ref.html", + "==" + ] + ], + {} + ] + ], "background-margin-iframe-root.html": [ "9c0cc829ff01036ad9bbb5491940288a1fc8ec3a", [ @@ -53931,6 +53975,32 @@ {} ] ], + "break-inside-avoid-min-block-size-1.html": [ + "733aae58d6fffb3af0739cfa503fa802ee3e7735", + [ + null, + [ + [ + "/css/css-break/break-inside-avoid-min-block-size-1-ref.html", + "==" + ] + ], + {} + ] + ], + "break-inside-avoid-min-block-size-2.html": [ + "e7669d8ebe13ca5a7d161f9e27feb0dd26d6de09", + [ + null, + [ + [ + "/css/css-break/break-inside-avoid-min-block-size-2-ref.html", + "==" + ] + ], + {} + ] + ], "break-overflowed-block-dynamic-001.html": [ "9afdab1d8b4021261ad0ccf51f5d2d487afee830", [ @@ -54763,6 +54833,32 @@ {} ] ], + "out-of-flow-in-multicolumn-046.html": [ + "16caaf849c615e4f8ca1546a10c2465accf1dcb9", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "out-of-flow-in-multicolumn-047.html": [ + "496c3bdaefacf0bc2f0fd47f0421c972684478db", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "overflow-clip-000.html": [ "72b10f5cdd3092a042f1f90bff04e9428d61608e", [ @@ -59210,6 +59306,266 @@ {} ] ], + "contain-body-bg-001.html": [ + "b7890faebabd1fc104ec54c0a8576b243675daf6", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-bg-002.html": [ + "71237d977e117f057e9c906b3e7882e06a1ddfd3", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-bg-003.html": [ + "0aaf8b0da859ba89dda8977bf18663be012d1fb5", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-bg-004.html": [ + "af046a96c43565c5c28988473b0bd7402610f8cc", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-dir-001.html": [ + "65e6f9c5874b3102abc7ccc72c1555c5c525acc6", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-dir-002.html": [ + "12f8fed5f37024a7a225b253d312b649c8c3b74d", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-dir-003.html": [ + "07bd88463c68f562aae3c330bbf76629a30b5df4", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-dir-004.html": [ + "b7bbc1480a6fa7541c503a429537ca18c7f5937c", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-overflow-001.html": [ + "7f368756ca730e86b64fe0bc93f95af2506b12c9", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-overflow-002.html": [ + "bc432e3e0e1ffcde0773ae2a2c7e8da3511ee985", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-overflow-003.html": [ + "d38cf53c2f47fd964b0cfc912eced2ce25e62c8e", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-overflow-004.html": [ + "5064d00c8b6a8b320182e10f649ce84ba8b4063e", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-t-o-001.html": [ + "36f70a1df4c87c7ea1556efb96800055238c86a3", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-t-o-002.html": [ + "47d3f480d1018f979dc4c238979e4181e668b00f", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-t-o-003.html": [ + "2323d07838f18bb260e4aff465f1c726f55e31ab", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-t-o-004.html": [ + "3eea6b8d322fbc7966ad3116b90f53ee9689120e", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-w-m-001.html": [ + "b37e96115c77dd5041980baa4880981b02ec2097", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-w-m-002.html": [ + "15040f0399362cc27b21625f77ab074d74331444", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-w-m-003.html": [ + "87b1d63466bebf09c5f0a86c4e9de3400921dd4d", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-body-w-m-004.html": [ + "736d4a58aae6bcd5eec17952dbca7d4690aaa428", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], "contain-content-001.html": [ "649bf54df5b6e005253e1a8d5d8b45521889e9f5", [ @@ -59275,6 +59631,266 @@ {} ] ], + "contain-html-bg-001.html": [ + "6d77ce081eb32c9d482083142cc3d15bf6ef7c72", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-bg-002.html": [ + "57324052b204e42b092808ebb59a8a914fc1c13d", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-bg-003.html": [ + "f1115ceb2f5c08d3b652ebe57a65c2a8eedc676f", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-bg-004.html": [ + "05fa3f820eb94c7e8c63fd8bf561c1d574bc7870", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-bg-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-dir-001.html": [ + "7eeae5e1213622f2789cba639810bddb8ad8c810", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-dir-002.html": [ + "ad4dd4e5b354f4262914a04aafb00045a2a0e6ac", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-dir-003.html": [ + "aadc0317e65b2fef4fdee5a5696dfcb395cffcbe", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-dir-004.html": [ + "4b6d2d3d8cbb698c63562d32d2bfbb2ab4ef689b", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-overflow-001.html": [ + "736ad1a54dde015f265ca2d80eb0222a04d6ffaf", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-overflow-002.html": [ + "2fd0b5e1a35ed5f14feaabb4b7d5944d4b78aa25", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-overflow-003.html": [ + "88ce0918916eab7c443cb0a09f085a3036f01db7", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-overflow-004.html": [ + "15339ed3dc004b47fd8c4b85ce9d6b6d84ffdbb2", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-overflow-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-t-o-001.html": [ + "d74fa252660f0b870435b1b7769897121a6e5f76", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-t-o-002.html": [ + "9ee3837bd2ad715d2f16820881d89514c134d5dd", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-t-o-003.html": [ + "87e70d505a6fab6ad6d92863c05abec3ff078136", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-t-o-004.html": [ + "5f7ea2ef18733b807f1fb4ff30166bdbaa0e4189", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-t-o-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-w-m-001.html": [ + "e8c0a8222d0993a08cbf8c8be6bb150cbd86243b", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-w-m-002.html": [ + "f4001a75c02b0f5b07e574c6efb8fd2bbf48efd8", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-w-m-003.html": [ + "c56d42ed7a40bf993cb4a5309692641aeeced600", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], + "contain-html-w-m-004.html": [ + "09a32ba50578075f4d41c3007bf38c49a43b5a3f", + [ + null, + [ + [ + "/css/css-contain/reference/contain-body-w-m-001-ref.html", + "==" + ] + ], + {} + ] + ], "contain-layout-001.html": [ "85b959da2b9a151c13be3dc83485646341752915", [ @@ -69256,7 +69872,7 @@ ] ], "flex-basis-011.html": [ - "78bbd5d889829160a66d273b8abc88bee38b2714", + "9edb5dc975206d2103d9eebfbfd7f9de450f9192", [ null, [ @@ -69268,6 +69884,19 @@ {} ] ], + "flex-basis-012.html": [ + "b1adddeb23368e7e18553436e1254ad9d8e2f582", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "flex-basis-item-margins-001.html": [ "5f65b267bb5bf1b8de1a742aef0a8fc0865bd902", [ @@ -77361,6 +77990,19 @@ {} ] ], + "synthesize-vrl-baseline.html": [ + "1e753da0a2c1349d06608d5d84bfcb3e91083330", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "table-as-item-auto-min-width.html": [ "66a77327f0f25e07db87e342ebb590358d045f7a", [ @@ -100166,6 +100808,19 @@ {} ] ], + "multicol-span-all-017.html": [ + "e9100ffce9563d8cd497116d83a71f6310c59f34", + [ + null, + [ + [ + "/css/css-multicol/multicol-span-all-017-ref.html", + "==" + ] + ], + {} + ] + ], "multicol-span-all-block-sibling-003.xht": [ "abaa45f0a85023f3f07a9db483629b74d2b09d71", [ @@ -116905,6 +117560,19 @@ {} ] ], + "border-collapse-empty-cell.html": [ + "18894a35a9c793755380d3a2ff1b34d88603af78", + [ + null, + [ + [ + "/css/css-tables/border-collapse-empty-cell-ref.html", + "==" + ] + ], + {} + ] + ], "border-collapse-rowspan-cell.html": [ "8a4bdede0ea4edafffbb5bb6c7f93684f1265368", [ @@ -117572,6 +118240,19 @@ {} ] ], + "table-cell-child-overflow-measure.html": [ + "c092d0c1bc970c6ac93050853a67098d3c750ded", + [ + null, + [ + [ + "/css/css-tables/table-cell-child-overflow-measure-ref.html", + "==" + ] + ], + {} + ] + ], "table-cell-overflow-auto.html": [ "6b688561b91321990f18680f88aa4873dd35916a", [ @@ -142335,7 +143016,7 @@ ] ], "transform3d-sorting-006.html": [ - "d40edf00a9f2b55ab9cf54aa15443240ba59f400", + "966549adc5d05b292ddd905654b20edd827eab21", [ null, [ @@ -142787,7 +143468,7 @@ ] ], "ttwf-css-3d-polygon-cycle.html": [ - "ec33e7d5bf1f529c996ea26df540c1db02fa395a", + "bd18d20fa1a03807bb8f4696f258626bb6ac6bcd", [ null, [ @@ -142796,7 +143477,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 104 + ], + [ + 0, + 610 + ] + ] + ] + ] + } ] ], "ttwf-reftest-rotate.html": [ @@ -142974,6 +143671,19 @@ {} ] ], + "accent-color-visited.tentative.html": [ + "5aee0f125f7a1a6fffacda9790d7b72b02ab71ac", + [ + null, + [ + [ + "/css/css-ui/accent-color-visited-ref.html", + "==" + ] + ], + {} + ] + ], "appearance-auto-001.html": [ "deef1c5d0b52fe7c91a319abbd1f6ccc2eeda08d", [ @@ -148728,6 +149438,19 @@ {} ] ], + "will-change-fixpos-cb-webkit-perspective-1.html": [ + "2438dcd975bf181e5a59885f91059d69c0f39b28", + [ + null, + [ + [ + "/css/css-will-change/green-square-100-by-100-offset-ref.html", + "==" + ] + ], + {} + ] + ], "will-change-stacking-context-backdrop-filter-1.html": [ "0081e93c4fa2c0eb14e1e51545c45a50c2d565de", [ @@ -160457,6 +161180,19 @@ {} ] ], + "vrl-inline-paint-invalidation.html": [ + "a804e4d7c0a47e84e6aca2952c6ea65ab41a4402", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "vrl-text-orientation-sideways-alongside-vrl-floats.html": [ "710221031a3ee31e06d540a63c80a819e9eff9c8", [ @@ -160834,6 +161570,19 @@ {} ] ], + "wm-propagation-body-dynamic-change-003.html": [ + "8e8bf03c31ff3c0da37b23f07e1f71d40de27c56", + [ + null, + [ + [ + "/css/css-writing-modes/wm-propagation-body-dynamic-change-003-ref.html", + "==" + ] + ], + {} + ] + ], "wm-propagation-svg-root-scrollbar.svg": [ "a9a7b25ff26854e137c8d6bc5c17160201401cdb", [ @@ -168839,6 +169588,19 @@ ], {} ] + ], + "canvas-filter-object-convolve-matrix.html": [ + "c5651070a8049bb8de803a5caae6ad32c19802d8", + [ + null, + [ + [ + "/html/canvas/element/manual/filters/canvas-filter-object-convolve-matrix-expected.html", + "==" + ] + ], + {} + ] ] }, "imagebitmap": { @@ -183961,7 +184723,7 @@ [] ], "META.yml": [ - "7cae5c0f90396f6e3a0bcd5f34935550f08c4b84", + "27a11a1fe47c39baa6f8ea9390f4e9be1777e77e", [] ], "OWNERS": [ @@ -185431,15 +186193,15 @@ [] ], "accept-ch-cache-revalidation.https.html.headers": [ - "6f01afb921bd98c7de89fc1f1054db49b7a12ed8", + "ed61fa27203ade74e305ee4d1dbf41a626c0d42c", [] ], "accept-ch-feature-policy-navigation.https.html.headers": [ - "557140f8f2d821e031e23c10f94aa65a7c283254", + "5f5f807c1df420cd1f0f7895275558119b905acb", [] ], "accept-ch-feature-policy.sub.https.html.headers": [ - "cf453cf368ddfb8096a62ad9720af877480bcc07", + "d620a5b8253f4b8283945949ea512f9af23311d4", [] ], "accept-ch-malformed-header.https.html.headers": [ @@ -185608,7 +186370,7 @@ [] ], "echo-client-hints-received.py": [ - "ca623d40f88305bb2bb5101612465bb25db6a021", + "ef750bddf7d39329b67025cdec56858f65429bd2", [] ], "echo-ua-client-hints-received.py": [ @@ -185648,12 +186410,12 @@ [] ], "stale-echo-client-hints.py": [ - "664f7c4c15d08a8ae608c05b0051b8aba6a1a5d1", + "51e09b887a2b6df1abde21a9012a616c9814942c", [] ] }, "sec-ch-quotes.https.html.headers": [ - "7ce8173856179f3758adf4a671582e2fa28a9880", + "abec79a3582a6de1cba0601332e4abb76618a265", [] ], "service-workers": { @@ -188542,7 +189304,7 @@ [] ], "cookie.py": [ - "16efcc04aeb919e70c8e9bbf03253a8101bef2c8", + "b18da7774da6eab7d311c1d40611e44bdf77d997", [] ], "drop.py": [ @@ -188820,7 +189582,7 @@ [] ], "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -193724,7 +194486,7 @@ }, "css-align": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -194030,7 +194792,7 @@ }, "css-backgrounds": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -195000,6 +195762,10 @@ "6f4261ecf45443c0d1d38f4599f2946492a570bb", [] ], + "background-image-with-border-radius-fidelity-ref.html": [ + "0d8f30d74f81e16d9fa0a3baf81306b14df0eac1", + [] + ], "background-origin-002-ref.html": [ "88d61225a623d112e5f54505899a21dd4d929a5b", [] @@ -195748,7 +196514,7 @@ }, "css-break": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -195831,6 +196597,14 @@ "f87e16adedc779911ec081990acd76dd5f6ed5ad", [] ], + "break-inside-avoid-min-block-size-1-ref.html": [ + "56789f62cbb570c4f5fbdcbdb13b97feda4fa174", + [] + ], + "break-inside-avoid-min-block-size-2-ref.html": [ + "70c4049131f7c4f458398c40bb0c1d575a6fa071", + [] + ], "break-nested-float-in-table-001-print-ref.html": [ "3459e25edd64ca8d90cebd4a44f68aa9b4106e25", [] @@ -195981,10 +196755,6 @@ ] }, "css-cascade": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "96467729fe91cef54b0bf5cc82d83e9f2a5c01ed", [] @@ -196043,10 +196813,6 @@ } }, "css-color": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "LICENSE": [ "d47f50cca8a2d9dc40dee384ae256f8aecf44e0a", [] @@ -196485,10 +197251,6 @@ } }, "css-conditional": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "0b9cc5ac3d69363f4ad472166d59f7779a7a125c", [] @@ -196530,7 +197292,7 @@ }, "css-contain": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -196890,6 +197652,22 @@ "1fdecb1c33149af52c48c105bce8ad91904bad44", [] ], + "contain-body-bg-001-ref.html": [ + "1d6357e173ccf3878821ceef86fd69c71778f6c4", + [] + ], + "contain-body-overflow-001-ref.html": [ + "32bc8b0eafc64d2c8552da37bab3b0138ab12dc9", + [] + ], + "contain-body-t-o-001-ref.html": [ + "ecf9d031a33956924d739136859b5837bfe73885", + [] + ], + "contain-body-w-m-001-ref.html": [ + "3341816e2b01433d8b24acc5cbd05a915c2c2736", + [] + ], "contain-content-011-ref.html": [ "21043b083c893a474aee7e0a926ce5be3d73ec12", [] @@ -198130,7 +198908,7 @@ }, "css-display": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -198348,7 +199126,7 @@ }, "css-flexbox": { "DIR_METADATA": [ - "aeed0e57ebfec85308d149a12d1adb51118341dc", + "e51f58e0dd2d33f85b8907874dab7a2afbd5224c", [] ], "META.yml": [ @@ -198638,7 +199416,7 @@ [] ], "flex-basis-011-ref.html": [ - "e1a968b5b53042ca97a97996c62a062ed89153f7", + "8c9d248efaf1cb03c18c4a4955576ccbc6ecaa15", [] ], "flex-child-percent-basis-resize-1-ref.html": [ @@ -200680,7 +201458,7 @@ }, "css-font-loading": { "DIR_METADATA": [ - "729d4e2f72e18065f3bc52a6f08422238e53be63", + "79a21decd5a038b674382ce2c897a53fb471f13f", [] ], "META.yml": [ @@ -200720,7 +201498,7 @@ }, "css-fonts": { "DIR_METADATA": [ - "729d4e2f72e18065f3bc52a6f08422238e53be63", + "79a21decd5a038b674382ce2c897a53fb471f13f", [] ], "META.yml": [ @@ -207820,7 +208598,7 @@ }, "css-grid": { "DIR_METADATA": [ - "00b116ef2de32513d4b8d11107c7fadc5efa69b9", + "0a52f7cafb7518ceb6f9a00a65377c7910e7cba2", [] ], "META.yml": [ @@ -208212,10 +208990,6 @@ } }, "alignment": { - "grid-baseline-004-expected.txt": [ - "7d26c4259e268b533b16eb5c1afeb591ae43e339", - [] - ], "grid-gutters-014-ref.html": [ "a6ca7c5aa7a80313786abc97ffe4581e9a6d7341", [] @@ -210092,7 +210866,7 @@ }, "css-layout-api": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -210540,7 +211314,7 @@ }, "css-logical": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -211130,7 +211904,7 @@ }, "css-multicol": { "DIR_METADATA": [ - "e6cb0fe2b8b39a9b09c86603a941b4b8deedb1cf", + "d7aaf3d206d9205a622667caad552dbbbe3db583", [] ], "META.yml": [ @@ -211645,6 +212419,10 @@ "54981d81068873d95a0b3725fc8aabdb542ef491", [] ], + "multicol-span-all-017-ref.html": [ + "64d1419cfc8b8be4d9ac0c8ab84c830b9ffc9b5e", + [] + ], "multicol-span-all-block-sibling-3-ref.xht": [ "53b58c6d2b0cbd9d6e6288231c22ff5c76068b25", [] @@ -212057,10 +212835,6 @@ } }, "css-namespaces": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "b625e16a9cb0837ee9c612fd25737ad011cddc94", [] @@ -212834,7 +213608,7 @@ }, "css-position": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -212869,40 +213643,6 @@ "4f8d043e5a3f108b0ce26f335ddbc405c047ac17", [] ], - "parsing": { - "inset-after-computed-expected.txt": [ - "a985abc0515a5307653f9106a49d3edec8ce84a2", - [] - ], - "inset-after-valid-expected.txt": [ - "bd51a0f7ccf7540823c6424273e96ccb274908dc", - [] - ], - "inset-before-computed-expected.txt": [ - "4625b5db69602a72d0f04f8876666d40cf35a508", - [] - ], - "inset-before-valid-expected.txt": [ - "f38396deadc01f5c44865a4e904017d277525444", - [] - ], - "inset-end-computed-expected.txt": [ - "1bf469bcbdf972477b559d3596f6dfc37f51fa53", - [] - ], - "inset-end-valid-expected.txt": [ - "0309ccd354def7fcd2e22072de786d6b9a3362c4", - [] - ], - "inset-start-computed-expected.txt": [ - "8d1cd6d2a82679135024528dc697cb82ea57e0e4", - [] - ], - "inset-start-valid-expected.txt": [ - "8a4eefd23f0970738d30bb464a168c9b3baccd9f", - [] - ] - }, "position-absolute-large-negative-inset-ref.html": [ "e04afce6ebd42889a3937823e86fcfd7b92da433", [] @@ -213072,7 +213812,7 @@ }, "css-properties-values-api": { "DIR_METADATA": [ - "275a4301518da45ba222e6ce4e6a69c6dc2b415d", + "b19504342dfe64050a6372808f15f3e792a79218", [] ], "META.yml": [ @@ -213879,10 +214619,6 @@ } }, "css-scoping": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "826341652122a40956ccc74288e23f952f1f40e8", [] @@ -213926,7 +214662,7 @@ }, "css-scroll-anchoring": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -214116,7 +214852,7 @@ }, "css-shapes": { "DIR_METADATA": [ - "54b56f58c82f39b06e4c14bb60b8035eefd604dd", + "2a197612af0b04fa4f2a3b0aeee84598813b9ac1", [] ], "META.yml": [ @@ -214992,7 +215728,7 @@ }, "css-sizing": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -215655,10 +216391,6 @@ } }, "css-syntax": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "359219c09965b90066e4fb31d952d621d0d0dc5b", [] @@ -215786,7 +216518,7 @@ }, "css-tables": { "DIR_METADATA": [ - "4f37329faad59e57da0239577be1f4216e54cd0a", + "b0e995291a114006c858e0e729f9004547f8fd37", [] ], "META.yml": [ @@ -215797,14 +216529,6 @@ "aef437ec77c0df2ec4d56553611bed3fae5c801b", [] ], - "absolute-tables-003-expected.txt": [ - "f1b3b491d2f32de0d7ef044ed951266ef87c563c", - [] - ], - "absolute-tables-005-expected.txt": [ - "9ceaa9a0684c2c12d7ca931785b1e82b850c9da4", - [] - ], "anonymous-table-ws-001-ref.html": [ "4429239d965d4a2adcb683e9426b94a73be8280f", [] @@ -215817,6 +216541,10 @@ "6ace02b432ab503a0275e1a04d205df3eeefe63a", [] ], + "border-collapse-empty-cell-ref.html": [ + "f6b25134f443c4625228b4901097b883a990d2a8", + [] + ], "border-collapse-rowspan-cell-ref.html": [ "53774da48a30f60eae0750e989c2e19db8bd97cc", [] @@ -215963,6 +216691,10 @@ [] ] }, + "table-cell-child-overflow-measure-ref.html": [ + "d4e3ec6a91c4124fa4f465b8912f720a8fec4c57", + [] + ], "table-cell-overflow-auto-ref.html": [ "18163de30320bd1f0f1a7248cd4c2f2d2897d0c5", [] @@ -216042,7 +216774,7 @@ }, "css-text": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -219236,7 +219968,7 @@ }, "css-text-decor": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -219646,12 +220378,6 @@ [] ] }, - "css-timing": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ] - }, "css-transforms": { "3dtransform-and-filter-no-perspective-001-ref.html": [ "bb7ae235fef0c4216de99c9c0ab3bec26db33fd4", @@ -219709,7 +220435,7 @@ [] ], "transform-interpolation-computed-value-expected.txt": [ - "76fbb3ea84b370caa1b7f0a917717918c38a4d22", + "b0fe2dde24f106e7f0a9a44b07fdeeecc8bee5ca", [] ], "transform-interpolation-ref.html": [ @@ -221361,10 +222087,6 @@ "918c97d6da7562004967a205522e3614d9c5d35f", [] ], - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "a448fc800d26f26f7976bb9358251a5c392262e1", [] @@ -221413,6 +222135,10 @@ }, "the-stylepropertymap": { "properties": { + "accent-color-expected.txt": [ + "3c4e773a36c0e76f69f2bf48f49428b0c6c31338", + [] + ], "alignment-baseline-expected.txt": [ "bfa1f080ecaefe71d6a26a0287860569d72f0296", [] @@ -221668,7 +222394,7 @@ }, "css-ui": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "META.yml": [ @@ -221684,7 +222410,11 @@ [] ], "accent-color-computed-expected.txt": [ - "49086258e620e57bb298b6345274e793a9041145", + "54594b62e7218828cd3b66fdab69d5ad919092af", + [] + ], + "accent-color-visited-ref.html": [ + "3954a3193ea3644eb666c37af619de303a5a4d27", [] ], "appearance-auto-input-non-widget-001-ref.html": [ @@ -222885,10 +223615,6 @@ ] }, "css-values": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "a22882a9996b14afa942d3403fa1a873f526073a", [] @@ -223367,10 +224093,6 @@ ] }, "css-variables": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "a1747aadc086e75733c15242826d7631b0c95ead", [] @@ -223580,7 +224302,7 @@ }, "css-writing-modes": { "DIR_METADATA": [ - "ff55dc965082ae94ce13fa0d5ad7a98af9bc204d", + "6d01f16a1c7c74fc298cf2730ecf4026e206ca04", [] ], "META.yml": [ @@ -225879,6 +226601,10 @@ "d7ddfd553d60bbb98243eb32090b76f24fe38113", [] ], + "wm-propagation-body-dynamic-change-003-ref.html": [ + "30e72f0df706a62c8e0ad97327ff1a625af731d6", + [] + ], "writing-mode-initial-ref.html": [ "6f7b84fa72ad042924dedba39503ed6ea40bbd20", [] @@ -225905,10 +226631,6 @@ "7a825be56202175f8b013ec7cc65f7d41ef77872", [] ], - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "HTMLLinkElement-disabled-alternate-ref.html": [ "5d87bfdaf5b0533f2ea7088a870ca45474d065f4", [] @@ -225922,7 +226644,7 @@ [] ], "cssstyledeclaration-custom-properties-expected.txt": [ - "7287e4fe19d2359052dbe4650b4419ff5d88c69c", + "fdc0f0c65871a26d4da55f347ae9abf592db01d1", [] ], "cssstyledeclaration-properties-expected.txt": [ @@ -225934,7 +226656,7 @@ [] ], "getComputedStyle-detached-subtree-expected.txt": [ - "97d84ff195dd599378592436c7933794db0e3077", + "e1c2ab5987f3d320c81a0497ed01b304d397daf5", [] ], "getComputedStyle-insets-absolute-expected.txt": [ @@ -226203,10 +226925,6 @@ } }, "cssom-view": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "a6644945910fc83ca079c93507b21117b91de9c3", [] @@ -227247,10 +227965,6 @@ } }, "mediaqueries": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "f277097263e7acf6f2e7b40fa810231c61b00e63", [] @@ -227281,16 +227995,16 @@ [] ] }, + "test_media_queries-expected.txt": [ + "7fd06266430fadd44d150de784c80c1404ee4456", + [] + ], "viewport-script-dynamic-ref.html": [ "e3f1c95d66fcd89bdce9fc08e31e798df3053e32", [] ] }, "motion": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "20835b48397f136a30b82a62654d389cad326315", [] @@ -227473,10 +228187,6 @@ [] ], "selectors": { - "DIR_METADATA": [ - "7bdd904a34286d9442dfbdd4302414f199b53d04", - [] - ], "META.yml": [ "8e506d671d4b1e741d3450bd66603edbb3de9f30", [] @@ -227998,7 +228708,7 @@ ], "mozilla-central-reftests": { "DIR_METADATA": [ - "aab9ded40a44aa888745a4a544ff6b6874015624", + "97e2659bf8cff713dc731eec03ac942794cc5fd2", [] ], "OWNERS": [ @@ -228143,7 +228853,7 @@ }, "flexbox": { "DIR_METADATA": [ - "aeed0e57ebfec85308d149a12d1adb51118341dc", + "e51f58e0dd2d33f85b8907874dab7a2afbd5224c", [] ], "OWNERS": [ @@ -228195,7 +228905,7 @@ }, "shapes1": { "DIR_METADATA": [ - "54b56f58c82f39b06e4c14bb60b8035eefd604dd", + "2a197612af0b04fa4f2a3b0aeee84598813b9ac1", [] ] }, @@ -238199,6 +238909,10 @@ "canvas-filter-object-blur-expected.html": [ "ae8911b2de39e593c2ef262ed9cd5eaa70b5bf0c", [] + ], + "canvas-filter-object-convolve-matrix-expected.html": [ + "f8dba9bb07e8648d2f030af88dd41eab12202a72", + [] ] }, "imagebitmap": { @@ -238837,7 +239551,7 @@ [] ], "filters.yaml": [ - "c4dabab60640f1ac6279689cb3c42bb93c8ab690", + "11026f49401d570bae85f9689763d360506d46e4", [] ], "line-styles.yaml": [ @@ -238881,7 +239595,7 @@ [] ], "transformations.yaml": [ - "89f72468acebb64b5680f03f8a277c80d4aa8e06", + "bca161728bebd88ae6f281d3fd31f9eab09cba86", [] ], "video.yaml": [ @@ -238915,7 +239629,7 @@ [] ], "filters.yaml": [ - "dd11080b4ca89399331096bcfaeec89664f74ffb", + "1bcd5bb025482cde4ab50f7524c100349d689965", [] ], "line-styles.yaml": [ @@ -238951,7 +239665,7 @@ [] ], "transformations.yaml": [ - "9b4cbd3463d32a094438f544440e05dbbd4ac120", + "5a784f4025c6a99edfdfe9356be03377b6b97a33", [] ] } @@ -239649,10 +240363,6 @@ "dom": { "documents": { "dom-tree-accessors": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "cross-domain.js": [ "32effe3c4580613831be8c140b0af3948bebc479", [] @@ -239680,21 +240390,11 @@ } }, "elements": { - "elements-in-the-dom": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ] - }, "global-attributes": { ".htaccess": [ "94e9a4f1908e4f4eb3216981a91c3c8174902fcb", [] ], - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "custom-attrs-expected.txt": [ "a134f46ae4f026f047d3d2556bd665b1403d85f5", [] @@ -243245,10 +243945,6 @@ "infrastructure": { "common-dom-interfaces": { "collections": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "htmlallcollection-expected.txt": [ "6dfa2f44790a5d3db9ee42fd698ae0b0e710be4e", [] @@ -243263,14 +243959,6 @@ ] } }, - "conformance-requirements": { - "extensibility": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ] - } - }, "safe-passing-of-structured-data": { "resources": { "echo-iframe.html": [ @@ -243561,10 +244249,6 @@ }, "terminology": { "plugins": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "sample.txt": [ "cedecd6d884d181a740f5be110d869679f768189", [] @@ -243887,20 +244571,12 @@ ], "requirements-for-implementations": { "other-elements-attributes-and-apis": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "original-id.json": [ "601a7c08d19493c45501a407059dd0ae72891ba2", [] ] }, "the-marquee-element-0": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "marquee-min-intrinsic-size-ref.html": [ "7a79361fc399301161400ef4ba75c876369329f7", [] @@ -243917,30 +244593,18 @@ ] }, "the-input-element-as-a-text-entry-widget": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "unrecognized-type-should-fallback-as-text-type-ref.html": [ "879ca9233f4f356b1d69a6e588f96c0c926a1ca7", [] ] }, "the-select-element-0": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "option-label-ref.html": [ "e3f73cb3eda267f57e1c7e4ac4d1510b1f0bd18a", [] ] }, "the-textarea-element-0": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "textarea-ref.html": [ "f2982808f652a1095a7cdaeffa1a6ba221115036", [] @@ -244725,10 +245389,6 @@ ] }, "semantics": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "document-metadata": { "interactions-of-styling-and-scripting": { "stylesheet.py": [ @@ -248301,10 +248961,6 @@ "a269f1c671774b34885af42e233d5ca4a260f62a", [] ], - "readwrite-readonly-expected.txt": [ - "7d301fe76b1e5637dfe359ffe6da5a9d79cf5311", - [] - ], "utils.js": [ "7a2fb77f105705b2ece7b7e495a3673f59faef94", [] @@ -248454,10 +249110,6 @@ [] ], "parsing": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "DOMContentLoaded-defer-expected.txt": [ "b92095bed64c26b94916f4794223833b7cfe4467", [] @@ -248673,18 +249325,6 @@ [] ] }, - "serializing-html-fragments": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ] - }, - "serializing-xml-fragments": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ] - }, "xmldecl": { "support": { "ENCODING-trail.htm": [ @@ -249164,12 +249804,6 @@ }, "webappapis": { "dynamic-markup-insertion": { - "closing-the-input-stream": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ] - }, "document-write": { "005.js": [ "ebfd7e2585284cd52326c995bad0809a08c5249d", @@ -249219,10 +249853,6 @@ "6a43faec51071fec146390475adcd12bad3d23a6", [] ], - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "contentType.window-expected.txt": [ "ff3d352f31150d5af569302f0eb7ddab0244aa9a", [] @@ -249309,10 +249939,6 @@ ] }, "document-writeln": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "original-id.json": [ "0cc32be6a2368591de06759c92223941f380f9c2", [] @@ -249343,10 +249969,6 @@ "ceeeb64df63ccb6d56cd46a93c6ec6c476573a6b", [] ], - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "document.open-03-frame.html": [ "a4b370cea41fb2d379b0350639aaeec4f169191d", [] @@ -249441,10 +250063,6 @@ }, "scripting": { "event-loops": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "fully_active_document.window-expected.txt": [ "771e58ec4f284f19efda49c1e9e7d85eab53cfc3", [] @@ -249465,10 +250083,6 @@ } }, "events": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "event-handler-all-global-events-expected.txt": [ "eb173e2bce9cc26f995c8567ae741d1dc4e7d9db", [] @@ -249517,10 +250131,6 @@ } }, "processing-model-2": { - "DIR_METADATA": [ - "9e1f16642cda25322fa29cfb47c280ca18ce9f48", - [] - ], "compile-error-same-origin-with-hash-expected.txt": [ "e6b4ffea5e691a3f0d6491ea4b34986e8deb489d", [] @@ -250227,7 +250837,7 @@ }, "infrastructure": { "DIR_METADATA": [ - "c7280ced42f5dddaf4d22247a2460b403cb759b0", + "b19504342dfe64050a6372808f15f3e792a79218", [] ], "META.yml": [ @@ -250979,11 +251589,11 @@ [] ], "WEBGL_multi_draw.idl": [ - "3ba984d957cbfc2090c0c9bb59b3364eb0c7e0fc", + "d5ab6cf4f4606665294717161c58d5ae9afc341c", [] ], "WEBGL_multi_draw_instanced_base_vertex_base_instance.idl": [ - "2f43d3a7a029b53e95374cc6eac6592f6ebe4ded", + "8dd3253a24cffa3b24ae145a378912d2ada260fb", [] ], "WebCryptoAPI.idl": [ @@ -251163,7 +251773,7 @@ [] ], "css-typed-om.idl": [ - "086cef39702b509cc4ffd75f2c1a364033354cc7", + "262d2884e8379aacecc5958b85040c1f39184918", [] ], "cssom-view.idl": [ @@ -251283,7 +251893,7 @@ [] ], "gpuweb.idl": [ - "53bff4fbc7717285adfee6983999c815cc35a979", + "3f7111820a726ad7c1986e244a414ad6039100f8", [] ], "gyroscope.idl": [ @@ -251303,7 +251913,7 @@ [] ], "html.idl": [ - "99443be4a71990cca3e1c22c79341ff4a4b69db5", + "d878cba3367cc627d2b36d388cf4c31115afde0a", [] ], "idle-detection.idl": [ @@ -251455,7 +252065,7 @@ [] ], "payment-handler.idl": [ - "b609df75a37139efcf8c1a9d52768604398ee5bc", + "7636e8a3b49b3b85d4a68471455002f0c6f3a5ec", [] ], "payment-method-basic-card.idl": [ @@ -251463,7 +252073,7 @@ [] ], "payment-request.idl": [ - "dc0511b0c4b091066a9dcbc94ece9cac28088bde", + "cd16e2aabef9d0c06bef99c60ac06898b6f333b5", [] ], "performance-measure-memory.idl": [ @@ -251518,10 +252128,6 @@ "9a7c8dd55ad3cc9fbea3c6e20c182a51c10889b5", [] ], - "private-network-access.idl": [ - "b470f3f5a153f37ecf3607ee85e6ea2c511a237c", - [] - ], "proximity.idl": [ "3cbfbd5ad139031a62d730e9a460b797b7537789", [] @@ -251723,7 +252329,7 @@ [] ], "webcodecs.idl": [ - "aae4aa0121f6e53f30f4af2ee9779826b55db0a6", + "1203ebae3efe15fab68fd5a5044f2de89fd4ec0d", [] ], "webdriver.idl": [ @@ -251775,7 +252381,7 @@ [] ], "webtransport.idl": [ - "220e6ea12043c19e054a0136ae9311e7497afbb0", + "6c3df2abc52cc97574445e2f0b3a89775c4f26d6", [] ], "webusb.idl": [ @@ -251803,7 +252409,7 @@ [] ], "webxr.idl": [ - "b08124e337862f78990ebda94a867f5d0858075e", + "3e5b432468648606c04d113ccb29ddb642872b5f", [] ], "webxrlayers.idl": [ @@ -252064,7 +252670,7 @@ ] }, "lint.ignore": [ - "9f1cb6e753a97d402082e06e54773390f9d792f7", + "525b46b3001e44b2447287fd676dc05c330cab78", [] ], "loading": { @@ -253075,8 +253681,12 @@ [] ], "resources": { + "checker.js": [ + "25487b7b0568d57fa2aa72ffe6acdb5659e5f2b3", + [] + ], "common.js": [ - "41f7c94d55e37016cca0506b87480e842c53a615", + "4332c6e79c10f4ccd166a77771c159ce7c1e9d7e", [] ], "iframe.redirect.sub.html": [ @@ -253140,6 +253750,14 @@ [] ] }, + "service-worker.https.any.js.headers": [ + "4fff9d9fba4c81f953826ffea010a75be626b95d", + [] + ], + "shared-worker.https.any.js.headers": [ + "4fff9d9fba4c81f953826ffea010a75be626b95d", + [] + ], "window-open.cross-origin.https.window.js.headers": [ "4fff9d9fba4c81f953826ffea010a75be626b95d", [] @@ -253407,7 +254025,7 @@ [] ], "mediasource-changetype-util.js": [ - "28e92893657b956d84bff1cf0c87c000f272063d", + "024af027ed69c5f239c826781571eab0797c8398", [] ], "mediasource-config-changes.js": [ @@ -258060,7 +258678,7 @@ [] ], "TAOResponse.py": [ - "163f8ca2e5b2b9bff7023849a06efee6b8907cf6", + "60392b8e10ada4fd70a03a6258849306e9714ec4", [] ], "all_resource_types.html": [ @@ -258091,6 +258709,10 @@ "e0a4f0b108094658be0aef453bf826bf01c28f93", [] ], + "cacheable-and-validated.py": [ + "31f0e3ab417a69079f20748751b2d6be9a7d5552", + [] + ], "cors-ahem.py": [ "dee5b62f0005705c18dde06865ab5a9947a37357", [] @@ -258215,42 +258837,6 @@ "cf68aade7954e609087d34f21e437c285eb73a58", [] ], - "iframe_TAO_match_wildcard.html": [ - "a6a03e0680e95b33c14b5c622ce99d37f8582375", - [] - ], - "iframe_TAO_multi.html": [ - "0696dbe3e502def905cece7cdd5599decb3ad9dc", - [] - ], - "iframe_TAO_multi_wildcard.html": [ - "977df01007d56d85d4c4726c4c501d7e2c21387c", - [] - ], - "iframe_TAO_null.html": [ - "7d47a2076f87dfa5e787e3d4072b3a513330e524", - [] - ], - "iframe_TAO_origin.html": [ - "c75b0752406d959a3157a2bc4d75d3e646143682", - [] - ], - "iframe_TAO_origin_uppercase.html": [ - "7404035d1ab238358770c31d40265fb4ef3ed881", - [] - ], - "iframe_TAO_space.html": [ - "2a484ed5140bf052b8426a81ec5b842d2f6a44be", - [] - ], - "iframe_TAO_wildcard.html": [ - "3b5be4cdab98bfc51fffbd3646bcdd75fc87f23c", - [] - ], - "iframe_TAO_zero.html": [ - "76c5938689a4ae08d6d4d4c911993e8deebd5de6", - [] - ], "inject_resource_test.html": [ "44d09675d38e26a9c69de4ed9133667d8dc5c5ef", [] @@ -258291,8 +258877,12 @@ "168850e2a88dbdc74d07c4813b2ef4e5fd812d7d", [] ], + "redirect-cors.py": [ + "ea67cb8e7ac4e61045d05af51f066db48bfdf101", + [] + ], "resource-loaders.js": [ - "1760628c78bdb85f5e195b982f81d24473662572", + "3df07ccb5496cf211b5435f336fac568e0f76afc", [] ], "resource-timing-content-length.py": [ @@ -258323,6 +258913,10 @@ "beb12f5da551780fcb4378bef4661b9699a5d009", [] ], + "sizes-helper.js": [ + "86336686b32902ec1c123b0f55ff67e9aba43062", + [] + ], "status-code.py": [ "72222b39e48574c666052b2bb4d7029fd6ba526a", [] @@ -258379,7 +258973,7 @@ [] ], "check-layout-th.js": [ - "5d4236d1cedb0e20dbc1bb30722cb0e9e160f110", + "a507a8dfd7f197cbf3ff3072e7f7291847cd6aa2", [] ], "chromium": { @@ -258633,7 +259227,7 @@ [] ], "OWNERS": [ - "90e5cde305022505fd502b2552ba07cd3ebb99a6", + "05cb9bd3c026ef049585c325e201f31abfb5059d", [] ], "feature-policy.https-expected.txt": [ @@ -261037,7 +261631,7 @@ [] ], "malformed-worker.py": [ - "b8bc842d2caf8f493b62e364f7dc6bd6a27037f8", + "319b6e277baa04a9b61c1f5f764219d32028f91a", [] ], "message-vs-microtask.html": [ @@ -261341,7 +261935,7 @@ [] ], "registration-tests-script.js": [ - "30c03d9ef041817c9429a2640d8c6edf72242678", + "e5bdaf4291a4205fb5205eab0c76ec0bc02bdd7b", [] ], "registration-tests-security-error.js": [ @@ -264528,14 +265122,6 @@ "50a71bb482df9e21f6385973268f9e95b3464e7c", [] ], - "historical.any-expected.txt": [ - "60291d5c06d83784b4e04bb820f5a3099b67c410", - [] - ], - "historical.any.worker-expected.txt": [ - "8417b56c611ec5f03582c8d59edfdece37ad98b0", - [] - ], "percent-encoding.window-expected.txt": [ "a4b0a3a4fa78feed4a378a69b0cba5aee47feec8", [] @@ -264558,7 +265144,7 @@ [] ], "setters_tests.json": [ - "8aa74d6b8a28d9021050f4e52e7ee7f8f411912f", + "56bcae464a6f542cadcf82444435ec55870d91f8", [] ], "toascii.json": [ @@ -264571,15 +265157,15 @@ ] }, "toascii.window-expected.txt": [ - "597c806768cae2474ef96160945c26ba7feb2a36", + "1fe76f608a654dbb514bca458170d1817dd9eb74", [] ], "url-setters-stripping.any-expected.txt": [ - "5b19d9ffd7e5a2cd95fdb93a355d24fa5a433c4b", + "82bebb674259d13678e9d3b46e01a4dd0722d55a", [] ], "url-setters-stripping.any.worker-expected.txt": [ - "5b19d9ffd7e5a2cd95fdb93a355d24fa5a433c4b", + "82bebb674259d13678e9d3b46e01a4dd0722d55a", [] ] }, @@ -265492,6 +266078,10 @@ "check-cookie-and-return-bundle.py": [ "32765e85c93d3bd57cd83f1cf0d7299cf4e7975d", [] + ], + "csp-blocked.https.tentative.html.sub.headers": [ + "ac826f8c485d107806e841d6ffb463bf5d20c0a8", + [] ] } }, @@ -265819,6 +266409,10 @@ "e447830c5ffb442842bc1c6c6227dd8531d085e0", [] ], + "dummy-processor-globalthis.js": [ + "d1b16cc9aaac4a21f8c428d2a1d583fc07914c67", + [] + ], "dummy-processor.js": [ "11155d508c51956ee07dcf4cf7c68829920c2af6", [] @@ -266921,7 +267515,7 @@ [] ], "RTCStats-helper.js": [ - "81abe2456e94bb84e4d56c9781dc302a502490e5", + "33cbf4a933bd37553a8595e0692f9717e145ecc9", [] ], "RTCTrackEvent-constructor-expected.txt": [ @@ -270038,7 +270632,7 @@ [] ], "webxr_util.js": [ - "cf9c6ff880a16baceb8feb09a5d3aa1ed237f802", + "75d73968ccaaca1411391f25b2726f6bda57e27d", [] ] }, @@ -283696,7 +284290,7 @@ ] ], "class-string-named-properties-object.window.js": [ - "cff2582f8ce9e8f1efea0e7b6b12f5710fa4f35c", + "a427a2f8142e5392725f078e1fdb0c179994c593", [ "WebIDL/ecmascript-binding/class-string-named-properties-object.window.html", {} @@ -283832,6 +284426,53 @@ } ] ], + "global-object-implicit-this-value.any.js": [ + "cc0d08fcbd0d9c7598a59219ba70fe8ca4d89d81", + [ + "WebIDL/ecmascript-binding/global-object-implicit-this-value.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "WebIDL/ecmascript-binding/global-object-implicit-this-value.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "WebIDL/ecmascript-binding/global-object-implicit-this-value.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ] + ] + } + ], + [ + "WebIDL/ecmascript-binding/global-object-implicit-this-value.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ] + ] + } + ] + ], "has-instance.html": [ "caf0be47290607f9d63b42dde96c31816a1f7376", [ @@ -283925,13 +284566,6 @@ ] ] }, - "named-properties-object.html": [ - "556eca4b3318fd96d753fe9f1f165b2e4bd170ff", - [ - null, - {} - ] - ], "no-regexp-special-casing.any.js": [ "4446dbf69c02ab466ad03fd69d6ed3924d8e84a0", [ @@ -283956,6 +284590,13 @@ null, {} ] + ], + "window-named-properties-object.html": [ + "fe8275ef6a3fc6e6a8074368804ea9f4f4560582", + [ + null, + {} + ] ] }, "idlharness.any.js": [ @@ -289245,7 +289886,7 @@ ] ], "accept-ch-cache-revalidation.https.html": [ - "453b6fc5fe609fa786a57246132d560c5e214f8a", + "84555a02852a05d9fdd4ef4579f3273852baf207", [ null, {} @@ -289266,7 +289907,7 @@ ] ], "accept-ch-feature-policy.sub.https.html": [ - "381e8a1b52a1d7aa360d04a28a5992f6b83040cf", + "f9e5db8acc4717ce11b2419dd04c07b728bd871c", [ null, {} @@ -289280,7 +289921,7 @@ ] ], "accept-ch-no-feature-policy-navigation.https.html": [ - "24749baceac3ad524c2d95ebf6db319ac79d71e0", + "559e5a6758d0ee4d775642e8b2dd9c14160b4cdb", [ null, {} @@ -289652,21 +290293,21 @@ ] ], "http-equiv-accept-ch-merge.https.html": [ - "177a836557607569a865dfb25ca5a224be8878a0", + "4ed2291de2999d267de8510f2204079b153f368a", [ null, {} ] ], "http-equiv-accept-ch-non-secure.http.html": [ - "909ab5f5f2a563348da0d0bb3377961f1015d031", + "4820af459247f8ba8da46cd7ebb13ce6d1e01cb6", [ null, {} ] ], "sec-ch-quotes.https.html": [ - "d60bf4c9b670a94d3c7c991c6aed5aac73a844f4", + "f48c8c09e097dde80c8b91e11d2b0784698bd25d", [ null, {} @@ -302434,6 +303075,13 @@ ] ] }, + "print-color-adjust-parsing.html": [ + "ced8666333e676791841c377b21d41e0d577c3dc", + [ + null, + {} + ] + ], "rendering": { "dark-color-scheme": { "color-scheme-color-property.html": [ @@ -305393,6 +306041,13 @@ ] ] }, + "system-fonts-serialization.tentative.html": [ + "6abd6f09d64d5dc358221c7d3af29acd49fc9475", + [ + null, + {} + ] + ], "test_datafont_same_origin.html": [ "937c8c38e00d92579055f5e17300fd05b4c1bc51", [ @@ -306368,7 +307023,7 @@ ] ], "grid-baseline-004.html": [ - "7c3e46cfdbde7c982f76526d4b98611abd311e1e", + "cd565a10ad68a3de7172f96376cb49112cd04791", [ null, {} @@ -306907,21 +307562,21 @@ ] ], "grid-row-axis-self-baseline-synthesized-001.html": [ - "870e368d08db87aba17ca669b8e9dc14ba81fee0", + "3939c5b4620781960e1a60a0892747c3ca5f275e", [ null, {} ] ], "grid-row-axis-self-baseline-synthesized-002.html": [ - "80dba9cc3589e05aa5cfb9758b6dfe614c548529", + "f2f23cbe2650dd308a2a2692d5eb7713e69bcd65", [ null, {} ] ], "grid-row-axis-self-baseline-synthesized-003.html": [ - "daf06a4a80e71f2edbf917703c02b4293a7af85e", + "1160895f401808c87aaa28394f3b507d20dd8511", [ null, {} @@ -307481,21 +308136,21 @@ ] ], "grid-self-baseline-not-applied-if-sizing-cyclic-dependency-001.html": [ - "dae81ceee1a90c7d0d66fb3a86fdae025d4389cb", + "5ddf4495921573bb5c56e1e9a0738098c7d6138e", [ null, {} ] ], "grid-self-baseline-not-applied-if-sizing-cyclic-dependency-002.html": [ - "10c6d8a1bb8a2d569a57b0787c80890e153d2675", + "f1ab2ef8ad1eb22af7d7c4a6d18b13fb2b6fe071", [ null, {} ] ], "grid-self-baseline-not-applied-if-sizing-cyclic-dependency-003.html": [ - "a62999cb3218fa974ff4be8fc773882313bb6d1a", + "96ae131d4cb5987dd5d6d9ae08684d8b53f2168f", [ null, {} @@ -310305,6 +310960,13 @@ {} ] ], + "multicol-span-all-016.html": [ + "87c4b5812e6adede5bff8251772f32c46ff97597", + [ + null, + {} + ] + ], "parsing": { "column-count-computed.html": [ "702632d2dd4d306368951af65e9c32d7f2e2f554", @@ -311151,85 +311813,22 @@ {} ] ], - "inset-after-computed.html": [ - "b095809f8c80ef1a8150f3cffbe0e391b054e641", + "inset-computed.html": [ + "2a52785e3299d40d2da3c29876087d3ff431ab58", [ null, {} ] ], - "inset-after-invalid.html": [ - "3fccd7320063ffc50cd938fdf1056a998002e0be", + "inset-invalid.html": [ + "a96d6253826a4d3a94a4f5f5257e252b06d8db5d", [ null, {} ] ], - "inset-after-valid.html": [ - "27734a59e69a0a9b0498c9af2932e21b8e18784e", - [ - null, - {} - ] - ], - "inset-before-computed.html": [ - "088a95714b91c1eae73a29a583ef721857e2127c", - [ - null, - {} - ] - ], - "inset-before-invalid.html": [ - "133afc23fb9aacac1b5e71a559978d69550f43ef", - [ - null, - {} - ] - ], - "inset-before-valid.html": [ - "a802ddb1b48edade7ee1538e6061b488a56b7a54", - [ - null, - {} - ] - ], - "inset-end-computed.html": [ - "ddc18ced27c5e3ea4b44b4f0e1819b64e91d8bae", - [ - null, - {} - ] - ], - "inset-end-invalid.html": [ - "b0e66bb7c24f6c0a5f349789c3abdfcf1c4dcd5b", - [ - null, - {} - ] - ], - "inset-end-valid.html": [ - "2271ae645544f6e7b83615b4c1b62246c5d199c9", - [ - null, - {} - ] - ], - "inset-start-computed.html": [ - "f92202f1c3b92052becc6031c5f4ea9daadd0324", - [ - null, - {} - ] - ], - "inset-start-invalid.html": [ - "2f7a9496ba87af211fe2734ca8f83ccef40a2a87", - [ - null, - {} - ] - ], - "inset-start-valid.html": [ - "e74b205ffbc62252023bc6561c536d76879b0702", + "inset-valid.html": [ + "0faab9873761165d3ccb95377f07510654cd0cbf", [ null, {} @@ -313294,6 +313893,15 @@ {} ] ], + "invalidation-part-pseudo.html": [ + "fca4a964dce5c5c61b8f4fed4ef25510a9099298", + [ + null, + { + "testdriver": true + } + ] + ], "multiple-parts.html": [ "de02a26e164d283e4f05a0d8eba0f6b98c778700", [ @@ -314893,7 +315501,7 @@ ] ], "absolute-tables-003.html": [ - "352d8cd6270c3c731aad09a3e8a62b5583a23b9c", + "a4f945e38420314fd0b1c767cb5641be32ae06bb", [ null, {} @@ -314907,7 +315515,7 @@ ] ], "absolute-tables-005.html": [ - "57c3f0dea3a56f0281a44e6be019c3ecc9866937", + "24444d3b44ee34ba4f65623c73e8101905632bd0", [ null, {} @@ -318203,7 +318811,7 @@ ] ], "transform-interpolation-computed-value.html": [ - "80d2a37f4c9aaf6224d8f729214259157b0eefa7", + "6209b4e9c247974d64f0c58410ec68b6979026a5", [ null, {} @@ -319906,6 +320514,13 @@ ] }, "properties": { + "accent-color.html": [ + "8cd0b986e8665ee6a4e9830b9346f5a4957b89b8", + [ + null, + {} + ] + ], "alignment-baseline.html": [ "aab4a6a5c30b00be831173887230b58c59f8cc09", [ @@ -321556,7 +322171,7 @@ }, "css-ui": { "accent-color-computed.html": [ - "896e4bb36d92f9ce4ba2598ce63484bf3e53c658", + "10e080104d7d547757e0e2fc1ea5b47179d2aa5b", [ null, {} @@ -321570,6 +322185,13 @@ ] ], "animation": { + "accent-color-interpolation.html": [ + "20d87c4e52cb21a115cd1453bd20595c06aa1afb", + [ + null, + {} + ] + ], "caret-color-composition.html": [ "6c69578677896e2463331deba85731e13fd94a25", [ @@ -322390,7 +323012,7 @@ ] ], "minmax-percentage-serialize.html": [ - "f1cb5081a6d341cbba638ca7f1ecdb302813bc8f", + "65ab9fad961feb87d82955c30659321423a04e3a", [ null, {} @@ -325640,7 +326262,7 @@ ] ], "test_media_queries.html": [ - "ca56082d144f9ddc924b1898d9bd63bac45fe359", + "7aa91989470da18ba77562614c6c04c73c8ddf8a", [ null, {} @@ -326153,6 +326775,15 @@ } ] ], + "focus-visible-022.tentative.html": [ + "e2692a6bec8f8ef72a58c7d2b6fe3f226674677f", + [ + null, + { + "testdriver": true + } + ] + ], "focus-visible-script-focus-001.html": [ "df6d9158b7cf3e829343834f1c5a499a15016434", [ @@ -328295,7 +328926,7 @@ ] ], "AddEventListenerOptions-signal.any.js": [ - "42871061f3b9167cfa28e536b8608844684427d6", + "dc401e3bb5a3e8816845d7afa1c02b3084587a0f", [ "dom/events/AddEventListenerOptions-signal.any.html", {} @@ -328696,7 +329327,7 @@ {} ] ], - "document-level-touchmove-event-listener-passive-by-default.html": [ + "document-level-touchmove-event-listener-passive-by-default.tentative.html": [ "f3f0d58209fd8edda4fa1cc092dbe8d19bc4f143", [ null, @@ -328705,7 +329336,7 @@ } ] ], - "document-level-wheel-event-listener-passive-by-default.html": [ + "document-level-wheel-event-listener-passive-by-default.tentative.html": [ "b7224835fa398b3a81415af4ff288899bf53c266", [ null, @@ -355549,105 +356180,6 @@ ] }, "private-network-access": { - "idlharness.tentative.any.js": [ - "5a7726f4fdc02dfe29807783c45fbd347681552a", - [ - "fetch/private-network-access/idlharness.tentative.any.html", - { - "script_metadata": [ - [ - "global", - "window,worker" - ], - [ - "script", - "/resources/WebIDLParser.js" - ], - [ - "script", - "/resources/idlharness.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ], - [ - "fetch/private-network-access/idlharness.tentative.any.serviceworker.html", - { - "script_metadata": [ - [ - "global", - "window,worker" - ], - [ - "script", - "/resources/WebIDLParser.js" - ], - [ - "script", - "/resources/idlharness.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ], - [ - "fetch/private-network-access/idlharness.tentative.any.sharedworker.html", - { - "script_metadata": [ - [ - "global", - "window,worker" - ], - [ - "script", - "/resources/WebIDLParser.js" - ], - [ - "script", - "/resources/idlharness.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ], - [ - "fetch/private-network-access/idlharness.tentative.any.worker.html", - { - "script_metadata": [ - [ - "global", - "window,worker" - ], - [ - "script", - "/resources/WebIDLParser.js" - ], - [ - "script", - "/resources/idlharness.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], "non-secure-context.window.js": [ "47e08e8b77962d871cf7bdfad18e26d6df619c35", [ @@ -359653,7 +360185,7 @@ ] ], "cross-origin-objects.html": [ - "577129502426989888a1791f78df46b6ed23c55e", + "d1b6cabc0f4703e3e2982c89765d0a6a1f2fabc4", [ null, { @@ -360696,7 +361228,7 @@ ] ], "window-named-properties.html": [ - "a0bdb1be1ed96d812408ea0e72db1ae885a9a3b5", + "0ec25812d0b8fe07b7951a9a211481f3d8149bc9", [ null, {} @@ -364442,6 +364974,13 @@ {} ] ], + "2d.filter.canvasFilterObject.convolveMatrix.exceptions.html": [ + "dd7b57c069dbe479cc21368b2a19b1e1fa95b098", + [ + null, + {} + ] + ], "2d.filter.canvasFilterObject.html": [ "c4a0838d4fa647d7cdf712b26ae8645acee5be38", [ @@ -367601,27 +368140,6 @@ {} ] ], - "2d.transformation.rotate3d.X.html": [ - "42a4e3c45a0f3a1fa5656c57b269e01c133e37da", - [ - null, - {} - ] - ], - "2d.transformation.rotate3d.Y.html": [ - "5006769fa400b65d8263e25bf55f1aca1c8ec1fa", - [ - null, - {} - ] - ], - "2d.transformation.rotate3d.Z.html": [ - "71e113dfe5ba707a43fc1a1ab33256ebd38614f4", - [ - null, - {} - ] - ], "2d.transformation.rotate3d.html": [ "104e0870f27c5464ef107e978740364e0c11c523", [ @@ -367629,6 +368147,27 @@ {} ] ], + "2d.transformation.rotate3d.x.html": [ + "284ffd484aaf0008187548ad6ea5b0ebf284e9d6", + [ + null, + {} + ] + ], + "2d.transformation.rotate3d.y.html": [ + "d1dae9653e1d8afc944ea9410f2a23ea1593b777", + [ + null, + {} + ] + ], + "2d.transformation.rotate3d.z.html": [ + "2012a12368385ccc6773dd9a6102f058ab4e8b2d", + [ + null, + {} + ] + ], "2d.transformation.rotateAxis.html": [ "be0785a7d3606dbc5f0e1a77cb176d996ce375f3", [ @@ -373352,19 +373891,33 @@ ] ], "2d.filter.canvasFilterObject.colorMatrix.html": [ - "ed4fe910437b22e13a19694f7d09a997fcc77f56", + "e11013e25b8a58f1967be2050611664922b7455f", [ null, {} ] ], "2d.filter.canvasFilterObject.colorMatrix.worker.js": [ - "a2f73e09e2f7f88fae90c83a547d239bb14b0526", + "3b4959d44f1ea40277f4d8767efc2e24f57d83cd", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.worker.html", {} ] ], + "2d.filter.canvasFilterObject.convolveMatrix.exceptions.html": [ + "e8838ff51bb12e3ec71175875f4b4abc539609d9", + [ + null, + {} + ] + ], + "2d.filter.canvasFilterObject.convolveMatrix.exceptions.worker.js": [ + "de249c52d0a7db746310dd26e588c3c485f150fe", + [ + "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.worker.html", + {} + ] + ], "2d.filter.canvasFilterObject.html": [ "8e2e2d8ba95efd638f0a6b54a702e55f55ae910b", [ @@ -379686,6 +380239,20 @@ {} ] ], + "2d.transformation.perspective.html": [ + "e6bc88095c8c2e30123ead1bf56b7fe2dfb8caad", + [ + null, + {} + ] + ], + "2d.transformation.perspective.worker.js": [ + "a155ebfeb98475acc0b2bd16156fdec62689be93", + [ + "html/canvas/offscreen/transformations/2d.transformation.perspective.worker.html", + {} + ] + ], "2d.transformation.rotate.direction.html": [ "1f32f8df99ca84148928bebde8c60a84afe6d202", [ @@ -379770,6 +380337,90 @@ {} ] ], + "2d.transformation.rotate3d.html": [ + "4925c114efdeba8e5c04182dbbe8d950a9da1c06", + [ + null, + {} + ] + ], + "2d.transformation.rotate3d.worker.js": [ + "785b0e233dd45d31921ce7a7cd124b6fb71754ac", + [ + "html/canvas/offscreen/transformations/2d.transformation.rotate3d.worker.html", + {} + ] + ], + "2d.transformation.rotate3d.x.html": [ + "2905ac390aa68779caef81333f03acbdeacd8c2a", + [ + null, + {} + ] + ], + "2d.transformation.rotate3d.x.worker.js": [ + "fcee7c17146822bb04b8edac9b4f9952d02d7434", + [ + "html/canvas/offscreen/transformations/2d.transformation.rotate3d.x.worker.html", + {} + ] + ], + "2d.transformation.rotate3d.y.html": [ + "27b4eff56927c4df0a5426478c4591be7f7cf904", + [ + null, + {} + ] + ], + "2d.transformation.rotate3d.y.worker.js": [ + "c4cfd34340143b664b349ffae35592f5660e0113", + [ + "html/canvas/offscreen/transformations/2d.transformation.rotate3d.y.worker.html", + {} + ] + ], + "2d.transformation.rotate3d.z.html": [ + "96405e804fa2bf8c2774e97e44d1d68a79f4a64e", + [ + null, + {} + ] + ], + "2d.transformation.rotate3d.z.worker.js": [ + "f3c59135387d89b114e4f53fb89c62f54e4de660", + [ + "html/canvas/offscreen/transformations/2d.transformation.rotate3d.z.worker.html", + {} + ] + ], + "2d.transformation.rotateAxis.html": [ + "d7257a23b49219221f31b13f11d4cfcd97d099fe", + [ + null, + {} + ] + ], + "2d.transformation.rotateAxis.worker.js": [ + "f17356c075851ee20435b75d89d92b56a4d329f9", + [ + "html/canvas/offscreen/transformations/2d.transformation.rotateAxis.worker.html", + {} + ] + ], + "2d.transformation.scale.3d.html": [ + "ffd2287939dd0fd706dad3932e63ed4a1194a650", + [ + null, + {} + ] + ], + "2d.transformation.scale.3d.worker.js": [ + "692967f48a8eeca7e6e98eb7f1f1f7655a096830", + [ + "html/canvas/offscreen/transformations/2d.transformation.scale.3d.worker.html", + {} + ] + ], "2d.transformation.scale.basic.html": [ "60ba3593f480fe71ba0f991a3afa06cf634c98f0", [ @@ -379854,6 +380505,20 @@ {} ] ], + "2d.transformation.setTransform.3d.html": [ + "fb31cda3f5731746a80128a48cbc5804ef79e183", + [ + null, + {} + ] + ], + "2d.transformation.setTransform.3d.worker.js": [ + "aa6c033f81c4cd52a9aa260783adb473993eaac8", + [ + "html/canvas/offscreen/transformations/2d.transformation.setTransform.3d.worker.html", + {} + ] + ], "2d.transformation.setTransform.multiple.html": [ "4d73261d7f22bfa1e77df20cb28189326e4baf75", [ @@ -379896,6 +380561,20 @@ {} ] ], + "2d.transformation.transform.3d.html": [ + "2dfc718eab0f4ba23683365e9915f29a0a9388d8", + [ + null, + {} + ] + ], + "2d.transformation.transform.3d.worker.js": [ + "976c4e0b0fcd497ac3bf2863bbd013fc007f79d4", + [ + "html/canvas/offscreen/transformations/2d.transformation.transform.3d.worker.html", + {} + ] + ], "2d.transformation.transform.identity.html": [ "747454ae9180bc5671199489486ce8182dfb7f88", [ @@ -379952,6 +380631,20 @@ {} ] ], + "2d.transformation.translate.3d.html": [ + "73abc7eda2854804a931fc3f1160fea56bd0add1", + [ + null, + {} + ] + ], + "2d.transformation.translate.3d.worker.js": [ + "4336022e71e1a0d0bd294ca61b82e4f81a290ffc", + [ + "html/canvas/offscreen/transformations/2d.transformation.translate.3d.worker.html", + {} + ] + ], "2d.transformation.translate.basic.html": [ "1163ee555a03794cbabe164a9e43c44d44498cb5", [ @@ -389527,7 +390220,7 @@ ] ], "newline-normalization.html": [ - "b49468e19991e9309282e3068efff859d1c66751", + "2c83c5a1e9a07c02f4443bfd96b0a15411a5f288", [ null, {} @@ -391019,6 +391712,13 @@ null, {} ] + ], + "wrapping-transformation.window.js": [ + "c5c28a4854bb0690831f2be3a12de5cfad4c909f", + [ + "html/semantics/forms/the-textarea-element/wrapping-transformation.window.html", + {} + ] ] } }, @@ -400402,7 +401102,7 @@ ] ], "delete_all_cookies.html": [ - "14b7d5861b7f60ae329d99b29dbbe12a25cc8c0b", + "8d7b82ab04d968a3fad3b7796a2d5c341c06c91c", [ null, { @@ -401910,6 +402610,15 @@ {} ] ], + "mousemove-becomes-drag.html": [ + "df4a416c81cd0ebaccfe2b0a041ca88ef34dc4e4", + [ + null, + { + "testdriver": true + } + ] + ], "move-distance-clamped.html": [ "5854fe08d156f52260fb9eeb8980d31a3ae91077", [ @@ -403491,7 +404200,7 @@ }, "measure-memory": { "detached.https.window.js": [ - "430cb2dbb701bd88683782169840cab41fbbd733", + "1fcedef54c787bbcab39508a8c266a8bfa439227", [ "measure-memory/detached.https.window.html", { @@ -403502,6 +404211,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403536,7 +404249,7 @@ ] ], "iframe.cross-origin.https.window.js": [ - "d977c3a84ee950915e41ce576e86359a3eb7cb63", + "de256ad83f83b486931bddc6931462f980b7ae51", [ "measure-memory/iframe.cross-origin.https.window.html", { @@ -403547,6 +404260,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403559,7 +404276,7 @@ ] ], "iframe.cross-site.https.window.js": [ - "919bc3e215a62fa1c03aca3d5142ae00431a5b8d", + "a4c50a5687e4bc75c6e127874a56668e8354a19b", [ "measure-memory/iframe.cross-site.https.window.html", { @@ -403570,6 +404287,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403582,7 +404303,7 @@ ] ], "iframe.same-origin.https.window.js": [ - "10fad71a750edfc5ac72d79b8d5fb4baf650515f", + "5d710bd1dd89d7ccdea956a29b0eebc095c286d8", [ "measure-memory/iframe.same-origin.https.window.html", { @@ -403593,6 +404314,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403605,7 +404330,7 @@ ] ], "main-frame-and-worker.https.window.js": [ - "43c27904e644b77b1152658d6087e78f5c7ba5ba", + "a1a5a5a6c3ad7c28692d830ea6357c6c30743d98", [ "measure-memory/main-frame-and-worker.https.window.html", { @@ -403616,6 +404341,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403628,7 +404357,7 @@ ] ], "main-frame.https.window.js": [ - "750017095f6d09bf515d07c5d1fdd4d9540a826b", + "1119ca4446451d3004543e257482a203f17a87e3", [ "measure-memory/main-frame.https.window.html", { @@ -403639,6 +404368,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403651,7 +404384,7 @@ ] ], "randomized-breakdown.https.window.js": [ - "2ad8535476b2db14e8c4f2d99d65a41c22d6a2a7", + "09937d51158d32bd67f5d95df033a87c3134fd27", [ "measure-memory/randomized-breakdown.https.window.html", { @@ -403662,6 +404395,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403674,7 +404411,7 @@ ] ], "redirect.client.https.window.js": [ - "9cad328bd92d6f5164c96ce8cb050b398e8f3428", + "a78a7ddfdc95404ca05a03b473fc03740e6a2e0e", [ "measure-memory/redirect.client.https.window.html", { @@ -403685,6 +404422,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403697,7 +404438,7 @@ ] ], "redirect.server.https.window.js": [ - "2c32de2d0dbd62371d546677bead76dad0d73496", + "98273edec27f40ffd5b228a9ab11038081e2d7c7", [ "measure-memory/redirect.server.https.window.html", { @@ -403708,6 +404449,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403719,8 +404464,49 @@ } ] ], + "service-worker.https.any.js": [ + "c0251114dd6ae5760667422a237e04ea03162887", + [ + "measure-memory/service-worker.https.any.serviceworker.html", + { + "script_metadata": [ + [ + "script", + "./resources/checker.js" + ], + [ + "timeout", + "long" + ], + [ + "global", + "serviceworker" + ] + ], + "timeout": "long" + } + ] + ], + "shared-worker.https.any.js": [ + "4e359ad3fe6cbe528d6377a273afa0df0bbaeec5", + [ + "measure-memory/shared-worker.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "./resources/checker.js" + ], + [ + "global", + "sharedworker" + ] + ] + } + ] + ], "window-open.cross-origin.https.window.js": [ - "9a054301e8fe8747aa13e0941b60e1548a4bee35", + "5305b1c0b0796ee3f96d73702a2154377b301a0b", [ "measure-memory/window-open.cross-origin.https.window.html", { @@ -403731,6 +404517,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403743,7 +404533,7 @@ ] ], "window-open.cross-site.https.window.js": [ - "a5fc1d31bd9d2a8c79595da9bd0b27045bf55cf4", + "3a9481fae6b13c1e4afa704de65052c88b5cdfb0", [ "measure-memory/window-open.cross-site.https.window.html", { @@ -403754,6 +404544,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403766,7 +404560,7 @@ ] ], "window-open.mix.https.window.js": [ - "91d13a5009e64954f4c4f8032bf142690b4e54a1", + "2b4c9e57aadadbe5f6fa5f94e0274c0ee821ca5c", [ "measure-memory/window-open.mix.https.window.html", { @@ -403777,6 +404571,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403789,7 +404587,7 @@ ] ], "window-open.same-origin.https.window.js": [ - "ee4a59e5bc74cb466533b9688dd095a3399fede5", + "f0ff6f2cd765622466e01e8a167cb25ea47b6795", [ "measure-memory/window-open.same-origin.https.window.html", { @@ -403800,6 +404598,10 @@ ], [ "script", + "./resources/checker.js" + ], + [ + "script", "./resources/common.js" ], [ @@ -403840,6 +404642,13 @@ } ] ], + "decodingInfo.webrtc.html": [ + "91f03bd692ba70510e3e77704c85d8395d4c1d92", + [ + null, + {} + ] + ], "decodingInfoEncryptedMedia.http.html": [ "267b23431b7fdf3baf3d4843d68778bb1cc15c85", [ @@ -403848,7 +404657,7 @@ ] ], "decodingInfoEncryptedMedia.https.html": [ - "09422840093cd13ac09c9eaf5120a558ba29099a", + "7ac914de89ddc0f7bee0169a7c7cee04ab261f2b", [ null, { @@ -404332,7 +405141,7 @@ ] ], "mediasource-is-type-supported.html": [ - "f7c6bdc223d3387604f1b465e7d4c0f4f6c9618e", + "1981af7b94138840d269e27d42d31896233dfd85", [ null, {} @@ -414513,6 +415322,26 @@ ] ] }, + "private-click-measurement": { + "idlharness.window.js": [ + "1d0539a7bf56d071d247cded4ed2f4555b34bf6f", + [ + "private-click-measurement/idlharness.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ] + ] + }, "push-api": { "idlharness.https.any.js": [ "c0e278eb5742b50802f5f40824acba21ed8fc70f", @@ -426733,6 +427562,13 @@ {} ] ], + "TAO-match.html": [ + "bd0e8dbb35b57405a909b11450ea70107e4a4c65", + [ + null, + {} + ] + ], "TAO-null-opaque-origin.html": [ "6548a7b9ad437407eaded2c6efc4974dec242ecd", [ @@ -427050,13 +427886,6 @@ {} ] ], - "resource-TAO-match-origin.html": [ - "7e738f9c9c5b591f9001f8611ae0248bf76e9f3f", - [ - null, - {} - ] - ], "resource-ignore-data-url.html": [ "a7056a80807967d9b94b1d4c54c0620dc2a4bad8", [ @@ -427094,69 +427923,6 @@ {} ] ], - "resource_TAO_match_wildcard.html": [ - "fe812f86774443cc40fc0abf40418fa95fda4763", - [ - null, - {} - ] - ], - "resource_TAO_multi.html": [ - "bb774abc6021a4abd041076afeee3e9d38acc7e0", - [ - null, - {} - ] - ], - "resource_TAO_multi_wildcard.html": [ - "844896087d45a45369243ce80987876970f40620", - [ - null, - {} - ] - ], - "resource_TAO_null.html": [ - "1a86e09c56753f0bb4319637a601b0acb09ac62e", - [ - null, - {} - ] - ], - "resource_TAO_origin.html": [ - "a0c0465e72660fb8aec6625493a0e0e183d6bc18", - [ - null, - {} - ] - ], - "resource_TAO_origin_uppercase.html": [ - "1a03c71410643866b9073db5d7b4c3402ea47fec", - [ - null, - {} - ] - ], - "resource_TAO_space.html": [ - "9efefe15a4f1d43d2b0f16e9636759338a4c2afc", - [ - null, - {} - ] - ], - "resource_TAO_wildcard.html": [ - "df278534cc49d46bad7967084b011cf6e93e3876", - [ - null, - {} - ] - ], - "resource_TAO_zero.html": [ - "a15f54d0134a82be3c4987ac09017fe317d2fc3a", - [ - null, - {} - ] - ], "resource_cached.html": [ "fd61d639616b1802ff4b63de82a01ffd701f814e", [ @@ -427294,6 +428060,171 @@ } ] ], + "sizes-cache.any.js": [ + "af70e5a6ded3e63d158fd929feacf0827b3cafc9", + [ + "resource-timing/sizes-cache.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ], + [ + "script", + "/resource-timing/resources/resource-loaders.js" + ] + ] + } + ], + [ + "resource-timing/sizes-cache.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ], + [ + "script", + "/resource-timing/resources/resource-loaders.js" + ] + ] + } + ], + [ + "resource-timing/sizes-cache.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ], + [ + "script", + "/resource-timing/resources/resource-loaders.js" + ] + ] + } + ], + [ + "resource-timing/sizes-cache.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ], + [ + "script", + "/resource-timing/resources/resource-loaders.js" + ] + ] + } + ] + ], + "sizes-redirect-img.html": [ + "786018d0c4634c3d8c6df2c4003b201e6e4bc4e1", + [ + null, + {} + ] + ], + "sizes-redirect.any.js": [ + "e483a4d409c6c2deee73fa213d698b95b865d0c8", + [ + "resource-timing/sizes-redirect.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ] + ] + } + ], + [ + "resource-timing/sizes-redirect.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ] + ] + } + ], + [ + "resource-timing/sizes-redirect.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ] + ] + } + ], + [ + "resource-timing/sizes-redirect.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/resource-timing/resources/sizes-helper.js" + ] + ] + } + ] + ], "status-codes-create-entry.html": [ "cc0cd8ccb88250331186c38554b09ff8515cacee", [ @@ -445268,6 +446199,13 @@ {} ] ], + "url-setters-a-area.window.js": [ + "8c66f2883d3c2e864f4b3da3da9d5b48a4027136", + [ + "url/url-setters-a-area.window.html", + {} + ] + ], "url-setters-stripping.any.js": [ "3413c6cd5ad21d1913c00269ae054fdc2c7750d9", [ @@ -445279,10 +446217,14 @@ {} ] ], - "url-setters.html": [ - "db30cf0774da445a18d9a6755b97ad1e13083b99", + "url-setters.any.js": [ + "1cddf94a8ecca9766638160d3770e6c7160cbbdc", [ - null, + "url/url-setters.any.html", + {} + ], + [ + "url/url-setters.any.worker.html", {} ] ], @@ -446079,7 +447021,7 @@ ] ], "request-video-frame-callback.html": [ - "afc6b834d44b3e1e400c09f1c74dbfbb159fea3d", + "a4404143fa408ebbb8f49cc3180e065d200ffa4a", [ null, {} @@ -449922,14 +450864,14 @@ "web-bundle": { "subresource-loading": { "csp-allowed.https.tentative.html": [ - "72a7593c4a47cc343a805748f1c60f7bb55844eb", + "ceec6456405e20c6be25d7321584bc5549afcfb7", [ null, {} ] ], "csp-blocked.https.tentative.html": [ - "dc5ffb82f43812ace8f5b0347aa9be35f9c92829", + "319ae65c96776d6a8f13d50c836e9f7dd4e253c6", [ null, {} @@ -449950,7 +450892,7 @@ ] ], "subframe-from-web-bundle.https.tentative.html": [ - "f6f2b769d0f1230f225c8625a3982fea1bd4b15e", + "a5bd9bc2eb89e663391ce2b047f7648952f10360", [ null, {} @@ -452095,6 +453037,13 @@ {} ] ], + "audioworklet-registerprocessor-called-on-globalthis.https.html": [ + "718cadffc716f04548af6caeeca9e075846b6d46", + [ + null, + {} + ] + ], "audioworklet-suspend.https.html": [ "685546aeb5e2f96e77e9c88cec19946f2b0fcb16", [ @@ -452949,7 +453898,7 @@ }, "the-periodicwave-interface": { "periodicWave.html": [ - "bd42453001498c990bea27424eb4164d3196aee0", + "9048b7f5dad775cfa55e4749ad7057bf1636efc5", [ null, {} @@ -455240,7 +456189,7 @@ ] ], "RTCPeerConnection-getStats.https.html": [ - "49f88131c3e1f75b8b7cb926792f9ac71f41e8ee", + "f26a93ea28999e241e7374ff9d07f39412816aa1", [ null, {} @@ -455286,7 +456235,7 @@ ] ], "RTCPeerConnection-mandatory-getStats.https.html": [ - "7da14cd5e0f3f5c7e807b61cb0e7ecc7216ff007", + "f80fa5fe1f465cf946347f30d06ef8a9052af45c", [ null, { @@ -455431,7 +456380,7 @@ ] ], "RTCPeerConnection-setLocalDescription-pranswer.html": [ - "e4296aef139f19d08229c9450f61c30706147d24", + "01845f09b16ce1ff03747f039dee5de89b19a5ae", [ null, {} @@ -456408,7 +457357,7 @@ }, "websockets": { "Close-1000-reason.any.js": [ - "1b1a101e2dda1946443203bad933c4ef82dda10d", + "6fc3c1fade8e70ca67fae93501e08b05624fefe6", [ "websockets/Close-1000-reason.any.html", { @@ -456549,7 +457498,7 @@ ] ], "Close-1000-verify-code.any.js": [ - "5adad3dc950c06a8ed33b0cf9f5a307c3e862f02", + "de50130660291f9cabb2db5f6780ac0189cda83a", [ "websockets/Close-1000-verify-code.any.html", { @@ -456690,7 +457639,7 @@ ] ], "Close-1000.any.js": [ - "6a3e73e349f2d1086dfae2fa54c5b7af4ab801f1", + "f3100c6caaa3d2524be6721e41153a123f86ef2d", [ "websockets/Close-1000.any.html", { @@ -456831,7 +457780,7 @@ ] ], "Close-1005-verify-code.any.js": [ - "34ebfc99c2fb974fe9efa8cbff3f4c15f928a764", + "afa7d7b0d983fca5892cc602eae955f790a6b57f", [ "websockets/Close-1005-verify-code.any.html", { @@ -456972,7 +457921,7 @@ ] ], "Close-1005.any.js": [ - "681194a9989191dcd86bf561df6a1370719b264d", + "514d03ac632431737e821619a54309b8a250b41d", [ "websockets/Close-1005.any.html", { @@ -457113,7 +458062,7 @@ ] ], "Close-2999-reason.any.js": [ - "baaa456d1a8ee558331a08721f00ae78aba941b7", + "95e481e53cf38c805b8af0c15a594296981289bf", [ "websockets/Close-2999-reason.any.html", { @@ -457254,7 +458203,7 @@ ] ], "Close-3000-reason.any.js": [ - "4a048e278cf51ce3cdc6c8486efd8ef4edd6a9f5", + "2db122934c787abab8a4c4a7b398c54f763b9991", [ "websockets/Close-3000-reason.any.html", { @@ -457395,7 +458344,7 @@ ] ], "Close-3000-verify-code.any.js": [ - "1191dea1335db9edf1ae98938542857f284ea1af", + "bfa441f1ee4d6161c7c8f29a8d27d4145aef6795", [ "websockets/Close-3000-verify-code.any.html", { @@ -457536,7 +458485,7 @@ ] ], "Close-4999-reason.any.js": [ - "4112d0130f204f9c4d8f27be2121dfa777616276", + "3516dc2f462d97aa52a21f2d4d308c422423d12c", [ "websockets/Close-4999-reason.any.html", { @@ -457677,7 +458626,7 @@ ] ], "Close-Reason-124Bytes.any.js": [ - "f42b7f409b29f1a1d061e301351868c72fd225cd", + "aa7fc8ffe83818daeb7faf630e2196f454d0735c", [ "websockets/Close-Reason-124Bytes.any.html", { @@ -457818,7 +458767,7 @@ ] ], "Close-onlyReason.any.js": [ - "b99595cf523cad6a935b39f9b81bb979bc2d112f", + "7c5d10d2a833b97a32863e498f30c225774828ba", [ "websockets/Close-onlyReason.any.html", { @@ -457959,7 +458908,7 @@ ] ], "Close-readyState-Closed.any.js": [ - "f2878ad9243fbbbe8a1159cef09c68ae0108b331", + "bfd61c48c14aa28ca61f703937432a181f22cbd0", [ "websockets/Close-readyState-Closed.any.html", { @@ -458100,7 +459049,7 @@ ] ], "Close-readyState-Closing.any.js": [ - "bbed4edc6891e137d74e8b99647e5b97cb609a16", + "554744d6297e3b843a288393c9c0969dce7ca96b", [ "websockets/Close-readyState-Closing.any.html", { @@ -458241,7 +459190,7 @@ ] ], "Close-reason-unpaired-surrogates.any.js": [ - "5e0fbe21782e728b931262b1ef27f68d9025a8dc", + "647a1216b99ce4f89fe8f2bac65aa2f2bd35c1f6", [ "websockets/Close-reason-unpaired-surrogates.any.html", { @@ -458382,7 +459331,7 @@ ] ], "Close-server-initiated-close.any.js": [ - "c70477eeeaab655addf78fb422aa10ab7f5a55e3", + "c86793b23a1d8c9592d74c3f5e13dacd57e9a643", [ "websockets/Close-server-initiated-close.any.html", { @@ -458523,7 +459472,7 @@ ] ], "Close-undefined.any.js": [ - "9130aa1c75627f1306c6433b9059a865d307fe9e", + "a8106c6f155a7aa8357529be3f39c1195ce686b9", [ "websockets/Close-undefined.any.html", { @@ -458946,7 +459895,7 @@ ] ], "Create-extensions-empty.any.js": [ - "b2de904144b880d5f3f514cca3a77bd722f954ed", + "1fba4bd2cc5a61556256167a97613d51517b210e", [ "websockets/Create-extensions-empty.any.html", { @@ -460091,7 +461040,7 @@ ] ], "Create-valid-url-array-protocols.any.js": [ - "3989616d02c8bcbe5f40457f7e696cc788fab3b8", + "00ab1ca9873248013dfaab04720befb8c0083f1f", [ "websockets/Create-valid-url-array-protocols.any.html", { @@ -460232,7 +461181,7 @@ ] ], "Create-valid-url-binaryType-blob.any.js": [ - "b161349a2b28a43b314a61bd1e18c312abe80b0c", + "59eec8e29d3e52648e21ace92a81df64bb65b1da", [ "websockets/Create-valid-url-binaryType-blob.any.html", { @@ -460514,7 +461463,7 @@ ] ], "Create-valid-url-protocol-setCorrectly.any.js": [ - "b4e34580f3e6b817fc459709280143fe09e414c8", + "bb1f32fbce1fa6a823db5947cc691e52ae02d8b9", [ "websockets/Create-valid-url-protocol-setCorrectly.any.html", { @@ -460655,7 +461604,7 @@ ] ], "Create-valid-url-protocol-string.any.js": [ - "46d613be1407b3a1eb3b7eb8403c9bb9e0afbed1", + "4f730db94f7ef2720f7d564e13b3740bd9554ba2", [ "websockets/Create-valid-url-protocol-string.any.html", { @@ -460796,7 +461745,7 @@ ] ], "Create-valid-url-protocol.any.js": [ - "7572d5967b0fd94be0a0712abd7d6b0fc8e5692f", + "599a9eb8f1b350cf79900620002c183aef4dd1d9", [ "websockets/Create-valid-url-protocol.any.html", { @@ -460937,7 +461886,7 @@ ] ], "Create-valid-url.any.js": [ - "f63d973a47097bb533c794603aeb07c13136f214", + "edb27f61d3c33c9028e4fd178d5a3d795ca23b1a", [ "websockets/Create-valid-url.any.html", { @@ -461219,7 +462168,7 @@ ] ], "Send-0byte-data.any.js": [ - "085c85229f978f95a7f8e02ea60e0d17590e019d", + "b984b641084a3cddbf1b757aa794532ab708000c", [ "websockets/Send-0byte-data.any.html", { @@ -461360,7 +462309,7 @@ ] ], "Send-65K-data.any.js": [ - "957fc4846b84ba779ad52be440bdc1e60477b532", + "5c3437999b99a40e0676534a9748e4d503b34f3e", [ "websockets/Send-65K-data.any.html", { @@ -461642,7 +462591,7 @@ ] ], "Send-binary-65K-arraybuffer.any.js": [ - "7269eb20640736cbe4e9e012c9132be61cdd1ea6", + "1e02ac2d37f99c5ab4d4d8b3639786b1a738db46", [ "websockets/Send-binary-65K-arraybuffer.any.html", { @@ -461783,7 +462732,7 @@ ] ], "Send-binary-arraybuffer.any.js": [ - "8b87f1b5954b2b5ce08416c86a32768b289005e0", + "5c985edd61638688eb73dd4ca7912372d123cac9", [ "websockets/Send-binary-arraybuffer.any.html", { @@ -461924,7 +462873,7 @@ ] ], "Send-binary-arraybufferview-float32.any.js": [ - "2e9fbaec95e025235504f715720a5ec7c39de306", + "9a8e3426f49c3ae6815f2a672be0c716569fdd0c", [ "websockets/Send-binary-arraybufferview-float32.any.html", { @@ -462065,7 +463014,7 @@ ] ], "Send-binary-arraybufferview-float64.any.js": [ - "375917753cf98386e03b34dab5eeee1b6550fefa", + "d71d2d8c58f5d5d0d285320d59e0f42c13e4031c", [ "websockets/Send-binary-arraybufferview-float64.any.html", { @@ -462206,7 +463155,7 @@ ] ], "Send-binary-arraybufferview-int16-offset.any.js": [ - "abed1bb24659fd7a4e16b1ba1b98df78837e6a48", + "bb77d300ad1f9c1d435a0c5e7b648b8e4d1f2b60", [ "websockets/Send-binary-arraybufferview-int16-offset.any.html", { @@ -462347,7 +463296,7 @@ ] ], "Send-binary-arraybufferview-int32.any.js": [ - "be08fc5d0ed8bfdc1505cfb0c431b12230f8b62d", + "f4312e410ab738f086b576fe656c9a4046fff266", [ "websockets/Send-binary-arraybufferview-int32.any.html", { @@ -462488,7 +463437,7 @@ ] ], "Send-binary-arraybufferview-int8.any.js": [ - "5ca9e64bfefd70d5dcacd9099ccc07513f344239", + "f2374fb413908548f9d9d5e4ada145dbac4af4cb", [ "websockets/Send-binary-arraybufferview-int8.any.html", { @@ -462629,7 +463578,7 @@ ] ], "Send-binary-arraybufferview-uint16-offset-length.any.js": [ - "dac79cbf547d776fb8d359f15c9850e75e90a08d", + "f917a3af007d8ca29df385c1397dbcb6378f526f", [ "websockets/Send-binary-arraybufferview-uint16-offset-length.any.html", { @@ -462770,7 +463719,7 @@ ] ], "Send-binary-arraybufferview-uint32-offset.any.js": [ - "46de94697ad41e39b1d5a7e9ba1bc7781aa6459d", + "33758dc65449e5fd662abd042be6373a1fd1abbe", [ "websockets/Send-binary-arraybufferview-uint32-offset.any.html", { @@ -462911,7 +463860,7 @@ ] ], "Send-binary-arraybufferview-uint8-offset-length.any.js": [ - "ec1a59a441b3de56055889d32be13d1dec3ee21b", + "1d256dbdca128771040325541ecb61f72a3e42c5", [ "websockets/Send-binary-arraybufferview-uint8-offset-length.any.html", { @@ -463052,7 +464001,7 @@ ] ], "Send-binary-arraybufferview-uint8-offset.any.js": [ - "7029080a068b585042ad3f4bdb7614c9735febfb", + "43e9fe6849919049af67a66c8b71cc3b5f159c14", [ "websockets/Send-binary-arraybufferview-uint8-offset.any.html", { @@ -463193,7 +464142,7 @@ ] ], "Send-binary-blob.any.js": [ - "c5f9031b5b0954deccf53917bba0ba00e9121d11", + "56c89a1b53c4e5e87fa30c3b64f669f7dfe94d78", [ "websockets/Send-binary-blob.any.html", { @@ -463334,7 +464283,7 @@ ] ], "Send-data.any.js": [ - "4d48f19dda4afe470e937e731a8c4a9925b784c8", + "203ab54dffc62b9b7b28e8344d573a0e911b9570", [ "websockets/Send-data.any.html", { @@ -463475,7 +464424,7 @@ ] ], "Send-data.worker.js": [ - "853725587f4dee557d6c7486806b59eed9e4e3af", + "b141fb382070307751b742f6f5f516fc32872264", [ "websockets/Send-data.worker.html", { @@ -463535,7 +464484,7 @@ ] ], "Send-null.any.js": [ - "4a77a5ff3ecf49c2f45b14a58723db87d769a136", + "a12eaf9c591af8ddfe95c75aef34cb5fd309d160", [ "websockets/Send-null.any.html", { @@ -463676,7 +464625,7 @@ ] ], "Send-paired-surrogates.any.js": [ - "6d7ab08b2122695c2d229aaca560c9d2c54c6eae", + "e2dc004bfcf4e9e5d1b71d65d8c69b2fd6efc715", [ "websockets/Send-paired-surrogates.any.html", { @@ -463817,7 +464766,7 @@ ] ], "Send-unicode-data.any.js": [ - "51bd15c5e92ddd6408099b6ced3aaad8c4cbdce2", + "f22094a243c96d1cb0777db3cfa975bf0fbff9e3", [ "websockets/Send-unicode-data.any.html", { @@ -463958,7 +464907,7 @@ ] ], "Send-unpaired-surrogates.any.js": [ - "8e06a4676b1623b75c28c8cc3b19228e457e1c9e", + "1cb5d0ac9cd49647fc384c077dbbc194a4edb051", [ "websockets/Send-unpaired-surrogates.any.html", { @@ -464287,7 +465236,7 @@ ], "binary": { "001.html": [ - "d20f5ad3490ce177cdf950de09f1ea4c13778e2c", + "21ffff40eb0f3fb225cecc2b698c54d779ab8d0b", [ null, {} @@ -464302,7 +465251,7 @@ ] ], "002.html": [ - "6bad9e95cae8fdfdd6e0b61babedf3c978c7076f", + "ffd1ee7a7a27510d88c23501791adef70e57572d", [ null, { @@ -464323,7 +465272,7 @@ ] ], "004.html": [ - "d679c5cec4005fb879785a602d1b48b11b17a83c", + "76bb902cf95b258d802a8c315179179cfd5a7822", [ null, { @@ -464344,7 +465293,7 @@ ] ], "005.html": [ - "e8c2b38eec8ac0d7a490b9bae77f7b815e4cc281", + "9b8b2c4edfd54049044e77e9d9d9ec0309c567a5", [ null, {} @@ -464360,7 +465309,7 @@ ] }, "binaryType-wrong-value.any.js": [ - "9b382e8e0f244d0f255fd4d481bb9d9714f9816e", + "007510d030bff14d1cc0d5198f850d5ad5e96a48", [ "websockets/binaryType-wrong-value.any.html", { @@ -465637,7 +466586,7 @@ ] ], "extended-payload-length.html": [ - "62b5f923615dc1ed5536ac0aaa77ff8f39803d8f", + "23caedc461c475da25b5dea07aa6a8399c9183e1", [ null, { @@ -465692,7 +466641,7 @@ "WebSocket": { "bufferedAmount": { "bufferedAmount-arraybuffer.html": [ - "240660e0811976d6996e388125a3494a5e0e7386", + "258eaa782797bf94a5a7ce4030a4d64f5eb60cc9", [ null, {} @@ -465707,7 +466656,7 @@ ] ], "bufferedAmount-blob.html": [ - "4ed0d98d2fc8ffe572b43388c3405a6c269f8577", + "ac5140de6cc572f1a0b1f9fcf23a4e3722667440", [ null, {} @@ -465781,7 +466730,7 @@ ] ], "bufferedAmount-large.html": [ - "caf3368cdaeb580cc58c5ec42f96130b3b8e6732", + "e599614103b4d3abafdda20db8176dee1578380e", [ null, { @@ -465813,7 +466762,7 @@ ] ], "bufferedAmount-unicode.html": [ - "de08a73a6261c497ccc088fe58f13de422ddda8f", + "ba25caeb220e5d201d62616ea31a5b8e5f5007cc", [ null, {} @@ -466176,7 +467125,7 @@ ] ], "018.html": [ - "7b909cde2f8c0db972ce903b36476b953d1a11d4", + "3dc36d0c5f118bf9b8f0e0e0f593fbf14b82a0ff", [ null, {} @@ -466390,7 +467339,7 @@ ] ], "006.html": [ - "ec008e99bb95159ad3cc33687be5054d935e6fa7", + "a7c00b154f12898e2f2a022aa9c23434d8d595f1", [ null, {} @@ -468480,6 +469429,85 @@ } ] ], + "idlharness.any.js": [ + "1a22753926745107f1edc522d4a8040a048de509", + [ + "webtransport/idlharness.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ], + [ + "webtransport/idlharness.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ], + [ + "webtransport/idlharness.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ], + [ + "webtransport/idlharness.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ] + ] + } + ] + ], "quic": { "client-indication.sub.any.js": [ "62f2f3fe4d22bd767db78650c1cc9dda2053e6ce", @@ -475246,7 +476274,7 @@ ] ], "constructor-formelement.html": [ - "cce0f428a20d2d49f2fb320a1ddeb201de2e0cdc", + "813e1d2a6c0ef432e743d4d1658deb8acefcbc18", [ null, {} @@ -489236,7 +490264,7 @@ }, "get_window_handle": { "get.py": [ - "8c262033c3838abb406c6dcf9c44f248b327373b", + "68441da5ef8460bb472beecd2e31a6cc34f0faa3", [ null, {} @@ -489335,7 +490363,7 @@ }, "maximize_window": { "maximize.py": [ - "6903eece70d02a47498586f0eca4e7bd75d469c0", + "e233e45a10d7136929380e2a80f5d6fdd0c32a9e", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml index 7cae5c0f..27a11a1 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml
@@ -1 +1,3 @@ spec: https://w3c.github.io/webcrypto/ +suggested_reviewers: + - twiss
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js index cff2582f..a427a2f8 100644 --- a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/class-string-named-properties-object.window.js
@@ -16,17 +16,6 @@ assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object WindowProperties]"); }, "Object.prototype.toString"); -test(t => { - assert_own_property(namedPropertiesObject, Symbol.toStringTag, "Precondition for this test: @@toStringTag exists"); - - t.add_cleanup(() => { - Object.defineProperty(namedPropertiesObject, Symbol.toStringTag, { value: "WindowProperties" }); - }); - - Object.defineProperty(namedPropertiesObject, Symbol.toStringTag, { value: "NotWindowProperties" }); - assert_equals(Object.prototype.toString.call(namedPropertiesObject), "[object NotWindowProperties]"); -}, "Object.prototype.toString applied after modifying @@toStringTag"); - // Chrome had a bug (https://bugs.chromium.org/p/chromium/issues/detail?id=793406) where if there // was no @@toStringTag, it would fall back to a magic class string. Tests for this are present in // the sibling class-string*.any.js tests. However, the named properties object always fails calls
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any-expected.txt b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any-expected.txt new file mode 100644 index 0000000..bad58bcd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any-expected.txt
@@ -0,0 +1,12 @@ +This is a testharness.js-based test. +FAIL Global object's getter throws when called on incompatible object assert_throws_js: function "() => { Object.create(globalThis).self; }" did not throw +PASS Global object's setter throws when called on incompatible object +PASS Global object's operation throws when called on incompatible object +PASS Global object's getter throws when called on incompatible object (document.all) +PASS Global object's setter throws when called on incompatible object (document.all) +PASS Global object's operation throws when called on incompatible object (document.all) +PASS Global object's getter works when called on null / undefined +PASS Global object's setter works when called on null / undefined +PASS Global object's operation works when called on null / undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.js b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.js new file mode 100644 index 0000000..cc0d08fc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.js
@@ -0,0 +1,85 @@ +// META: global=window,worker + +// https://heycam.github.io/webidl/#dfn-attribute-getter (step 1.1.2.1) +// https://heycam.github.io/webidl/#dfn-attribute-setter (step 4.5.1) +// https://heycam.github.io/webidl/#dfn-create-operation-function (step 2.1.2.1) + +const notGlobalObject = Object.create(Object.getPrototypeOf(globalThis)); + +test(() => { + assert_throws_js(TypeError, () => { Object.create(globalThis).self; }); + assert_throws_js(TypeError, () => { getGlobalPropertyDescriptor("location").get.call(notGlobalObject); }); + assert_throws_js(TypeError, () => { Reflect.get(globalThis, "navigator", notGlobalObject); }); + assert_throws_js(TypeError, () => { new Proxy(globalThis, {}).onerror; }); +}, "Global object's getter throws when called on incompatible object"); + +test(() => { + assert_throws_js(TypeError, () => { Object.create(globalThis).origin = origin; }); + assert_throws_js(TypeError, () => { getGlobalPropertyDescriptor("onerror").set.call(notGlobalObject, onerror); }); + assert_throws_js(TypeError, () => { Reflect.set(globalThis, "onoffline", onoffline, notGlobalObject); }); + assert_throws_js(TypeError, () => { new Proxy(globalThis, {}).ononline = ononline; }); +}, "Global object's setter throws when called on incompatible object"); + +test(() => { + assert_throws_js(TypeError, () => { Object.create(globalThis).setInterval(() => {}, 100); }); + assert_throws_js(TypeError, () => { clearTimeout.call(notGlobalObject, () => {}); }); + assert_throws_js(TypeError, () => { Reflect.apply(btoa, notGlobalObject, [""]); }); + assert_throws_js(TypeError, () => { new Proxy(globalThis, {}).removeEventListener("foo", () => {}); }); +}, "Global object's operation throws when called on incompatible object"); + +if (typeof document !== "undefined") { + test(() => { + assert_throws_js(TypeError, () => { Object.getOwnPropertyDescriptor(window, "document").get.call(document.all); }); + }, "Global object's getter throws when called on incompatible object (document.all)"); + + test(() => { + assert_throws_js(TypeError, () => { Object.getOwnPropertyDescriptor(window, "name").set.call(document.all); }); + }, "Global object's setter throws when called on incompatible object (document.all)"); + + test(() => { + assert_throws_js(TypeError, () => { focus.call(document.all); }); + }, "Global object's operation throws when called on incompatible object (document.all)"); +} + +// An engine might have different code path for calling a function from outer scope to implement step 1.b.iii of https://tc39.es/ecma262/#sec-evaluatecall +const locationGetter = getGlobalPropertyDescriptor("location").get; +test(() => { + assert_equals(getGlobalPropertyDescriptor("self").get.call(null), self); + assert_equals((() => locationGetter())(), location); + assert_equals(Reflect.get(globalThis, "origin", null), origin); + assert_equals(Reflect.get(globalThis, "onoffline", undefined), onoffline); +}, "Global object's getter works when called on null / undefined"); + +test(() => { + const fn = () => {}; + + // origin is [Replaceable] + getGlobalPropertyDescriptor("origin").set.call(null, "foo"); + assert_equals(origin, "foo"); + getGlobalPropertyDescriptor("onerror").set.call(undefined, fn); + assert_equals(onerror, fn); + assert_true(Reflect.set(globalThis, "onoffline", fn, null)); + assert_equals(onoffline, fn); + + const ononlineSetter = getGlobalPropertyDescriptor("ononline").set; + (() => { ononlineSetter(fn); })(); + assert_equals(ononline, fn); +}, "Global object's setter works when called on null / undefined"); + +// An engine might have different code path for calling a function from outer scope to implement step 1.b.iii of https://tc39.es/ecma262/#sec-evaluatecall +const __addEventListener = addEventListener; +test(() => { + assert_equals(atob.call(null, ""), ""); + assert_equals(typeof (0, setInterval)(() => {}, 100), "number"); + + (() => { __addEventListener("foo", event => { event.preventDefault(); }); })(); + const __dispatchEvent = dispatchEvent; + (() => { assert_false(__dispatchEvent(new Event("foo", { cancelable: true }))); })(); +}, "Global object's operation works when called on null / undefined"); + +function getGlobalPropertyDescriptor(key) { + for (let obj = globalThis; obj; obj = Object.getPrototypeOf(obj)) { + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc) return desc; + } +}
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.serviceworker-expected.txt new file mode 100644 index 0000000..a5e372e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.serviceworker-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS Global object's getter throws when called on incompatible object +FAIL Global object's setter throws when called on incompatible object assert_throws_js: function "() => { Reflect.set(globalThis, "onoffline", onoffline, notGlobalObject); }" threw object "ReferenceError: onoffline is not defined" ("ReferenceError") expected instance of function "function TypeError() { [native code] }" ("TypeError") +PASS Global object's operation throws when called on incompatible object +FAIL Global object's getter works when called on null / undefined onoffline is not defined +FAIL Global object's setter works when called on null / undefined assert_true: expected true got false +PASS Global object's operation works when called on null / undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.sharedworker-expected.txt new file mode 100644 index 0000000..a5e372e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.sharedworker-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS Global object's getter throws when called on incompatible object +FAIL Global object's setter throws when called on incompatible object assert_throws_js: function "() => { Reflect.set(globalThis, "onoffline", onoffline, notGlobalObject); }" threw object "ReferenceError: onoffline is not defined" ("ReferenceError") expected instance of function "function TypeError() { [native code] }" ("TypeError") +PASS Global object's operation throws when called on incompatible object +FAIL Global object's getter works when called on null / undefined onoffline is not defined +FAIL Global object's setter works when called on null / undefined assert_true: expected true got false +PASS Global object's operation works when called on null / undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.worker-expected.txt new file mode 100644 index 0000000..a5e372e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/global-object-implicit-this-value.any.worker-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS Global object's getter throws when called on incompatible object +FAIL Global object's setter throws when called on incompatible object assert_throws_js: function "() => { Reflect.set(globalThis, "onoffline", onoffline, notGlobalObject); }" threw object "ReferenceError: onoffline is not defined" ("ReferenceError") expected instance of function "function TypeError() { [native code] }" ("TypeError") +PASS Global object's operation throws when called on incompatible object +FAIL Global object's getter works when called on null / undefined onoffline is not defined +FAIL Global object's setter works when called on null / undefined assert_true: expected true got false +PASS Global object's operation works when called on null / undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/named-properties-object.html b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/named-properties-object.html deleted file mode 100644 index 556eca4..0000000 --- a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/named-properties-object.html +++ /dev/null
@@ -1,33 +0,0 @@ -<!doctype html> -<meta charset="utf-8"> -<title>named properties object</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<link rel="help" href="https://heycam.github.io/webidl/#named-properties-object"> - -<script> -"use strict"; - -test(() => { - const npo = Object.getPrototypeOf(Window.prototype); - - assert_equals(npo.nonExistingProp, undefined); - assert_throws_js(TypeError, () => { - const desc = Object.create(null); - Object.defineProperty(npo, "nonExistingProp", desc); - }, "Cannot define a property with Object.defineProperty (string)"); - assert_throws_js(TypeError, () => { - npo.nonExistingProp = "peach"; - }, "Cannot create a property through assignment (string)"); - - assert_equals(npo[123], undefined); - assert_throws_js(TypeError, () => { - const desc = Object.create(null); - Object.defineProperty(npo, 123, desc); - }, "Cannot define a property with Object.defineProperty (index)"); - assert_throws_js(TypeError, () => { - npo[123] = "peach"; - }, "Cannot create a property through assignment (index)"); -}, "Cannot create a property on a named property object"); - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object-expected.txt b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object-expected.txt new file mode 100644 index 0000000..0e4f14b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object-expected.txt
@@ -0,0 +1,16 @@ +This is a testharness.js-based test. +PASS [[SetPrototypeOf]] and [[GetPrototypeOf]] +PASS [[PreventExtensions]] and [[IsExtensible]] +PASS [[GetOwnProperty]] +PASS [[GetOwnProperty]] (named property visibility algorithm) +FAIL [[DefineOwnProperty]] assert_false: supported non-index property name expected false got true +PASS [[HasProperty]] +PASS [[Get]] +FAIL [[Get]] (named property visibility algorithm) assert_equals: supported indexed property name expected (number) 20 but got (object) Element node <div id="0"></div> +FAIL [[Set]] (direct) assert_false: expected false got true +PASS [[Set]] (prototype chain) +PASS [[Set]] (Reflect.set) +FAIL [[Delete]] assert_throws_js: existing symbol property name function "() => { delete object[key]; }" did not throw +PASS [[OwnPropertyKeys]] +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object.html b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object.html new file mode 100644 index 0000000..fe8275e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebIDL/ecmascript-binding/window-named-properties-object.html
@@ -0,0 +1,284 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Internal methods of Window's named properties object</title> +<link rel="help" href="https://heycam.github.io/webidl/#named-properties-object"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +function sloppyModeSet(base, key, value) { base[key] = value; } +</script> +<script> +"use strict"; + +const supportedNonIndex = "supported non-index property name"; +const supportedIndex = "supported indexed property name"; +const unsupportedNonIndex = "unsupported non-index property name"; +const unsupportedIndex = "unsupported indexed property name"; +const existingSymbol = "existing symbol property name"; +const nonExistingSymbol = "non-existing symbol property name"; + +test(t => { + const { w, wp } = createWindowProperties(t); + + Object.setPrototypeOf(wp, w.EventTarget.prototype); // Setting current [[Prototype]] value shouldn't throw + + assert_throws_js(TypeError, () => { Object.setPrototypeOf(wp, {}); }); + assert_throws_js(w.TypeError, () => { wp.__proto__ = null; }); + assert_false(Reflect.setPrototypeOf(wp, w.Object.prototype)); + + assert_equals(Object.getPrototypeOf(wp), w.EventTarget.prototype); +}, "[[SetPrototypeOf]] and [[GetPrototypeOf]]"); + +test(t => { + const { wp } = createWindowProperties(t); + + assert_throws_js(TypeError, () => { Object.preventExtensions(wp); }); + assert_false(Reflect.preventExtensions(wp)); + + assert_true(Object.isExtensible(wp)); +}, "[[PreventExtensions]] and [[IsExtensible]]"); + +test(t => { + const { w, wp } = createWindowProperties(t); + + const elA = appendElementWithId(w, "a"); + const el0 = appendIframeWithName(w, 0); + + assert_prop_desc(Object.getOwnPropertyDescriptor(wp, "a"), elA, supportedNonIndex); + assert_prop_desc(Reflect.getOwnPropertyDescriptor(wp, 0), el0, supportedIndex); + assert_equals(Reflect.getOwnPropertyDescriptor(wp, "b"), undefined, unsupportedNonIndex); + assert_equals(Object.getOwnPropertyDescriptor(wp, 1), undefined, unsupportedIndex); +}, "[[GetOwnProperty]]"); + +test(t => { + const { w, wp } = createWindowProperties(t); + + appendIframeWithName(w, "hasOwnProperty"); + appendFormWithName(w, "addEventListener"); + appendElementWithId(w, "a"); + appendIframeWithName(w, 0); + + w.Object.prototype.a = {}; + w.EventTarget.prototype[0] = {}; + + // These are shadowed by properties higher in [[Prototype]] chain. See https://heycam.github.io/webidl/#dfn-named-property-visibility + assert_equals(Object.getOwnPropertyDescriptor(wp, "hasOwnProperty"), undefined, supportedNonIndex); + assert_equals(Reflect.getOwnPropertyDescriptor(wp, "addEventListener"), undefined, supportedNonIndex); + assert_equals(Object.getOwnPropertyDescriptor(wp, "a"), undefined, supportedNonIndex); + assert_equals(Reflect.getOwnPropertyDescriptor(wp, 0), undefined, supportedIndex); +}, "[[GetOwnProperty]] (named property visibility algorithm)"); + +test(t => { + const { w, wp } = createWindowProperties(t); + + appendElementWithId(w, "a"); + appendFormWithName(w, 0); + + assert_define_own_property_fails(wp, "a", {}, supportedNonIndex); + assert_define_own_property_fails(wp, 0, {}, supportedIndex); + assert_define_own_property_fails(wp, "b", {}, unsupportedNonIndex); + assert_define_own_property_fails(wp, 1, {}, unsupportedIndex); + assert_define_own_property_fails(wp, Symbol.toStringTag, {}, existingSymbol); + assert_define_own_property_fails(wp, Symbol(), {}, nonExistingSymbol); +}, "[[DefineOwnProperty]]"); + +test(t => { + const { w, wp } = createWindowProperties(t); + + appendFormWithName(w, "a"); + appendElementWithId(w, 0); + + assert_true("a" in wp, supportedNonIndex); + assert_true(Reflect.has(wp, "a"), supportedNonIndex); + assert_true(0 in wp, supportedIndex); + assert_true(Reflect.has(wp, 0), supportedIndex); + + assert_false("b" in wp, unsupportedNonIndex); + assert_false(Reflect.has(wp, 1), unsupportedIndex); +}, "[[HasProperty]]"); + +test(t => { + const { w, wp } = createWindowProperties(t); + const elA = appendFormWithName(w, "a"); + const el0 = appendIframeWithName(w, 0); + + assert_equals(wp.a, elA, supportedNonIndex); + assert_equals(wp[0], el0, supportedIndex); + assert_equals(wp[Symbol.toStringTag], "WindowProperties", existingSymbol); + + assert_equals(wp.b, undefined, unsupportedNonIndex); + assert_equals(wp[1], undefined, unsupportedIndex); + assert_equals(wp[Symbol.iterator], undefined, nonExistingSymbol); +}, "[[Get]]"); + +test(t => { + const { w, wp } = createWindowProperties(t); + + appendIframeWithName(w, "isPrototypeOf"); + appendFormWithName(w, "dispatchEvent"); + appendElementWithId(w, "a"); + appendElementWithId(w, 0); + + w.EventTarget.prototype.a = 10; + w.Object.prototype[0] = 20; + + // These are shadowed by properties higher in [[Prototype]] chain. See https://heycam.github.io/webidl/#dfn-named-property-visibility + assert_equals(wp.isPrototypeOf, w.Object.prototype.isPrototypeOf, supportedNonIndex); + assert_equals(wp.dispatchEvent, w.EventTarget.prototype.dispatchEvent, supportedNonIndex); + assert_equals(wp.a, 10, supportedNonIndex); + assert_equals(wp[0], 20, supportedIndex); +}, "[[Get]] (named property visibility algorithm)"); + +test(t => { + const { w, wp } = createWindowProperties(t); + const elA = appendIframeWithName(w, "a"); + const el0 = appendFormWithName(w, 0); + + assert_set_fails(wp, "a", supportedNonIndex); + assert_set_fails(wp, "b", unsupportedNonIndex); + assert_set_fails(wp, 0, supportedIndex); + assert_set_fails(wp, 1, unsupportedIndex); + assert_set_fails(wp, Symbol.toStringTag, existingSymbol); + assert_set_fails(wp, Symbol(), nonExistingSymbol); + + assert_equals(wp.a, elA, supportedNonIndex); + assert_equals(wp[0], el0, supportedIndex); + assert_equals(wp.b, undefined, unsupportedNonIndex); + assert_equals(wp[1], undefined, unsupportedIndex); +}, "[[Set]] (direct)"); + +test(t => { + const { w, wp } = createWindowProperties(t); + const receiver = Object.create(wp); + + appendIframeWithName(w, "a"); + appendElementWithId(w, 0); + + let setterThisValue; + Object.defineProperty(w.Object.prototype, 1, { set() { setterThisValue = this; } }); + Object.defineProperty(w.EventTarget.prototype, "b", { writable: false }); + + receiver.a = 10; + assert_throws_js(TypeError, () => { receiver.b = {}; }, unsupportedNonIndex); + receiver[0] = 20; + receiver[1] = {}; + + assert_equals(receiver.a, 10, supportedNonIndex); + assert_equals(receiver[0], 20, supportedIndex); + assert_false(receiver.hasOwnProperty("b"), unsupportedNonIndex); + assert_false(receiver.hasOwnProperty(1), unsupportedIndex); + assert_equals(setterThisValue, receiver, "setter |this| value is receiver"); +}, "[[Set]] (prototype chain)"); + +test(t => { + const { w, wp } = createWindowProperties(t); + const receiver = {}; + + appendFormWithName(w, "a"); + appendIframeWithName(w, 0); + + let setterThisValue; + Object.defineProperty(w.Object.prototype, "b", { set() { setterThisValue = this; } }); + Object.defineProperty(w.EventTarget.prototype, 1, { writable: false }); + + assert_true(Reflect.set(wp, "a", 10, receiver), supportedNonIndex); + assert_true(Reflect.set(wp, 0, 20, receiver), supportedIndex); + assert_true(Reflect.set(wp, "b", {}, receiver), unsupportedNonIndex); + assert_false(Reflect.set(wp, 1, {}, receiver), unsupportedIndex); + + assert_equals(receiver.a, 10, supportedNonIndex); + assert_equals(receiver[0], 20, supportedIndex); + assert_false(receiver.hasOwnProperty("b"), unsupportedNonIndex); + assert_equals(setterThisValue, receiver, "setter |this| value is receiver"); + assert_false(receiver.hasOwnProperty(1), unsupportedIndex); +}, "[[Set]] (Reflect.set)"); + +test(t => { + const { w, wp } = createWindowProperties(t); + const elA = appendFormWithName(w, "a"); + const el0 = appendElementWithId(w, 0); + + assert_delete_fails(wp, "a", supportedNonIndex); + assert_delete_fails(wp, 0, supportedIndex); + assert_delete_fails(wp, "b", unsupportedNonIndex); + assert_delete_fails(wp, 1, unsupportedIndex); + assert_delete_fails(wp, Symbol.toStringTag, existingSymbol); + assert_delete_fails(wp, Symbol("foo"), nonExistingSymbol); + + assert_equals(wp.a, elA, supportedNonIndex); + assert_equals(wp[0], el0, supportedIndex); + assert_equals(wp[Symbol.toStringTag], "WindowProperties", existingSymbol); +}, "[[Delete]]"); + +test(t => { + const { w, wp } = createWindowProperties(t); + + appendIframeWithName(w, "a"); + appendElementWithId(w, 0); + appendFormWithName(w, "b"); + + const forInKeys = []; + for (const key in wp) + forInKeys.push(key); + + assert_array_equals(forInKeys, Object.keys(w.EventTarget.prototype)); + assert_array_equals(Object.getOwnPropertyNames(wp), []); + assert_array_equals(Reflect.ownKeys(wp), [Symbol.toStringTag]); +}, "[[OwnPropertyKeys]]"); + +function createWindowProperties(t) { + const iframe = document.createElement("iframe"); + document.body.append(iframe); + t.add_cleanup(() => { iframe.remove(); }); + + const w = iframe.contentWindow; + const wp = Object.getPrototypeOf(w.Window.prototype); + return { w, wp }; +} + +function appendIframeWithName(w, name) { + const el = w.document.createElement("iframe"); + el.name = name; + w.document.body.append(el); + return el.contentWindow; +} + +function appendFormWithName(w, name) { + const el = w.document.createElement("form"); + el.name = name; + w.document.body.append(el); + return el; +} + +function appendElementWithId(w, id) { + const el = w.document.createElement("div"); + el.id = id; + w.document.body.append(el); + return el; +} + +function assert_prop_desc(desc, value, testInfo) { + assert_equals(typeof desc, "object", `${testInfo} typeof desc`); + assert_equals(desc.value, value, `${testInfo} [[Value]]`); + assert_true(desc.writable, `${testInfo} [[Writable]]`); + assert_false(desc.enumerable, `${testInfo} [[Enumerable]]`); + assert_true(desc.configurable, `${testInfo} [[Configurable]]`); +} + +function assert_define_own_property_fails(object, key, desc, testInfo) { + assert_throws_js(TypeError, () => { Object.defineProperty(object, key, desc); }, testInfo); + assert_false(Reflect.defineProperty(object, key, desc), testInfo); +} + +function assert_set_fails(object, key, value, testInfo) { + sloppyModeSet(object, key, value); + assert_throws_js(TypeError, () => { object[key] = value; }, testInfo); + assert_false(Reflect.set(object, key, value), testInfo); +} + +function assert_delete_fails(object, key, testInfo) { + assert_throws_js(TypeError, () => { delete object[key]; }, testInfo); + assert_false(Reflect.deleteProperty(object, key), testInfo); +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/cookies/resources/cookie.py b/third_party/blink/web_tests/external/wpt/cookies/resources/cookie.py index 16efcc04a..b18da77 100644 --- a/third_party/blink/web_tests/external/wpt/cookies/resources/cookie.py +++ b/third_party/blink/web_tests/external/wpt/cookies/resources/cookie.py
@@ -30,25 +30,22 @@ """ headers = setNoCacheAndCORSHeaders(request, response) - try: - if b'drop' in request.GET: - cookie = request.GET[b'drop'] - cookie = json.loads(cookie) - cookies = cookie if isinstance(cookie, list) else [cookie] - for c in cookies: - set_cookie(headers, c, drop=True) + if b'drop' in request.GET: + cookie = request.GET[b'drop'] + cookie = json.loads(cookie) + cookies = cookie if isinstance(cookie, list) else [cookie] + for c in cookies: + set_cookie(headers, c, drop=True) - if b'set' in request.GET: - cookie = isomorphic_decode(request.GET[b'set']) - cookie = json.loads(cookie) - cookies = cookie if isinstance(cookie, list) else [cookie] - for c in cookies: - set_cookie(headers, c) + if b'set' in request.GET: + cookie = isomorphic_decode(request.GET[b'set']) + cookie = json.loads(cookie) + cookies = cookie if isinstance(cookie, list) else [cookie] + for c in cookies: + set_cookie(headers, c) - if b'location' in request.GET: - headers.append((b'Location', request.GET[b'location'])) - return 302, headers, b'{"redirect": true}' + if b'location' in request.GET: + headers.append((b'Location', request.GET[b'location'])) + return 302, headers, b'{"redirect": true}' - return headers, b'{"success": true}' - except Exception as e: - return 500, headers, bytes({'error': '{}'.format(e)}) + return headers, b'{"success": true}'
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-letter.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-letter.html index 0b0a813d..8716095 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-letter.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-letter.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<html> +<html class="reftest-wait"> <head> <title>CSS Test: background-image applicability to ::first-letter</title> <link rel="author" title="Ethan Malasky" href="mailto:emalasky@adobe.com"> @@ -11,6 +11,8 @@ <link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> <meta name="flags" content="ahem image"> <meta name="assert" content="background-image applicability to ::first-letter"> + <script src="/common/reftest-wait.js"></script> + <link rel="preload" as="image" href="support/cat.png" onload="takeScreenshot()" /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"> #content {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-line.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-line.html index 304fef40..eb8cbbd0 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-line.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-image-first-line.html
@@ -8,6 +8,8 @@ <link rel="match" href="reference/background-image-first-line-ref.html"> <meta name="flags" content="ahem image"> <meta name="assert" content="background-image applicability to ::first-line"> +<script src="/common/reftest-wait.js"></script> +<link rel="preload" as="image" href="support/cat.png" onload="takeScreenshot()" /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"> #content { @@ -21,11 +23,4 @@ </style> <p>Test passes if cat image is visible.</p> <div id="content">X</div> -<script src="/common/reftest-wait.js"></script> -<script> -// Some browser may delay one frame to update the background-image in first-line. -onload = () => { - requestAnimationFrame(() => requestAnimationFrame(takeScreenshot)); -}; -</script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-letter-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-letter-ref.html index 210994b..fd2fdf93 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-letter-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-letter-ref.html
@@ -1,9 +1,11 @@ <!DOCTYPE html> -<html> +<html class="reftest-wait"> <head> <title>CSS Reftest Reference</title> <link rel="author" title="Ethan Malasky" href="mailto:emalasky@adobe.com"> <meta name="flags" content="ahem image"> + <script src="/common/reftest-wait.js"></script> + <link rel="preload" as="image" href="../support/cat.png" onload="takeScreenshot()" /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"> #content {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-line-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-line-ref.html index 3536cba..3bbe8467 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-line-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/reference/background-image-first-line-ref.html
@@ -1,5 +1,8 @@ <!DOCTYPE html> +<html class="reftest-wait"> <meta name="flags" content="ahem image"> +<script src="/common/reftest-wait.js"></script> +<link rel="preload" as="image" href="../support/cat.png" onload="takeScreenshot()" /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"> #content {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-1-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-1-ref.html new file mode 100644 index 0000000..56789f62 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-1-ref.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: break-inside:avoid min-block-size block</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <style> +html,body { + color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0; +} +.columns { + columns: 3; + background: grey; + margin-block-end: 1px; + inline-size: 500px; +} +.fill { + column-fill: auto; +} +.short { + block-size: 30px; +} +.tall { + block-size: 60px; +} +.columns > div { + block-size: 40px; + background: blue; +} +.columns > div:nth-child(2n) { background: lightblue; } + </style> +</head> +<body> +<div class="columns fill" style="block-size:40px"> + <div></div> + <div></div> +</div> +<div class="columns fill" style="block-size:40px"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns short"> + <div style="margin-block-end:20px"></div> + <div></div> +</div> +<div class="columns short"> + <div style="margin-block-end:20px"> <br> </div> + <div> <br> </div> +</div> +<div class="columns tall"> + <div style="margin-block-end:40px"></div> + <div></div> +</div> +<div class="columns tall"> + <div style="margin-block-end:40px"> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill short"> + <div style="margin-block-end:20px"></div> + <div></div> +</div> +<div class="columns fill short"> + <div style="margin-block-end:20px"> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill tall"> + <div style="margin-block-end:40px"></div> + <div></div> +</div> +<div class="columns fill tall"> + <div style="margin-block-end:40px"> <br> </div> + <div> <br> </div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-1.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-1.html new file mode 100644 index 0000000..733aae5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-1.html
@@ -0,0 +1,78 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: break-inside:avoid min-block-size block</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1711630"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="break-inside-avoid-min-block-size-1-ref.html"> + <style> +html,body { + color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0; +} +.columns { + columns: 3; + background: grey; + margin-block-end: 1px; + inline-size: 500px; +} +.fill { + column-fill: auto; +} +.short { + block-size: 30px; +} +.tall { + block-size: 60px; +} +.columns > div { + break-inside: avoid; + min-block-size: 40px; + background: blue; +} +.columns > div:nth-child(2n) { background: lightblue; } + </style> +</head> +<body> +<div class="columns"> + <div></div> + <div></div> +</div> +<div class="columns"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns short"> + <div></div> + <div></div> +</div> +<div class="columns short"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns tall"> + <div></div> + <div></div> +</div> +<div class="columns tall"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill short"> + <div></div> + <div></div> +</div> +<div class="columns fill short"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill tall"> + <div></div> + <div></div> +</div> +<div class="columns fill tall"> + <div> <br> </div> + <div> <br> </div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-2-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-2-ref.html new file mode 100644 index 0000000..70c40491 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-2-ref.html
@@ -0,0 +1,75 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: break-inside:avoid min-block-size block</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <style> +html,body { + color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0; + writing-mode: vertical-rl; +} +.columns { + columns: 3; + background: grey; + margin-block-end: 1px; + inline-size: 500px; +} +.fill { + column-fill: auto; +} +.short { + block-size: 30px; +} +.tall { + block-size: 60px; +} +.columns > div { + block-size: 40px; + background: blue; +} +.columns > div:nth-child(2n) { background: lightblue; } + </style> +</head> +<body> +<div class="columns fill" style="block-size:40px"> + <div></div> + <div></div> +</div> +<div class="columns fill" style="block-size:40px"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns short"> + <div style="margin-block-end:20px"></div> + <div></div> +</div> +<div class="columns short"> + <div style="margin-block-end:20px"> <br> </div> + <div> <br> </div> +</div> +<div class="columns tall"> + <div style="margin-block-end:40px"></div> + <div></div> +</div> +<div class="columns tall"> + <div style="margin-block-end:40px"> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill short"> + <div style="margin-block-end:20px"></div> + <div></div> +</div> +<div class="columns fill short"> + <div style="margin-block-end:20px"> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill tall"> + <div style="margin-block-end:40px"></div> + <div></div> +</div> +<div class="columns fill tall"> + <div style="margin-block-end:40px"> <br> </div> + <div> <br> </div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-2.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-2.html new file mode 100644 index 0000000..e7669d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-inside-avoid-min-block-size-2.html
@@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html> +<head> + <title>CSS Test: break-inside:avoid min-block-size block</title> + <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> + <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1711630"> + <link rel="help" href="https://drafts.csswg.org/css-break"> + <link rel="match" href="break-inside-avoid-min-block-size-2-ref.html"> + <style> +html,body { + color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0; + writing-mode: vertical-rl; +} +.columns { + columns: 3; + background: grey; + margin-block-end: 1px; + inline-size: 500px; +} +.fill { + column-fill: auto; +} +.short { + block-size: 30px; +} +.tall { + block-size: 60px; +} +.columns > div { + break-inside: avoid; + min-block-size: 40px; + background: blue; +} +.columns > div:nth-child(2n) { background: lightblue; } + </style> +</head> +<body> +<div class="columns"> + <div></div> + <div></div> +</div> +<div class="columns"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns short"> + <div></div> + <div></div> +</div> +<div class="columns short"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns tall"> + <div></div> + <div></div> +</div> +<div class="columns tall"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill short"> + <div></div> + <div></div> +</div> +<div class="columns fill short"> + <div> <br> </div> + <div> <br> </div> +</div> +<div class="columns fill tall"> + <div></div> + <div></div> +</div> +<div class="columns fill tall"> + <div> <br> </div> + <div> <br> </div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/print-color-adjust-parsing-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/print-color-adjust-parsing-expected.txt new file mode 100644 index 0000000..38a1c2a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/print-color-adjust-parsing-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +Harness Error. harness_status.status = 1 , harness_status.message = Uncaught ReferenceError: test_valid_value is not defined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color-adjust/print-color-adjust-parsing.html b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/print-color-adjust-parsing.html new file mode 100644 index 0000000..ced8666 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-color-adjust/print-color-adjust-parsing.html
@@ -0,0 +1,16 @@ +<!doctype html> +<title>print-color-adjust Parsing</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<link rel=help href="https://www.w3.org/TR/css-color-adjust-1/#perf"> +<link rel=author title="Tab Atkins-Bittner" href="https://www.xanthir.com/contact/">" + +<script src="/css/supports/parsing-testcommon.js"></script> + +<script> +test_valid_value('print-color-adjust', 'exact', 'exact'); +test_valid_value('print-color-adjust', 'economy', 'economy'); +test_valid_value('color-adjust', 'exact', 'exact'); +test_valid_value('color-adjust', 'economy', 'economy'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-001.html new file mode 100644 index 0000000..b7890fae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-001.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on body prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on body prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; + contain: layout; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-002.html new file mode 100644 index 0000000..71237d9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-002.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on body prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on body prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; + contain: paint; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-003.html new file mode 100644 index 0000000..0aaf8b0d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-003.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on body prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on body prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; + contain: size; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-004.html new file mode 100644 index 0000000..af046a9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-bg-004.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on body prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on body prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; + contain: style; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-001.html new file mode 100644 index 0000000..65e6f9c5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-001.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on body prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on body prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; + contain: layout; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-002.html new file mode 100644 index 0000000..12f8fed --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-002.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on body prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on body prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; + contain: paint; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-003.html new file mode 100644 index 0000000..07bd8846 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-003.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on body prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on body prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; + contain: size; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-004.html new file mode 100644 index 0000000..b7bbc14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-dir-004.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on body prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on body prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; + contain: style; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-001.html new file mode 100644 index 0000000..7f368756 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-001.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on body prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on body prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; + contain: layout; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-002.html new file mode 100644 index 0000000..bc432e3e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-002.html
@@ -0,0 +1,33 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on body prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on body prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; + contain: paint; +} +:focus { + outline: none; +} +</style> + +<div></div> +<p tabindex=1 id=target>Test passes if there is no red. +<script> +window.onload = function() { + document.getElementById("target").focus() +} +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-003.html new file mode 100644 index 0000000..d38cf53 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-003.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on body prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on body prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; + contain: size; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-004.html new file mode 100644 index 0000000..5064d00c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-overflow-004.html
@@ -0,0 +1,26 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on body prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on body prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; + contain: style; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-001.html new file mode 100644 index 0000000..36f70a1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-001.html
@@ -0,0 +1,36 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on body prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on body prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; + contain: layout; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-002.html new file mode 100644 index 0000000..47d3f480 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-002.html
@@ -0,0 +1,36 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on body prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on body prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; + contain: paint; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-003.html new file mode 100644 index 0000000..2323d07 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-003.html
@@ -0,0 +1,36 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on body prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on body prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; + contain: size; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-004.html new file mode 100644 index 0000000..3eea6b8d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-t-o-004.html
@@ -0,0 +1,36 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on body prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on body prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; + contain: style; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-001.html new file mode 100644 index 0000000..b37e961 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-001.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on body prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on body prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; + contain: layout; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-002.html new file mode 100644 index 0000000..15040f0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-002.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on body prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on body prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; + contain: paint; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-003.html new file mode 100644 index 0000000..87b1d634 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-003.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on body prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on body prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; + contain: size; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-004.html new file mode 100644 index 0000000..736d4a5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-body-w-m-004.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on body prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on body prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; + contain: style; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-001.html new file mode 100644 index 0000000..6d77ce0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-001.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on html prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on html prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; +} +html { + contain: layout; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-002.html new file mode 100644 index 0000000..57324052b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-002.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on html prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on html prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; +} +html { + contain: paint; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-003.html new file mode 100644 index 0000000..f1115ce --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-003.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on html prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on html prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; +} +html { + contain: size; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-004.html new file mode 100644 index 0000000..05fa3f82 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-bg-004.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on html prevents background propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on html prevents background propagation"> + <link rel="match" href="reference/contain-body-bg-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +p { + background: white; +} +body { + background: red; +} +html { + contain: style; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-001.html new file mode 100644 index 0000000..7eeae5e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-001.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on html prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on html prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; +} +html { + contain: layout; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-002.html new file mode 100644 index 0000000..ad4dd4e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-002.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on html prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on html prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; +} +html { + contain: paint; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-003.html new file mode 100644 index 0000000..aadc031 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-003.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on html prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on html prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; +} +html { + contain: size; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-004.html new file mode 100644 index 0000000..4b6d2d3d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-dir-004.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on html prevents direction propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on html prevents direction propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { direction: ltr; } +body { + margin: 0 auto 0 0; + width: 200px; + height: 200px; + direction: rtl; +} +html { + contain: style; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-001.html new file mode 100644 index 0000000..736ad1a54 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-001.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on html prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on html prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; +} +html { + contain: layout; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-002.html new file mode 100644 index 0000000..2fd0b5e1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-002.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on html prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on html prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; +} +html { + height: 400px; + contain: paint; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-003.html new file mode 100644 index 0000000..88ce091 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-003.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on html prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on html prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; +} +html { + contain: size; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-004.html new file mode 100644 index 0000000..15339ed3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-overflow-004.html
@@ -0,0 +1,28 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on html prevents overflow propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on html prevents overflow propagation"> + <link rel="match" href="reference/contain-body-overflow-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +div { background: red; } +body { + overflow: hidden; +} +html { + contain: style; +} +</style> + +<p>Test passes if there is no red. + +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-001.html new file mode 100644 index 0000000..d74fa252 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-001.html
@@ -0,0 +1,38 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on html prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on html prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; +} +html { + contain: layout; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-002.html new file mode 100644 index 0000000..9ee3837 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-002.html
@@ -0,0 +1,38 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on html prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on html prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; +} +html { + contain: paint; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-003.html new file mode 100644 index 0000000..87e70d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-003.html
@@ -0,0 +1,38 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on html prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on html prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; +} +html { + contain: size; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-004.html new file mode 100644 index 0000000..5f7ea2e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-t-o-004.html
@@ -0,0 +1,38 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on html prevents text-orientation propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on html prevents text-orientation propagation"> + <link rel="match" href="reference/contain-body-t-o-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; + text-orientation: upright; +} +html { + contain: style; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-001.html new file mode 100644 index 0000000..e8c0a822 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-001.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: layout containment on html prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="layout containment on html prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; +} +html { + contain: layout; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-002.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-002.html new file mode 100644 index 0000000..f4001a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-002.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: paint containment on html prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="paint containment on html prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; +} +html { + contain: paint; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-003.html new file mode 100644 index 0000000..c56d42e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-003.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: size containment on html prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="size containment on html prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-1/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; +} +html { + contain: size; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-004.html new file mode 100644 index 0000000..09a32ba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-html-w-m-004.html
@@ -0,0 +1,31 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test: style containment on html prevents writing-mode propagation</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + <meta name=flags content=""> + <meta name=assert content="style containment on html prevents writing-mode propagation"> + <link rel="match" href="reference/contain-body-w-m-001-ref.html"> + <link rel=help href="https://drafts.csswg.org/css-contain-2/#contain-property"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +p { writing-mode: horizontal-tb; margin: 0;} +body { + margin: 0; + width: 200px; + height: 200px; + writing-mode: vertical-rl; +} +html { + contain: style; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-bg-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-bg-001-ref.html new file mode 100644 index 0000000..1d6357e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-bg-001-ref.html
@@ -0,0 +1,15 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test reference</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + +<style> +html, body, p { + margin: 0; + width: 300px; + height: 200px; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-overflow-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-overflow-001-ref.html new file mode 100644 index 0000000..32bc8b0e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-overflow-001-ref.html
@@ -0,0 +1,15 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test referemce</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + +<style> +html, body, p, div { + margin: 0; + width: 200px; + height: 200px; +} +</style> + +<p>Test passes if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-t-o-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-t-o-001-ref.html new file mode 100644 index 0000000..ecf9d03 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-t-o-001-ref.html
@@ -0,0 +1,35 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test reference</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + +<style> +html { + writing-mode: vertical-lr; + direction: rtl; + width: 100vw; + height: 100vh; + overflow: hidden; +} +body { + margin: 0; + border-top: 100px solid red; + border-bottom: 100px solid green; + width: 100vw; + height: 100vh; +} +div { + text-orientation: upright; +} +p { + margin: auto; + padding: 150px 0; + writing-mode: horizontal-tb; + direction: ltr; +} +</style> + +<div> + <p>Test passes if there is no red. +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-w-m-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-w-m-001-ref.html new file mode 100644 index 0000000..3341816 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-body-w-m-001-ref.html
@@ -0,0 +1,23 @@ +<!doctype html> +<html lang=en> + <meta charset=utf-8> + <title>CSS-contain test reference</title> + <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net"> + +<style> +html::before { + content: ""; + width: 100px; + height: 100px; + background: orange; + display: block; +} +body { margin: 0; } +p { + margin: 0; + width: 200px; + height: 200px; +} +</style> + +<p>Test passes if the orange square is in the upper-left corner.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html index cc6b3b5..c00a9ab 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html
@@ -7,7 +7,10 @@ A grid item whose size is input to the size of the track on which its size depends - cannot participate in baseline alignment. + cannot participate in baseline alignment, unless + the grid algorithm requires + another pass, where the track + sizing can be resovled. "> <link rel="help" href="https://www.w3.org/TR/css-grid-1/#row-align"> <link rel="match" href="references/grid-baseline-align-cycles-001-ref.html"> @@ -55,7 +58,7 @@ <div class="index"> X </div> - <div class="percent"> + <div class="percent orthogonal"> X </div> </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/invalidation-part-pseudo.html b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/invalidation-part-pseudo.html new file mode 100644 index 0000000..fca4a96 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/invalidation-part-pseudo.html
@@ -0,0 +1,50 @@ +<!doctype html> +<title>CSS Shadow Parts - Pseudo class and exported parts</title> +<link rel="help" href="https://drafts.csswg.org/css-shadow-parts" > +<link rel="help" href="https://drafts.csswg.org/selectors/#matches"> +<link href="https://drafts.csswg.org/selectors/#matches" rel="help"> +<link rel="match" href="interaction-with-nested-pseudo-class-ref.html"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<style> +/* NOTE: Even though it might be tempting to use :focus instead, because we + can more easily add that state programmatically, that'd defeat the point + of the test, since :focus / :focus-visible has default styles which + invalidate the element's style anyways */ +#host::part(a):hover { + background: blue; +} +</style> +<div id="host"></div> +<script> +let host = document.querySelector('#host') +host.attachShadow({mode: 'open'}).innerHTML = `<div part="b" exportparts="a"></div>`; + +let innerHost = host.shadowRoot.querySelector('div'); +innerHost.attachShadow({mode: 'open'}).innerHTML = ` + <style> + div { + width: 100px; + height: 100px; + background: black; + color: white; + } + </style> + <div part="a">hover, the background should be blue</div> +`; + +let part = innerHost.shadowRoot.querySelector("div"); +let t = async_test("Invalidation of nested part on hover"); +part.addEventListener("mouseover", t.step_func_done(function() { + assert_true(part.matches(":hover"), "Element should be hovered"); + assert_equals(getComputedStyle(part).backgroundColor, "rgb(0, 0, 255)", "Hover style should apply"); +})); + +new test_driver.Actions() + .pointerMove(0, 0) + .pointerMove(50, 50) + .send(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt index 476b017a0..a25b56c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -19,8 +19,8 @@ PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" -PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'. -PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'. +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' and 'calc(10% + min(1%, 2%) + max(3%, 4%))' should serialize the same in specified values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "calc(15%)" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(10% + min(1%, 2%) + max(3%, 4%))' should round-trip exactly in computed values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "15%" PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize.html b/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize.html index f1cb508..65ab9fad 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize.html +++ b/third_party/blink/web_tests/external/wpt/css/css-values/minmax-percentage-serialize.html
@@ -65,8 +65,8 @@ test_serialization( 'calc(min(1%, 2%) + max(3%, 4%) + 10%)', - 'calc(15%)', - '15%', + 'calc(10% + min(1%, 2%) + max(3%, 4%))', + 'calc(10% + min(1%, 2%) + max(3%, 4%))', '15px'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-022.tentative.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-022.tentative.html new file mode 100644 index 0000000..e2692a6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-022.tentative.html
@@ -0,0 +1,34 @@ +<!doctype html> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo" /> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1711057"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<div id="one" tabindex="1">One</div> +<div id="two" tabindex="1">Two</div> + +<script> +let one = document.getElementById("one"); +let two = document.getElementById("two"); + +document.addEventListener("keydown", function(e) { + two.focus(); +}); + +promise_test(async t => { + await test_driver.click(one); + assert_equals(document.activeElement, one, "#one should be focused by mouse"); + assert_true(one.matches(":focus"), "#one should match :focus"); + assert_true(!one.matches(":focus-visible"), "#one should not match :focus-visible"); + + await test_driver.send_keys(document.body, " "); + + assert_equals(document.activeElement, two, "#two should be focused by our event listener"); + assert_true(two.matches(":focus"), "#two should match :focus"); + assert_true(two.matches(":focus-visible"), "#two should match :focus-visible"); +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/AddEventListenerOptions-signal.any.js b/third_party/blink/web_tests/external/wpt/dom/events/AddEventListenerOptions-signal.any.js index 4287106..dc401e3b 100644 --- a/third_party/blink/web_tests/external/wpt/dom/events/AddEventListenerOptions-signal.any.js +++ b/third_party/blink/web_tests/external/wpt/dom/events/AddEventListenerOptions-signal.any.js
@@ -131,3 +131,8 @@ }, { once: true }); et.dispatchEvent(new Event('foo')); }, "Aborting from a nested listener should remove it"); + +test(function() { + const et = new EventTarget(); + assert_throws_js(TypeError, () => { et.addEventListener("foo", () => {}, { signal: null }); }); +}, "Passing null as the signal should throw");
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/document-level-touchmove-event-listener-passive-by-default.html b/third_party/blink/web_tests/external/wpt/dom/events/document-level-touchmove-event-listener-passive-by-default.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/dom/events/document-level-touchmove-event-listener-passive-by-default.html rename to third_party/blink/web_tests/external/wpt/dom/events/document-level-touchmove-event-listener-passive-by-default.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default.html b/third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default.html rename to third_party/blink/web_tests/external/wpt/dom/events/document-level-wheel-event-listener-passive-by-default.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/idlharness.tentative.any.js b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/idlharness.tentative.any.js deleted file mode 100644 index 5a7726f..0000000 --- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/idlharness.tentative.any.js +++ /dev/null
@@ -1,24 +0,0 @@ -// META: global=window,worker -// META: script=/resources/WebIDLParser.js -// META: script=/resources/idlharness.js -// META: timeout=long - -'use strict'; - -// https://wicg.github.io/private-network-access/ - -idl_test( - ['private-network-access'], - ['html', 'dom'], - idlArray => { - if (self.GLOBAL.isWorker()) { - idlArray.add_objects({ - WorkerGlobalScope: ['self'], - }); - } else { - idlArray.add_objects({ - Document: ['document'], - }); - } - } -);
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html index 57712950..d1b6cab 100644 --- a/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html +++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html
@@ -232,7 +232,10 @@ } for (var prop of windowAllowlists.namedFrames) { win[prop]; // Shouldn't throw. - Object.getOwnPropertyDescriptor(win, prop); // Shouldn't throw. + var desc = Object.getOwnPropertyDescriptor(win, prop); + assert_false(desc.writable, "[[Writable]] for named frame " + String(prop)); + assert_false(desc.enumerable, "[[Enumerable]] for named frame " + String(prop)); + assert_true(desc.configurable, "[[Configurable]] for named frame " + String(prop)); assert_true(Object.prototype.hasOwnProperty.call(win, prop), "hasOwnProperty for " + String(prop)); } for (var prop in location) {
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt index ebdf863d..098ad25b 100644 --- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt
@@ -3,7 +3,7 @@ PASS Static id PASS Static name on the prototype FAIL constructor assert_false: gsp.hasOwnProperty("constructor") expected false got true -FAIL duplicate property names assert_equals: expected 1 but got 0 +PASS duplicate property names PASS Dynamic name PASS Ghost name Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties.html b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties.html index a0bdb1be..0ec25812d 100644 --- a/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties.html +++ b/third_party/blink/web_tests/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties.html
@@ -60,9 +60,7 @@ }, "constructor"); test(function() { var gsp = Object.getPrototypeOf(Object.getPrototypeOf(window)); - var names = Object.getOwnPropertyNames(gsp); - assert_equals(names.filter((name) => name == "baz").length, 1); - + assert_equals(gsp.baz, document.getElementsByTagName("iframe")[1].contentWindow); }, "duplicate property names") var t = async_test("Dynamic name") var t2 = async_test("Ghost name")
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt index d10785d..cc3f61a 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 3761 tests; 3739 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 3763 tests; 3741 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS idl_test setup PASS idl_test validation PASS Partial interface Document: original interface defined @@ -234,6 +234,7 @@ PASS HTMLElement interface: attribute spellcheck PASS HTMLElement interface: attribute autocapitalize PASS HTMLElement interface: attribute innerText +PASS HTMLElement interface: attribute outerText PASS HTMLElement interface: operation attachInternals() PASS HTMLElement interface: attribute onabort PASS HTMLElement interface: attribute onauxclick @@ -328,6 +329,7 @@ PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type PASS HTMLElement interface: document.createElement("noscript") must inherit property "autocapitalize" 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 "outerText" with the proper type PASS HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" 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
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/newline-normalization.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/newline-normalization.html index b49468e..2c83c5a 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/newline-normalization.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/form-submission-0/newline-normalization.html
@@ -2,7 +2,9 @@ <html> <head> <meta charset="utf-8" /> - <title>Form newline normalization</title> + <title> + Constructing the entry list shouldn't perform newline normalization + </title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> </head> @@ -40,71 +42,71 @@ test((testCase) => { const formData = new FormData(createForm(testCase, "a", "b\nc")); - assert_equals(formData.get("a"), "b\r\nc"); - }, document.title + ": \\n in the value becomes \\r\\n"); + assert_equals(formData.get("a"), "b\nc"); + }, document.title + ": \\n in the value"); test((testCase) => { const formData = new FormData(createForm(testCase, "a", "b\rc")); - assert_equals(formData.get("a"), "b\r\nc"); - }, document.title + ": \\r in the value becomes \\r\\n"); + assert_equals(formData.get("a"), "b\rc"); + }, document.title + ": \\r in the value"); test((testCase) => { const formData = new FormData(createForm(testCase, "a", "b\r\nc")); assert_equals(formData.get("a"), "b\r\nc"); - }, document.title + ": \\r\\n in the value stays unchanged"); + }, document.title + ": \\r\\n in the value"); test((testCase) => { const formData = new FormData(createForm(testCase, "a", "b\n\rc")); - assert_equals(formData.get("a"), "b\r\n\r\nc"); - }, document.title + ": \\n\\r in the value becomes \\r\\n\\r\\n"); + assert_equals(formData.get("a"), "b\n\rc"); + }, document.title + ": \\n\\r in the value"); test((testCase) => { const formData = new FormData(createForm(testCase, "a\nb", "c")); - assert_equals([...formData][0][0], "a\r\nb"); - }, document.title + ": \\n in the name becomes \\r\\n"); + assert_equals([...formData][0][0], "a\nb"); + }, document.title + ": \\n in the name"); test((testCase) => { const formData = new FormData(createForm(testCase, "a\rb", "c")); - assert_equals([...formData][0][0], "a\r\nb"); - }, document.title + ": \\r in the name becomes \\r\\n"); + assert_equals([...formData][0][0], "a\rb"); + }, document.title + ": \\r in the name"); test((testCase) => { const formData = new FormData(createForm(testCase, "a\r\nb", "c")); assert_equals([...formData][0][0], "a\r\nb"); - }, document.title + ": \\r\\n in the name stays unchanged"); + }, document.title + ": \\r\\n in the name"); test((testCase) => { const formData = new FormData(createForm(testCase, "a\n\rb", "c")); - assert_equals([...formData][0][0], "a\r\n\r\nb"); - }, document.title + ": \\n\\r in the name becomes \\r\\n\\r\\n"); + assert_equals([...formData][0][0], "a\n\rb"); + }, document.title + ": \\n\\r in the name"); test((testCase) => { const formData = new FormData( createFormWithFile(testCase, "a", "b\nc") ); assert_equals(formData.get("a").name, "b\nc"); - }, document.title + ": \\n in the filename stays unchanged"); + }, document.title + ": \\n in the filename"); test((testCase) => { const formData = new FormData( createFormWithFile(testCase, "a", "b\rc") ); assert_equals(formData.get("a").name, "b\rc"); - }, document.title + ": \\r in the filename stays unchanged"); + }, document.title + ": \\r in the filename"); test((testCase) => { const formData = new FormData( createFormWithFile(testCase, "a", "b\r\nc") ); assert_equals(formData.get("a").name, "b\r\nc"); - }, document.title + ": \\r\\n in the filename stays unchanged"); + }, document.title + ": \\r\\n in the filename"); test((testCase) => { const formData = new FormData( createFormWithFile(testCase, "a", "b\n\rc") ); assert_equals(formData.get("a").name, "b\n\rc"); - }, document.title + ": \\n\\r in the filename stays unchanged"); + }, document.title + ": \\n\\r in the filename"); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-textarea-element/wrapping-transformation.window.js b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-textarea-element/wrapping-transformation.window.js new file mode 100644 index 0000000..c5c28a4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-textarea-element/wrapping-transformation.window.js
@@ -0,0 +1,58 @@ +test((t) => { + const form = document.createElement("form"); + const textarea = document.createElement("textarea"); + textarea.name = "linebreakTest"; + textarea.textContent = "a\nb\rc\r\nd\n\re"; + form.appendChild(textarea); + document.body.appendChild(form); + t.add_cleanup(() => { + document.body.removeChild(form); + }); + + assert_equals(textarea.textContent, "a\nb\rc\r\nd\n\re"); + assert_equals(textarea.value, "a\nb\nc\nd\n\ne"); + + const formData = new FormData(form); + assert_equals( + formData.get("linebreakTest"), + "a\nb\nc\nd\n\ne", + ); +}, "Textarea wrapping transformation: Newlines should be normalized to LF."); + +test((t) => { + const form = document.createElement("form"); + const textarea = document.createElement("textarea"); + textarea.name = "wrapTest"; + textarea.cols = 10; + textarea.wrap = "hard"; + textarea.textContent = + "Some text that is too long for the specified character width."; + form.appendChild(textarea); + document.body.appendChild(form); + t.add_cleanup(() => { + document.body.removeChild(form); + }); + + assert_true( + !textarea.textContent.includes("\n") && + !textarea.textContent.includes("\r"), + "textContent shouldn't contain any newlines", + ); + assert_true( + !textarea.textContent.includes("\n") && + !textarea.textContent.includes("\r"), + "The API value shouldn't be line wrapped.", + ); + + const formData = new FormData(form); + const formDataValue = formData.get("wrapTest"); + + assert_true( + !formDataValue.includes("\r"), + "The wrapping done on the value must be LF, not CRLF.", + ); + assert_true( + formDataValue.includes("\n"), + "The value must be wrapped.", + ); +}, "Textarea wrapping transformation: Wrapping happens with LF newlines.");
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/delete_all_cookies.html b/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/delete_all_cookies.html index 14b7d58..8d7b82ab 100644 --- a/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/delete_all_cookies.html +++ b/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/delete_all_cookies.html
@@ -17,21 +17,11 @@ }, "DOM-set cookies get deleted"); promise_test(async t => { - const cookie = "test1=1"; - const encoded = encodeURIComponent(cookie); - await fetch(`/cookies/resources/cookie.py?set=${encoded}`) - - const cookie2 = "test2=2; path=/"; - const encoded2 = encodeURIComponent(cookie2); - await fetch(`/cookies/resources/cookie.py?set=${encoded2}`) - - const cookie3 = "test3=3; path=/cookies/resources"; - const encoded3 = encodeURIComponent(cookie3); - await fetch(`/cookies/resources/cookie.py?set=${encoded3}`) - - const cookie4 = "test4=4; HttpOnly"; - const encoded4 = encodeURIComponent(cookie4); - await fetch(`/cookies/resources/cookie.py?set=${encoded4}`) + const cookies = ["test1=1", "test2=2; path=/", "test3=3; path=/cookies/resources", "test4=4; HttpOnly"]; + for (const cookie of cookies) { + const encoded = encodeURIComponent(JSON.stringify(cookie)); + await fetch(`/cookies/resources/cookie.py?set=${encoded}`) + } return test_driver.delete_all_cookies().then(() => { assert_true(document.cookie === "");
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw.idl b/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw.idl index 3ba984d..d5ab6cf 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw.idl
@@ -7,26 +7,26 @@ interface WEBGL_multi_draw { undefined multiDrawArraysWEBGL( GLenum mode, - (Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, - (Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, + ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, GLsizei drawcount); undefined multiDrawElementsWEBGL( GLenum mode, - (Int32Array or sequence<GLint>) countsList, GLuint countsOffset, + ([AllowShared] Int32Array or sequence<GLint>) countsList, GLuint countsOffset, GLenum type, - (Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, GLsizei drawcount); undefined multiDrawArraysInstancedWEBGL( GLenum mode, - (Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, - (Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, - (Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, + ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, GLsizei drawcount); undefined multiDrawElementsInstancedWEBGL( GLenum mode, - (Int32Array or sequence<GLint>) countsList, GLuint countsOffset, + ([AllowShared] Int32Array or sequence<GLint>) countsList, GLuint countsOffset, GLenum type, - (Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, - (Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, GLsizei drawcount); };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl b/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl index 2f43d3a..8dd3253a 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/WEBGL_multi_draw_instanced_base_vertex_base_instance.idl
@@ -7,20 +7,20 @@ interface WEBGL_multi_draw_instanced_base_vertex_base_instance { undefined multiDrawArraysInstancedBaseInstanceWEBGL( GLenum mode, - (Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, - (Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, - (Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, - (Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset, + ([AllowShared] Int32Array or sequence<GLint>) firstsList, GLuint firstsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, + ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset, GLsizei drawCount ); undefined multiDrawElementsInstancedBaseVertexBaseInstanceWEBGL( GLenum mode, - (Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) countsList, GLuint countsOffset, GLenum type, - (Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, - (Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, - (Int32Array or sequence<GLint>) baseVerticesList, GLuint baseVerticesOffset, - (Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) offsetsList, GLuint offsetsOffset, + ([AllowShared] Int32Array or sequence<GLsizei>) instanceCountsList, GLuint instanceCountsOffset, + ([AllowShared] Int32Array or sequence<GLint>) baseVerticesList, GLuint baseVerticesOffset, + ([AllowShared] Uint32Array or sequence<GLuint>) baseInstancesList, GLuint baseInstancesOffset, GLsizei drawCount ); };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/css-typed-om.idl b/third_party/blink/web_tests/external/wpt/interfaces/css-typed-om.idl index 086cef3..262d288 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/css-typed-om.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/css-typed-om.idl
@@ -319,14 +319,8 @@ [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)] interface CSSColorValue : CSSStyleValue { - CSSRGB toRGB(); - CSSHSL toHSL(); - CSSHWB toHWB(); - CSSGray toGray(); - CSSLCH toLCH(); - CSSLab toLab(); - CSSColor toColor(CSSKeywordish colorspace); - + readonly attribute CSSKeywordValue colorSpace; + CSSColorValue to(CSSKeywordish colorSpace); [Exposed=Window] static CSSColorValue parse(USVString cssText); }; @@ -358,13 +352,6 @@ }; [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)] -interface CSSGray : CSSColorValue { - constructor(CSSNumberish gray, optional CSSNumberish alpha = 1); - attribute CSSNumberish gray; - attribute CSSNumberish alpha; -}; - -[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)] interface CSSLCH : CSSColorValue { constructor(CSSNumberish l, CSSNumberish c, CSSNumericValue h, optional CSSNumberish alpha = 1); attribute CSSNumberish l; @@ -388,3 +375,13 @@ /* CSSColor(["foo", 0, 1, .5], ["bar", "yellow"], 1, fallbackColor) */ /* or just make the alpha and fallback successive optional args? */ }; + +[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)] +interface CSSDeviceCMYK : CSSColorValue { + constructor(CSSNumberish c, CSSNumberish m, CSSNumberish y, CSSNumberish k, optional CSSNumberish alpha = 1); + attribute CSSNumberish c; + attribute CSSNumberish m; + attribute CSSNumberish y; + attribute CSSNumberish k; + attribute CSSNumberish alpha; +};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/gpuweb.idl b/third_party/blink/web_tests/external/wpt/interfaces/gpuweb.idl index 53bff4f..3f711182 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/gpuweb.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/gpuweb.idl
@@ -37,6 +37,10 @@ readonly setlike<DOMString>; }; +enum GPUPredefinedColorSpace { + "srgb", +}; + interface mixin NavigatorGPU { [SameObject] readonly attribute GPU gpu; }; @@ -92,6 +96,7 @@ GPUBuffer createBuffer(GPUBufferDescriptor descriptor); GPUTexture createTexture(GPUTextureDescriptor descriptor); GPUSampler createSampler(optional GPUSamplerDescriptor descriptor = {}); + GPUExternalTexture importExternalTexture(GPUExternalTextureDescriptor descriptor); GPUBindGroupLayout createBindGroupLayout(GPUBindGroupLayoutDescriptor descriptor); GPUPipelineLayout createPipelineLayout(GPUPipelineLayoutDescriptor descriptor); @@ -291,6 +296,16 @@ }; [Exposed=Window] +interface GPUExternalTexture { +}; +GPUExternalTexture includes GPUObjectBase; + +dictionary GPUExternalTextureDescriptor : GPUObjectDescriptorBase { + required HTMLVideoElement source; + GPUPredefinedColorSpace colorSpace = "srgb"; +}; + +[Exposed=Window] interface GPUSampler { }; GPUSampler includes GPUObjectBase; @@ -355,6 +370,7 @@ GPUSamplerBindingLayout sampler; GPUTextureBindingLayout texture; GPUStorageTextureBindingLayout storageTexture; + GPUExternalTextureBindingLayout externalTexture; }; enum GPUBufferBindingType { @@ -404,6 +420,9 @@ GPUTextureViewDimension viewDimension = "2d"; }; +dictionary GPUExternalTextureBindingLayout { +}; + [Exposed=Window] interface GPUBindGroup { }; @@ -414,7 +433,7 @@ required sequence<GPUBindGroupEntry> entries; }; -typedef (GPUSampler or GPUTextureView or GPUBufferBinding) GPUBindingResource; +typedef (GPUSampler or GPUTextureView or GPUBufferBinding or GPUExternalTexture) GPUBindingResource; dictionary GPUBindGroupEntry { required GPUIndex32 binding;
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/html.idl b/third_party/blink/web_tests/external/wpt/interfaces/html.idl index 99443be4..d878cba 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/html.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
@@ -120,6 +120,7 @@ [CEReactions] attribute DOMString autocapitalize; [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText; + [CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText; ElementInternals attachInternals(); }; @@ -1341,6 +1342,7 @@ 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); + CanvasGradient createConicGradient(double startAngle, double x, double y); CanvasPattern? createPattern(CanvasImageSource image, [LegacyNullToEmptyString] DOMString repetition); };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl b/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl index b609df75..7636e8a 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/payment-handler.idl
@@ -11,14 +11,6 @@ interface PaymentManager { [SameObject] readonly attribute PaymentInstruments instruments; attribute DOMString userHint; - Promise<undefined> enableDelegations(sequence<PaymentDelegation> delegations); -}; - -enum PaymentDelegation { - "shippingAddress", - "payerName", - "payerPhone", - "payerEmail" }; [SecureContext, Exposed=(Window,Worker)] @@ -71,9 +63,7 @@ DOMString error; PaymentCurrencyAmount total; sequence<PaymentDetailsModifier> modifiers; - sequence<PaymentShippingOption> shippingOptions; object paymentMethodErrors; - AddressErrors shippingAddressErrors; }; [Exposed=ServiceWorker] @@ -86,13 +76,8 @@ readonly attribute object total; readonly attribute FrozenArray<PaymentDetailsModifier> modifiers; readonly attribute DOMString instrumentKey; - readonly attribute boolean requestBillingAddress; - readonly attribute object? paymentOptions; - readonly attribute FrozenArray<PaymentShippingOption>? shippingOptions; Promise<WindowClient?> openWindow(USVString url); Promise<PaymentRequestDetailsUpdate?> changePaymentMethod(DOMString methodName, optional object? methodDetails = null); - Promise<PaymentRequestDetailsUpdate?> changeShippingAddress(optional AddressInit shippingAddress = {}); - Promise<PaymentRequestDetailsUpdate?> changeShippingOption(DOMString shippingOption); undefined respondWith(Promise<PaymentHandlerResponse> handlerResponsePromise); }; @@ -104,16 +89,9 @@ PaymentCurrencyAmount total; sequence<PaymentDetailsModifier> modifiers; DOMString instrumentKey; - PaymentOptions paymentOptions; - sequence<PaymentShippingOption> shippingOptions; }; dictionary PaymentHandlerResponse { DOMString methodName; object details; -DOMString? payerName; -DOMString? payerEmail; -DOMString? payerPhone; -AddressInit shippingAddress; -DOMString? shippingOption; };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/payment-request.idl b/third_party/blink/web_tests/external/wpt/interfaces/payment-request.idl index dc0511b..cd16e2a 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/payment-request.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/payment-request.idl
@@ -7,8 +7,7 @@ interface PaymentRequest : EventTarget { constructor( sequence<PaymentMethodData> methodData, - PaymentDetailsInit details, - optional PaymentOptions options = {} + PaymentDetailsInit details ); [NewObject] Promise<PaymentResponse> show(optional Promise<PaymentDetailsUpdate> detailsPromise); @@ -18,12 +17,7 @@ Promise<boolean> canMakePayment(); readonly attribute DOMString id; - readonly attribute PaymentAddress? shippingAddress; - readonly attribute DOMString? shippingOption; - readonly attribute PaymentShippingType? shippingType; - attribute EventHandler onshippingaddresschange; - attribute EventHandler onshippingoptionchange; attribute EventHandler onpaymentmethodchange; }; @@ -39,7 +33,6 @@ dictionary PaymentDetailsBase { sequence<PaymentItem> displayItems; - sequence<PaymentShippingOption> shippingOptions; sequence<PaymentDetailsModifier> modifiers; }; @@ -49,10 +42,7 @@ }; dictionary PaymentDetailsUpdate : PaymentDetailsBase { - DOMString error; PaymentItem total; - AddressErrors shippingAddressErrors; - PayerErrors payerErrors; object paymentMethodErrors; }; @@ -63,75 +53,12 @@ object data; }; -enum PaymentShippingType { - "shipping", - "delivery", - "pickup" -}; - -dictionary PaymentOptions { - boolean requestPayerName = false; - boolean requestBillingAddress = false; - boolean requestPayerEmail = false; - boolean requestPayerPhone = false; - boolean requestShipping = false; - PaymentShippingType shippingType = "shipping"; -}; - dictionary PaymentItem { required DOMString label; required PaymentCurrencyAmount amount; boolean pending = false; }; -[SecureContext, Exposed=(Window)] -interface PaymentAddress { - [Default] object toJSON(); - readonly attribute DOMString city; - readonly attribute DOMString country; - readonly attribute DOMString dependentLocality; - readonly attribute DOMString organization; - readonly attribute DOMString phone; - readonly attribute DOMString postalCode; - readonly attribute DOMString recipient; - readonly attribute DOMString region; - readonly attribute DOMString sortingCode; - readonly attribute FrozenArray<DOMString> addressLine; -}; - -dictionary AddressInit { - DOMString country = ""; - sequence<DOMString> addressLine = []; - DOMString region = ""; - DOMString city = ""; - DOMString dependentLocality = ""; - DOMString postalCode = ""; - DOMString sortingCode = ""; - DOMString organization = ""; - DOMString recipient = ""; - DOMString phone = ""; -}; - -dictionary AddressErrors { - DOMString addressLine; - DOMString city; - DOMString country; - DOMString dependentLocality; - DOMString organization; - DOMString phone; - DOMString postalCode; - DOMString recipient; - DOMString region; - DOMString sortingCode; -}; - -dictionary PaymentShippingOption { - required DOMString id; - required DOMString label; - required PaymentCurrencyAmount amount; - boolean selected = false; -}; - enum PaymentComplete { "fail", "success", @@ -145,33 +72,18 @@ readonly attribute DOMString requestId; readonly attribute DOMString methodName; readonly attribute object details; - readonly attribute PaymentAddress? shippingAddress; - readonly attribute DOMString? shippingOption; - readonly attribute DOMString? payerName; - readonly attribute DOMString? payerEmail; - readonly attribute DOMString? payerPhone; [NewObject] Promise<undefined> complete(optional PaymentComplete result = "unknown"); [NewObject] Promise<undefined> retry(optional PaymentValidationErrors errorFields = {}); - - attribute EventHandler onpayerdetailchange; }; dictionary PaymentValidationErrors { - PayerErrors payer; - AddressErrors shippingAddress; DOMString error; object paymentMethod; }; -dictionary PayerErrors { - DOMString email; - DOMString name; - DOMString phone; -}; - [SecureContext, Exposed=Window] interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent { constructor(DOMString type, optional PaymentMethodChangeEventInit eventInitDict = {}); @@ -191,3 +103,31 @@ }; dictionary PaymentRequestUpdateEventInit : EventInit {}; + +[SecureContext, Exposed=(Window)] +interface PaymentAddress { + [Default] object toJSON(); + readonly attribute DOMString city; + readonly attribute DOMString country; + readonly attribute DOMString dependentLocality; + readonly attribute DOMString organization; + readonly attribute DOMString phone; + readonly attribute DOMString postalCode; + readonly attribute DOMString recipient; + readonly attribute DOMString region; + readonly attribute DOMString sortingCode; + readonly attribute FrozenArray<DOMString> addressLine; +}; + +dictionary AddressErrors { + DOMString addressLine; + DOMString city; + DOMString country; + DOMString dependentLocality; + DOMString organization; + DOMString phone; + DOMString postalCode; + DOMString recipient; + DOMString region; + DOMString sortingCode; +};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/private-network-access.idl b/third_party/blink/web_tests/external/wpt/interfaces/private-network-access.idl deleted file mode 100644 index b470f3f..0000000 --- a/third_party/blink/web_tests/external/wpt/interfaces/private-network-access.idl +++ /dev/null
@@ -1,14 +0,0 @@ -// GENERATED CONTENT - DO NOT EDIT -// Content was automatically extracted by Reffy into webref -// (https://github.com/w3c/webref) -// Source: Private Network Access (https://wicg.github.io/private-network-access/) - -enum AddressSpace { "local", "private", "public" }; - -partial interface Document { - readonly attribute AddressSpace addressSpace; -}; - -partial interface WorkerGlobalScope { - readonly attribute AddressSpace addressSpace; -};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl b/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl index aae4aa0..1203eba 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webcodecs.idl
@@ -175,13 +175,15 @@ interface EncodedAudioChunk { constructor(EncodedAudioChunkInit init); readonly attribute EncodedAudioChunkType type; - readonly attribute unsigned long long timestamp; // microseconds - readonly attribute ArrayBuffer data; + readonly attribute long long timestamp; // microseconds + readonly attribute unsigned long byteLength; + + undefined copyTo(ArrayBufferView dst); }; dictionary EncodedAudioChunkInit { required EncodedAudioChunkType type; - required unsigned long long timestamp; + required long long timestamp; // microseconds required BufferSource data; }; @@ -194,15 +196,17 @@ interface EncodedVideoChunk { constructor(EncodedVideoChunkInit init); readonly attribute EncodedVideoChunkType type; - readonly attribute unsigned long long timestamp; // microseconds - readonly attribute unsigned long long? duration; // microseconds - readonly attribute ArrayBuffer data; + readonly attribute long long timestamp; // microseconds + readonly attribute long long? duration; // microseconds + readonly attribute unsigned long byteLength; + + undefined copyTo(ArrayBufferView dst); }; dictionary EncodedVideoChunkInit { required EncodedVideoChunkType type; - required unsigned long long timestamp; - unsigned long long duration; + required long long timestamp; // microseconds + long long duration; // microseconds required BufferSource data; }; @@ -220,8 +224,8 @@ readonly attribute unsigned long numberOfFrames; readonly attribute unsigned long numberOfChannels; readonly attribute unsigned long allocationSize; - readonly attribute unsigned long long duration; - readonly attribute unsigned long long timestamp; + readonly attribute long long duration; // microseconds + readonly attribute long long timestamp; // microseconds undefined copyTo([AllowShared] BufferSource destination, unsigned long planeNumber); AudioData clone(); @@ -233,7 +237,7 @@ required float sampleRate; required unsigned long numberOfFrames; required unsigned long numberOfChannels; - required unsigned long long timestamp; + required long long timestamp; // microseconds required BufferSource data; }; @@ -263,16 +267,16 @@ readonly attribute unsigned long cropHeight; readonly attribute unsigned long displayWidth; readonly attribute unsigned long displayHeight; - readonly attribute unsigned long long? duration; - readonly attribute unsigned long long? timestamp; + readonly attribute long long? duration; // microseconds + readonly attribute long long? timestamp; // microseconds VideoFrame clone(); undefined close(); }; dictionary VideoFrameInit { - unsigned long long duration; - unsigned long long timestamp; + long long duration; // microseconds + long long timestamp; // microseconds }; dictionary VideoFramePlaneInit { @@ -285,8 +289,8 @@ unsigned long cropHeight; unsigned long displayWidth; unsigned long displayHeight; - unsigned long long duration; - unsigned long long timestamp; + long long duration; // microseconds + long long timestamp; // microseconds }; [Exposed=(Window,DedicatedWorker)]
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl b/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl index 220e6ea1..6c3df2ab 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl
@@ -12,17 +12,6 @@ dictionary SendStreamParameters { }; -interface mixin BidirectionalStreamsTransport { - Promise<BidirectionalStream> createBidirectionalStream(); - /* a ReadableStream of BidirectionalStream objects */ - readonly attribute ReadableStream incomingBidirectionalStreams; -}; - -interface mixin DatagramTransport { - readonly attribute unsigned short maxDatagramSize; - readonly attribute DatagramDuplexStream datagrams; -}; - [Exposed=(Window,Worker)] interface DatagramDuplexStream { readonly attribute ReadableStream readable; @@ -39,11 +28,16 @@ readonly attribute Promise<WebTransportCloseInfo> closed; undefined close(optional WebTransportCloseInfo closeInfo = {}); attribute EventHandler onstatechange; + + readonly attribute unsigned short maxDatagramSize; + readonly attribute DatagramDuplexStream datagrams; + + Promise<BidirectionalStream> createBidirectionalStream(); + /* a ReadableStream of BidirectionalStream objects */ + readonly attribute ReadableStream incomingBidirectionalStreams; }; WebTransport includes UnidirectionalStreamsTransport; -WebTransport includes BidirectionalStreamsTransport; -WebTransport includes DatagramTransport; dictionary WebTransportOptions { boolean allowPooling;
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webxr.idl b/third_party/blink/web_tests/external/wpt/interfaces/webxr.idl index b08124e..3e5b4324 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webxr.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webxr.idl
@@ -202,6 +202,7 @@ // Attributes readonly attribute boolean antialias; readonly attribute boolean ignoreDepthValues; + attribute float? fixedFoveation; [SameObject] readonly attribute WebGLFramebuffer? framebuffer; readonly attribute unsigned long framebufferWidth;
diff --git a/third_party/blink/web_tests/external/wpt/private-click-measurement/idlharness.window.js b/third_party/blink/web_tests/external/wpt/private-click-measurement/idlharness.window.js new file mode 100644 index 0000000..1d0539a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/private-click-measurement/idlharness.window.js
@@ -0,0 +1,14 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +idl_test( + ['private-click-measurement'], + ['html', 'dom'], + idl_array => { + idl_array.add_objects({ + HTMLAnchorElement: ['document.createElement("a")'], + }); + } +);
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-registerprocessor-called-on-globalthis.https.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-registerprocessor-called-on-globalthis.https.html new file mode 100644 index 0000000..718cadff --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/audioworklet-registerprocessor-called-on-globalthis.https.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> + <head> + <title> + Test AudioWorkletGlobalScope's registerProcessor() called on globalThis + </title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/webaudio/resources/audit.js"></script> + </head> + <body> + <script id="layout-test-code"> + const audit = Audit.createTaskRunner(); + const realtimeContext = new AudioContext(); + const filePath = 'processors/dummy-processor-globalthis.js'; + + audit.define('registerprocessor-called-on-globalthis', (task, should) => { + realtimeContext.audioWorklet.addModule(filePath).then(() => { + const dummyWorkletNode = new AudioWorkletNode(realtimeContext, 'dummy-globalthis'); + should(dummyWorkletNode instanceof AudioWorkletNode, + '"dummyWorkletNode" is an instance of AudioWorkletNode').beTrue(); + task.done(); + }); + }); + + audit.run(); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/processors/dummy-processor-globalthis.js b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/processors/dummy-processor-globalthis.js new file mode 100644 index 0000000..d1b16cc9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioworklet-interface/processors/dummy-processor-globalthis.js
@@ -0,0 +1,12 @@ +class DummyProcessor extends AudioWorkletProcessor { + constructor() { + super(); + } + + process(inputs, outputs, parameters) { + // Doesn't do anything here. + return true; + } +} + +globalThis.registerProcessor('dummy-globalthis', DummyProcessor);
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/get_window_handle/get.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/get_window_handle/get.py index 8c26203..68441da 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/get_window_handle/get.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/get_window_handle/get.py
@@ -1,3 +1,5 @@ +import pytest + from tests.support.asserts import assert_error, assert_success @@ -19,3 +21,23 @@ def test_basic(session): response = get_window_handle(session) assert_success(response, session.window_handle) + + +# Capability needed as long as no valid certificate is available: +# https://github.com/web-platform-tests/wpt/issues/28847 +@pytest.mark.capabilities({"acceptInsecureCerts": True}) +def test_navigation_with_coop_headers(session, url): + base_path = ("/webdriver/tests/support/html/subframe.html" + + "?pipe=header(Cross-Origin-Opener-Policy,same-origin") + + session.url = url(base_path, protocol="https") + response = get_window_handle(session) + first_handle = assert_success(response) + + # navigating to another domain with COOP headers will force a process change + # in most browsers + session.url = url(base_path, protocol="https", domain="alt") + response = get_window_handle(session) + second_handle = assert_success(response) + + assert first_handle == second_handle
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/maximize_window/maximize.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/maximize_window/maximize.py index 6903eec..e233e45a 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/maximize_window/maximize.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/maximize_window/maximize.py
@@ -84,6 +84,7 @@ session.end() session.window.maximize() available = session.window.size + session.window.size = (800, 600) session.end() session.window.size = available @@ -95,4 +96,5 @@ # its expected dimensions. before = session.window.size session.window.maximize() - assert session.window.size == before + after = session.window.size + assert after == before
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html index 49f8813..f26a93e 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-getStats.https.html
@@ -264,8 +264,11 @@ "outbound-rtp", "remote-inbound-rtp", "remote-outbound-rtp", + "media-source", "peer-connection", "data-channel", + "sender", + "receiver", "transport", "candidate-pair", "local-candidate",
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https.html index 7da14cd..f80fa5f 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https.html
@@ -95,7 +95,11 @@ ], RTCCodecStats: [ "payloadType", - "codecType", + /* codecType is part of MTI but is not systematically set + per https://www.w3.org/TR/webrtc-stats/#dom-rtccodecstats-codectype + If the dictionary member is not present, it means that + this media format can be both encoded and decoded. */ + // "codecType", "mimeType", "clockRate", "channels", @@ -130,7 +134,11 @@ "fingerprint", "fingerprintAlgorithm", "base64Certificate", - "issuerCertificateId", + /* issuerCertificateId is part of MTI but is not systematically set + per https://www.w3.org/TR/webrtc-stats/#dom-rtccertificatestats-issuercertificateid + If the current certificate is at the end of the chain + (i.e. a self-signed certificate), this will not be set. */ + // "issuerCertificateId", ], };
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html index e4296aef..01845f0 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html
@@ -103,7 +103,6 @@ assert_session_desc_similar(pc.pendingLocalDescription, pranswer); assert_equals(pc.currentLocalDescription, null); - assert_equals(pc.pendingRemoteDescription, null); assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer']); });
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCStats-helper.js b/third_party/blink/web_tests/external/wpt/webrtc/RTCStats-helper.js index 81abe24..33cbf4a 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCStats-helper.js +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCStats-helper.js
@@ -207,8 +207,9 @@ assert_string_field(stats, 'mimeType'); assert_unsigned_int_field(stats, 'clockRate'); - assert_unsigned_int_field(stats, 'channels'); - + if (stats.kind === 'audio') { + assert_unsigned_int_field(stats, 'channels'); + } assert_string_field(stats, 'sdpFmtpLine'); }
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any-expected.txt new file mode 100644 index 0000000..42bc8cd6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any-expected.txt
@@ -0,0 +1,73 @@ +This is a testharness.js-based test. +Found 69 tests; 45 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL idl_test setup promise_test: Unhandled rejection with value: object "SyntaxError: Failed to construct 'WebTransport': The URL's scheme must be 'https'. 'quic-transport' is not allowed." +PASS idl_test validation +PASS WebTransport includes UnidirectionalStreamsTransport: member names are unique +PASS DatagramDuplexStream interface: existence and properties of interface object +PASS DatagramDuplexStream interface object length +PASS DatagramDuplexStream interface object name +PASS DatagramDuplexStream interface: existence and properties of interface prototype object +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property +PASS DatagramDuplexStream interface: attribute readable +PASS DatagramDuplexStream interface: attribute writable +PASS WebTransport interface: existence and properties of interface object +PASS WebTransport interface object length +PASS WebTransport interface object name +PASS WebTransport interface: existence and properties of interface prototype object +PASS WebTransport interface: existence and properties of interface prototype object's "constructor" property +PASS WebTransport interface: existence and properties of interface prototype object's @@unscopables property +FAIL WebTransport interface: operation getStats() assert_own_property: interface prototype object missing non-static operation expected property "getStats" missing +FAIL WebTransport interface: attribute state assert_true: The prototype object must have a property "state" expected true got false +PASS WebTransport interface: attribute ready +PASS WebTransport interface: attribute closed +PASS WebTransport interface: operation close(optional WebTransportCloseInfo) +FAIL WebTransport interface: attribute onstatechange assert_true: The prototype object must have a property "onstatechange" expected true got false +FAIL WebTransport interface: attribute maxDatagramSize assert_true: The prototype object must have a property "maxDatagramSize" expected true got false +FAIL WebTransport interface: attribute datagrams assert_true: The prototype object must have a property "datagrams" expected true got false +PASS WebTransport interface: operation createBidirectionalStream() +PASS WebTransport interface: attribute incomingBidirectionalStreams +PASS WebTransport interface: operation createUnidirectionalStream(optional SendStreamParameters) +PASS WebTransport interface: attribute incomingUnidirectionalStreams +FAIL WebTransport must be primary interface of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL Stringification of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "state" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "ready" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "closed" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "onstatechange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "maxDatagramSize" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "datagrams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createBidirectionalStream()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional SendStreamParameters)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling createUnidirectionalStream(optional SendStreamParameters) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +PASS SendStream interface: existence and properties of interface object +PASS SendStream interface object length +PASS SendStream interface object name +PASS SendStream interface: existence and properties of interface prototype object +PASS SendStream interface: existence and properties of interface prototype object's "constructor" property +PASS SendStream interface: existence and properties of interface prototype object's @@unscopables property +PASS SendStream interface: attribute writingAborted +PASS SendStream interface: operation abortWriting(optional StreamAbortInfo) +FAIL ReceiveStream interface: existence and properties of interface object assert_equals: prototype of ReceiveStream is not ReadableStream expected function "function ReadableStream() { [native code] }" but got function "function () { [native code] }" +PASS ReceiveStream interface object length +PASS ReceiveStream interface object name +FAIL ReceiveStream interface: existence and properties of interface prototype object assert_equals: prototype of ReceiveStream.prototype is not ReadableStream.prototype expected object "[object ReadableStream]" but got object "[object Object]" +PASS ReceiveStream interface: existence and properties of interface prototype object's "constructor" property +PASS ReceiveStream interface: existence and properties of interface prototype object's @@unscopables property +PASS ReceiveStream interface: attribute readingAborted +PASS ReceiveStream interface: operation abortReading(optional StreamAbortInfo) +PASS BidirectionalStream interface: existence and properties of interface object +PASS BidirectionalStream interface object length +PASS BidirectionalStream interface object name +PASS BidirectionalStream interface: existence and properties of interface prototype object +PASS BidirectionalStream interface: existence and properties of interface prototype object's "constructor" property +PASS BidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property +PASS BidirectionalStream interface: attribute readable +PASS BidirectionalStream interface: attribute writable +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.js b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.js new file mode 100644 index 0000000..1a22753 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.js
@@ -0,0 +1,20 @@ +// META: global=window,worker +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +idl_test( + ['webtransport'], + ['streams'], + idl_array => { + idl_array.add_objects({ + WebTransport: ['webTransport'], + // TODO: The stream APIs below require a working connection to create. + // BidirectionalStream + // SendStream + // ReceiveStream + }); + self.webTransport = new WebTransport("quic-transport://example.com/"); + } +);
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.serviceworker-expected.txt new file mode 100644 index 0000000..42bc8cd6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.serviceworker-expected.txt
@@ -0,0 +1,73 @@ +This is a testharness.js-based test. +Found 69 tests; 45 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL idl_test setup promise_test: Unhandled rejection with value: object "SyntaxError: Failed to construct 'WebTransport': The URL's scheme must be 'https'. 'quic-transport' is not allowed." +PASS idl_test validation +PASS WebTransport includes UnidirectionalStreamsTransport: member names are unique +PASS DatagramDuplexStream interface: existence and properties of interface object +PASS DatagramDuplexStream interface object length +PASS DatagramDuplexStream interface object name +PASS DatagramDuplexStream interface: existence and properties of interface prototype object +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property +PASS DatagramDuplexStream interface: attribute readable +PASS DatagramDuplexStream interface: attribute writable +PASS WebTransport interface: existence and properties of interface object +PASS WebTransport interface object length +PASS WebTransport interface object name +PASS WebTransport interface: existence and properties of interface prototype object +PASS WebTransport interface: existence and properties of interface prototype object's "constructor" property +PASS WebTransport interface: existence and properties of interface prototype object's @@unscopables property +FAIL WebTransport interface: operation getStats() assert_own_property: interface prototype object missing non-static operation expected property "getStats" missing +FAIL WebTransport interface: attribute state assert_true: The prototype object must have a property "state" expected true got false +PASS WebTransport interface: attribute ready +PASS WebTransport interface: attribute closed +PASS WebTransport interface: operation close(optional WebTransportCloseInfo) +FAIL WebTransport interface: attribute onstatechange assert_true: The prototype object must have a property "onstatechange" expected true got false +FAIL WebTransport interface: attribute maxDatagramSize assert_true: The prototype object must have a property "maxDatagramSize" expected true got false +FAIL WebTransport interface: attribute datagrams assert_true: The prototype object must have a property "datagrams" expected true got false +PASS WebTransport interface: operation createBidirectionalStream() +PASS WebTransport interface: attribute incomingBidirectionalStreams +PASS WebTransport interface: operation createUnidirectionalStream(optional SendStreamParameters) +PASS WebTransport interface: attribute incomingUnidirectionalStreams +FAIL WebTransport must be primary interface of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL Stringification of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "state" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "ready" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "closed" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "onstatechange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "maxDatagramSize" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "datagrams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createBidirectionalStream()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional SendStreamParameters)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling createUnidirectionalStream(optional SendStreamParameters) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +PASS SendStream interface: existence and properties of interface object +PASS SendStream interface object length +PASS SendStream interface object name +PASS SendStream interface: existence and properties of interface prototype object +PASS SendStream interface: existence and properties of interface prototype object's "constructor" property +PASS SendStream interface: existence and properties of interface prototype object's @@unscopables property +PASS SendStream interface: attribute writingAborted +PASS SendStream interface: operation abortWriting(optional StreamAbortInfo) +FAIL ReceiveStream interface: existence and properties of interface object assert_equals: prototype of ReceiveStream is not ReadableStream expected function "function ReadableStream() { [native code] }" but got function "function () { [native code] }" +PASS ReceiveStream interface object length +PASS ReceiveStream interface object name +FAIL ReceiveStream interface: existence and properties of interface prototype object assert_equals: prototype of ReceiveStream.prototype is not ReadableStream.prototype expected object "[object ReadableStream]" but got object "[object Object]" +PASS ReceiveStream interface: existence and properties of interface prototype object's "constructor" property +PASS ReceiveStream interface: existence and properties of interface prototype object's @@unscopables property +PASS ReceiveStream interface: attribute readingAborted +PASS ReceiveStream interface: operation abortReading(optional StreamAbortInfo) +PASS BidirectionalStream interface: existence and properties of interface object +PASS BidirectionalStream interface object length +PASS BidirectionalStream interface object name +PASS BidirectionalStream interface: existence and properties of interface prototype object +PASS BidirectionalStream interface: existence and properties of interface prototype object's "constructor" property +PASS BidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property +PASS BidirectionalStream interface: attribute readable +PASS BidirectionalStream interface: attribute writable +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.sharedworker-expected.txt new file mode 100644 index 0000000..42bc8cd6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.sharedworker-expected.txt
@@ -0,0 +1,73 @@ +This is a testharness.js-based test. +Found 69 tests; 45 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL idl_test setup promise_test: Unhandled rejection with value: object "SyntaxError: Failed to construct 'WebTransport': The URL's scheme must be 'https'. 'quic-transport' is not allowed." +PASS idl_test validation +PASS WebTransport includes UnidirectionalStreamsTransport: member names are unique +PASS DatagramDuplexStream interface: existence and properties of interface object +PASS DatagramDuplexStream interface object length +PASS DatagramDuplexStream interface object name +PASS DatagramDuplexStream interface: existence and properties of interface prototype object +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property +PASS DatagramDuplexStream interface: attribute readable +PASS DatagramDuplexStream interface: attribute writable +PASS WebTransport interface: existence and properties of interface object +PASS WebTransport interface object length +PASS WebTransport interface object name +PASS WebTransport interface: existence and properties of interface prototype object +PASS WebTransport interface: existence and properties of interface prototype object's "constructor" property +PASS WebTransport interface: existence and properties of interface prototype object's @@unscopables property +FAIL WebTransport interface: operation getStats() assert_own_property: interface prototype object missing non-static operation expected property "getStats" missing +FAIL WebTransport interface: attribute state assert_true: The prototype object must have a property "state" expected true got false +PASS WebTransport interface: attribute ready +PASS WebTransport interface: attribute closed +PASS WebTransport interface: operation close(optional WebTransportCloseInfo) +FAIL WebTransport interface: attribute onstatechange assert_true: The prototype object must have a property "onstatechange" expected true got false +FAIL WebTransport interface: attribute maxDatagramSize assert_true: The prototype object must have a property "maxDatagramSize" expected true got false +FAIL WebTransport interface: attribute datagrams assert_true: The prototype object must have a property "datagrams" expected true got false +PASS WebTransport interface: operation createBidirectionalStream() +PASS WebTransport interface: attribute incomingBidirectionalStreams +PASS WebTransport interface: operation createUnidirectionalStream(optional SendStreamParameters) +PASS WebTransport interface: attribute incomingUnidirectionalStreams +FAIL WebTransport must be primary interface of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL Stringification of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "state" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "ready" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "closed" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "onstatechange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "maxDatagramSize" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "datagrams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createBidirectionalStream()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional SendStreamParameters)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling createUnidirectionalStream(optional SendStreamParameters) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +PASS SendStream interface: existence and properties of interface object +PASS SendStream interface object length +PASS SendStream interface object name +PASS SendStream interface: existence and properties of interface prototype object +PASS SendStream interface: existence and properties of interface prototype object's "constructor" property +PASS SendStream interface: existence and properties of interface prototype object's @@unscopables property +PASS SendStream interface: attribute writingAborted +PASS SendStream interface: operation abortWriting(optional StreamAbortInfo) +FAIL ReceiveStream interface: existence and properties of interface object assert_equals: prototype of ReceiveStream is not ReadableStream expected function "function ReadableStream() { [native code] }" but got function "function () { [native code] }" +PASS ReceiveStream interface object length +PASS ReceiveStream interface object name +FAIL ReceiveStream interface: existence and properties of interface prototype object assert_equals: prototype of ReceiveStream.prototype is not ReadableStream.prototype expected object "[object ReadableStream]" but got object "[object Object]" +PASS ReceiveStream interface: existence and properties of interface prototype object's "constructor" property +PASS ReceiveStream interface: existence and properties of interface prototype object's @@unscopables property +PASS ReceiveStream interface: attribute readingAborted +PASS ReceiveStream interface: operation abortReading(optional StreamAbortInfo) +PASS BidirectionalStream interface: existence and properties of interface object +PASS BidirectionalStream interface object length +PASS BidirectionalStream interface object name +PASS BidirectionalStream interface: existence and properties of interface prototype object +PASS BidirectionalStream interface: existence and properties of interface prototype object's "constructor" property +PASS BidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property +PASS BidirectionalStream interface: attribute readable +PASS BidirectionalStream interface: attribute writable +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.worker-expected.txt new file mode 100644 index 0000000..42bc8cd6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webtransport/idlharness.any.worker-expected.txt
@@ -0,0 +1,73 @@ +This is a testharness.js-based test. +Found 69 tests; 45 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN. +FAIL idl_test setup promise_test: Unhandled rejection with value: object "SyntaxError: Failed to construct 'WebTransport': The URL's scheme must be 'https'. 'quic-transport' is not allowed." +PASS idl_test validation +PASS WebTransport includes UnidirectionalStreamsTransport: member names are unique +PASS DatagramDuplexStream interface: existence and properties of interface object +PASS DatagramDuplexStream interface object length +PASS DatagramDuplexStream interface object name +PASS DatagramDuplexStream interface: existence and properties of interface prototype object +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property +PASS DatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property +PASS DatagramDuplexStream interface: attribute readable +PASS DatagramDuplexStream interface: attribute writable +PASS WebTransport interface: existence and properties of interface object +PASS WebTransport interface object length +PASS WebTransport interface object name +PASS WebTransport interface: existence and properties of interface prototype object +PASS WebTransport interface: existence and properties of interface prototype object's "constructor" property +PASS WebTransport interface: existence and properties of interface prototype object's @@unscopables property +FAIL WebTransport interface: operation getStats() assert_own_property: interface prototype object missing non-static operation expected property "getStats" missing +FAIL WebTransport interface: attribute state assert_true: The prototype object must have a property "state" expected true got false +PASS WebTransport interface: attribute ready +PASS WebTransport interface: attribute closed +PASS WebTransport interface: operation close(optional WebTransportCloseInfo) +FAIL WebTransport interface: attribute onstatechange assert_true: The prototype object must have a property "onstatechange" expected true got false +FAIL WebTransport interface: attribute maxDatagramSize assert_true: The prototype object must have a property "maxDatagramSize" expected true got false +FAIL WebTransport interface: attribute datagrams assert_true: The prototype object must have a property "datagrams" expected true got false +PASS WebTransport interface: operation createBidirectionalStream() +PASS WebTransport interface: attribute incomingBidirectionalStreams +PASS WebTransport interface: operation createUnidirectionalStream(optional SendStreamParameters) +PASS WebTransport interface: attribute incomingUnidirectionalStreams +FAIL WebTransport must be primary interface of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL Stringification of webTransport assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "getStats()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "state" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "ready" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "closed" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "onstatechange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "maxDatagramSize" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "datagrams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createBidirectionalStream()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional SendStreamParameters)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: calling createUnidirectionalStream(optional SendStreamParameters) on webTransport with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +FAIL WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: webTransport is not defined" +PASS SendStream interface: existence and properties of interface object +PASS SendStream interface object length +PASS SendStream interface object name +PASS SendStream interface: existence and properties of interface prototype object +PASS SendStream interface: existence and properties of interface prototype object's "constructor" property +PASS SendStream interface: existence and properties of interface prototype object's @@unscopables property +PASS SendStream interface: attribute writingAborted +PASS SendStream interface: operation abortWriting(optional StreamAbortInfo) +FAIL ReceiveStream interface: existence and properties of interface object assert_equals: prototype of ReceiveStream is not ReadableStream expected function "function ReadableStream() { [native code] }" but got function "function () { [native code] }" +PASS ReceiveStream interface object length +PASS ReceiveStream interface object name +FAIL ReceiveStream interface: existence and properties of interface prototype object assert_equals: prototype of ReceiveStream.prototype is not ReadableStream.prototype expected object "[object ReadableStream]" but got object "[object Object]" +PASS ReceiveStream interface: existence and properties of interface prototype object's "constructor" property +PASS ReceiveStream interface: existence and properties of interface prototype object's @@unscopables property +PASS ReceiveStream interface: attribute readingAborted +PASS ReceiveStream interface: operation abortReading(optional StreamAbortInfo) +PASS BidirectionalStream interface: existence and properties of interface object +PASS BidirectionalStream interface object length +PASS BidirectionalStream interface object name +PASS BidirectionalStream interface: existence and properties of interface prototype object +PASS BidirectionalStream interface: existence and properties of interface prototype object's "constructor" property +PASS BidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property +PASS BidirectionalStream interface: attribute readable +PASS BidirectionalStream interface: attribute writable +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js index cf9c6ff..75d73968cc 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js +++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js
@@ -15,6 +15,10 @@ function xr_promise_test(name, func, properties, glContextType, glContextProperties) { promise_test(async (t) => { + if (glContextType === 'webgl2') { + // Fast fail on platforms not supporting WebGL2. + assert_implements('WebGL2RenderingContext' in window, 'webgl2 not supported.'); + } // Perform any required test setup: xr_debug(name, 'setup');
diff --git a/third_party/blink/web_tests/external/wpt/xhr/formdata/constructor-formelement.html b/third_party/blink/web_tests/external/wpt/xhr/formdata/constructor-formelement.html index cce0f42..813e1d2a6 100644 --- a/third_party/blink/web_tests/external/wpt/xhr/formdata/constructor-formelement.html +++ b/third_party/blink/web_tests/external/wpt/xhr/formdata/constructor-formelement.html
@@ -77,7 +77,7 @@ <input type="color" name="submit-me-15" value="#123456"> <textarea name="submit-me-16">textarea value -with linebreaks set to CRLF</textarea> +with linebreaks set to LF</textarea> <!-- this generates two form data entries! --> <input type="text" name="dirname-is-special" dirname="submit-me-17" value="dirname-value"> @@ -123,11 +123,11 @@ ["submit-me-13", "11"], ["submit-me-14", "11"], ["submit-me-15", "#123456"], - ["submit-me-16", "textarea value\r\nwith linebreaks set to CRLF"], + ["submit-me-16", "textarea value\nwith linebreaks set to LF"], ["dirname-is-special", "dirname-value"], ["submit-me-17", "ltr"], ["submit-me-18-\uFFFD", "value-\uFFFD"], - ["submit-me-\r\n19\r\n", "value"], + ["submit-me-\r19\n", "value"], ["submit-me-21", ""] ];
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt index 40dab7f..e9d5981 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/accessibility/accessibility-ignoredNodes-expected.txt
@@ -14,16 +14,40 @@ } } -*none +RootWebArea + img + *SvgRoot { domNode : svg - ignored : true - ignoredReasons : [ - ] + ignored : false + name : { + sources : [ + [0] : { + attribute : aria-labelledby + type : relatedElement + } + [1] : { + attribute : aria-label + type : attribute + } + [2] : { + nativeSource : title + type : relatedElement + } + [3] : { + attribute : title + type : attribute + } + ] + type : computedString + value : + } nodeId : <string> + properties : [ + ] role : { - type : role - value : none + type : internalRole + value : SvgRoot } }
diff --git a/third_party/blink/web_tests/images/resources/avif/README.md b/third_party/blink/web_tests/images/resources/avif/README.md index 3cc35267..78abe86 100644 --- a/third_party/blink/web_tests/images/resources/avif/README.md +++ b/third_party/blink/web_tests/images/resources/avif/README.md
@@ -88,4 +88,9 @@ This image uses a 'clap' (clean aperture) image property to crop the image to contain the blue rectangle only (with a magenta rectangle inside). +### blue-and-magenta-crop-invalid.avif +This image is the same as blue-and-magenta-crop.avif except that the fractions +horizOff and vertOff have positive numerators and negative denominators (30/-1 +and 10/-1 instead of -30/1 and -10/1). Changed with a hex editor. + ### TODO(crbug.com/960620): Figure out how the rest of files were generated.
diff --git a/third_party/blink/web_tests/images/resources/avif/blue-and-magenta-crop-invalid.avif b/third_party/blink/web_tests/images/resources/avif/blue-and-magenta-crop-invalid.avif new file mode 100644 index 0000000..e465182 --- /dev/null +++ b/third_party/blink/web_tests/images/resources/avif/blue-and-magenta-crop-invalid.avif Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index 316483ca..e6933e9 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 662cbfb..df20a95 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 1297542f..fd0d0f3 100644 --- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 4da9bb4a..8f70bf2 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-image-01-b-expected.png new file mode 100644 index 0000000..fd0d0f3 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png new file mode 100644 index 0000000..e6933e9 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png new file mode 100644 index 0000000..df20a95 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1/filters-image-01-b-expected.png new file mode 100644 index 0000000..fd0d0f3 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/synchronous_html_parser/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..476b017a0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt new file mode 100644 index 0000000..ebdf863d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt
@@ -0,0 +1,10 @@ +This is a testharness.js-based test. +PASS Static name +PASS Static id +PASS Static name on the prototype +FAIL constructor assert_false: gsp.hasOwnProperty("constructor") expected false got true +FAIL duplicate property names assert_equals: expected 1 but got 0 +PASS Dynamic name +PASS Ghost name +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt new file mode 100644 index 0000000..d10785d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt
@@ -0,0 +1,3765 @@ +This is a testharness.js-based test. +Found 3761 tests; 3739 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS idl_test setup +PASS idl_test validation +PASS Partial interface Document: original interface defined +PASS Partial interface Document: member names are unique +PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined +PASS Partial interface mixin DocumentOrShadowRoot: member names are unique +PASS Partial interface mixin NavigatorID: original interface mixin defined +PASS Partial interface mixin NavigatorID: member names are unique +PASS Partial interface HTMLAnchorElement: original interface defined +PASS Partial interface HTMLAnchorElement: member names are unique +PASS Partial interface HTMLAreaElement: original interface defined +PASS Partial interface HTMLAreaElement: member names are unique +PASS Partial interface HTMLBodyElement: original interface defined +PASS Partial interface HTMLBodyElement: member names are unique +PASS Partial interface HTMLBRElement: original interface defined +PASS Partial interface HTMLBRElement: member names are unique +PASS Partial interface HTMLTableCaptionElement: original interface defined +PASS Partial interface HTMLTableCaptionElement: member names are unique +PASS Partial interface HTMLTableColElement: original interface defined +PASS Partial interface HTMLTableColElement: member names are unique +PASS Partial interface HTMLDivElement: original interface defined +PASS Partial interface HTMLDivElement: member names are unique +PASS Partial interface HTMLDListElement: original interface defined +PASS Partial interface HTMLDListElement: member names are unique +PASS Partial interface HTMLEmbedElement: original interface defined +PASS Partial interface HTMLEmbedElement: member names are unique +PASS Partial interface HTMLHeadingElement: original interface defined +PASS Partial interface HTMLHeadingElement: member names are unique +PASS Partial interface HTMLHRElement: original interface defined +PASS Partial interface HTMLHRElement: member names are unique +PASS Partial interface HTMLHtmlElement: original interface defined +PASS Partial interface HTMLHtmlElement: member names are unique +PASS Partial interface HTMLIFrameElement: original interface defined +PASS Partial interface HTMLIFrameElement: member names are unique +PASS Partial interface HTMLImageElement: original interface defined +PASS Partial interface HTMLImageElement: member names are unique +PASS Partial interface HTMLInputElement: original interface defined +PASS Partial interface HTMLInputElement: member names are unique +PASS Partial interface HTMLLegendElement: original interface defined +PASS Partial interface HTMLLegendElement: member names are unique +PASS Partial interface HTMLLIElement: original interface defined +PASS Partial interface HTMLLIElement: member names are unique +PASS Partial interface HTMLLinkElement: original interface defined +PASS Partial interface HTMLLinkElement: member names are unique +PASS Partial interface HTMLMenuElement: original interface defined +PASS Partial interface HTMLMenuElement: member names are unique +PASS Partial interface HTMLMetaElement: original interface defined +PASS Partial interface HTMLMetaElement: member names are unique +PASS Partial interface HTMLObjectElement: original interface defined +PASS Partial interface HTMLObjectElement: member names are unique +PASS Partial interface HTMLOListElement: original interface defined +PASS Partial interface HTMLOListElement: member names are unique +PASS Partial interface HTMLParagraphElement: original interface defined +PASS Partial interface HTMLParagraphElement: member names are unique +PASS Partial interface HTMLParamElement: original interface defined +PASS Partial interface HTMLParamElement: member names are unique +PASS Partial interface HTMLPreElement: original interface defined +PASS Partial interface HTMLPreElement: member names are unique +PASS Partial interface HTMLStyleElement: original interface defined +PASS Partial interface HTMLStyleElement: member names are unique +PASS Partial interface HTMLScriptElement: original interface defined +PASS Partial interface HTMLScriptElement: member names are unique +PASS Partial interface HTMLTableElement: original interface defined +PASS Partial interface HTMLTableElement: member names are unique +PASS Partial interface HTMLTableSectionElement: original interface defined +PASS Partial interface HTMLTableSectionElement: member names are unique +PASS Partial interface HTMLTableCellElement: original interface defined +PASS Partial interface HTMLTableCellElement: member names are unique +PASS Partial interface HTMLTableRowElement: original interface defined +PASS Partial interface HTMLTableRowElement: member names are unique +PASS Partial interface HTMLUListElement: original interface defined +PASS Partial interface HTMLUListElement: member names are unique +PASS Partial interface Document[2]: original interface defined +PASS Partial interface Document[2]: member names are unique +PASS Partial interface Window: original interface defined +PASS Partial interface Window: member names are unique +PASS Partial interface Document[3]: member names are unique +PASS Partial interface mixin DocumentOrShadowRoot[2]: member names are unique +PASS Partial interface UIEvent: member names are unique +PASS Partial interface MouseEvent: member names are unique +PASS Partial interface UIEvent[2]: member names are unique +PASS Partial dictionary UIEventInit: member names are unique +PASS Document includes GlobalEventHandlers: member names are unique +PASS Document includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes GlobalEventHandlers: member names are unique +PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes ElementContentEditable: member names are unique +PASS HTMLElement includes HTMLOrSVGElement: member names are unique +PASS HTMLLinkElement includes LinkStyle: member names are unique +PASS HTMLStyleElement includes LinkStyle: member names are unique +PASS HTMLBodyElement includes WindowEventHandlers: member names are unique +PASS HTMLAnchorElement includes HTMLHyperlinkElementUtils: member names are unique +PASS HTMLAreaElement includes HTMLHyperlinkElementUtils: member names are unique +PASS CanvasRenderingContext2D includes CanvasState: member names are unique +PASS CanvasRenderingContext2D includes CanvasTransform: member names are unique +PASS CanvasRenderingContext2D includes CanvasCompositing: member names are unique +PASS CanvasRenderingContext2D includes CanvasImageSmoothing: member names are unique +PASS CanvasRenderingContext2D includes CanvasFillStrokeStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasShadowStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasFilters: member names are unique +PASS CanvasRenderingContext2D includes CanvasRect: member names are unique +PASS CanvasRenderingContext2D includes CanvasDrawPath: member names are unique +PASS CanvasRenderingContext2D includes CanvasUserInterface: member names are unique +PASS CanvasRenderingContext2D includes CanvasText: member names are unique +PASS CanvasRenderingContext2D includes CanvasDrawImage: member names are unique +PASS CanvasRenderingContext2D includes CanvasImageData: member names are unique +PASS CanvasRenderingContext2D includes CanvasPathDrawingStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasTextDrawingStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasPath: member names are unique +PASS Path2D includes CanvasPath: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasState: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasTransform: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasCompositing: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasShadowStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasFilters: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasRect: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasDrawPath: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasText: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasDrawImage: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasImageData: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasPath: member names are unique +PASS ElementInternals includes ARIAMixin: member names are unique +PASS Window includes GlobalEventHandlers: member names are unique +PASS Window includes WindowEventHandlers: member names are unique +PASS Window includes WindowOrWorkerGlobalScope: member names are unique +PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique +PASS Navigator includes NavigatorID: member names are unique +PASS Navigator includes NavigatorLanguage: member names are unique +PASS Navigator includes NavigatorOnLine: member names are unique +PASS Navigator includes NavigatorContentUtils: member names are unique +PASS Navigator includes NavigatorCookies: member names are unique +PASS Navigator includes NavigatorPlugins: member names are unique +PASS Navigator includes NavigatorConcurrentHardware: member names are unique +PASS Window includes AnimationFrameProvider: member names are unique +PASS DedicatedWorkerGlobalScope includes AnimationFrameProvider: member names are unique +PASS Worker includes AbstractWorker: member names are unique +PASS SharedWorker includes AbstractWorker: member names are unique +PASS WorkerNavigator includes NavigatorID: member names are unique +PASS WorkerNavigator includes NavigatorLanguage: member names are unique +PASS WorkerNavigator includes NavigatorOnLine: member names are unique +PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique +PASS Window includes WindowSessionStorage: member names are unique +PASS Window includes WindowLocalStorage: member names are unique +PASS HTMLFrameSetElement includes WindowEventHandlers: member names are unique +PASS Element includes ARIAMixin: member names are unique +PASS SVGElement includes GlobalEventHandlers: member names are unique +PASS SVGElement includes DocumentAndElementEventHandlers: member names are unique +PASS SVGElement includes SVGElementInstance: member names are unique +PASS SVGElement includes HTMLOrSVGElement: member names are unique +PASS SVGGraphicsElement includes SVGTests: member names are unique +PASS SVGSVGElement includes SVGFitToViewBox: member names are unique +PASS SVGSVGElement includes WindowEventHandlers: member names are unique +PASS SVGImageElement includes SVGURIReference: member names are unique +PASS SVGScriptElement includes SVGURIReference: member names are unique +PASS HTMLElement includes ElementCSSInlineStyle: member names are unique +PASS SVGElement includes ElementCSSInlineStyle: member names are unique +PASS Document includes NonElementParentNode: member names are unique +PASS DocumentFragment includes NonElementParentNode: member names are unique +PASS Document includes DocumentOrShadowRoot: member names are unique +PASS ShadowRoot includes DocumentOrShadowRoot: member names are unique +PASS Document includes ParentNode: member names are unique +PASS DocumentFragment includes ParentNode: member names are unique +PASS Element includes ParentNode: member names are unique +PASS Element includes NonDocumentTypeChildNode: member names are unique +PASS Element includes ChildNode: member names are unique +PASS Element includes Slottable: member names are unique +PASS Document includes XPathEvaluatorBase: member names are unique +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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLAllCollection interface: attribute length +PASS HTMLAllCollection interface: operation namedItem(DOMString) +PASS HTMLAllCollection interface: operation item(optional DOMString) +PASS HTMLAllCollection must be primary interface of document.all +PASS Stringification of document.all +PASS HTMLAllCollection interface: document.all must inherit property "length" with the proper type +PASS HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type +PASS HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError +PASS HTMLAllCollection interface: document.all must inherit property "item(optional DOMString)" with the proper type +PASS HTMLAllCollection interface: calling item(optional DOMString) on document.all with too few arguments must throw TypeError +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: existence and properties of interface prototype object's @@unscopables 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 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLOptionsCollection interface: attribute length +PASS HTMLOptionsCollection interface: operation add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) +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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?)" with the proper type +PASS HTMLOptionsCollection interface: calling add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) 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 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: existence and properties of interface prototype object's @@unscopables 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 hidden +PASS HTMLElement interface: operation click() +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 autocapitalize +PASS HTMLElement interface: attribute innerText +PASS HTMLElement interface: operation attachInternals() +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 +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 onformdata +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 +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 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 +FAIL HTMLElement interface: attribute onslotchange assert_true: The prototype object must have a property "onslotchange" expected true got false +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 +PASS HTMLElement interface: attribute onwebkitanimationend +PASS HTMLElement interface: attribute onwebkitanimationiteration +PASS HTMLElement interface: attribute onwebkitanimationstart +PASS HTMLElement interface: attribute onwebkittransitionend +PASS HTMLElement interface: attribute onwheel +PASS HTMLElement interface: attribute oncopy +PASS HTMLElement interface: attribute oncut +PASS HTMLElement interface: attribute onpaste +PASS HTMLElement interface: attribute contentEditable +PASS HTMLElement interface: attribute enterKeyHint +PASS HTMLElement interface: attribute isContentEditable +PASS HTMLElement interface: attribute inputMode +PASS HTMLElement interface: attribute dataset +PASS HTMLElement interface: attribute nonce +PASS HTMLElement interface: attribute autofocus +PASS HTMLElement interface: attribute tabIndex +PASS HTMLElement interface: operation focus(optional FocusOptions) +PASS HTMLElement interface: operation blur() +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 "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 "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 "autocapitalize" 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 "attachInternals()" 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 +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 "onformdata" 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 +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 "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 +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type assert_inherits: property "onslotchange" not found in prototype chain +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 "onwebkitanimationend" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" 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 "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 "enterKeyHint" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" 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 "nonce" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" 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(optional FocusOptions)" with the proper type +PASS HTMLElement interface: calling focus(optional 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 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 interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLUnknownElement must be primary interface of document.createElement("bgsound") +PASS Stringification of document.createElement("bgsound") +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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLLinkElement interface: attribute integrity +PASS HTMLLinkElement interface: attribute hreflang +PASS HTMLLinkElement interface: attribute type +PASS HTMLLinkElement interface: attribute sizes +PASS HTMLLinkElement interface: attribute imageSrcset +PASS HTMLLinkElement interface: attribute imageSizes +PASS HTMLLinkElement interface: attribute referrerPolicy +PASS HTMLLinkElement interface: attribute disabled +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 "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 "imageSrcset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "disabled" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type +PASS HTMLMetaElement interface: existence and properties of interface object +PASS HTMLMetaElement interface object length +PASS HTMLMetaElement interface object name +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLStyleElement interface: attribute media +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 "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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLAnchorElement interface: attribute target +PASS HTMLAnchorElement interface: attribute download +PASS HTMLAnchorElement interface: attribute ping +PASS HTMLAnchorElement interface: attribute rel +PASS HTMLAnchorElement interface: attribute relList +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 +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: attribute width +PASS HTMLSourceElement interface: attribute height +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 HTMLSourceElement interface: document.createElement("source") must inherit property "width" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "height" 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: named constructor +PASS HTMLImageElement interface: named constructor object +PASS HTMLImageElement interface: named constructor prototype property +PASS HTMLImageElement interface: named constructor name +PASS HTMLImageElement interface: named constructor length +PASS HTMLImageElement interface: named constructor without 'new' +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: existence and properties of interface prototype object's @@unscopables 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: attribute decoding +PASS HTMLImageElement interface: attribute loading +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 "decoding" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "loading" 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 "decoding" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "loading" 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: existence and properties of interface prototype object's @@unscopables 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 allow +PASS HTMLIFrameElement interface: attribute allowFullscreen +PASS HTMLIFrameElement interface: attribute width +PASS HTMLIFrameElement interface: attribute height +PASS HTMLIFrameElement interface: attribute referrerPolicy +PASS HTMLIFrameElement interface: attribute loading +PASS HTMLIFrameElement interface: attribute contentDocument +PASS HTMLIFrameElement interface: attribute contentWindow +PASS HTMLIFrameElement interface: operation getSVGDocument() +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 HTMLIFrameElement must be primary interface of document.createElement("iframe") +PASS Stringification of document.createElement("iframe") +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "src" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "srcdoc" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "name" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "sandbox" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "allow" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "allowFullscreen" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "width" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "height" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "referrerPolicy" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "loading" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "contentDocument" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "contentWindow" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "getSVGDocument()" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "align" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "scrolling" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "frameBorder" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "longDesc" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "marginHeight" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "marginWidth" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLObjectElement interface: attribute data +PASS HTMLObjectElement interface: attribute type +PASS HTMLObjectElement interface: attribute name +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 useMap +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 +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" 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 "useMap" 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLVideoElement interface: attribute playsInline +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 +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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: named constructor +PASS HTMLAudioElement interface: named constructor object +PASS HTMLAudioElement interface: named constructor prototype property +PASS HTMLAudioElement interface: named constructor name +PASS HTMLAudioElement interface: named constructor length +PASS HTMLAudioElement interface: named constructor without 'new' +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 interface: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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 +PASS HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 preservesPitch +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, optional DOMString, optional DOMString) +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLAreaElement interface: attribute relList +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 +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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(optional 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(optional long)" with the proper type +PASS HTMLTableElement interface: calling insertRow(optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTableSectionElement interface: attribute rows +PASS HTMLTableSectionElement interface: operation insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTableRowElement interface: attribute rowIndex +PASS HTMLTableRowElement interface: attribute sectionRowIndex +PASS HTMLTableRowElement interface: attribute cells +PASS HTMLTableRowElement interface: operation insertCell(optional 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(optional long)" with the proper type +PASS HTMLTableRowElement interface: calling insertCell(optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +FAIL HTMLFormElement interface: attribute rel assert_true: The prototype object must have a property "rel" expected true got false +FAIL HTMLFormElement interface: attribute relList assert_true: The prototype object must have a property "relList" expected true got false +PASS HTMLFormElement interface: attribute elements +PASS HTMLFormElement interface: attribute length +PASS HTMLFormElement interface: operation submit() +PASS HTMLFormElement interface: operation requestSubmit(optional HTMLElement?) +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 +FAIL HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type assert_inherits: property "rel" not found in prototype chain +FAIL HTMLFormElement interface: document.createElement("form") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain +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 "requestSubmit(optional HTMLElement?)" with the proper type +PASS HTMLFormElement interface: calling requestSubmit(optional HTMLElement?) on document.createElement("form") with too few arguments must throw TypeError +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLInputElement interface: attribute accept +PASS HTMLInputElement interface: attribute alt +PASS HTMLInputElement interface: attribute autocomplete +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 +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(optional long) +PASS HTMLInputElement interface: operation stepDown(optional 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, optional SelectionMode) +PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on document.createElement("input") with too few arguments must throw TypeError +PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("datetime-local") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 +PASS HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type +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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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: existence and properties of interface prototype object's @@unscopables property +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 "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 +PASS HTMLSelectElement interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLSelectElement interface: attribute autocomplete +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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) +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") +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" 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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?)" with the proper type +PASS HTMLSelectElement interface: calling add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: named constructor +PASS HTMLOptionElement interface: named constructor object +PASS HTMLOptionElement interface: named constructor prototype property +PASS HTMLOptionElement interface: named constructor name +PASS HTMLOptionElement interface: named constructor length +PASS HTMLOptionElement interface: named constructor without 'new' +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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTextAreaElement interface: attribute autocomplete +PASS HTMLTextAreaElement interface: attribute cols +PASS HTMLTextAreaElement interface: attribute dirName +PASS HTMLTextAreaElement interface: attribute disabled +PASS HTMLTextAreaElement interface: attribute form +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, optional SelectionMode) +PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, optional DOMString) +PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea") +PASS Stringification of document.createElement("textarea") +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" 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 "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, optional SelectionMode)" with the proper type +PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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(optional 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLScriptElement interface: attribute integrity +PASS HTMLScriptElement interface: attribute referrerPolicy +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 "integrity" with the proper type +FAIL HTMLScriptElement interface: document.createElement("script") must inherit property "referrerPolicy" with the proper type assert_equals: expected "string" but got "object" +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLSlotElement interface: attribute name +PASS HTMLSlotElement interface: operation assignedNodes(optional AssignedNodesOptions) +PASS HTMLSlotElement interface: operation assignedElements(optional AssignedNodesOptions) +PASS HTMLSlotElement interface: operation assign((Element or Text)...) +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(optional AssignedNodesOptions)" with the proper type +PASS HTMLSlotElement interface: calling assignedNodes(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(optional AssignedNodesOptions)" with the proper type +PASS HTMLSlotElement interface: calling assignedElements(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assign((Element or Text)...)" with the proper type +PASS HTMLSlotElement interface: calling assign((Element or Text)...) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: existence and properties of interface object +PASS HTMLCanvasElement interface object length +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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLCanvasElement interface: attribute width +PASS HTMLCanvasElement interface: attribute height +PASS HTMLCanvasElement interface: operation getContext(DOMString, optional any) +PASS HTMLCanvasElement interface: operation toDataURL(optional DOMString, optional any) +PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, optional DOMString, optional 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, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling getContext(DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(optional DOMString, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling toDataURL(optional DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, optional DOMString, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, optional DOMString, optional 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 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: existence and properties of interface prototype object's @@unscopables 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 +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 +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..476b017a0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png new file mode 100644 index 0000000..97efa50 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png new file mode 100644 index 0000000..dc1e113 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/filters/feImage-preserveAspectRatio-all-expected.png new file mode 100644 index 0000000..8296338 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/synchronous_html_parser/svg/filters/feImage-preserveAspectRatio-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..a25b56c --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' and 'calc(10% + min(1%, 2%) + max(3%, 4%))' should serialize the same in specified values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "calc(15%)" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(10% + min(1%, 2%) + max(3%, 4%))' should round-trip exactly in computed values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "15%" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt new file mode 100644 index 0000000..098ad25b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt
@@ -0,0 +1,10 @@ +This is a testharness.js-based test. +PASS Static name +PASS Static id +PASS Static name on the prototype +FAIL constructor assert_false: gsp.hasOwnProperty("constructor") expected false got true +PASS duplicate property names +PASS Dynamic name +PASS Ghost name +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt new file mode 100644 index 0000000..cc3f61a --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt
@@ -0,0 +1,3767 @@ +This is a testharness.js-based test. +Found 3763 tests; 3741 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS idl_test setup +PASS idl_test validation +PASS Partial interface Document: original interface defined +PASS Partial interface Document: member names are unique +PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined +PASS Partial interface mixin DocumentOrShadowRoot: member names are unique +PASS Partial interface mixin NavigatorID: original interface mixin defined +PASS Partial interface mixin NavigatorID: member names are unique +PASS Partial interface HTMLAnchorElement: original interface defined +PASS Partial interface HTMLAnchorElement: member names are unique +PASS Partial interface HTMLAreaElement: original interface defined +PASS Partial interface HTMLAreaElement: member names are unique +PASS Partial interface HTMLBodyElement: original interface defined +PASS Partial interface HTMLBodyElement: member names are unique +PASS Partial interface HTMLBRElement: original interface defined +PASS Partial interface HTMLBRElement: member names are unique +PASS Partial interface HTMLTableCaptionElement: original interface defined +PASS Partial interface HTMLTableCaptionElement: member names are unique +PASS Partial interface HTMLTableColElement: original interface defined +PASS Partial interface HTMLTableColElement: member names are unique +PASS Partial interface HTMLDivElement: original interface defined +PASS Partial interface HTMLDivElement: member names are unique +PASS Partial interface HTMLDListElement: original interface defined +PASS Partial interface HTMLDListElement: member names are unique +PASS Partial interface HTMLEmbedElement: original interface defined +PASS Partial interface HTMLEmbedElement: member names are unique +PASS Partial interface HTMLHeadingElement: original interface defined +PASS Partial interface HTMLHeadingElement: member names are unique +PASS Partial interface HTMLHRElement: original interface defined +PASS Partial interface HTMLHRElement: member names are unique +PASS Partial interface HTMLHtmlElement: original interface defined +PASS Partial interface HTMLHtmlElement: member names are unique +PASS Partial interface HTMLIFrameElement: original interface defined +PASS Partial interface HTMLIFrameElement: member names are unique +PASS Partial interface HTMLImageElement: original interface defined +PASS Partial interface HTMLImageElement: member names are unique +PASS Partial interface HTMLInputElement: original interface defined +PASS Partial interface HTMLInputElement: member names are unique +PASS Partial interface HTMLLegendElement: original interface defined +PASS Partial interface HTMLLegendElement: member names are unique +PASS Partial interface HTMLLIElement: original interface defined +PASS Partial interface HTMLLIElement: member names are unique +PASS Partial interface HTMLLinkElement: original interface defined +PASS Partial interface HTMLLinkElement: member names are unique +PASS Partial interface HTMLMenuElement: original interface defined +PASS Partial interface HTMLMenuElement: member names are unique +PASS Partial interface HTMLMetaElement: original interface defined +PASS Partial interface HTMLMetaElement: member names are unique +PASS Partial interface HTMLObjectElement: original interface defined +PASS Partial interface HTMLObjectElement: member names are unique +PASS Partial interface HTMLOListElement: original interface defined +PASS Partial interface HTMLOListElement: member names are unique +PASS Partial interface HTMLParagraphElement: original interface defined +PASS Partial interface HTMLParagraphElement: member names are unique +PASS Partial interface HTMLParamElement: original interface defined +PASS Partial interface HTMLParamElement: member names are unique +PASS Partial interface HTMLPreElement: original interface defined +PASS Partial interface HTMLPreElement: member names are unique +PASS Partial interface HTMLStyleElement: original interface defined +PASS Partial interface HTMLStyleElement: member names are unique +PASS Partial interface HTMLScriptElement: original interface defined +PASS Partial interface HTMLScriptElement: member names are unique +PASS Partial interface HTMLTableElement: original interface defined +PASS Partial interface HTMLTableElement: member names are unique +PASS Partial interface HTMLTableSectionElement: original interface defined +PASS Partial interface HTMLTableSectionElement: member names are unique +PASS Partial interface HTMLTableCellElement: original interface defined +PASS Partial interface HTMLTableCellElement: member names are unique +PASS Partial interface HTMLTableRowElement: original interface defined +PASS Partial interface HTMLTableRowElement: member names are unique +PASS Partial interface HTMLUListElement: original interface defined +PASS Partial interface HTMLUListElement: member names are unique +PASS Partial interface Document[2]: original interface defined +PASS Partial interface Document[2]: member names are unique +PASS Partial interface Window: original interface defined +PASS Partial interface Window: member names are unique +PASS Partial interface Document[3]: member names are unique +PASS Partial interface mixin DocumentOrShadowRoot[2]: member names are unique +PASS Partial interface UIEvent: member names are unique +PASS Partial interface MouseEvent: member names are unique +PASS Partial interface UIEvent[2]: member names are unique +PASS Partial dictionary UIEventInit: member names are unique +PASS Document includes GlobalEventHandlers: member names are unique +PASS Document includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes GlobalEventHandlers: member names are unique +PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes ElementContentEditable: member names are unique +PASS HTMLElement includes HTMLOrSVGElement: member names are unique +PASS HTMLLinkElement includes LinkStyle: member names are unique +PASS HTMLStyleElement includes LinkStyle: member names are unique +PASS HTMLBodyElement includes WindowEventHandlers: member names are unique +PASS HTMLAnchorElement includes HTMLHyperlinkElementUtils: member names are unique +PASS HTMLAreaElement includes HTMLHyperlinkElementUtils: member names are unique +PASS CanvasRenderingContext2D includes CanvasState: member names are unique +PASS CanvasRenderingContext2D includes CanvasTransform: member names are unique +PASS CanvasRenderingContext2D includes CanvasCompositing: member names are unique +PASS CanvasRenderingContext2D includes CanvasImageSmoothing: member names are unique +PASS CanvasRenderingContext2D includes CanvasFillStrokeStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasShadowStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasFilters: member names are unique +PASS CanvasRenderingContext2D includes CanvasRect: member names are unique +PASS CanvasRenderingContext2D includes CanvasDrawPath: member names are unique +PASS CanvasRenderingContext2D includes CanvasUserInterface: member names are unique +PASS CanvasRenderingContext2D includes CanvasText: member names are unique +PASS CanvasRenderingContext2D includes CanvasDrawImage: member names are unique +PASS CanvasRenderingContext2D includes CanvasImageData: member names are unique +PASS CanvasRenderingContext2D includes CanvasPathDrawingStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasTextDrawingStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasPath: member names are unique +PASS Path2D includes CanvasPath: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasState: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasTransform: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasCompositing: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasShadowStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasFilters: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasRect: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasDrawPath: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasText: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasDrawImage: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasImageData: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasPath: member names are unique +PASS ElementInternals includes ARIAMixin: member names are unique +PASS Window includes GlobalEventHandlers: member names are unique +PASS Window includes WindowEventHandlers: member names are unique +PASS Window includes WindowOrWorkerGlobalScope: member names are unique +PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique +PASS Navigator includes NavigatorID: member names are unique +PASS Navigator includes NavigatorLanguage: member names are unique +PASS Navigator includes NavigatorOnLine: member names are unique +PASS Navigator includes NavigatorContentUtils: member names are unique +PASS Navigator includes NavigatorCookies: member names are unique +PASS Navigator includes NavigatorPlugins: member names are unique +PASS Navigator includes NavigatorConcurrentHardware: member names are unique +PASS Window includes AnimationFrameProvider: member names are unique +PASS DedicatedWorkerGlobalScope includes AnimationFrameProvider: member names are unique +PASS Worker includes AbstractWorker: member names are unique +PASS SharedWorker includes AbstractWorker: member names are unique +PASS WorkerNavigator includes NavigatorID: member names are unique +PASS WorkerNavigator includes NavigatorLanguage: member names are unique +PASS WorkerNavigator includes NavigatorOnLine: member names are unique +PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique +PASS Window includes WindowSessionStorage: member names are unique +PASS Window includes WindowLocalStorage: member names are unique +PASS HTMLFrameSetElement includes WindowEventHandlers: member names are unique +PASS Element includes ARIAMixin: member names are unique +PASS SVGElement includes GlobalEventHandlers: member names are unique +PASS SVGElement includes DocumentAndElementEventHandlers: member names are unique +PASS SVGElement includes SVGElementInstance: member names are unique +PASS SVGElement includes HTMLOrSVGElement: member names are unique +PASS SVGGraphicsElement includes SVGTests: member names are unique +PASS SVGSVGElement includes SVGFitToViewBox: member names are unique +PASS SVGSVGElement includes WindowEventHandlers: member names are unique +PASS SVGImageElement includes SVGURIReference: member names are unique +PASS SVGScriptElement includes SVGURIReference: member names are unique +PASS HTMLElement includes ElementCSSInlineStyle: member names are unique +PASS SVGElement includes ElementCSSInlineStyle: member names are unique +PASS Document includes NonElementParentNode: member names are unique +PASS DocumentFragment includes NonElementParentNode: member names are unique +PASS Document includes DocumentOrShadowRoot: member names are unique +PASS ShadowRoot includes DocumentOrShadowRoot: member names are unique +PASS Document includes ParentNode: member names are unique +PASS DocumentFragment includes ParentNode: member names are unique +PASS Element includes ParentNode: member names are unique +PASS Element includes NonDocumentTypeChildNode: member names are unique +PASS Element includes ChildNode: member names are unique +PASS Element includes Slottable: member names are unique +PASS Document includes XPathEvaluatorBase: member names are unique +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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLAllCollection interface: attribute length +PASS HTMLAllCollection interface: operation namedItem(DOMString) +PASS HTMLAllCollection interface: operation item(optional DOMString) +PASS HTMLAllCollection must be primary interface of document.all +PASS Stringification of document.all +PASS HTMLAllCollection interface: document.all must inherit property "length" with the proper type +PASS HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type +PASS HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError +PASS HTMLAllCollection interface: document.all must inherit property "item(optional DOMString)" with the proper type +PASS HTMLAllCollection interface: calling item(optional DOMString) on document.all with too few arguments must throw TypeError +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: existence and properties of interface prototype object's @@unscopables 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 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLOptionsCollection interface: attribute length +PASS HTMLOptionsCollection interface: operation add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) +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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?)" with the proper type +PASS HTMLOptionsCollection interface: calling add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) 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 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: existence and properties of interface prototype object's @@unscopables 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 hidden +PASS HTMLElement interface: operation click() +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 autocapitalize +PASS HTMLElement interface: attribute innerText +PASS HTMLElement interface: attribute outerText +PASS HTMLElement interface: operation attachInternals() +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 +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 onformdata +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 +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 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 +FAIL HTMLElement interface: attribute onslotchange assert_true: The prototype object must have a property "onslotchange" expected true got false +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 +PASS HTMLElement interface: attribute onwebkitanimationend +PASS HTMLElement interface: attribute onwebkitanimationiteration +PASS HTMLElement interface: attribute onwebkitanimationstart +PASS HTMLElement interface: attribute onwebkittransitionend +PASS HTMLElement interface: attribute onwheel +PASS HTMLElement interface: attribute oncopy +PASS HTMLElement interface: attribute oncut +PASS HTMLElement interface: attribute onpaste +PASS HTMLElement interface: attribute contentEditable +PASS HTMLElement interface: attribute enterKeyHint +PASS HTMLElement interface: attribute isContentEditable +PASS HTMLElement interface: attribute inputMode +PASS HTMLElement interface: attribute dataset +PASS HTMLElement interface: attribute nonce +PASS HTMLElement interface: attribute autofocus +PASS HTMLElement interface: attribute tabIndex +PASS HTMLElement interface: operation focus(optional FocusOptions) +PASS HTMLElement interface: operation blur() +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 "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 "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 "autocapitalize" 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 "outerText" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" 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 +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 "onformdata" 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 +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 "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 +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type assert_inherits: property "onslotchange" not found in prototype chain +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 "onwebkitanimationend" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" 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 "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 "enterKeyHint" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" 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 "nonce" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" 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(optional FocusOptions)" with the proper type +PASS HTMLElement interface: calling focus(optional 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 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 interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLUnknownElement must be primary interface of document.createElement("bgsound") +PASS Stringification of document.createElement("bgsound") +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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLLinkElement interface: attribute integrity +PASS HTMLLinkElement interface: attribute hreflang +PASS HTMLLinkElement interface: attribute type +PASS HTMLLinkElement interface: attribute sizes +PASS HTMLLinkElement interface: attribute imageSrcset +PASS HTMLLinkElement interface: attribute imageSizes +PASS HTMLLinkElement interface: attribute referrerPolicy +PASS HTMLLinkElement interface: attribute disabled +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 "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 "imageSrcset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "disabled" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type +PASS HTMLMetaElement interface: existence and properties of interface object +PASS HTMLMetaElement interface object length +PASS HTMLMetaElement interface object name +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLStyleElement interface: attribute media +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 "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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLAnchorElement interface: attribute target +PASS HTMLAnchorElement interface: attribute download +PASS HTMLAnchorElement interface: attribute ping +PASS HTMLAnchorElement interface: attribute rel +PASS HTMLAnchorElement interface: attribute relList +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 +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: attribute width +PASS HTMLSourceElement interface: attribute height +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 HTMLSourceElement interface: document.createElement("source") must inherit property "width" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "height" 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: named constructor +PASS HTMLImageElement interface: named constructor object +PASS HTMLImageElement interface: named constructor prototype property +PASS HTMLImageElement interface: named constructor name +PASS HTMLImageElement interface: named constructor length +PASS HTMLImageElement interface: named constructor without 'new' +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: existence and properties of interface prototype object's @@unscopables 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: attribute decoding +PASS HTMLImageElement interface: attribute loading +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 "decoding" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "loading" 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 "decoding" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "loading" 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: existence and properties of interface prototype object's @@unscopables 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 allow +PASS HTMLIFrameElement interface: attribute allowFullscreen +PASS HTMLIFrameElement interface: attribute width +PASS HTMLIFrameElement interface: attribute height +PASS HTMLIFrameElement interface: attribute referrerPolicy +PASS HTMLIFrameElement interface: attribute loading +PASS HTMLIFrameElement interface: attribute contentDocument +PASS HTMLIFrameElement interface: attribute contentWindow +PASS HTMLIFrameElement interface: operation getSVGDocument() +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 HTMLIFrameElement must be primary interface of document.createElement("iframe") +PASS Stringification of document.createElement("iframe") +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "src" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "srcdoc" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "name" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "sandbox" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "allow" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "allowFullscreen" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "width" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "height" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "referrerPolicy" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "loading" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "contentDocument" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "contentWindow" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "getSVGDocument()" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "align" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "scrolling" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "frameBorder" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "longDesc" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "marginHeight" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "marginWidth" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLObjectElement interface: attribute data +PASS HTMLObjectElement interface: attribute type +PASS HTMLObjectElement interface: attribute name +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 useMap +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 +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" 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 "useMap" 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLVideoElement interface: attribute playsInline +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 +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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: named constructor +PASS HTMLAudioElement interface: named constructor object +PASS HTMLAudioElement interface: named constructor prototype property +PASS HTMLAudioElement interface: named constructor name +PASS HTMLAudioElement interface: named constructor length +PASS HTMLAudioElement interface: named constructor without 'new' +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 interface: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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 +PASS HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 preservesPitch +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, optional DOMString, optional DOMString) +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLAreaElement interface: attribute relList +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 +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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(optional 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(optional long)" with the proper type +PASS HTMLTableElement interface: calling insertRow(optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTableSectionElement interface: attribute rows +PASS HTMLTableSectionElement interface: operation insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTableRowElement interface: attribute rowIndex +PASS HTMLTableRowElement interface: attribute sectionRowIndex +PASS HTMLTableRowElement interface: attribute cells +PASS HTMLTableRowElement interface: operation insertCell(optional 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(optional long)" with the proper type +PASS HTMLTableRowElement interface: calling insertCell(optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +FAIL HTMLFormElement interface: attribute rel assert_true: The prototype object must have a property "rel" expected true got false +FAIL HTMLFormElement interface: attribute relList assert_true: The prototype object must have a property "relList" expected true got false +PASS HTMLFormElement interface: attribute elements +PASS HTMLFormElement interface: attribute length +PASS HTMLFormElement interface: operation submit() +PASS HTMLFormElement interface: operation requestSubmit(optional HTMLElement?) +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 +FAIL HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type assert_inherits: property "rel" not found in prototype chain +FAIL HTMLFormElement interface: document.createElement("form") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain +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 "requestSubmit(optional HTMLElement?)" with the proper type +PASS HTMLFormElement interface: calling requestSubmit(optional HTMLElement?) on document.createElement("form") with too few arguments must throw TypeError +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLInputElement interface: attribute accept +PASS HTMLInputElement interface: attribute alt +PASS HTMLInputElement interface: attribute autocomplete +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 +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(optional long) +PASS HTMLInputElement interface: operation stepDown(optional 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, optional SelectionMode) +PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on document.createElement("input") with too few arguments must throw TypeError +PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("datetime-local") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 +PASS HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type +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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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: existence and properties of interface prototype object's @@unscopables property +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 "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 +PASS HTMLSelectElement interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLSelectElement interface: attribute autocomplete +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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) +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") +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" 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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?)" with the proper type +PASS HTMLSelectElement interface: calling add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: named constructor +PASS HTMLOptionElement interface: named constructor object +PASS HTMLOptionElement interface: named constructor prototype property +PASS HTMLOptionElement interface: named constructor name +PASS HTMLOptionElement interface: named constructor length +PASS HTMLOptionElement interface: named constructor without 'new' +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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTextAreaElement interface: attribute autocomplete +PASS HTMLTextAreaElement interface: attribute cols +PASS HTMLTextAreaElement interface: attribute dirName +PASS HTMLTextAreaElement interface: attribute disabled +PASS HTMLTextAreaElement interface: attribute form +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, optional SelectionMode) +PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, optional DOMString) +PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea") +PASS Stringification of document.createElement("textarea") +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" 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 "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, optional SelectionMode)" with the proper type +PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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(optional 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLScriptElement interface: attribute integrity +PASS HTMLScriptElement interface: attribute referrerPolicy +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 "integrity" with the proper type +FAIL HTMLScriptElement interface: document.createElement("script") must inherit property "referrerPolicy" with the proper type assert_equals: expected "string" but got "object" +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLSlotElement interface: attribute name +PASS HTMLSlotElement interface: operation assignedNodes(optional AssignedNodesOptions) +PASS HTMLSlotElement interface: operation assignedElements(optional AssignedNodesOptions) +PASS HTMLSlotElement interface: operation assign((Element or Text)...) +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(optional AssignedNodesOptions)" with the proper type +PASS HTMLSlotElement interface: calling assignedNodes(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(optional AssignedNodesOptions)" with the proper type +PASS HTMLSlotElement interface: calling assignedElements(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assign((Element or Text)...)" with the proper type +PASS HTMLSlotElement interface: calling assign((Element or Text)...) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: existence and properties of interface object +PASS HTMLCanvasElement interface object length +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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLCanvasElement interface: attribute width +PASS HTMLCanvasElement interface: attribute height +PASS HTMLCanvasElement interface: operation getContext(DOMString, optional any) +PASS HTMLCanvasElement interface: operation toDataURL(optional DOMString, optional any) +PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, optional DOMString, optional 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, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling getContext(DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(optional DOMString, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling toDataURL(optional DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, optional DOMString, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, optional DOMString, optional 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 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: existence and properties of interface prototype object's @@unscopables 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 +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 +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..a25b56c --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' and 'calc(10% + min(1%, 2%) + max(3%, 4%))' should serialize the same in specified values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "calc(15%)" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(10% + min(1%, 2%) + max(3%, 4%))' should round-trip exactly in computed values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "15%" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..476b017a0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt new file mode 100644 index 0000000..ebdf863d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties-expected.txt
@@ -0,0 +1,10 @@ +This is a testharness.js-based test. +PASS Static name +PASS Static id +PASS Static name on the prototype +FAIL constructor assert_false: gsp.hasOwnProperty("constructor") expected false got true +FAIL duplicate property names assert_equals: expected 1 but got 0 +PASS Dynamic name +PASS Ghost name +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt new file mode 100644 index 0000000..d10785d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/dom/idlharness.https_include=HTML._-expected.txt
@@ -0,0 +1,3765 @@ +This is a testharness.js-based test. +Found 3761 tests; 3739 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS idl_test setup +PASS idl_test validation +PASS Partial interface Document: original interface defined +PASS Partial interface Document: member names are unique +PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined +PASS Partial interface mixin DocumentOrShadowRoot: member names are unique +PASS Partial interface mixin NavigatorID: original interface mixin defined +PASS Partial interface mixin NavigatorID: member names are unique +PASS Partial interface HTMLAnchorElement: original interface defined +PASS Partial interface HTMLAnchorElement: member names are unique +PASS Partial interface HTMLAreaElement: original interface defined +PASS Partial interface HTMLAreaElement: member names are unique +PASS Partial interface HTMLBodyElement: original interface defined +PASS Partial interface HTMLBodyElement: member names are unique +PASS Partial interface HTMLBRElement: original interface defined +PASS Partial interface HTMLBRElement: member names are unique +PASS Partial interface HTMLTableCaptionElement: original interface defined +PASS Partial interface HTMLTableCaptionElement: member names are unique +PASS Partial interface HTMLTableColElement: original interface defined +PASS Partial interface HTMLTableColElement: member names are unique +PASS Partial interface HTMLDivElement: original interface defined +PASS Partial interface HTMLDivElement: member names are unique +PASS Partial interface HTMLDListElement: original interface defined +PASS Partial interface HTMLDListElement: member names are unique +PASS Partial interface HTMLEmbedElement: original interface defined +PASS Partial interface HTMLEmbedElement: member names are unique +PASS Partial interface HTMLHeadingElement: original interface defined +PASS Partial interface HTMLHeadingElement: member names are unique +PASS Partial interface HTMLHRElement: original interface defined +PASS Partial interface HTMLHRElement: member names are unique +PASS Partial interface HTMLHtmlElement: original interface defined +PASS Partial interface HTMLHtmlElement: member names are unique +PASS Partial interface HTMLIFrameElement: original interface defined +PASS Partial interface HTMLIFrameElement: member names are unique +PASS Partial interface HTMLImageElement: original interface defined +PASS Partial interface HTMLImageElement: member names are unique +PASS Partial interface HTMLInputElement: original interface defined +PASS Partial interface HTMLInputElement: member names are unique +PASS Partial interface HTMLLegendElement: original interface defined +PASS Partial interface HTMLLegendElement: member names are unique +PASS Partial interface HTMLLIElement: original interface defined +PASS Partial interface HTMLLIElement: member names are unique +PASS Partial interface HTMLLinkElement: original interface defined +PASS Partial interface HTMLLinkElement: member names are unique +PASS Partial interface HTMLMenuElement: original interface defined +PASS Partial interface HTMLMenuElement: member names are unique +PASS Partial interface HTMLMetaElement: original interface defined +PASS Partial interface HTMLMetaElement: member names are unique +PASS Partial interface HTMLObjectElement: original interface defined +PASS Partial interface HTMLObjectElement: member names are unique +PASS Partial interface HTMLOListElement: original interface defined +PASS Partial interface HTMLOListElement: member names are unique +PASS Partial interface HTMLParagraphElement: original interface defined +PASS Partial interface HTMLParagraphElement: member names are unique +PASS Partial interface HTMLParamElement: original interface defined +PASS Partial interface HTMLParamElement: member names are unique +PASS Partial interface HTMLPreElement: original interface defined +PASS Partial interface HTMLPreElement: member names are unique +PASS Partial interface HTMLStyleElement: original interface defined +PASS Partial interface HTMLStyleElement: member names are unique +PASS Partial interface HTMLScriptElement: original interface defined +PASS Partial interface HTMLScriptElement: member names are unique +PASS Partial interface HTMLTableElement: original interface defined +PASS Partial interface HTMLTableElement: member names are unique +PASS Partial interface HTMLTableSectionElement: original interface defined +PASS Partial interface HTMLTableSectionElement: member names are unique +PASS Partial interface HTMLTableCellElement: original interface defined +PASS Partial interface HTMLTableCellElement: member names are unique +PASS Partial interface HTMLTableRowElement: original interface defined +PASS Partial interface HTMLTableRowElement: member names are unique +PASS Partial interface HTMLUListElement: original interface defined +PASS Partial interface HTMLUListElement: member names are unique +PASS Partial interface Document[2]: original interface defined +PASS Partial interface Document[2]: member names are unique +PASS Partial interface Window: original interface defined +PASS Partial interface Window: member names are unique +PASS Partial interface Document[3]: member names are unique +PASS Partial interface mixin DocumentOrShadowRoot[2]: member names are unique +PASS Partial interface UIEvent: member names are unique +PASS Partial interface MouseEvent: member names are unique +PASS Partial interface UIEvent[2]: member names are unique +PASS Partial dictionary UIEventInit: member names are unique +PASS Document includes GlobalEventHandlers: member names are unique +PASS Document includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes GlobalEventHandlers: member names are unique +PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique +PASS HTMLElement includes ElementContentEditable: member names are unique +PASS HTMLElement includes HTMLOrSVGElement: member names are unique +PASS HTMLLinkElement includes LinkStyle: member names are unique +PASS HTMLStyleElement includes LinkStyle: member names are unique +PASS HTMLBodyElement includes WindowEventHandlers: member names are unique +PASS HTMLAnchorElement includes HTMLHyperlinkElementUtils: member names are unique +PASS HTMLAreaElement includes HTMLHyperlinkElementUtils: member names are unique +PASS CanvasRenderingContext2D includes CanvasState: member names are unique +PASS CanvasRenderingContext2D includes CanvasTransform: member names are unique +PASS CanvasRenderingContext2D includes CanvasCompositing: member names are unique +PASS CanvasRenderingContext2D includes CanvasImageSmoothing: member names are unique +PASS CanvasRenderingContext2D includes CanvasFillStrokeStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasShadowStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasFilters: member names are unique +PASS CanvasRenderingContext2D includes CanvasRect: member names are unique +PASS CanvasRenderingContext2D includes CanvasDrawPath: member names are unique +PASS CanvasRenderingContext2D includes CanvasUserInterface: member names are unique +PASS CanvasRenderingContext2D includes CanvasText: member names are unique +PASS CanvasRenderingContext2D includes CanvasDrawImage: member names are unique +PASS CanvasRenderingContext2D includes CanvasImageData: member names are unique +PASS CanvasRenderingContext2D includes CanvasPathDrawingStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasTextDrawingStyles: member names are unique +PASS CanvasRenderingContext2D includes CanvasPath: member names are unique +PASS Path2D includes CanvasPath: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasState: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasTransform: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasCompositing: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasShadowStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasFilters: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasRect: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasDrawPath: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasText: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasDrawImage: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasImageData: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles: member names are unique +PASS OffscreenCanvasRenderingContext2D includes CanvasPath: member names are unique +PASS ElementInternals includes ARIAMixin: member names are unique +PASS Window includes GlobalEventHandlers: member names are unique +PASS Window includes WindowEventHandlers: member names are unique +PASS Window includes WindowOrWorkerGlobalScope: member names are unique +PASS WorkerGlobalScope includes WindowOrWorkerGlobalScope: member names are unique +PASS Navigator includes NavigatorID: member names are unique +PASS Navigator includes NavigatorLanguage: member names are unique +PASS Navigator includes NavigatorOnLine: member names are unique +PASS Navigator includes NavigatorContentUtils: member names are unique +PASS Navigator includes NavigatorCookies: member names are unique +PASS Navigator includes NavigatorPlugins: member names are unique +PASS Navigator includes NavigatorConcurrentHardware: member names are unique +PASS Window includes AnimationFrameProvider: member names are unique +PASS DedicatedWorkerGlobalScope includes AnimationFrameProvider: member names are unique +PASS Worker includes AbstractWorker: member names are unique +PASS SharedWorker includes AbstractWorker: member names are unique +PASS WorkerNavigator includes NavigatorID: member names are unique +PASS WorkerNavigator includes NavigatorLanguage: member names are unique +PASS WorkerNavigator includes NavigatorOnLine: member names are unique +PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique +PASS Window includes WindowSessionStorage: member names are unique +PASS Window includes WindowLocalStorage: member names are unique +PASS HTMLFrameSetElement includes WindowEventHandlers: member names are unique +PASS Element includes ARIAMixin: member names are unique +PASS SVGElement includes GlobalEventHandlers: member names are unique +PASS SVGElement includes DocumentAndElementEventHandlers: member names are unique +PASS SVGElement includes SVGElementInstance: member names are unique +PASS SVGElement includes HTMLOrSVGElement: member names are unique +PASS SVGGraphicsElement includes SVGTests: member names are unique +PASS SVGSVGElement includes SVGFitToViewBox: member names are unique +PASS SVGSVGElement includes WindowEventHandlers: member names are unique +PASS SVGImageElement includes SVGURIReference: member names are unique +PASS SVGScriptElement includes SVGURIReference: member names are unique +PASS HTMLElement includes ElementCSSInlineStyle: member names are unique +PASS SVGElement includes ElementCSSInlineStyle: member names are unique +PASS Document includes NonElementParentNode: member names are unique +PASS DocumentFragment includes NonElementParentNode: member names are unique +PASS Document includes DocumentOrShadowRoot: member names are unique +PASS ShadowRoot includes DocumentOrShadowRoot: member names are unique +PASS Document includes ParentNode: member names are unique +PASS DocumentFragment includes ParentNode: member names are unique +PASS Element includes ParentNode: member names are unique +PASS Element includes NonDocumentTypeChildNode: member names are unique +PASS Element includes ChildNode: member names are unique +PASS Element includes Slottable: member names are unique +PASS Document includes XPathEvaluatorBase: member names are unique +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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLAllCollection interface: attribute length +PASS HTMLAllCollection interface: operation namedItem(DOMString) +PASS HTMLAllCollection interface: operation item(optional DOMString) +PASS HTMLAllCollection must be primary interface of document.all +PASS Stringification of document.all +PASS HTMLAllCollection interface: document.all must inherit property "length" with the proper type +PASS HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type +PASS HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError +PASS HTMLAllCollection interface: document.all must inherit property "item(optional DOMString)" with the proper type +PASS HTMLAllCollection interface: calling item(optional DOMString) on document.all with too few arguments must throw TypeError +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: existence and properties of interface prototype object's @@unscopables 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 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLOptionsCollection interface: attribute length +PASS HTMLOptionsCollection interface: operation add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) +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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?)" with the proper type +PASS HTMLOptionsCollection interface: calling add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) 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 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: existence and properties of interface prototype object's @@unscopables 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 hidden +PASS HTMLElement interface: operation click() +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 autocapitalize +PASS HTMLElement interface: attribute innerText +PASS HTMLElement interface: operation attachInternals() +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 +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 onformdata +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 +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 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 +FAIL HTMLElement interface: attribute onslotchange assert_true: The prototype object must have a property "onslotchange" expected true got false +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 +PASS HTMLElement interface: attribute onwebkitanimationend +PASS HTMLElement interface: attribute onwebkitanimationiteration +PASS HTMLElement interface: attribute onwebkitanimationstart +PASS HTMLElement interface: attribute onwebkittransitionend +PASS HTMLElement interface: attribute onwheel +PASS HTMLElement interface: attribute oncopy +PASS HTMLElement interface: attribute oncut +PASS HTMLElement interface: attribute onpaste +PASS HTMLElement interface: attribute contentEditable +PASS HTMLElement interface: attribute enterKeyHint +PASS HTMLElement interface: attribute isContentEditable +PASS HTMLElement interface: attribute inputMode +PASS HTMLElement interface: attribute dataset +PASS HTMLElement interface: attribute nonce +PASS HTMLElement interface: attribute autofocus +PASS HTMLElement interface: attribute tabIndex +PASS HTMLElement interface: operation focus(optional FocusOptions) +PASS HTMLElement interface: operation blur() +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 "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 "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 "autocapitalize" 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 "attachInternals()" 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 +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 "onformdata" 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 +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 "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 +FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onslotchange" with the proper type assert_inherits: property "onslotchange" not found in prototype chain +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 "onwebkitanimationend" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationiteration" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkitanimationstart" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwebkittransitionend" 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 "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 "enterKeyHint" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" 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 "nonce" with the proper type +PASS HTMLElement interface: document.createElement("noscript") must inherit property "autofocus" 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(optional FocusOptions)" with the proper type +PASS HTMLElement interface: calling focus(optional 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 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 interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLUnknownElement must be primary interface of document.createElement("bgsound") +PASS Stringification of document.createElement("bgsound") +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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLLinkElement interface: attribute integrity +PASS HTMLLinkElement interface: attribute hreflang +PASS HTMLLinkElement interface: attribute type +PASS HTMLLinkElement interface: attribute sizes +PASS HTMLLinkElement interface: attribute imageSrcset +PASS HTMLLinkElement interface: attribute imageSizes +PASS HTMLLinkElement interface: attribute referrerPolicy +PASS HTMLLinkElement interface: attribute disabled +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 "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 "imageSrcset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "disabled" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type +PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type +PASS HTMLMetaElement interface: existence and properties of interface object +PASS HTMLMetaElement interface object length +PASS HTMLMetaElement interface object name +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLStyleElement interface: attribute media +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 "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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLAnchorElement interface: attribute target +PASS HTMLAnchorElement interface: attribute download +PASS HTMLAnchorElement interface: attribute ping +PASS HTMLAnchorElement interface: attribute rel +PASS HTMLAnchorElement interface: attribute relList +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 +PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 interface: attribute width +PASS HTMLSourceElement interface: attribute height +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 HTMLSourceElement interface: document.createElement("source") must inherit property "width" with the proper type +PASS HTMLSourceElement interface: document.createElement("source") must inherit property "height" 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: named constructor +PASS HTMLImageElement interface: named constructor object +PASS HTMLImageElement interface: named constructor prototype property +PASS HTMLImageElement interface: named constructor name +PASS HTMLImageElement interface: named constructor length +PASS HTMLImageElement interface: named constructor without 'new' +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: existence and properties of interface prototype object's @@unscopables 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: attribute decoding +PASS HTMLImageElement interface: attribute loading +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 "decoding" with the proper type +PASS HTMLImageElement interface: document.createElement("img") must inherit property "loading" 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 "decoding" with the proper type +PASS HTMLImageElement interface: new Image() must inherit property "loading" 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: existence and properties of interface prototype object's @@unscopables 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 allow +PASS HTMLIFrameElement interface: attribute allowFullscreen +PASS HTMLIFrameElement interface: attribute width +PASS HTMLIFrameElement interface: attribute height +PASS HTMLIFrameElement interface: attribute referrerPolicy +PASS HTMLIFrameElement interface: attribute loading +PASS HTMLIFrameElement interface: attribute contentDocument +PASS HTMLIFrameElement interface: attribute contentWindow +PASS HTMLIFrameElement interface: operation getSVGDocument() +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 HTMLIFrameElement must be primary interface of document.createElement("iframe") +PASS Stringification of document.createElement("iframe") +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "src" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "srcdoc" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "name" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "sandbox" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "allow" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "allowFullscreen" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "width" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "height" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "referrerPolicy" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "loading" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "contentDocument" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "contentWindow" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "getSVGDocument()" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "align" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "scrolling" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "frameBorder" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "longDesc" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "marginHeight" with the proper type +PASS HTMLIFrameElement interface: document.createElement("iframe") must inherit property "marginWidth" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLObjectElement interface: attribute data +PASS HTMLObjectElement interface: attribute type +PASS HTMLObjectElement interface: attribute name +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 useMap +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 +PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" 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 "useMap" 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLVideoElement interface: attribute playsInline +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 +PASS HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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: named constructor +PASS HTMLAudioElement interface: named constructor object +PASS HTMLAudioElement interface: named constructor prototype property +PASS HTMLAudioElement interface: named constructor name +PASS HTMLAudioElement interface: named constructor length +PASS HTMLAudioElement interface: named constructor without 'new' +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 interface: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError +PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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 +PASS HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type +PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type +PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError +PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type +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 "preservesPitch" 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, optional DOMString, optional DOMString)" with the proper type +PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, optional DOMString, optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 preservesPitch +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, optional DOMString, optional DOMString) +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLAreaElement interface: attribute relList +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 +PASS HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type +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: existence and properties of interface prototype object's @@unscopables 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(optional 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(optional long)" with the proper type +PASS HTMLTableElement interface: calling insertRow(optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTableSectionElement interface: attribute rows +PASS HTMLTableSectionElement interface: operation insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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(optional long)" with the proper type +PASS HTMLTableSectionElement interface: calling insertRow(optional 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTableRowElement interface: attribute rowIndex +PASS HTMLTableRowElement interface: attribute sectionRowIndex +PASS HTMLTableRowElement interface: attribute cells +PASS HTMLTableRowElement interface: operation insertCell(optional 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(optional long)" with the proper type +PASS HTMLTableRowElement interface: calling insertCell(optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +FAIL HTMLFormElement interface: attribute rel assert_true: The prototype object must have a property "rel" expected true got false +FAIL HTMLFormElement interface: attribute relList assert_true: The prototype object must have a property "relList" expected true got false +PASS HTMLFormElement interface: attribute elements +PASS HTMLFormElement interface: attribute length +PASS HTMLFormElement interface: operation submit() +PASS HTMLFormElement interface: operation requestSubmit(optional HTMLElement?) +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 +FAIL HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type assert_inherits: property "rel" not found in prototype chain +FAIL HTMLFormElement interface: document.createElement("form") must inherit property "relList" with the proper type assert_inherits: property "relList" not found in prototype chain +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 "requestSubmit(optional HTMLElement?)" with the proper type +PASS HTMLFormElement interface: calling requestSubmit(optional HTMLElement?) on document.createElement("form") with too few arguments must throw TypeError +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLInputElement interface: attribute accept +PASS HTMLInputElement interface: attribute alt +PASS HTMLInputElement interface: attribute autocomplete +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 +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(optional long) +PASS HTMLInputElement interface: operation stepDown(optional 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, optional SelectionMode) +PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on document.createElement("input") with too few arguments must throw TypeError +PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("text") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("hidden") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("search") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("tel") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("url") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("email") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("password") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("date") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("month") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("week") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("time") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("datetime-local") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("number") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("range") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("color") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("radio") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 +PASS HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type +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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("file") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("submit") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("image") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("reset") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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 "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 "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(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepUp(optional long) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(optional long)" with the proper type +PASS HTMLInputElement interface: calling stepDown(optional 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, optional SelectionMode)" with the proper type +PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional SelectionMode) on createInput("button") with too few arguments must throw TypeError +PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, optional DOMString)" with the proper type +PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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: existence and properties of interface prototype object's @@unscopables property +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 "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 +PASS HTMLSelectElement interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLSelectElement interface: attribute autocomplete +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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) +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") +PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" 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((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?)" with the proper type +PASS HTMLSelectElement interface: calling add((HTMLOptionElement or HTMLOptGroupElement), optional (HTMLElement or long)?) 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: named constructor +PASS HTMLOptionElement interface: named constructor object +PASS HTMLOptionElement interface: named constructor prototype property +PASS HTMLOptionElement interface: named constructor name +PASS HTMLOptionElement interface: named constructor length +PASS HTMLOptionElement interface: named constructor without 'new' +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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's @@unscopables property +PASS HTMLTextAreaElement interface: attribute autocomplete +PASS HTMLTextAreaElement interface: attribute cols +PASS HTMLTextAreaElement interface: attribute dirName +PASS HTMLTextAreaElement interface: attribute disabled +PASS HTMLTextAreaElement interface: attribute form +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, optional SelectionMode) +PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, optional DOMString) +PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea") +PASS Stringification of document.createElement("textarea") +PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" 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 "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, optional SelectionMode)" with the proper type +PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, optional 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, optional DOMString)" with the proper type +PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, optional 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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(optional 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: existence and properties of interface prototype object's @@unscopables 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 +PASS HTMLScriptElement interface: attribute integrity +PASS HTMLScriptElement interface: attribute referrerPolicy +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 "integrity" with the proper type +FAIL HTMLScriptElement interface: document.createElement("script") must inherit property "referrerPolicy" with the proper type assert_equals: expected "string" but got "object" +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLSlotElement interface: attribute name +PASS HTMLSlotElement interface: operation assignedNodes(optional AssignedNodesOptions) +PASS HTMLSlotElement interface: operation assignedElements(optional AssignedNodesOptions) +PASS HTMLSlotElement interface: operation assign((Element or Text)...) +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(optional AssignedNodesOptions)" with the proper type +PASS HTMLSlotElement interface: calling assignedNodes(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(optional AssignedNodesOptions)" with the proper type +PASS HTMLSlotElement interface: calling assignedElements(optional AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assign((Element or Text)...)" with the proper type +PASS HTMLSlotElement interface: calling assign((Element or Text)...) on document.createElement("slot") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: existence and properties of interface object +PASS HTMLCanvasElement interface object length +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: existence and properties of interface prototype object's @@unscopables property +PASS HTMLCanvasElement interface: attribute width +PASS HTMLCanvasElement interface: attribute height +PASS HTMLCanvasElement interface: operation getContext(DOMString, optional any) +PASS HTMLCanvasElement interface: operation toDataURL(optional DOMString, optional any) +PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, optional DOMString, optional 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, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling getContext(DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(optional DOMString, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling toDataURL(optional DOMString, optional any) on document.createElement("canvas") with too few arguments must throw TypeError +PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, optional DOMString, optional any)" with the proper type +PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, optional DOMString, optional 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 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: existence and properties of interface prototype object's @@unscopables 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 +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 +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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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: existence and properties of interface prototype object's @@unscopables 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 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index aebcad77..e6cb52e9 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 9ada46c..5353ca6 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.14/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..476b017a0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(15%)'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as '15%'. +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png new file mode 100644 index 0000000..e6cb52e9 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png new file mode 100644 index 0000000..5353ca6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/synchronous_html_parser/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/webrtc-stats/supported-stats-expected.txt new file mode 100644 index 0000000..84cb4f1 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -0,0 +1,314 @@ +This is a testharness.js-based test. +Found 310 tests; 195 PASS, 115 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS getStats succeeds +PASS Validating stats +PASS codec's payloadType +FAIL codec's codecType assert_true: Is codecType present expected true got false +PASS codec's transportId +PASS codec's mimeType +PASS codec's clockRate +PASS codec's channels +PASS codec's sdpFmtpLine +PASS codec's timestamp +PASS codec's type +PASS codec's id +FAIL inbound-rtp's receiverId assert_true: Is receiverId present expected true got false +PASS inbound-rtp's remoteId +PASS inbound-rtp's framesDecoded +PASS inbound-rtp's keyFramesDecoded +PASS inbound-rtp's frameWidth +PASS inbound-rtp's frameHeight +FAIL inbound-rtp's frameBitDepth assert_true: Is frameBitDepth present expected true got false +PASS inbound-rtp's framesPerSecond +PASS inbound-rtp's qpSum +PASS inbound-rtp's totalDecodeTime +PASS inbound-rtp's totalInterFrameDelay +PASS inbound-rtp's totalSquaredInterFrameDelay +FAIL inbound-rtp's voiceActivityFlag assert_true: Is voiceActivityFlag present expected true got false +PASS inbound-rtp's lastPacketReceivedTimestamp +FAIL inbound-rtp's averageRtcpInterval assert_true: Is averageRtcpInterval present expected true got false +PASS inbound-rtp's headerBytesReceived +PASS inbound-rtp's fecPacketsReceived +PASS inbound-rtp's fecPacketsDiscarded +PASS inbound-rtp's bytesReceived +FAIL inbound-rtp's packetsFailedDecryption assert_true: Is packetsFailedDecryption present expected true got false +FAIL inbound-rtp's packetsDuplicated assert_true: Is packetsDuplicated present expected true got false +FAIL inbound-rtp's perDscpPacketsReceived assert_true: Is perDscpPacketsReceived present expected true got false +PASS inbound-rtp's nackCount +PASS inbound-rtp's firCount +PASS inbound-rtp's pliCount +FAIL inbound-rtp's sliCount assert_true: Is sliCount present expected true got false +FAIL inbound-rtp's totalProcessingDelay assert_true: Is totalProcessingDelay present expected true got false +FAIL inbound-rtp's estimatedPlayoutTimestamp assert_true: Is estimatedPlayoutTimestamp present expected true got false +PASS inbound-rtp's jitterBufferDelay +PASS inbound-rtp's jitterBufferEmittedCount +PASS inbound-rtp's totalSamplesReceived +FAIL inbound-rtp's totalSamplesDecoded assert_true: Is totalSamplesDecoded present expected true got false +FAIL inbound-rtp's samplesDecodedWithSilk assert_true: Is samplesDecodedWithSilk present expected true got false +FAIL inbound-rtp's samplesDecodedWithCelt assert_true: Is samplesDecodedWithCelt present expected true got false +PASS inbound-rtp's concealedSamples +PASS inbound-rtp's silentConcealedSamples +PASS inbound-rtp's concealmentEvents +PASS inbound-rtp's insertedSamplesForDeceleration +PASS inbound-rtp's removedSamplesForAcceleration +PASS inbound-rtp's audioLevel +PASS inbound-rtp's totalAudioEnergy +PASS inbound-rtp's totalSamplesDuration +PASS inbound-rtp's framesReceived +PASS inbound-rtp's decoderImplementation +PASS inbound-rtp's packetsReceived +PASS inbound-rtp's packetsLost +PASS inbound-rtp's jitter +FAIL inbound-rtp's packetsDiscarded assert_true: Is packetsDiscarded present expected true got false +FAIL inbound-rtp's packetsRepaired assert_true: Is packetsRepaired present expected true got false +FAIL inbound-rtp's burstPacketsLost assert_true: Is burstPacketsLost present expected true got false +FAIL inbound-rtp's burstPacketsDiscarded assert_true: Is burstPacketsDiscarded present expected true got false +FAIL inbound-rtp's burstLossCount assert_true: Is burstLossCount present expected true got false +FAIL inbound-rtp's burstDiscardCount assert_true: Is burstDiscardCount present expected true got false +FAIL inbound-rtp's burstLossRate assert_true: Is burstLossRate present expected true got false +FAIL inbound-rtp's burstDiscardRate assert_true: Is burstDiscardRate present expected true got false +FAIL inbound-rtp's gapLossRate assert_true: Is gapLossRate present expected true got false +FAIL inbound-rtp's gapDiscardRate assert_true: Is gapDiscardRate present expected true got false +PASS inbound-rtp's framesDropped +FAIL inbound-rtp's partialFramesLost assert_true: Is partialFramesLost present expected true got false +FAIL inbound-rtp's fullFramesLost assert_true: Is fullFramesLost present expected true got false +PASS inbound-rtp's ssrc +PASS inbound-rtp's kind +PASS inbound-rtp's transportId +PASS inbound-rtp's codecId +PASS inbound-rtp's timestamp +PASS inbound-rtp's type +PASS inbound-rtp's id +FAIL outbound-rtp's rtxSsrc assert_true: Is rtxSsrc present expected true got false +PASS outbound-rtp's mediaSourceId +FAIL outbound-rtp's senderId assert_true: Is senderId present expected true got false +PASS outbound-rtp's remoteId +FAIL outbound-rtp's rid assert_true: Is rid present expected true got false +FAIL outbound-rtp's lastPacketSentTimestamp assert_true: Is lastPacketSentTimestamp present expected true got false +PASS outbound-rtp's headerBytesSent +FAIL outbound-rtp's packetsDiscardedOnSend assert_true: Is packetsDiscardedOnSend present expected true got false +FAIL outbound-rtp's bytesDiscardedOnSend assert_true: Is bytesDiscardedOnSend present expected true got false +FAIL outbound-rtp's fecPacketsSent assert_true: Is fecPacketsSent present expected true got false +PASS outbound-rtp's retransmittedPacketsSent +PASS outbound-rtp's retransmittedBytesSent +FAIL outbound-rtp's targetBitrate assert_true: Is targetBitrate present expected true got false +PASS outbound-rtp's totalEncodedBytesTarget +PASS outbound-rtp's frameWidth +PASS outbound-rtp's frameHeight +FAIL outbound-rtp's frameBitDepth assert_true: Is frameBitDepth present expected true got false +PASS outbound-rtp's framesPerSecond +PASS outbound-rtp's framesSent +PASS outbound-rtp's hugeFramesSent +PASS outbound-rtp's framesEncoded +PASS outbound-rtp's keyFramesEncoded +FAIL outbound-rtp's framesDiscardedOnSend assert_true: Is framesDiscardedOnSend present expected true got false +PASS outbound-rtp's qpSum +FAIL outbound-rtp's totalSamplesSent assert_true: Is totalSamplesSent present expected true got false +FAIL outbound-rtp's samplesEncodedWithSilk assert_true: Is samplesEncodedWithSilk present expected true got false +FAIL outbound-rtp's samplesEncodedWithCelt assert_true: Is samplesEncodedWithCelt present expected true got false +FAIL outbound-rtp's voiceActivityFlag assert_true: Is voiceActivityFlag present expected true got false +PASS outbound-rtp's totalEncodeTime +PASS outbound-rtp's totalPacketSendDelay +FAIL outbound-rtp's averageRtcpInterval assert_true: Is averageRtcpInterval present expected true got false +PASS outbound-rtp's qualityLimitationReason +FAIL outbound-rtp's qualityLimitationDurations assert_true: Is qualityLimitationDurations present expected true got false +PASS outbound-rtp's qualityLimitationResolutionChanges +FAIL outbound-rtp's perDscpPacketsSent assert_true: Is perDscpPacketsSent present expected true got false +PASS outbound-rtp's nackCount +PASS outbound-rtp's firCount +PASS outbound-rtp's pliCount +FAIL outbound-rtp's sliCount assert_true: Is sliCount present expected true got false +PASS outbound-rtp's encoderImplementation +PASS outbound-rtp's packetsSent +PASS outbound-rtp's bytesSent +PASS outbound-rtp's ssrc +PASS outbound-rtp's kind +PASS outbound-rtp's transportId +PASS outbound-rtp's codecId +PASS outbound-rtp's timestamp +PASS outbound-rtp's type +PASS outbound-rtp's id +PASS remote-inbound-rtp's localId +PASS remote-inbound-rtp's roundTripTime +PASS remote-inbound-rtp's totalRoundTripTime +PASS remote-inbound-rtp's fractionLost +FAIL remote-inbound-rtp's reportsReceived assert_true: Is reportsReceived present expected true got false +PASS remote-inbound-rtp's roundTripTimeMeasurements +FAIL remote-inbound-rtp's packetsReceived assert_true: Is packetsReceived present expected true got false +PASS remote-inbound-rtp's packetsLost +PASS remote-inbound-rtp's jitter +FAIL remote-inbound-rtp's packetsDiscarded assert_true: Is packetsDiscarded present expected true got false +FAIL remote-inbound-rtp's packetsRepaired assert_true: Is packetsRepaired present expected true got false +FAIL remote-inbound-rtp's burstPacketsLost assert_true: Is burstPacketsLost present expected true got false +FAIL remote-inbound-rtp's burstPacketsDiscarded assert_true: Is burstPacketsDiscarded present expected true got false +FAIL remote-inbound-rtp's burstLossCount assert_true: Is burstLossCount present expected true got false +FAIL remote-inbound-rtp's burstDiscardCount assert_true: Is burstDiscardCount present expected true got false +FAIL remote-inbound-rtp's burstLossRate assert_true: Is burstLossRate present expected true got false +FAIL remote-inbound-rtp's burstDiscardRate assert_true: Is burstDiscardRate present expected true got false +FAIL remote-inbound-rtp's gapLossRate assert_true: Is gapLossRate present expected true got false +FAIL remote-inbound-rtp's gapDiscardRate assert_true: Is gapDiscardRate present expected true got false +FAIL remote-inbound-rtp's framesDropped assert_true: Is framesDropped present expected true got false +FAIL remote-inbound-rtp's partialFramesLost assert_true: Is partialFramesLost present expected true got false +FAIL remote-inbound-rtp's fullFramesLost assert_true: Is fullFramesLost present expected true got false +PASS remote-inbound-rtp's ssrc +PASS remote-inbound-rtp's kind +PASS remote-inbound-rtp's transportId +PASS remote-inbound-rtp's codecId +PASS remote-inbound-rtp's timestamp +PASS remote-inbound-rtp's type +PASS remote-inbound-rtp's id +PASS remote-outbound-rtp's localId +PASS remote-outbound-rtp's remoteTimestamp +PASS remote-outbound-rtp's reportsSent +FAIL remote-outbound-rtp's roundTripTime assert_true: Is roundTripTime present expected true got false +FAIL remote-outbound-rtp's totalRoundTripTime assert_true: Is totalRoundTripTime present expected true got false +FAIL remote-outbound-rtp's roundTripTimeMeasurements assert_true: Is roundTripTimeMeasurements present expected true got false +PASS remote-outbound-rtp's packetsSent +PASS remote-outbound-rtp's bytesSent +PASS remote-outbound-rtp's ssrc +PASS remote-outbound-rtp's kind +PASS remote-outbound-rtp's transportId +PASS remote-outbound-rtp's codecId +PASS remote-outbound-rtp's timestamp +PASS remote-outbound-rtp's type +PASS remote-outbound-rtp's id +FAIL csrc's contributorSsrc assert_true: Is contributorSsrc present expected true got false +FAIL csrc's inboundRtpStreamId assert_true: Is inboundRtpStreamId present expected true got false +FAIL csrc's packetsContributedTo assert_true: Is packetsContributedTo present expected true got false +FAIL csrc's audioLevel assert_true: Is audioLevel present expected true got false +FAIL csrc's timestamp assert_true: Is timestamp present expected true got false +FAIL csrc's type assert_true: Is type present expected true got false +FAIL csrc's id assert_true: Is id present expected true got false +PASS peer-connection's dataChannelsOpened +PASS peer-connection's dataChannelsClosed +FAIL peer-connection's dataChannelsRequested assert_true: Is dataChannelsRequested present expected true got false +FAIL peer-connection's dataChannelsAccepted assert_true: Is dataChannelsAccepted present expected true got false +PASS peer-connection's timestamp +PASS peer-connection's type +PASS peer-connection's id +PASS data-channel's label +PASS data-channel's protocol +PASS data-channel's dataChannelIdentifier +PASS data-channel's state +PASS data-channel's messagesSent +PASS data-channel's bytesSent +PASS data-channel's messagesReceived +PASS data-channel's bytesReceived +PASS data-channel's timestamp +PASS data-channel's type +PASS data-channel's id +PASS media-source's audioLevel +PASS media-source's totalAudioEnergy +PASS media-source's totalSamplesDuration +FAIL media-source's echoReturnLoss assert_true: Is echoReturnLoss present expected true got false +FAIL media-source's echoReturnLossEnhancement assert_true: Is echoReturnLossEnhancement present expected true got false +PASS media-source's width +PASS media-source's height +FAIL media-source's bitDepth assert_true: Is bitDepth present expected true got false +PASS media-source's frames +PASS media-source's framesPerSecond +PASS media-source's trackIdentifier +PASS media-source's kind +FAIL media-source's relayedSource assert_true: Is relayedSource present expected true got false +PASS media-source's timestamp +PASS media-source's type +PASS media-source's id +FAIL sender's mediaSourceId assert_true: Is mediaSourceId present expected true got false +FAIL sender's trackIdentifier assert_true: Is trackIdentifier present expected true got false +FAIL sender's ended assert_true: Is ended present expected true got false +FAIL sender's kind assert_true: Is kind present expected true got false +FAIL sender's timestamp assert_true: Is timestamp present expected true got false +FAIL sender's type assert_true: Is type present expected true got false +FAIL sender's id assert_true: Is id present expected true got false +FAIL receiver's trackIdentifier assert_true: Is trackIdentifier present expected true got false +FAIL receiver's ended assert_true: Is ended present expected true got false +FAIL receiver's kind assert_true: Is kind present expected true got false +FAIL receiver's timestamp assert_true: Is timestamp present expected true got false +FAIL receiver's type assert_true: Is type present expected true got false +FAIL receiver's id assert_true: Is id present expected true got false +PASS transport's packetsSent +PASS transport's packetsReceived +PASS transport's bytesSent +PASS transport's bytesReceived +FAIL transport's rtcpTransportStatsId assert_true: Is rtcpTransportStatsId present expected true got false +FAIL transport's iceRole assert_true: Is iceRole present expected true got false +FAIL transport's iceLocalUsernameFragment assert_true: Is iceLocalUsernameFragment present expected true got false +PASS transport's dtlsState +FAIL transport's iceState assert_true: Is iceState present expected true got false +PASS transport's selectedCandidatePairId +PASS transport's localCertificateId +PASS transport's remoteCertificateId +PASS transport's tlsVersion +PASS transport's dtlsCipher +PASS transport's srtpCipher +FAIL transport's tlsGroup assert_true: Is tlsGroup present expected true got false +PASS transport's selectedCandidatePairChanges +PASS transport's timestamp +PASS transport's type +PASS transport's id +PASS candidate-pair's transportId +PASS candidate-pair's localCandidateId +PASS candidate-pair's remoteCandidateId +PASS candidate-pair's state +PASS candidate-pair's nominated +FAIL candidate-pair's packetsSent assert_true: Is packetsSent present expected true got false +FAIL candidate-pair's packetsReceived assert_true: Is packetsReceived present expected true got false +PASS candidate-pair's bytesSent +PASS candidate-pair's bytesReceived +FAIL candidate-pair's lastPacketSentTimestamp assert_true: Is lastPacketSentTimestamp present expected true got false +FAIL candidate-pair's lastPacketReceivedTimestamp assert_true: Is lastPacketReceivedTimestamp present expected true got false +FAIL candidate-pair's firstRequestTimestamp assert_true: Is firstRequestTimestamp present expected true got false +FAIL candidate-pair's lastRequestTimestamp assert_true: Is lastRequestTimestamp present expected true got false +FAIL candidate-pair's lastResponseTimestamp assert_true: Is lastResponseTimestamp present expected true got false +PASS candidate-pair's totalRoundTripTime +PASS candidate-pair's currentRoundTripTime +PASS candidate-pair's availableOutgoingBitrate +FAIL candidate-pair's availableIncomingBitrate assert_true: Is availableIncomingBitrate present expected true got false +FAIL candidate-pair's circuitBreakerTriggerCount assert_true: Is circuitBreakerTriggerCount present expected true got false +PASS candidate-pair's requestsReceived +PASS candidate-pair's requestsSent +PASS candidate-pair's responsesReceived +PASS candidate-pair's responsesSent +FAIL candidate-pair's retransmissionsReceived assert_true: Is retransmissionsReceived present expected true got false +FAIL candidate-pair's retransmissionsSent assert_true: Is retransmissionsSent present expected true got false +PASS candidate-pair's consentRequestsSent +FAIL candidate-pair's consentExpiredTimestamp assert_true: Is consentExpiredTimestamp present expected true got false +FAIL candidate-pair's packetsDiscardedOnSend assert_true: Is packetsDiscardedOnSend present expected true got false +FAIL candidate-pair's bytesDiscardedOnSend assert_true: Is bytesDiscardedOnSend present expected true got false +FAIL candidate-pair's requestBytesSent assert_true: Is requestBytesSent present expected true got false +FAIL candidate-pair's consentRequestBytesSent assert_true: Is consentRequestBytesSent present expected true got false +FAIL candidate-pair's responseBytesSent assert_true: Is responseBytesSent present expected true got false +PASS candidate-pair's timestamp +PASS candidate-pair's type +PASS candidate-pair's id +PASS local-candidate's transportId +PASS local-candidate's address +PASS local-candidate's port +PASS local-candidate's protocol +PASS local-candidate's candidateType +PASS local-candidate's priority +FAIL local-candidate's url assert_true: Is url present expected true got false +FAIL local-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS local-candidate's timestamp +PASS local-candidate's type +PASS local-candidate's id +PASS remote-candidate's transportId +PASS remote-candidate's address +PASS remote-candidate's port +PASS remote-candidate's protocol +PASS remote-candidate's candidateType +PASS remote-candidate's priority +FAIL remote-candidate's url assert_true: Is url present expected true got false +FAIL remote-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +PASS remote-candidate's timestamp +PASS remote-candidate's type +PASS remote-candidate's id +PASS certificate's fingerprint +PASS certificate's fingerprintAlgorithm +PASS certificate's base64Certificate +FAIL certificate's issuerCertificateId assert_true: Is issuerCertificateId present expected true got false +PASS certificate's timestamp +PASS certificate's type +PASS certificate's id +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/svg/filters/feImage-preserveAspectRatio-all-expected.png new file mode 100644 index 0000000..8bc59d61 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/svg/filters/feImage-preserveAspectRatio-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 8ca48c8..268a4fa 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-image-01-b-expected.png new file mode 100644 index 0000000..842f0711 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/filters/feImage-preserveAspectRatio-all-expected.png new file mode 100644 index 0000000..8bc59d61 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/filters/feImage-preserveAspectRatio-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webrtc-stats/supported-stats-expected.txt new file mode 100644 index 0000000..9781bfe --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -0,0 +1,314 @@ +This is a testharness.js-based test. +Found 310 tests; 115 PASS, 195 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS getStats succeeds +PASS Validating stats +PASS codec's payloadType +FAIL codec's codecType assert_true: Is codecType present expected true got false +PASS codec's transportId +PASS codec's mimeType +PASS codec's clockRate +PASS codec's channels +PASS codec's sdpFmtpLine +PASS codec's timestamp +PASS codec's type +PASS codec's id +FAIL inbound-rtp's receiverId assert_true: Is receiverId present expected true got false +FAIL inbound-rtp's remoteId assert_true: Is remoteId present expected true got false +PASS inbound-rtp's framesDecoded +PASS inbound-rtp's keyFramesDecoded +FAIL inbound-rtp's frameWidth assert_true: Is frameWidth present expected true got false +FAIL inbound-rtp's frameHeight assert_true: Is frameHeight present expected true got false +FAIL inbound-rtp's frameBitDepth assert_true: Is frameBitDepth present expected true got false +FAIL inbound-rtp's framesPerSecond assert_true: Is framesPerSecond present expected true got false +FAIL inbound-rtp's qpSum assert_true: Is qpSum present expected true got false +PASS inbound-rtp's totalDecodeTime +PASS inbound-rtp's totalInterFrameDelay +PASS inbound-rtp's totalSquaredInterFrameDelay +FAIL inbound-rtp's voiceActivityFlag assert_true: Is voiceActivityFlag present expected true got false +FAIL inbound-rtp's lastPacketReceivedTimestamp assert_true: Is lastPacketReceivedTimestamp present expected true got false +FAIL inbound-rtp's averageRtcpInterval assert_true: Is averageRtcpInterval present expected true got false +PASS inbound-rtp's headerBytesReceived +PASS inbound-rtp's fecPacketsReceived +PASS inbound-rtp's fecPacketsDiscarded +PASS inbound-rtp's bytesReceived +FAIL inbound-rtp's packetsFailedDecryption assert_true: Is packetsFailedDecryption present expected true got false +FAIL inbound-rtp's packetsDuplicated assert_true: Is packetsDuplicated present expected true got false +FAIL inbound-rtp's perDscpPacketsReceived assert_true: Is perDscpPacketsReceived present expected true got false +PASS inbound-rtp's nackCount +PASS inbound-rtp's firCount +PASS inbound-rtp's pliCount +FAIL inbound-rtp's sliCount assert_true: Is sliCount present expected true got false +FAIL inbound-rtp's totalProcessingDelay assert_true: Is totalProcessingDelay present expected true got false +FAIL inbound-rtp's estimatedPlayoutTimestamp assert_true: Is estimatedPlayoutTimestamp present expected true got false +PASS inbound-rtp's jitterBufferDelay +PASS inbound-rtp's jitterBufferEmittedCount +PASS inbound-rtp's totalSamplesReceived +FAIL inbound-rtp's totalSamplesDecoded assert_true: Is totalSamplesDecoded present expected true got false +FAIL inbound-rtp's samplesDecodedWithSilk assert_true: Is samplesDecodedWithSilk present expected true got false +FAIL inbound-rtp's samplesDecodedWithCelt assert_true: Is samplesDecodedWithCelt present expected true got false +PASS inbound-rtp's concealedSamples +PASS inbound-rtp's silentConcealedSamples +PASS inbound-rtp's concealmentEvents +PASS inbound-rtp's insertedSamplesForDeceleration +PASS inbound-rtp's removedSamplesForAcceleration +FAIL inbound-rtp's audioLevel assert_true: Is audioLevel present expected true got false +PASS inbound-rtp's totalAudioEnergy +PASS inbound-rtp's totalSamplesDuration +PASS inbound-rtp's framesReceived +PASS inbound-rtp's decoderImplementation +PASS inbound-rtp's packetsReceived +PASS inbound-rtp's packetsLost +PASS inbound-rtp's jitter +FAIL inbound-rtp's packetsDiscarded assert_true: Is packetsDiscarded present expected true got false +FAIL inbound-rtp's packetsRepaired assert_true: Is packetsRepaired present expected true got false +FAIL inbound-rtp's burstPacketsLost assert_true: Is burstPacketsLost present expected true got false +FAIL inbound-rtp's burstPacketsDiscarded assert_true: Is burstPacketsDiscarded present expected true got false +FAIL inbound-rtp's burstLossCount assert_true: Is burstLossCount present expected true got false +FAIL inbound-rtp's burstDiscardCount assert_true: Is burstDiscardCount present expected true got false +FAIL inbound-rtp's burstLossRate assert_true: Is burstLossRate present expected true got false +FAIL inbound-rtp's burstDiscardRate assert_true: Is burstDiscardRate present expected true got false +FAIL inbound-rtp's gapLossRate assert_true: Is gapLossRate present expected true got false +FAIL inbound-rtp's gapDiscardRate assert_true: Is gapDiscardRate present expected true got false +PASS inbound-rtp's framesDropped +FAIL inbound-rtp's partialFramesLost assert_true: Is partialFramesLost present expected true got false +FAIL inbound-rtp's fullFramesLost assert_true: Is fullFramesLost present expected true got false +PASS inbound-rtp's ssrc +PASS inbound-rtp's kind +PASS inbound-rtp's transportId +FAIL inbound-rtp's codecId assert_true: Is codecId present expected true got false +PASS inbound-rtp's timestamp +PASS inbound-rtp's type +PASS inbound-rtp's id +FAIL outbound-rtp's rtxSsrc assert_true: Is rtxSsrc present expected true got false +PASS outbound-rtp's mediaSourceId +FAIL outbound-rtp's senderId assert_true: Is senderId present expected true got false +FAIL outbound-rtp's remoteId assert_true: Is remoteId present expected true got false +FAIL outbound-rtp's rid assert_true: Is rid present expected true got false +FAIL outbound-rtp's lastPacketSentTimestamp assert_true: Is lastPacketSentTimestamp present expected true got false +PASS outbound-rtp's headerBytesSent +FAIL outbound-rtp's packetsDiscardedOnSend assert_true: Is packetsDiscardedOnSend present expected true got false +FAIL outbound-rtp's bytesDiscardedOnSend assert_true: Is bytesDiscardedOnSend present expected true got false +FAIL outbound-rtp's fecPacketsSent assert_true: Is fecPacketsSent present expected true got false +PASS outbound-rtp's retransmittedPacketsSent +PASS outbound-rtp's retransmittedBytesSent +FAIL outbound-rtp's targetBitrate assert_true: Is targetBitrate present expected true got false +PASS outbound-rtp's totalEncodedBytesTarget +FAIL outbound-rtp's frameWidth assert_true: Is frameWidth present expected true got false +FAIL outbound-rtp's frameHeight assert_true: Is frameHeight present expected true got false +FAIL outbound-rtp's frameBitDepth assert_true: Is frameBitDepth present expected true got false +FAIL outbound-rtp's framesPerSecond assert_true: Is framesPerSecond present expected true got false +PASS outbound-rtp's framesSent +PASS outbound-rtp's hugeFramesSent +PASS outbound-rtp's framesEncoded +PASS outbound-rtp's keyFramesEncoded +FAIL outbound-rtp's framesDiscardedOnSend assert_true: Is framesDiscardedOnSend present expected true got false +FAIL outbound-rtp's qpSum assert_true: Is qpSum present expected true got false +FAIL outbound-rtp's totalSamplesSent assert_true: Is totalSamplesSent present expected true got false +FAIL outbound-rtp's samplesEncodedWithSilk assert_true: Is samplesEncodedWithSilk present expected true got false +FAIL outbound-rtp's samplesEncodedWithCelt assert_true: Is samplesEncodedWithCelt present expected true got false +FAIL outbound-rtp's voiceActivityFlag assert_true: Is voiceActivityFlag present expected true got false +PASS outbound-rtp's totalEncodeTime +PASS outbound-rtp's totalPacketSendDelay +FAIL outbound-rtp's averageRtcpInterval assert_true: Is averageRtcpInterval present expected true got false +PASS outbound-rtp's qualityLimitationReason +FAIL outbound-rtp's qualityLimitationDurations assert_true: Is qualityLimitationDurations present expected true got false +PASS outbound-rtp's qualityLimitationResolutionChanges +FAIL outbound-rtp's perDscpPacketsSent assert_true: Is perDscpPacketsSent present expected true got false +PASS outbound-rtp's nackCount +PASS outbound-rtp's firCount +PASS outbound-rtp's pliCount +FAIL outbound-rtp's sliCount assert_true: Is sliCount present expected true got false +PASS outbound-rtp's encoderImplementation +PASS outbound-rtp's packetsSent +PASS outbound-rtp's bytesSent +PASS outbound-rtp's ssrc +PASS outbound-rtp's kind +PASS outbound-rtp's transportId +PASS outbound-rtp's codecId +PASS outbound-rtp's timestamp +PASS outbound-rtp's type +PASS outbound-rtp's id +FAIL remote-inbound-rtp's localId assert_true: Is localId present expected true got false +FAIL remote-inbound-rtp's roundTripTime assert_true: Is roundTripTime present expected true got false +FAIL remote-inbound-rtp's totalRoundTripTime assert_true: Is totalRoundTripTime present expected true got false +FAIL remote-inbound-rtp's fractionLost assert_true: Is fractionLost present expected true got false +FAIL remote-inbound-rtp's reportsReceived assert_true: Is reportsReceived present expected true got false +FAIL remote-inbound-rtp's roundTripTimeMeasurements assert_true: Is roundTripTimeMeasurements present expected true got false +FAIL remote-inbound-rtp's packetsReceived assert_true: Is packetsReceived present expected true got false +FAIL remote-inbound-rtp's packetsLost assert_true: Is packetsLost present expected true got false +FAIL remote-inbound-rtp's jitter assert_true: Is jitter present expected true got false +FAIL remote-inbound-rtp's packetsDiscarded assert_true: Is packetsDiscarded present expected true got false +FAIL remote-inbound-rtp's packetsRepaired assert_true: Is packetsRepaired present expected true got false +FAIL remote-inbound-rtp's burstPacketsLost assert_true: Is burstPacketsLost present expected true got false +FAIL remote-inbound-rtp's burstPacketsDiscarded assert_true: Is burstPacketsDiscarded present expected true got false +FAIL remote-inbound-rtp's burstLossCount assert_true: Is burstLossCount present expected true got false +FAIL remote-inbound-rtp's burstDiscardCount assert_true: Is burstDiscardCount present expected true got false +FAIL remote-inbound-rtp's burstLossRate assert_true: Is burstLossRate present expected true got false +FAIL remote-inbound-rtp's burstDiscardRate assert_true: Is burstDiscardRate present expected true got false +FAIL remote-inbound-rtp's gapLossRate assert_true: Is gapLossRate present expected true got false +FAIL remote-inbound-rtp's gapDiscardRate assert_true: Is gapDiscardRate present expected true got false +FAIL remote-inbound-rtp's framesDropped assert_true: Is framesDropped present expected true got false +FAIL remote-inbound-rtp's partialFramesLost assert_true: Is partialFramesLost present expected true got false +FAIL remote-inbound-rtp's fullFramesLost assert_true: Is fullFramesLost present expected true got false +FAIL remote-inbound-rtp's ssrc assert_true: Is ssrc present expected true got false +FAIL remote-inbound-rtp's kind assert_true: Is kind present expected true got false +FAIL remote-inbound-rtp's transportId assert_true: Is transportId present expected true got false +FAIL remote-inbound-rtp's codecId assert_true: Is codecId present expected true got false +FAIL remote-inbound-rtp's timestamp assert_true: Is timestamp present expected true got false +FAIL remote-inbound-rtp's type assert_true: Is type present expected true got false +FAIL remote-inbound-rtp's id assert_true: Is id present expected true got false +FAIL remote-outbound-rtp's localId assert_true: Is localId present expected true got false +FAIL remote-outbound-rtp's remoteTimestamp assert_true: Is remoteTimestamp present expected true got false +FAIL remote-outbound-rtp's reportsSent assert_true: Is reportsSent present expected true got false +FAIL remote-outbound-rtp's roundTripTime assert_true: Is roundTripTime present expected true got false +FAIL remote-outbound-rtp's totalRoundTripTime assert_true: Is totalRoundTripTime present expected true got false +FAIL remote-outbound-rtp's roundTripTimeMeasurements assert_true: Is roundTripTimeMeasurements present expected true got false +FAIL remote-outbound-rtp's packetsSent assert_true: Is packetsSent present expected true got false +FAIL remote-outbound-rtp's bytesSent assert_true: Is bytesSent present expected true got false +FAIL remote-outbound-rtp's ssrc assert_true: Is ssrc present expected true got false +FAIL remote-outbound-rtp's kind assert_true: Is kind present expected true got false +FAIL remote-outbound-rtp's transportId assert_true: Is transportId present expected true got false +FAIL remote-outbound-rtp's codecId assert_true: Is codecId present expected true got false +FAIL remote-outbound-rtp's timestamp assert_true: Is timestamp present expected true got false +FAIL remote-outbound-rtp's type assert_true: Is type present expected true got false +FAIL remote-outbound-rtp's id assert_true: Is id present expected true got false +FAIL csrc's contributorSsrc assert_true: Is contributorSsrc present expected true got false +FAIL csrc's inboundRtpStreamId assert_true: Is inboundRtpStreamId present expected true got false +FAIL csrc's packetsContributedTo assert_true: Is packetsContributedTo present expected true got false +FAIL csrc's audioLevel assert_true: Is audioLevel present expected true got false +FAIL csrc's timestamp assert_true: Is timestamp present expected true got false +FAIL csrc's type assert_true: Is type present expected true got false +FAIL csrc's id assert_true: Is id present expected true got false +PASS peer-connection's dataChannelsOpened +PASS peer-connection's dataChannelsClosed +FAIL peer-connection's dataChannelsRequested assert_true: Is dataChannelsRequested present expected true got false +FAIL peer-connection's dataChannelsAccepted assert_true: Is dataChannelsAccepted present expected true got false +PASS peer-connection's timestamp +PASS peer-connection's type +PASS peer-connection's id +PASS data-channel's label +PASS data-channel's protocol +PASS data-channel's dataChannelIdentifier +PASS data-channel's state +PASS data-channel's messagesSent +PASS data-channel's bytesSent +PASS data-channel's messagesReceived +PASS data-channel's bytesReceived +PASS data-channel's timestamp +PASS data-channel's type +PASS data-channel's id +PASS media-source's audioLevel +PASS media-source's totalAudioEnergy +PASS media-source's totalSamplesDuration +FAIL media-source's echoReturnLoss assert_true: Is echoReturnLoss present expected true got false +FAIL media-source's echoReturnLossEnhancement assert_true: Is echoReturnLossEnhancement present expected true got false +PASS media-source's width +PASS media-source's height +FAIL media-source's bitDepth assert_true: Is bitDepth present expected true got false +PASS media-source's frames +PASS media-source's framesPerSecond +PASS media-source's trackIdentifier +PASS media-source's kind +FAIL media-source's relayedSource assert_true: Is relayedSource present expected true got false +PASS media-source's timestamp +PASS media-source's type +PASS media-source's id +FAIL sender's mediaSourceId assert_true: Is mediaSourceId present expected true got false +FAIL sender's trackIdentifier assert_true: Is trackIdentifier present expected true got false +FAIL sender's ended assert_true: Is ended present expected true got false +FAIL sender's kind assert_true: Is kind present expected true got false +FAIL sender's timestamp assert_true: Is timestamp present expected true got false +FAIL sender's type assert_true: Is type present expected true got false +FAIL sender's id assert_true: Is id present expected true got false +FAIL receiver's trackIdentifier assert_true: Is trackIdentifier present expected true got false +FAIL receiver's ended assert_true: Is ended present expected true got false +FAIL receiver's kind assert_true: Is kind present expected true got false +FAIL receiver's timestamp assert_true: Is timestamp present expected true got false +FAIL receiver's type assert_true: Is type present expected true got false +FAIL receiver's id assert_true: Is id present expected true got false +PASS transport's packetsSent +PASS transport's packetsReceived +PASS transport's bytesSent +PASS transport's bytesReceived +FAIL transport's rtcpTransportStatsId assert_true: Is rtcpTransportStatsId present expected true got false +FAIL transport's iceRole assert_true: Is iceRole present expected true got false +FAIL transport's iceLocalUsernameFragment assert_true: Is iceLocalUsernameFragment present expected true got false +PASS transport's dtlsState +FAIL transport's iceState assert_true: Is iceState present expected true got false +FAIL transport's selectedCandidatePairId assert_true: Is selectedCandidatePairId present expected true got false +PASS transport's localCertificateId +FAIL transport's remoteCertificateId assert_true: Is remoteCertificateId present expected true got false +FAIL transport's tlsVersion assert_true: Is tlsVersion present expected true got false +FAIL transport's dtlsCipher assert_true: Is dtlsCipher present expected true got false +FAIL transport's srtpCipher assert_true: Is srtpCipher present expected true got false +FAIL transport's tlsGroup assert_true: Is tlsGroup present expected true got false +PASS transport's selectedCandidatePairChanges +PASS transport's timestamp +PASS transport's type +PASS transport's id +FAIL candidate-pair's transportId assert_true: Is transportId present expected true got false +FAIL candidate-pair's localCandidateId assert_true: Is localCandidateId present expected true got false +FAIL candidate-pair's remoteCandidateId assert_true: Is remoteCandidateId present expected true got false +FAIL candidate-pair's state assert_true: Is state present expected true got false +FAIL candidate-pair's nominated assert_true: Is nominated present expected true got false +FAIL candidate-pair's packetsSent assert_true: Is packetsSent present expected true got false +FAIL candidate-pair's packetsReceived assert_true: Is packetsReceived present expected true got false +FAIL candidate-pair's bytesSent assert_true: Is bytesSent present expected true got false +FAIL candidate-pair's bytesReceived assert_true: Is bytesReceived present expected true got false +FAIL candidate-pair's lastPacketSentTimestamp assert_true: Is lastPacketSentTimestamp present expected true got false +FAIL candidate-pair's lastPacketReceivedTimestamp assert_true: Is lastPacketReceivedTimestamp present expected true got false +FAIL candidate-pair's firstRequestTimestamp assert_true: Is firstRequestTimestamp present expected true got false +FAIL candidate-pair's lastRequestTimestamp assert_true: Is lastRequestTimestamp present expected true got false +FAIL candidate-pair's lastResponseTimestamp assert_true: Is lastResponseTimestamp present expected true got false +FAIL candidate-pair's totalRoundTripTime assert_true: Is totalRoundTripTime present expected true got false +FAIL candidate-pair's currentRoundTripTime assert_true: Is currentRoundTripTime present expected true got false +FAIL candidate-pair's availableOutgoingBitrate assert_true: Is availableOutgoingBitrate present expected true got false +FAIL candidate-pair's availableIncomingBitrate assert_true: Is availableIncomingBitrate present expected true got false +FAIL candidate-pair's circuitBreakerTriggerCount assert_true: Is circuitBreakerTriggerCount present expected true got false +FAIL candidate-pair's requestsReceived assert_true: Is requestsReceived present expected true got false +FAIL candidate-pair's requestsSent assert_true: Is requestsSent present expected true got false +FAIL candidate-pair's responsesReceived assert_true: Is responsesReceived present expected true got false +FAIL candidate-pair's responsesSent assert_true: Is responsesSent present expected true got false +FAIL candidate-pair's retransmissionsReceived assert_true: Is retransmissionsReceived present expected true got false +FAIL candidate-pair's retransmissionsSent assert_true: Is retransmissionsSent present expected true got false +FAIL candidate-pair's consentRequestsSent assert_true: Is consentRequestsSent present expected true got false +FAIL candidate-pair's consentExpiredTimestamp assert_true: Is consentExpiredTimestamp present expected true got false +FAIL candidate-pair's packetsDiscardedOnSend assert_true: Is packetsDiscardedOnSend present expected true got false +FAIL candidate-pair's bytesDiscardedOnSend assert_true: Is bytesDiscardedOnSend present expected true got false +FAIL candidate-pair's requestBytesSent assert_true: Is requestBytesSent present expected true got false +FAIL candidate-pair's consentRequestBytesSent assert_true: Is consentRequestBytesSent present expected true got false +FAIL candidate-pair's responseBytesSent assert_true: Is responseBytesSent present expected true got false +FAIL candidate-pair's timestamp assert_true: Is timestamp present expected true got false +FAIL candidate-pair's type assert_true: Is type present expected true got false +FAIL candidate-pair's id assert_true: Is id present expected true got false +FAIL local-candidate's transportId assert_true: Is transportId present expected true got false +FAIL local-candidate's address assert_true: Is address present expected true got false +FAIL local-candidate's port assert_true: Is port present expected true got false +FAIL local-candidate's protocol assert_true: Is protocol present expected true got false +FAIL local-candidate's candidateType assert_true: Is candidateType present expected true got false +FAIL local-candidate's priority assert_true: Is priority present expected true got false +FAIL local-candidate's url assert_true: Is url present expected true got false +FAIL local-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +FAIL local-candidate's timestamp assert_true: Is timestamp present expected true got false +FAIL local-candidate's type assert_true: Is type present expected true got false +FAIL local-candidate's id assert_true: Is id present expected true got false +FAIL remote-candidate's transportId assert_true: Is transportId present expected true got false +FAIL remote-candidate's address assert_true: Is address present expected true got false +FAIL remote-candidate's port assert_true: Is port present expected true got false +FAIL remote-candidate's protocol assert_true: Is protocol present expected true got false +FAIL remote-candidate's candidateType assert_true: Is candidateType present expected true got false +FAIL remote-candidate's priority assert_true: Is priority present expected true got false +FAIL remote-candidate's url assert_true: Is url present expected true got false +FAIL remote-candidate's relayProtocol assert_true: Is relayProtocol present expected true got false +FAIL remote-candidate's timestamp assert_true: Is timestamp present expected true got false +FAIL remote-candidate's type assert_true: Is type present expected true got false +FAIL remote-candidate's id assert_true: Is id present expected true got false +PASS certificate's fingerprint +PASS certificate's fingerprintAlgorithm +PASS certificate's base64Certificate +FAIL certificate's issuerCertificateId assert_true: Is issuerCertificateId present expected true got false +PASS certificate's timestamp +PASS certificate's type +PASS certificate's id +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/webrtc/RTCDTMFSender-ontonechange-long.https-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/webrtc/RTCDTMFSender-ontonechange-long.https-expected.txt new file mode 100644 index 0000000..b543ad7 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/webrtc/RTCDTMFSender-ontonechange-long.https-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL insertDTMF with duration greater than 6000 should be clamped to 6000 promise_test: Unhandled rejection with value: "Waited too long for canInsertDTMF" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index 0c03f4a..522a03b 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index 37fda7b..7ecb427 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 4970697..321e75d 100644 --- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png index 55b1e00fc..eca8977c 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png index d47aa42c6..454d729 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1-SE/filters-image-05-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png index 7685494..d75d05dc 100644 --- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-image-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/platform/win/svg/filters/feImage-preserveAspectRatio-all-expected.png new file mode 100644 index 0000000..8bc59d61 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/svg/filters/feImage-preserveAspectRatio-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt b/third_party/blink/web_tests/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt new file mode 100644 index 0000000..a25b56c --- /dev/null +++ b/third_party/blink/web_tests/virtual/css-calc-infinity-and-nan/external/wpt/css/css-values/minmax-percentage-serialize-expected.txt
@@ -0,0 +1,26 @@ +This is a testharness.js-based test. +FAIL 'min(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'min(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "min(1%)" +PASS 'min(1%)' as a computed value should serialize as '1%'. +PASS 'min(1%)' as a used value should serialize as '1px'. +FAIL 'max(1%)' as a specified value should serialize as 'calc(1%)'. assert_equals: 'max(1%)' and 'calc(1%)' should serialize the same in specified values. expected "calc(1%)" but got "max(1%)" +PASS 'max(1%)' as a computed value should serialize as '1%'. +PASS 'max(1%)' as a used value should serialize as '1px'. +PASS 'min(1%, 2%, 3%)' as a specified value should serialize as 'min(1%, 2%, 3%)'. +FAIL 'min(1%, 2%, 3%)' as a computed value should serialize as 'min(1%, 2%, 3%)'. assert_equals: 'min(1%, 2%, 3%)' should round-trip exactly in computed values. expected "min(1%, 2%, 3%)" but got "1%" +PASS 'min(1%, 2%, 3%)' as a used value should serialize as '1px'. +PASS 'min(3%, 2%, 1%)' as a specified value should serialize as 'min(3%, 2%, 1%)'. +FAIL 'min(3%, 2%, 1%)' as a computed value should serialize as 'min(3%, 2%, 1%)'. assert_equals: 'min(3%, 2%, 1%)' should round-trip exactly in computed values. expected "min(3%, 2%, 1%)" but got "1%" +PASS 'min(3%, 2%, 1%)' as a used value should serialize as '1px'. +PASS 'max(1%, 2%, 3%)' as a specified value should serialize as 'max(1%, 2%, 3%)'. +FAIL 'max(1%, 2%, 3%)' as a computed value should serialize as 'max(1%, 2%, 3%)'. assert_equals: 'max(1%, 2%, 3%)' should round-trip exactly in computed values. expected "max(1%, 2%, 3%)" but got "3%" +PASS 'max(1%, 2%, 3%)' as a used value should serialize as '3px'. +PASS 'max(3%, 2%, 1%)' as a specified value should serialize as 'max(3%, 2%, 1%)'. +FAIL 'max(3%, 2%, 1%)' as a computed value should serialize as 'max(3%, 2%, 1%)'. assert_equals: 'max(3%, 2%, 1%)' should round-trip exactly in computed values. expected "max(3%, 2%, 1%)" but got "3%" +PASS 'max(3%, 2%, 1%)' as a used value should serialize as '3px'. +PASS 'min(1%, 2%, 3%) 0px' as a specified value should serialize as 'min(1%, 2%, 3%) 0px'. +FAIL 'min(1%, 2%, 3%) 0px' as a computed value should serialize as 'min(1%, 2%, 3%) 0px'. assert_equals: 'min(1%, 2%, 3%) 0px' should round-trip exactly in computed values. expected "min(1%, 2%, 3%) 0px" but got "min(1% + 0px, 2% + 0px, 3% + 0px) 0px" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a specified value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' and 'calc(10% + min(1%, 2%) + max(3%, 4%))' should serialize the same in specified values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "calc(15%)" +FAIL 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a computed value should serialize as 'calc(10% + min(1%, 2%) + max(3%, 4%))'. assert_equals: 'calc(10% + min(1%, 2%) + max(3%, 4%))' should round-trip exactly in computed values. expected "calc(10% + min(1%, 2%) + max(3%, 4%))" but got "15%" +PASS 'calc(min(1%, 2%) + max(3%, 4%) + 10%)' as a used value should serialize as '15px'. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/synchronous_html_parser/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/virtual/synchronous_html_parser/svg/filters/feImage-preserveAspectRatio-all-expected.png new file mode 100644 index 0000000..8bc59d61 --- /dev/null +++ b/third_party/blink/web_tests/virtual/synchronous_html_parser/svg/filters/feImage-preserveAspectRatio-all-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/change_delayed_task_priority.html b/third_party/blink/web_tests/wpt_internal/scheduler/change_delayed_task_priority.any.js similarity index 62% rename from third_party/blink/web_tests/wpt_internal/scheduler/change_delayed_task_priority.html rename to third_party/blink/web_tests/wpt_internal/scheduler/change_delayed_task_priority.any.js index dc5517d..ad07d86 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/change_delayed_task_priority.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/change_delayed_task_priority.any.js
@@ -1,11 +1,6 @@ -<!doctype html> -<title>Scheduling API: Move Delayed Tasks</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> +// META: title=Scheduling API: Move Delayed Tasks +// META: global=window -<script> 'use strict'; let taskCount = 0; @@ -29,5 +24,3 @@ }), { signal: tc.signal, delay: 20 }); }, "Tests delay when changing a delayed task's priority"); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/change_task_priority.html b/third_party/blink/web_tests/wpt_internal/scheduler/change_task_priority.any.js similarity index 61% rename from third_party/blink/web_tests/wpt_internal/scheduler/change_task_priority.html rename to third_party/blink/web_tests/wpt_internal/scheduler/change_task_priority.any.js index d35a5531..a561546 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/change_task_priority.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/change_task_priority.any.js
@@ -1,11 +1,5 @@ -<!doctype html> -<title>Scheduling API: Setting TaskController.priority</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> +// META: title=Scheduling API: Setting TaskController.priority +// META: global=window 'use strict'; async_test(t => { @@ -28,5 +22,3 @@ }), { priority: 'background' }); }, 'Test modifying TaskController priority'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal.html b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal.any.js similarity index 62% rename from third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal.html rename to third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal.any.js index 92451ece..041e776 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal.any.js
@@ -1,11 +1,5 @@ -<!doctype html> -<title>Scheduling API: Signal inheritance</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> +// META: title=Scheduling API: Signal inheritance +// META: global=window 'use strict'; async_test(t => { @@ -13,7 +7,7 @@ let tc = new TaskController("user-blocking"); scheduler.postTask(() => { scheduler.postTask(() => { - assert_equals(scheduler.currentTaskSignal.priority, "user-blocking"); + assert_equals(scheduler.currentTaskSignal.priority, "user-blocking"); result = "pass"; }, { signal: scheduler.currentTaskSignal }); }, { signal: tc.signal }); @@ -24,5 +18,3 @@ assert_equals(result, "pass"); })); }, 'Test that currentTaskSignal uses the incumbent priority'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_abort_signal.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_abort_signal.any.js new file mode 100644 index 0000000..4c6e3341 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_abort_signal.any.js
@@ -0,0 +1,13 @@ +// META: title=Scheduling API: Signal inheritance +// META: global=window +'use strict'; + +async_test(t => { + let ac = new AbortController() + scheduler.postTask(() => { + scheduler.postTask(() => {}, { signal : scheduler.currentTaskSignal }).then( + () => { assert_unreached('This task should have been aborted'); }, + t.step_func_done()); + ac.abort(); + }, { signal: ac.signal }); +}, 'Test that currentTaskSignal wraps and follows an AbortSignal');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_abort_signal.html b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_abort_signal.html deleted file mode 100644 index 1e9ddbd8..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_abort_signal.html +++ /dev/null
@@ -1,21 +0,0 @@ -<!doctype html> -<title>Scheduling API: Signal inheritance</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let ac = new AbortController() - scheduler.postTask(() => { - scheduler.postTask(() => {}, { signal : scheduler.currentTaskSignal }).then( - () => { assert_unreached('This task should have been aborted'); }, - t.step_func_done()); - ac.abort(); - }, { signal: ac.signal }); -}, 'Test that currentTaskSignal wraps and follows an AbortSignal'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_abort.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_abort.any.js new file mode 100644 index 0000000..4c6e3341 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_abort.any.js
@@ -0,0 +1,13 @@ +// META: title=Scheduling API: Signal inheritance +// META: global=window +'use strict'; + +async_test(t => { + let ac = new AbortController() + scheduler.postTask(() => { + scheduler.postTask(() => {}, { signal : scheduler.currentTaskSignal }).then( + () => { assert_unreached('This task should have been aborted'); }, + t.step_func_done()); + ac.abort(); + }, { signal: ac.signal }); +}, 'Test that currentTaskSignal wraps and follows an AbortSignal');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_abort.html b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_abort.html deleted file mode 100644 index 70c26156..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_abort.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!doctype html> -<title>Scheduling API: Signal inheritance</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let tc = new TaskController("user-blocking"); - scheduler.postTask(async () => { - await new Promise(resolve => setTimeout(resolve, 0)); - scheduler.postTask(() => {}, { signal: scheduler.currentTaskSignal }).then( - () => { assert_unreached('This task should have been aborted'); }, - t.step_func_done()); - tc.abort(); - }, { signal: tc.signal }); -}, 'Test that currentTaskSignal works through promise resolution'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_priority.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_priority.any.js new file mode 100644 index 0000000..67009dff --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_priority.any.js
@@ -0,0 +1,12 @@ +// META: title=Scheduling API: Signal inheritance +// META: global=window +'use strict'; + +async_test(t => { + let tc = new TaskController("user-blocking"); + scheduler.postTask(async () => { + await new Promise(resolve => setTimeout(resolve, 0)); + assert_equals(scheduler.currentTaskSignal.priority, "user-blocking"); + t.done(); + }, { signal: tc.signal }); +}, 'Test that currentTaskSignal works through promise resolution');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_priority.html b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_priority.html deleted file mode 100644 index 94cbdcd..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_async_priority.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!doctype html> -<title>Scheduling API: Signal inheritance</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let tc = new TaskController("user-blocking"); - scheduler.postTask(async () => { - await new Promise(resolve => setTimeout(resolve, 0)); - assert_equals(scheduler.currentTaskSignal.priority, "user-blocking"); - t.done(); - }, { signal: tc.signal }); -}, 'Test that currentTaskSignal works through promise resolution'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_inherit_priority.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_inherit_priority.any.js new file mode 100644 index 0000000..59ed0d0c --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_inherit_priority.any.js
@@ -0,0 +1,9 @@ +// META: title=Scheduling API: Signal inheritance +// META: global=window +'use strict'; + +async_test(t => { + scheduler.postTask(t.step_func_done(() => { + assert_equals('user-blocking', scheduler.currentTaskSignal.priority); + }), { priority: "user-blocking" }); +}, 'Test that currentTaskSignal propagates priority even if an explicit signal was not given');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_inherit_priority.html b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_inherit_priority.html deleted file mode 100644 index 427af77..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_inherit_priority.html +++ /dev/null
@@ -1,17 +0,0 @@ -<!doctype html> -<title>Scheduling API: Signal inheritance</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - scheduler.postTask(t.step_func_done(() => { - assert_equals('user-blocking', scheduler.currentTaskSignal.priority); - }), { priority: "user-blocking" }); -}, 'Test that currentTaskSignal propagates priority even if an explicit signal was not given'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_thru_fetch.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_thru_fetch.any.js new file mode 100644 index 0000000..c3d84b0 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_thru_fetch.any.js
@@ -0,0 +1,14 @@ +// META: title=Scheduling API: Signal inheritance +// META: global=window +'use strict'; + +async_test(t => { + let tc = new TaskController("user-blocking"); + scheduler.postTask(async () => { + await fetch("support/dummy.txt"); + scheduler.postTask(() => {}, { signal: scheduler.currentTaskSignal }).then( + () => { assert_unreached('This task should have been aborted'); }, + t.step_func_done()); + tc.abort(); + }, { signal: tc.signal }); +}, 'Test that currentTaskSignal works through promise resolution');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_thru_fetch.html b/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_thru_fetch.html deleted file mode 100644 index df430fe..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/current_task_signal_thru_fetch.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!doctype html> -<title>Scheduling API: Signal inheritance</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let tc = new TaskController("user-blocking"); - scheduler.postTask(async () => { - await fetch("support/dummy.txt"); - scheduler.postTask(() => {}, { signal: scheduler.currentTaskSignal }).then( - () => { assert_unreached('This task should have been aborted'); }, - t.step_func_done()); - tc.abort(); - }, { signal: tc.signal }); -}, 'Test that currentTaskSignal works through promise resolution'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_delayed_task.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/post_delayed_task.any.js new file mode 100644 index 0000000..2d9401a7 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/post_delayed_task.any.js
@@ -0,0 +1,11 @@ +// META: title=Scheduling API: Post Delayed Tasks +// META: global=window +'use strict'; + +async_test(t => { + let now = performance.now(); + scheduler.postTask(t.step_func_done(() => { + let elapsed = performance.now() - now; + assert_greater_than_equal(elapsed, 10); + }), { priority: 'user-blocking', delay: 10 }); +}, 'Tests basic scheduler.postTask with a delay');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_delayed_task.html b/third_party/blink/web_tests/wpt_internal/scheduler/post_delayed_task.html deleted file mode 100644 index 824d201..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/post_delayed_task.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!doctype html> -<title>Scheduling API: Post Delayed Tasks</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let now = performance.now(); - scheduler.postTask(t.step_func_done(() => { - let elapsed = performance.now() - now; - assert_greater_than_equal(elapsed, 10); - }), { priority: 'user-blocking', delay: 10 }); -}, 'Tests basic scheduler.postTask with a delay'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_abort_signal.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_abort_signal.any.js new file mode 100644 index 0000000..af751b26 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_abort_signal.any.js
@@ -0,0 +1,17 @@ +// META: title=Scheduling API: postTask and AbortSignal +// META: global=window +'use strict'; + +async_test(t => { + let result = "fail"; + let ac = new AbortController; + scheduler.postTask(() => {}, { signal: ac.signal }).then( + () => { assert_unreached('This task should have been aborted'); }, + () => { result = "pass"; }); + ac.abort(); + + // The task should be aborted. + scheduler.postTask(t.step_func_done(() => { + assert_equals(result, "pass"); + })); +}, 'Test that scheduler.postTask() accepts an AbortSignal that is not also a TaskSignal');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_abort_signal.html b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_abort_signal.html deleted file mode 100644 index f6d128c..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_abort_signal.html +++ /dev/null
@@ -1,25 +0,0 @@ -<!doctype html> -<title>Scheduling API: postTask and AbortSignal</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let result = "fail"; - let ac = new AbortController; - scheduler.postTask(() => {}, { signal: ac.signal }).then( - () => { assert_unreached('This task should have been aborted'); }, - () => { result = "pass"; }); - ac.abort(); - - // The task should be aborted. - scheduler.postTask(t.step_func_done(() => { - assert_equals(result, "pass"); - })); -}, 'Test that scheduler.postTask() accepts an AbortSignal that is not also a TaskSignal'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_aborted_signal.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_aborted_signal.any.js new file mode 100644 index 0000000..d143825 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_aborted_signal.any.js
@@ -0,0 +1,10 @@ +// META: title=Scheduling API: postTask +// META: global=window +'use strict'; + +promise_test(t => { + const controller = new TaskController(); + const signal = controller.signal; + controller.abort(); + return promise_rejects_dom(t, 'AbortError', scheduler.postTask(() => {}, {signal})); +}, 'Posting a task with an aborted signal rejects with an AbortError');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_aborted_signal.html b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_aborted_signal.html deleted file mode 100644 index a380fb7a..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_aborted_signal.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!doctype html> -<title>Scheduling API: postTask</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://wicg.github.io/scheduling-apis/"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -promise_test(t => { - const controller = new TaskController(); - const signal = controller.signal; - controller.abort(); - return promise_rejects_dom(t, 'AbortError', scheduler.postTask(() => {}, {signal})); -}, 'Posting a task with an aborted signal rejects with an AbortError'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_signal_and_priority.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_signal_and_priority.any.js new file mode 100644 index 0000000..a1ab144 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_signal_and_priority.any.js
@@ -0,0 +1,15 @@ +// META: title=Scheduling API: Global Task Queues +// META: global=window +'use strict'; + +async_test(t => { + var result = "fail"; + let tc = new TaskController("background"); + scheduler.postTask(() => { result = "pass"; }, { priority : "user-blocking", signal: tc.signal }); + + // Since the above task should be run at user-blocking priority, it should execute + // before this user-visible priority task. + scheduler.postTask(t.step_func_done(() => { + assert_equals(result, "pass"); + })); +}, 'Test when scheduler.postTask() is passed both a signal and a priority');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_signal_and_priority.html b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_signal_and_priority.html deleted file mode 100644 index 525d56f..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_with_signal_and_priority.html +++ /dev/null
@@ -1,23 +0,0 @@ -<!doctype html> -<title>Scheduling API: Global Task Queues</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - var result = "fail"; - let tc = new TaskController("background"); - scheduler.postTask(() => { result = "pass"; }, { priority : "user-blocking", signal: tc.signal }); - - // Since the above task should be run at user-blocking priority, it should execute - // before this user-visible priority task. - scheduler.postTask(t.step_func_done(() => { - assert_equals(result, "pass"); - })); -}, 'Test when scheduler.postTask() is passed both a signal and a priority'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_without_signals.html b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_without_signals.any.js similarity index 68% rename from third_party/blink/web_tests/wpt_internal/scheduler/post_task_without_signals.html rename to third_party/blink/web_tests/wpt_internal/scheduler/post_task_without_signals.any.js index 644e22b59..7e161301d 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/post_task_without_signals.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/post_task_without_signals.any.js
@@ -1,11 +1,5 @@ -<!doctype html> -<title>Scheduling API: Global Task Queues</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> +// META: title=Scheduling API: Global Task Queues +// META: global=window 'use strict'; async_test(t => { @@ -39,5 +33,3 @@ nextTaskQueue(); })); }, 'Basic functionality for scheduler.postTask() without using a task signal'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort.any.js similarity index 73% rename from third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort.html rename to third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort.any.js index 6c32dfd..04f4b89 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort.any.js
@@ -1,11 +1,5 @@ -<!doctype html> -<title>Scheduling API: Task Cancellation</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> +// META: title=Scheduling API: Task Cancellation +// META: global=window 'use strict'; async_test(t => { @@ -43,5 +37,3 @@ }), { signal: final_task_tc.signal }); }, 'Test canceling a task'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort_with_custom_priority.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort_with_custom_priority.any.js similarity index 65% rename from third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort_with_custom_priority.html rename to third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort_with_custom_priority.any.js index 6a26dba4..65264120 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort_with_custom_priority.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_abort_with_custom_priority.any.js
@@ -1,11 +1,5 @@ -<!doctype html> -<title>Scheduling API: TaskController.abort()</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> +// META: title=Scheduling API: TaskController.abort() +// META: global=window 'use strict'; async_test(t => { @@ -25,5 +19,3 @@ }), { priority: "background" }); }, 'Test that when scheduler.postTask() is given both a signal and priority. the signal abort is honored'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_setPriority.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_setPriority.any.js similarity index 64% rename from third_party/blink/web_tests/wpt_internal/scheduler/task_controller_setPriority.html rename to third_party/blink/web_tests/wpt_internal/scheduler/task_controller_setPriority.any.js index 0610cfa6..702b0eac 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_setPriority.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_controller_setPriority.any.js
@@ -1,11 +1,5 @@ -<!doctype html> -<title>Scheduling API: TaskController.setPriority()</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> +// META: title=Scheduling API: TaskController.setPriority() +// META: global=window 'use strict'; async_test(t => { @@ -28,5 +22,3 @@ }), { priority: "background" }); }, 'Test that TaskController.setPriority() changes the priority of all associated tasks'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_order.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_order.any.js similarity index 68% rename from third_party/blink/web_tests/wpt_internal/scheduler/task_order.html rename to third_party/blink/web_tests/wpt_internal/scheduler/task_order.any.js index c7d7536..658996e 100644 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_order.html +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_order.any.js
@@ -1,12 +1,5 @@ -<!doctype html> -<title>Scheduling API: Tasks Run in Priority Order</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; +// META: title=Scheduling API: Tasks Run in Priority Order +// META: global=window async_test(t => { let result = ''; @@ -34,5 +27,3 @@ assert_equals(result, 'UB1 UB2 UV1 UV2 B1 B2'); }), { priority: 'background' }); }, 'Test scheduler.postTask task run in priority order'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_priority_change_error_on_recursive_call.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_priority_change_error_on_recursive_call.any.js new file mode 100644 index 0000000..c07e107 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_priority_change_error_on_recursive_call.any.js
@@ -0,0 +1,12 @@ +// META: title=Scheduling API: Recursive TaskController.setPriority() +// META: global=window +'use strict'; + +async_test(t => { + let tc = new TaskController("user-visible"); + tc.signal.onprioritychange = t.step_func_done(() => { + assert_equals(tc.signal.priority, "background"); + assert_throws_dom("NotAllowedError", () => { tc.setPriority("user-blocking"); }); + }); + tc.setPriority("background"); +}, 'Test that TaskController.setPriority() throws an error if called recursively');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_priority_change_error_on_recursive_call.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_priority_change_error_on_recursive_call.html deleted file mode 100644 index a4772dcde..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_priority_change_error_on_recursive_call.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!doctype html> -<title>Scheduling API: Recursive TaskController.setPriority()</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/scheduling-APIs"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let tc = new TaskController("user-visible"); - tc.signal.onprioritychange = t.step_func_done(() => { - assert_equals(tc.signal.priority, "background"); - assert_throws_dom("NotAllowedError", () => { tc.setPriority("user-blocking"); }); - }); - tc.setPriority("background"); -}, 'Test that TaskController.setPriority() throws an error if called recursively'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_after_task_runs.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_after_task_runs.any.js new file mode 100644 index 0000000..fb26fa9a --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_after_task_runs.any.js
@@ -0,0 +1,18 @@ +// META: title=Scheduling API: Task.result Accessed After Task Runs +// META: global=window +'use strict'; + +async_test(t => { + (function() { + let task_promise = scheduler.postTask(t.step_func(() => { + // This task will run after |task| finishes. + scheduler.postTask(t.step_func(() => { + task_promise.then(t.step_func_done((res) => { + assert_equals(res, 1234); + })); + })); + return 1234; + })); + })(); + +}, 'Test task result is resolved properly when accessed after the task runs');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_after_task_runs.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_after_task_runs.html deleted file mode 100644 index be94a4b7..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_after_task_runs.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!doctype html> -<title>Scheduling API: Task.result Accessed After Task Runs</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - (function() { - let task_promise = scheduler.postTask(t.step_func(() => { - // This task will run after |task| finishes. - scheduler.postTask(t.step_func(() => { - task_promise.then(t.step_func_done((res) => { - assert_equals(res, 1234); - })); - })); - return 1234; - })); - })(); - -}, 'Test task result is resolved properly when accessed after the task runs'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_before_task_runs.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_before_task_runs.any.js new file mode 100644 index 0000000..4b5994b --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_before_task_runs.any.js
@@ -0,0 +1,11 @@ +// META: title=Scheduling API: Task.result Accessed Before Task Runs +// META: global=window +'use strict'; + +async_test(t => { + (function() { + scheduler.postTask(() => 1234).then(t.step_func_done((res) => { + assert_equals(res, 1234); + })); + })(); +}, 'Test task result is resolved properly when accessed before the task runs');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_before_task_runs.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_before_task_runs.html deleted file mode 100644 index f5a39eb..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_access_result_before_task_runs.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!doctype html> -<title>Scheduling API: Task.result Accessed Before Task Runs</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - (function() { - scheduler.postTask(() => 1234).then(t.step_func_done((res) => { - assert_equals(res, 1234); - })); - })(); -}, 'Test task result is resolved properly when accessed before the task runs'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_after_accessing_result.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_after_accessing_result.any.js new file mode 100644 index 0000000..ea19065 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_after_accessing_result.any.js
@@ -0,0 +1,17 @@ +// META: title=Scheduling API: Canceling Task Rejects Task.result (After Accessing Result) +// META: global=window +'use strict'; + +async_test(t => { + (function() { + let tc = new TaskController(); + let task_promise = scheduler.postTask(() => 1234, { signal: tc.signal }); + task_promise.then(t.step_func((res) => { + assert_true(false, 'task promise should not be fulfilled when the task is canceled.'); + })) + .catch(t.step_func_done((e) => { + assert_equals(e.name, 'AbortError'); + })); + tc.abort(); + })(); +}, 'Test task result is rejected properly when the task is canceled after accessing the result');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_after_accessing_result.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_after_accessing_result.html deleted file mode 100644 index 1b1c3f4c..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_after_accessing_result.html +++ /dev/null
@@ -1,25 +0,0 @@ -<!doctype html> -<title>Scheduling API: Canceling Task Rejects Task.result (After Accessing Result)</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - (function() { - let tc = new TaskController(); - let task_promise = scheduler.postTask(() => 1234, { signal: tc.signal }); - task_promise.then(t.step_func((res) => { - assert_true(false, 'task promise should not be fulfilled when the task is canceled.'); - })) - .catch(t.step_func_done((e) => { - assert_equals(e.name, 'AbortError'); - })); - tc.abort(); - })(); -}, 'Test task result is rejected properly when the task is canceled after accessing the result'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_before_accessing_result.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_before_accessing_result.any.js new file mode 100644 index 0000000..1dc3f3a --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_before_accessing_result.any.js
@@ -0,0 +1,17 @@ +// META: title=Scheduling API: Canceling Task Rejects Task.result (Beforre Accessing Result) +// META: global=window +'use strict'; + +async_test(t => { + (function() { + let tc = new TaskController(); + let task_promise = scheduler.postTask(() => 1234, { signal: tc.signal }); + tc.abort(); + task_promise.then(t.step_func((res) => { + assert_true(false, 'task promise should not be fulfilled when the task is canceled.'); + })) + .catch(t.step_func_done((e) => { + assert_equals(e.name, 'AbortError'); + })); + })(); +}, 'Test task result is rejected properly when the task is canceled before accessing the result');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_before_accessing_result.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_before_accessing_result.html deleted file mode 100644 index 952f823..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_cancel_before_accessing_result.html +++ /dev/null
@@ -1,25 +0,0 @@ -<!doctype html> -<title>Scheduling API: Canceling Task Rejects Task.result (Beforre Accessing Result)</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - (function() { - let tc = new TaskController(); - let task_promise = scheduler.postTask(() => 1234, { signal: tc.signal }); - tc.abort(); - task_promise.then(t.step_func((res) => { - assert_true(false, 'task promise should not be fulfilled when the task is canceled.'); - })) - .catch(t.step_func_done((e) => { - assert_equals(e.name, 'AbortError'); - })); - })(); -}, 'Test task result is rejected properly when the task is canceled before accessing the result'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_error.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_error.any.js new file mode 100644 index 0000000..c0d195f6 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_error.any.js
@@ -0,0 +1,16 @@ +// META: title=Scheduling API: Task.result When a Task Throws an Error +// META: global=window +'use strict'; + +async_test(t => { + (function() { + let task_promise = scheduler.postTask(() => { throw Error('Failed'); }); + task_promise.then(t.step_func((res) => { + assert_true(false, 'task promise should not be fulfilled when the task throws an error.'); + })) + .catch(t.step_func_done((e) => { + assert_equals(e.name, 'Error'); + assert_equals(e.message, 'Failed'); + })); + })(); +}, 'Test task promise is rejected properly when the task throws an error');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_error.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_result_error.html deleted file mode 100644 index dc24c2f8..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_result_error.html +++ /dev/null
@@ -1,24 +0,0 @@ -<!doctype html> -<title>Scheduling API: Task.result When a Task Throws an Error</title> -<link rel="author" title="Scott Haseley" href="mailto:shaseley@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - (function() { - let task_promise = scheduler.postTask(() => { throw Error('Failed'); }); - task_promise.then(t.step_func((res) => { - assert_true(false, 'task promise should not be fulfilled when the task throws an error.'); - })) - .catch(t.step_func_done((e) => { - assert_equals(e.name, 'Error'); - assert_equals(e.message, 'Failed'); - })); - })(); -}, 'Test task promise is rejected properly when the task throws an error'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_signal_onprioritychange.any.js b/third_party/blink/web_tests/wpt_internal/scheduler/task_signal_onprioritychange.any.js new file mode 100644 index 0000000..0817eb39 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/scheduler/task_signal_onprioritychange.any.js
@@ -0,0 +1,14 @@ +// META: title=Scheduling API: TaskController.setPriority() +// META: global=window +'use strict'; + +async_test(t => { + let tc = new TaskController("user-visible"); + tc.signal.onprioritychange = t.step_func_done((event) => { + assert_equals(tc.signal.priority, "background"); + assert_equals(event.type, "prioritychange"); + assert_equals(event.target.priority, "background"); + assert_equals(event.previousPriority, "user-visible"); + }); + tc.setPriority("background"); +}, 'Test that TaskController.setPriority() triggers an onprioritychange event on the signal');
diff --git a/third_party/blink/web_tests/wpt_internal/scheduler/task_signal_onprioritychange.html b/third_party/blink/web_tests/wpt_internal/scheduler/task_signal_onprioritychange.html deleted file mode 100644 index 6b4c7ee..0000000 --- a/third_party/blink/web_tests/wpt_internal/scheduler/task_signal_onprioritychange.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!doctype html> -<title>Scheduling API: TaskController.setPriority()</title> -<link rel="author" title="Nate Chapin" href="mailto:japhet@chromium.org"> -<link rel="help" href="https://github.com/WICG/main-thread-scheduling"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> -'use strict'; - -async_test(t => { - let tc = new TaskController("user-visible"); - tc.signal.onprioritychange = t.step_func_done((event) => { - assert_equals(tc.signal.priority, "background"); - assert_equals(event.type, "prioritychange"); - assert_equals(event.target.priority, "background"); - assert_equals(event.previousPriority, "user-visible"); - }); - tc.setPriority("background"); -}, 'Test that TaskController.setPriority() triggers an onprioritychange event on the signal'); - -</script>
diff --git a/third_party/googletest/custom/gtest/internal/custom/chrome_custom_temp_dir.cc b/third_party/googletest/custom/gtest/internal/custom/chrome_custom_temp_dir.cc index 73ef2fb..52c4bd09 100644 --- a/third_party/googletest/custom/gtest/internal/custom/chrome_custom_temp_dir.cc +++ b/third_party/googletest/custom/gtest/internal/custom/chrome_custom_temp_dir.cc
@@ -74,9 +74,31 @@ return "/sdcard/"; // Generic POSIX fallback. return "/tmp/"; +#elif GTEST_OS_IOS + char name_template[PATH_MAX + 1]; + + // Documented alternative to NSTemporaryDirectory() (for obtaining creating + // a temporary directory) at + // https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html#//apple_ref/doc/uid/TP40002585-SW10 + // + // _CS_DARWIN_USER_TEMP_DIR (as well as _CS_DARWIN_USER_CACHE_DIR) is not + // documented in the confstr() man page at + // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/confstr.3.html#//apple_ref/doc/man/3/confstr + // but are still available, according to the WebKit patches at + // https://trac.webkit.org/changeset/262004/webkit + // https://trac.webkit.org/changeset/263705/webkit + // + // The confstr() implementation falls back to getenv("TMPDIR"). See + // https://opensource.apple.com/source/Libc/Libc-1439.100.3/gen/confstr.c.auto.html + ::confstr(_CS_DARWIN_USER_TEMP_DIR, name_template, sizeof(name_template)); + + temp_dir = name_template; + if (temp_dir.back() != GTEST_PATH_SEP_[0]) + temp_dir.push_back(GTEST_PATH_SEP_[0]); + return temp_dir; #else return "/tmp/"; -#endif // GTEST_OS_WINDOWS_MOBILE +#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS } } // namespace testing
diff --git a/third_party/webxr_test_pages/webxr-samples/tests/permission-request.html b/third_party/webxr_test_pages/webxr-samples/tests/permission-request.html index 15e750ce..d057156 100644 --- a/third_party/webxr_test_pages/webxr-samples/tests/permission-request.html +++ b/third_party/webxr_test_pages/webxr-samples/tests/permission-request.html
@@ -260,10 +260,10 @@ icon: '../test-media/third-party/screen-share-button.png', callback: (success, fail) => { let promise = null; - if (navigator.mediaDevices.getDisplayMedia == null) { - promise = navigator.mediaDevices.getCurrentBrowsingContextMedia({video:true}); - } else { + if (navigator.mediaDevices.getCurrentBrowsingContextMedia == null) { promise = navigator.mediaDevices.getDisplayMedia(); + } else { + promise = navigator.mediaDevices.getCurrentBrowsingContextMedia({video:true}); } promise.then(device => {
diff --git a/tools/gritsettings/startup_resources_mac.txt b/tools/gritsettings/startup_resources_mac.txt index bb505acf..8d2c20d1 100644 --- a/tools/gritsettings/startup_resources_mac.txt +++ b/tools/gritsettings/startup_resources_mac.txt
@@ -1,4 +1,3 @@ -IDS_PROFILES_OPTIONS_GROUP_NAME 101 IDS_APP_MENU_PRODUCT_NAME 102 IDS_PRODUCT_NAME 103 IDS_ABOUT_MAC 104
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 3b5a348d..e14cd76 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -573,6 +573,7 @@ 'chromium.perf.calibration': { 'linux-perf-calibration': 'official_goma_linux_perf', + 'android-pixel2-perf-calibration': 'official_goma_minimal_symbols_android_arm64', }, 'chromium.perf.fyi': { @@ -995,6 +996,7 @@ 'gpu-try-linux-nvidia-rel': 'gpu_tests_release_trybot', 'layout_test_leak_detection': 'release_trybot', 'leak_detection_linux': 'release_trybot', + 'linux-1mbu-compile-fyi-rel': 'release_trybot', 'linux-annotator-rel': 'release_trybot', 'linux-autofill-assistant': 'autofill_assistant_release_trybot', 'linux-blink-heap-concurrent-marking-tsan-rel': 'release_trybot_tsan',
diff --git a/tools/mb/mb_config_expectations/chromium.perf.calibration.json b/tools/mb/mb_config_expectations/chromium.perf.calibration.json index 8254354..be07a91 100644 --- a/tools/mb/mb_config_expectations/chromium.perf.calibration.json +++ b/tools/mb/mb_config_expectations/chromium.perf.calibration.json
@@ -1,4 +1,19 @@ { + "android-pixel2-perf-calibration": { + "gn_args": { + "chrome_pgo_phase": 0, + "clang_use_default_sample_profile": false, + "ffmpeg_branding": "Chrome", + "is_chrome_branded": true, + "is_official_build": true, + "proprietary_codecs": true, + "strip_absolute_paths_from_debug_symbols": true, + "symbol_level": 1, + "target_cpu": "arm64", + "target_os": "android", + "use_goma": true + } + }, "linux-perf-calibration": { "gn_args": { "chrome_pgo_phase": 0,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json index f60cf63a..622fd83 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -387,6 +387,15 @@ "use_goma": true } }, + "linux-1mbu-compile-fyi-rel": { + "gn_args": { + "dcheck_always_on": true, + "is_component_build": false, + "is_debug": false, + "symbol_level": 1, + "use_goma": true + } + }, "linux-annotator-rel": { "gn_args": { "dcheck_always_on": true,
diff --git a/tools/mb/rts_banned_suites.json b/tools/mb/rts_banned_suites.json index 5317924..48b0ff6 100644 --- a/tools/mb/rts_banned_suites.json +++ b/tools/mb/rts_banned_suites.json
@@ -9,7 +9,8 @@ "grit_python_unittests", "telemetry_perf_unittests", "maps_tests", - "telemetry_gpu_unittests" + "telemetry_gpu_unittests", + "telemetry_gpu_integration_test" ], "fuchsia_x64_rts": [ "blink_web_tests"
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 38e2b49..982047c 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -28376,6 +28376,8 @@ <suffix name="ReadingListEntryPoint" label="For ReadingListEntryPoint feature."/> <suffix name="ReopenTab" label="For ReopenTab feature."/> + <suffix name="SharedHighlightingBuilder" + label="For SharedHighlightingBuilder feature."/> <suffix name="TabGroupsDragAndDrop" label="For drop-to-merge in tab group."/> <suffix name="TabGroupsQuicklyComparePages" label="For long press links to create tab groups."/>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 8ce1347..599c4073 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -9699,6 +9699,19 @@ <int value="9" label="INTERACTION_COMPLETE"/> </enum> +<enum name="BreakoutBoxUsage"> + <int value="0" label="ReadableVideo"/> + <int value="1" label="ReadableVideoWorker"/> + <int value="2" label="ReadableAudio"/> + <int value="3" label="ReadableAudioWorker"/> + <int value="4" label="WritableVideo"/> + <int value="5" label="WritableVideoWorker"/> + <int value="6" label="WritableAudio"/> + <int value="7" label="WritableAudioWorker"/> + <int value="8" label="ReadableControlVideo"/> + <int value="9" label="WritableControlVideo"/> +</enum> + <enum name="BrokenAlternateProtocolLocation"> <int value="0" label="HTTP_STREAM_FACTORY_JOB"/> <int value="1" label="QUIC_STREAM_FACTORY"/> @@ -82311,6 +82324,22 @@ <int value="1" label="Android Wallpapers App"/> </enum> +<enum name="WallpaperCollection"> + <int value="-1750392449" label="Landscapes"/> + <int value="-1479919333" label="Made by Canvas"/> + <int value="-1094276707" label="Element"/> + <int value="-917389828" label="Collage"/> + <int value="-622998436" label="Imaginary"/> + <int value="711032077" label="Cityscapes"/> + <int value="1129315377" label="Composition"/> + <int value="1659755048" label="Illustrations"/> + <int value="1668389814" label="Art"/> + <int value="1804492839" label="Colors"/> + <int value="1894705443" label="Leisure"/> + <int value="2084467495" label="Dessert time"/> + <int value="2094027636" label="Solid colors"/> +</enum> + <enum name="WallpaperColorExtractionResult"> <int value="0" label="(Dark, Vibrant): failure"/> <int value="1" label="(Dark, Vibrant): success"/>
diff --git a/tools/metrics/histograms/histograms_xml/ash/histograms.xml b/tools/metrics/histograms/histograms_xml/ash/histograms.xml index af6336c..b89a7b1 100644 --- a/tools/metrics/histograms/histograms_xml/ash/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/ash/histograms.xml
@@ -2616,6 +2616,17 @@ </summary> </histogram> +<histogram name="Ash.Wallpaper.Collection" enum="WallpaperCollection" + expires_after="2022-05-17"> + <owner>jasontt@chromium.org</owner> + <owner>assistive-eng@google.com</owner> + <summary> + The wallpaper collection of the selected online wallpaper. Recorded each + time the online wallpaper image is selected, but not when wallpaper is + automatically refreshed. + </summary> +</histogram> + <histogram name="Ash.Wallpaper.ColorExtractionResult2" enum="WallpaperColorExtractionResult" expires_after="M92"> <owner>newcomer@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml index d27c80c..c5e2d43b 100644 --- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -8261,6 +8261,9 @@ tab to reading list."/> <suffix name="IPH_ReopenTab" label="In product help for reopening closed tabs."/> + <suffix name="IPH_SharedHighlightingBuilder" + label="The in product help message to notify the user that the share + action can preemptively share a link-to-text."/> <suffix name="IPH_TabGroupsDragAndDrop" label="In product help for educating user to drop one tab on another tab to create group."/> @@ -14686,15 +14689,6 @@ <affected-histogram name="Power.CpuTimeSecondsPerCoreTypeAndFrequency"/> </histogram_suffixes> -<histogram_suffixes name="Power_CpuTimeProcessTypes" separator="."> - <suffix name="Browser" label=""/> - <suffix name="GPU" label=""/> - <suffix name="Other" label=""/> - <suffix name="Renderer" label=""/> - <affected-histogram name="Power.CpuTimeSecondsPerPowerMode"/> - <affected-histogram name="Power.CpuTimeSecondsPerThreadType"/> -</histogram_suffixes> - <histogram_suffixes name="PowerConsumptionSources" separator="."> <suffix name="CPU" label="Instantaneous power used by the CPU."/> <suffix name="GPU0"
diff --git a/tools/metrics/histograms/histograms_xml/local/histograms.xml b/tools/metrics/histograms/histograms_xml/local/histograms.xml index 854f5c4..46bf875 100644 --- a/tools/metrics/histograms/histograms_xml/local/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/local/histograms.xml
@@ -362,6 +362,9 @@ <histogram name="LocalStorageContext.MigrationFixUpNeeded" enum="Boolean" expires_after="M87"> + <obsolete> + Removed May 2021 as part of legacy migration code cleanup. + </obsolete> <owner>mek@chromium.org</owner> <summary> Whether or not any fixes needed to be made to localstorage data, as a result
diff --git a/tools/metrics/histograms/histograms_xml/media/histograms.xml b/tools/metrics/histograms/histograms_xml/media/histograms.xml index 128b2e9..dd85640 100644 --- a/tools/metrics/histograms/histograms_xml/media/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/media/histograms.xml
@@ -1291,6 +1291,17 @@ </summary> </histogram> +<histogram name="Media.BreakoutBox.Usage" enum="BreakoutBoxUsage" + expires_after="2022-05-21"> + <owner>guidou@chromium.org</owner> + <owner>hta@chromium.org</owner> + <owner>tguilbert@chromium.org</owner> + <summary> + Usage of various BreakoutBox features. Recorded when a stream is created or + transferred in MediaStreamTrackProcessor or MediaStreamTrackGenerator. + </summary> +</histogram> + <histogram name="Media.Capabilities.DecodingInfo.Time.Video" units="ms" expires_after="2021-10-04"> <owner>chcunningham@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/power/histograms.xml b/tools/metrics/histograms/histograms_xml/power/histograms.xml index e144507..4dd4514 100644 --- a/tools/metrics/histograms/histograms_xml/power/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/power/histograms.xml
@@ -291,22 +291,28 @@ </summary> </histogram> -<histogram name="Power.CpuTimeSecondsPerPowerMode" enum="PowerMode" - expires_after="2021-12-31"> +<histogram name="Power.CpuTimeSecondsPerPowerMode.{ProcessType}" + enum="PowerMode" expires_after="2021-12-31"> <owner>eseckler@chromium.org</owner> <owner>skyostil@chromium.org</owner> <summary> - Total seconds of CPU time consumed by Chrome, split by process type and - power mode. Currently only implemented on Android. For every second of CPU - time consumed by a process of the chosen type, while a specific PowerMode - was active, a sample is recorded into the bucket for the PowerMode. Samples - are recorded periodically depending on the task load of each process's main - thread. The histogram thus shows the total sum of CPU time seconds spent per - PowerMode within all processes of the chosen type across all users. + Total seconds of CPU time consumed by Chrome's {ProcessType} process, split + by power mode. Currently only implemented on Android. For every second of + CPU time consumed by the process, while a specific PowerMode was active, a + sample is recorded into the bucket for the PowerMode. Samples are recorded + periodically depending on the task load of each process's main thread. The + histogram thus shows the total sum of CPU time seconds spent per PowerMode + within all {ProcessType} processes across all users. For a histogram of daily per-user values, select "Per-Client Aggregation Mode". </summary> + <token key="ProcessType"> + <variant name="Browser" summary="browser"/> + <variant name="GPU" summary="GPU"/> + <variant name="Other" summary="other type of"/> + <variant name="Renderer" summary="renderer"/> + </token> </histogram> <histogram name="Power.CpuTimeSecondsPerProcessType" enum="ProcessType2" @@ -349,24 +355,30 @@ </token> </histogram> -<histogram name="Power.CpuTimeSecondsPerThreadType" +<histogram name="Power.CpuTimeSecondsPerThreadType.{ProcessType}" enum="CpuTimeMetricsThreadType" expires_after="2021-10-10"> <owner>eseckler@chromium.org</owner> <owner>skyostil@chromium.org</owner> <summary> - Total seconds of CPU time consumed by Chrome, split by process type and - thread type. Currently only implemented on Android. For every second of CPU - time consumed by one thread, a sample is recorded into the bucket for the - thread's type. CPU time consumed by a process that cannot be attributed to a - specific thread is recorded into the "UnattributedThread" bucket. - Samples are recorded periodically depending on the task load of each + Total seconds of CPU time consumed by Chrome's {ProcessType} process, split + by thread type. Currently only implemented on Android. For every second of + CPU time consumed by one thread, a sample is recorded into the bucket for + the thread's type. CPU time consumed by a process that cannot be attributed + to a specific thread is recorded into the "UnattributedThread" + bucket. Samples are recorded periodically depending on the task load of each process's main thread. The histogram thus shows the total sum of CPU time - seconds spent per thread type (within processes of a specific type) across - all users. + seconds spent per thread type (within {ProcessType} processes) across all + users. For a histogram of daily per-user values, select "Per-Client Aggregation Mode". </summary> + <token key="ProcessType"> + <variant name="Browser" summary="browser"/> + <variant name="GPU" summary="GPU"/> + <variant name="Other" summary="other type of"/> + <variant name="Renderer" summary="renderer"/> + </token> </histogram> <histogram name="Power.DarkResumeWakeDurationMs" units="ms" expires_after="M85"> @@ -1021,6 +1033,19 @@ </summary> </histogram> +<histogram name="Power.PowerScheduler.ThrottlingDurationPerCpuAffinityMode" + enum="CpuAffinityMode" expires_after="2021-10-29"> + <owner>eseckler@chromium.org</owner> + <owner>skyostil@chromium.org</owner> + <summary> + Duration in milliseconds during which CPU throttling was active, split by + the CPU affinity for that duration. Only recorded when a CPU throttling + policy is active (e.g. throttle while idle). A sample is recorded every time + throttling stops (e.g. when exiting idle state), on the order of once per + second. + </summary> +</histogram> + <histogram name="Power.PowerSupplyMaxPower" units="W" expires_after="2021-10-31"> <owner>bleung@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index c3257a7c..3730b15 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -669,6 +669,7 @@ FYI_PLATFORMS = { p for p in ALL_PLATFORMS if p.is_fyi } +CALIBRATION_PLATFORMS = {p for p in ALL_PLATFORMS if p.is_calibration} OFFICIAL_PLATFORMS = {p for p in ALL_PLATFORMS if p.is_official} ALL_PLATFORM_NAMES = { p.name for p in ALL_PLATFORMS
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 7a4d33e..144898a8 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -9,8 +9,8 @@ "remote_path": "perfetto_binaries/trace_processor_shell/mac/09ac375b1cd018988ad890c78b44f6731bf301dc/trace_processor_shell" }, "linux": { - "hash": "9076c8b15696207c77b63956250bee3969d86d35", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/1cbe5e703e4de134fd35b97b445c4008f6316fea/trace_processor_shell" + "hash": "e05c613f05fbfeefb3d15bb7ae4f545d50eb6f77", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/78af063a636c83fbaafa05a1af2b6a41dc6bc40e/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/cross_device_test_config.py b/tools/perf/cross_device_test_config.py index b6148552..dcef114 100644 --- a/tools/perf/cross_device_test_config.py +++ b/tools/perf/cross_device_test_config.py
@@ -28,8 +28,6 @@ 'css_transitions_triggered_style_element': 4, 'canvas_animation_no_clear': 4 }, - 'system_health.common_mobile': 3, - 'system_health.memory_mobile': 3, }, 'android-pixel2-perf': { 'system_health.common_mobile': 3,
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index e0685e3..9243851 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -25,8 +25,11 @@ import cross_device_test_config from core import path_util +path_util.AddTelemetryToPath() + from core import upload_results_to_perf_dashboard from core import results_merger +from core import bot_platforms path_util.AddAndroidPylibToPath() @@ -362,6 +365,10 @@ # we are deprecating perf-id crbug.com/817823 configuration_name = build_properties_map['buildername'] + _update_perf_results_for_calibration(benchmarks_shard_map_file, + benchmark_enabled_map, + benchmark_directory_map, + configuration_name) if not smoke_test_mode and handle_perf: try: return_code, benchmark_upload_result_map = _handle_perf_results( @@ -500,6 +507,91 @@ return 4 +def _load_shard_id_from_test_results(directory): + shard_id = None + test_json_path = os.path.join(directory, 'test_results.json') + try: + with open(test_json_path) as f: + test_json = json.load(f) + all_results = test_json['tests'] + for _, benchmark_results in all_results.items(): + for _, measurement_result in benchmark_results.items(): + shard_id = measurement_result['shard'] + break + except IOError as e: + logging.error('Failed to open test_results.json from %s: %s', + test_json_path, e) + except KeyError as e: + logging.error('Failed to locate results in test_results.json: %s', e) + return shard_id + + +def _find_device_id_by_shard_id(benchmarks_shard_map_file, shard_id): + try: + with open(benchmarks_shard_map_file) as f: + shard_map_json = json.load(f) + device_id = shard_map_json['extra_infos']['bot #%s' % shard_id] + except KeyError as e: + logging.error('Failed to locate device name in shard map: %s', e) + return device_id + + +def _update_perf_json_with_summary_on_device_id(directory, device_id): + perf_json_path = os.path.join(directory, 'perf_results.json') + try: + with open(perf_json_path, 'r') as f: + perf_json = json.load(f) + except IOError as e: + logging.error('Failed to open perf_results.json from %s: %s', + perf_json_path, e) + summary_key_guid = str(uuid.uuid4()) + summary_key_generic_set = { + 'value': ['device_id'], + 'guid': summary_key_guid, + 'type': 'GenericSet' + } + perf_json.insert(0, summary_key_generic_set) + stories_guids = set() + for entry in perf_json: + if 'diagnostics' in entry: + entry['diagnostics']['summaryKeys'] = summary_key_guid + stories_guids.add(entry['diagnostics']['stories']) + for entry in perf_json: + if 'guid' in entry and entry['guid'] in stories_guids: + entry['values'].append(device_id) + try: + with open(perf_json_path, 'w') as f: + json.dump(perf_json, f) + except IOError as e: + logging.error('Failed to writing perf_results.json to %s: %s', + perf_json_path, e) + + +def _should_add_device_id_in_perf_result(builder_name): + # We should always add device id in calibration builders. + # For testing purpose, adding fyi as well for faster turnaround, because + # calibration builders run every 24 hours. + return (builder_name in bot_platforms.CALIBRATION_PLATFORMS) or ( + builder_name == 'android-pixel2-perf-fyi') + + +def _update_perf_results_for_calibration(benchmarks_shard_map_file, + benchmark_enabled_map, + benchmark_directory_map, + configuration_name): + if not _should_add_device_id_in_perf_result(configuration_name): + return + logging.info('Updating perf results for %s.', configuration_name) + for benchmark_name, directories in benchmark_directory_map.items(): + if not benchmark_enabled_map.get(benchmark_name, False): + continue + for directory in directories: + shard_id = _load_shard_id_from_test_results(directory) + device_id = _find_device_id_by_shard_id(benchmarks_shard_map_file, + shard_id) + _update_perf_json_with_summary_on_device_id(directory, device_id) + + def _handle_perf_results( benchmark_enabled_map, benchmark_directory_map, configuration_name, build_properties, extra_links, output_results_dir):
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc index e6cf4b3..a4b8306 100644 --- a/ui/accessibility/ax_node.cc +++ b/ui/accessibility/ax_node.cc
@@ -1536,10 +1536,15 @@ // contents. See https://crbug.com/689204. // So we decided to not enforce the leafiness of buttons and expose all // children. - // Images are not leaves because the same role is used for image maps, - // which can have link and/or text children. case ax::mojom::Role::kButton: return false; + case ax::mojom::Role::kImage: { + // Images are not leaves when they are image maps. Therefore, do not + // truncate descendants except in the case where ARIA role=img. + std::string role = + data().GetStringAttribute(ax::mojom::StringAttribute::kRole); + return role == "img" || role == "image"; + } case ax::mojom::Role::kDocCover: case ax::mojom::Role::kGraphicsSymbol: case ax::mojom::Role::kMeter:
diff --git a/ui/aura/native_window_occlusion_tracker_win.cc b/ui/aura/native_window_occlusion_tracker_win.cc index 7146e55..974ffd8 100644 --- a/ui/aura/native_window_occlusion_tracker_win.cc +++ b/ui/aura/native_window_occlusion_tracker_win.cc
@@ -180,9 +180,12 @@ // Filter out "tool windows", which are floating windows that do not appear on // the taskbar or ALT-TAB. Floating windows can have larger window rectangles // than what is visible to the user, so by filtering them out we will avoid - // incorrectly marking native windows as occluded. - if (ex_styles & WS_EX_TOOLWINDOW) - return false; + // incorrectly marking native windows as occluded. We do not filter out the + // Windows Taskbar. + if (ex_styles & WS_EX_TOOLWINDOW) { + if (gfx::GetClassName(hwnd) != L"Shell_TrayWnd") + return false; + } // Filter out layered windows that are not opaque or that set a transparency // colorkey. @@ -230,15 +233,36 @@ return false; // Ignore popup windows since they're transient unless it is a Chrome Widget - // Window. + // Window or the Windows Taskbar if (::GetWindowLong(hwnd, GWL_STYLE) & WS_POPUP) { - if (!base::StartsWith(gfx::GetClassName(hwnd), L"Chrome_WidgetWin_")) { + std::wstring hwnd_class_name = gfx::GetClassName(hwnd); + if (!base::StartsWith(hwnd_class_name, L"Chrome_WidgetWin_") && + hwnd_class_name != L"Shell_TrayWnd") { return false; } } *window_rect = gfx::Rect(win_rect); + WINDOWPLACEMENT window_placement = {0}; + window_placement.length = sizeof(WINDOWPLACEMENT); + ::GetWindowPlacement(hwnd, &window_placement); + if (window_placement.showCmd == SW_MAXIMIZE) { + // If the window is maximized the window border extends beyond the visible + // region of the screen. Adjust the maximized window rect to fit the + // screen dimensions to ensure that fullscreen windows, which do not extend + // beyond the screen boundaries since they typically have no borders, will + // occlude maximized windows underneath them. + HMONITOR hmon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + if (hmon) { + MONITORINFO mi; + mi.cbSize = sizeof(mi); + if (GetMonitorInfo(hmon, &mi)) { + (*window_rect).AdjustToFit(gfx::Rect(mi.rcWork)); + } + } + } + return true; } @@ -695,12 +719,14 @@ return; // We generally ignore events for popup windows, except for when the taskbar - // is hidden or when the popup is a Chrome Widget, in which case we - // recalculate occlusion. + // is hidden or when the popup is a Chrome Widget or Windows Taskbar, in + // which case we recalculate occlusion. bool calculate_occlusion = true; if (::GetWindowLong(hwnd, GWL_STYLE) & WS_POPUP) { + std::wstring hwnd_class_name = gfx::GetClassName(hwnd); calculate_occlusion = - base::StartsWith(gfx::GetClassName(hwnd), L"Chrome_WidgetWin_"); + base::StartsWith(hwnd_class_name, L"Chrome_WidgetWin_") || + hwnd_class_name == L"Shell_TrayWnd"; } // Detect if either the alt tab view or the task list thumbnail is being
diff --git a/ui/aura/native_window_occlusion_tracker_win_interactive_test.cc b/ui/aura/native_window_occlusion_tracker_win_interactive_test.cc index f86003a..c25df9d 100644 --- a/ui/aura/native_window_occlusion_tracker_win_interactive_test.cc +++ b/ui/aura/native_window_occlusion_tracker_win_interactive_test.cc
@@ -161,7 +161,7 @@ return hwnd; } - void CreateTrackedAuraWindowWithBounds(MockWindowTreeHostObserver* observer, + HWND CreateTrackedAuraWindowWithBounds(MockWindowTreeHostObserver* observer, gfx::Rect bounds) { host()->Show(); host()->SetBoundsInPixels(bounds); @@ -171,6 +171,8 @@ window->SetBounds(bounds); Env::GetInstance()->GetWindowOcclusionTracker()->Track(window); + + return window->GetHost()->GetAcceleratedWidget(); } int GetNumVisibleRootWindows() { @@ -178,6 +180,24 @@ ->num_visible_root_windows_; } + void MakeFullscreen(HWND hwnd) { + DWORD style = GetWindowLong(hwnd, GWL_STYLE); + DWORD ex_style = GetWindowLong(hwnd, GWL_STYLE); + SetWindowLong(hwnd, GWL_STYLE, style & ~(WS_CAPTION | WS_THICKFRAME)); + SetWindowLong(hwnd, GWL_EXSTYLE, + ex_style & ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | + WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); + + MONITORINFO monitor_info; + monitor_info.cbSize = sizeof(monitor_info); + GetMonitorInfo(MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST), + &monitor_info); + gfx::Rect window_rect(monitor_info.rcMonitor); + SetWindowPos(hwnd, nullptr, window_rect.x(), window_rect.y(), + window_rect.width(), window_rect.height(), + SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS); + } + private: base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<TestNativeWindow> native_win_; @@ -432,4 +452,29 @@ host()->RemoveObserver(&observer); } +// Test that a maximized aura window that is covered by a fullscreen window is +// marked as occluded. +TEST_F(NativeWindowOcclusionTrackerTest, MaximizedOccludedByFullscreenWindow) { + // Create an aura window that is miximized. + base::RunLoop run_loop1; + MockWindowTreeHostObserver observer(run_loop1.QuitClosure()); + HWND hwnd_aura_window_maximized = + CreateTrackedAuraWindowWithBounds(&observer, gfx::Rect(0, 0, 100, 100)); + ShowWindow(hwnd_aura_window_maximized, SW_SHOWMAXIMIZED); + observer.set_expectation(Window::OcclusionState::VISIBLE); + run_loop1.Run(); + EXPECT_FALSE(observer.is_expecting_call()); + + // Create a fullscreen native window that occludes the aura window. + base::RunLoop run_loop2; + observer.set_quit_closure(run_loop2.QuitClosure()); + observer.set_expectation(Window::OcclusionState::OCCLUDED); + HWND hwnd_native_window = + CreateNativeWindowWithBounds(gfx::Rect(0, 0, 100, 100)); + MakeFullscreen(hwnd_native_window); + run_loop2.Run(); + EXPECT_FALSE(observer.is_expecting_call()); + host()->RemoveObserver(&observer); +} + } // namespace aura
diff --git a/ui/aura/scoped_window_capture_request.cc b/ui/aura/scoped_window_capture_request.cc index 0d7c3f2..5b903f8a 100644 --- a/ui/aura/scoped_window_capture_request.cc +++ b/ui/aura/scoped_window_capture_request.cc
@@ -10,33 +10,66 @@ ScopedWindowCaptureRequest::ScopedWindowCaptureRequest( ScopedWindowCaptureRequest&& other) - : window_(other.window_) { - other.window_ = nullptr; + // Do not decrement requests on |other| nor increment them on |this| since + // we are moving the same request into here. + : window_(other.DetachFromCurrentWindow(/*decrement_requests=*/false)) { + if (window_) + AttachToCurrentWindow(/*increment_requests=*/false); } ScopedWindowCaptureRequest& ScopedWindowCaptureRequest::operator=( ScopedWindowCaptureRequest&& rhs) { + // Note that |this| might have been attached to a different window than that + // of |rhs|, so we need to detach from while decrementing the requests. + DetachFromCurrentWindow(/*decrement_requests=*/true); + + // However, |rhs| is moving into |this|, so it's essentially the same request, + // therefore, no need to either increment or decrement the requests. + window_ = rhs.DetachFromCurrentWindow(/*decrement_requests=*/false); if (window_) - window_->OnScopedWindowCaptureRequestRemoved(); - window_ = rhs.window_; - rhs.window_ = nullptr; + AttachToCurrentWindow(/*increment_requests=*/false); + return *this; } ScopedWindowCaptureRequest::~ScopedWindowCaptureRequest() { - if (window_) - window_->OnScopedWindowCaptureRequestRemoved(); + DetachFromCurrentWindow(/*decrement_requests=*/true); } viz::SubtreeCaptureId ScopedWindowCaptureRequest::GetCaptureId() const { return window_ ? window_->subtree_capture_id() : viz::SubtreeCaptureId(); } +void ScopedWindowCaptureRequest::OnWindowDestroying(Window* window) { + // No need to call OnScopedWindowCaptureRequestRemoved() since the window is + // being destroyed. + DetachFromCurrentWindow(/*decrement_requests=*/false); +} + ScopedWindowCaptureRequest::ScopedWindowCaptureRequest(Window* window) : window_(window) { + AttachToCurrentWindow(/*increment_requests=*/true); +} + +void ScopedWindowCaptureRequest::AttachToCurrentWindow( + bool increment_requests) { DCHECK(window_); DCHECK(!window_->IsRootWindow()); - window_->OnScopedWindowCaptureRequestAdded(); + if (increment_requests) + window_->OnScopedWindowCaptureRequestAdded(); + window_->AddObserver(this); +} + +Window* ScopedWindowCaptureRequest::DetachFromCurrentWindow( + bool decrement_requests) { + Window* result = window_; + if (window_) { + window_->RemoveObserver(this); + if (decrement_requests) + window_->OnScopedWindowCaptureRequestRemoved(); + window_ = nullptr; + } + return result; } } // namespace aura
diff --git a/ui/aura/scoped_window_capture_request.h b/ui/aura/scoped_window_capture_request.h index ee7e4f95..794d5d7 100644 --- a/ui/aura/scoped_window_capture_request.h +++ b/ui/aura/scoped_window_capture_request.h
@@ -7,6 +7,7 @@ #include "components/viz/common/surfaces/subtree_capture_id.h" #include "ui/aura/aura_export.h" +#include "ui/aura/window_observer.h" namespace aura { @@ -21,24 +22,40 @@ // Note that making a window capturable forces the layer tree root at its layer // to be promoted to a render surface that draw into a render pass. // See https://crbug.com/1143930 for more details. -class AURA_EXPORT ScopedWindowCaptureRequest { +class AURA_EXPORT ScopedWindowCaptureRequest : public WindowObserver { public: // Creates an empty request that doesn't affect any window. ScopedWindowCaptureRequest() = default; ScopedWindowCaptureRequest(ScopedWindowCaptureRequest&& other); ScopedWindowCaptureRequest& operator=(ScopedWindowCaptureRequest&& rhs); - ~ScopedWindowCaptureRequest(); + ~ScopedWindowCaptureRequest() override; Window* window() const { return window_; } viz::SubtreeCaptureId GetCaptureId() const; + // WindowObserver: + void OnWindowDestroying(Window* window) override; + private: friend class Window; // Private so it can only be called through Window::MakeWindowCapturable(). explicit ScopedWindowCaptureRequest(Window* window); + // Attaches to the current |window_| by observing it. If |increment_requests| + // is true (meaning this is a new request, rather than an existing one being + // moved into |this|), OnScopedWindowCaptureRequestAdded() will be called on + // |window_|. |window_| must be valid. + void AttachToCurrentWindow(bool increment_requests); + + // Detaches from the current |window_| (if any) by ending observing it. If + // |decrement_requests| is true (meaning this request is actually ending + // rather than being moved from |this|), OnScopedWindowCaptureRequestRemoved() + // will be called on |window_|. + // |window_| will be reset to |nullptr|, and its old value will be returned. + Window* DetachFromCurrentWindow(bool decrement_requests); + // The window on which this request has been made. Can be |nullptr| if this is // an empty request (created by the default ctor), or if this object was // std::move()'d from.
diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc index 69af357..8849a06e 100644 --- a/ui/aura/window_unittest.cc +++ b/ui/aura/window_unittest.cc
@@ -439,7 +439,7 @@ TEST_F(WindowTest, MakeWindowCapturable) { std::unique_ptr<Window> w1(CreateTestWindowWithId(1, root_window())); - // Initailly the window is not capturable. + // Initially the window is not capturable. EXPECT_FALSE(w1->subtree_capture_id().is_valid()); // Creating requests makes the window capturable as long as those requests @@ -485,6 +485,21 @@ EXPECT_FALSE(w1->layer()->GetSubtreeCaptureId().is_valid()); } +TEST_F(WindowTest, DeletingCapturableWindows) { + std::unique_ptr<Window> w1(CreateTestWindowWithId(1, root_window())); + // Initially the window is not capturable. + EXPECT_FALSE(w1->subtree_capture_id().is_valid()); + + // Deleting a window with capture requests on them will not result in a use- + // after-free crash. + ScopedWindowCaptureRequest request1 = w1->MakeWindowCapturable(); + ScopedWindowCaptureRequest request2 = w1->MakeWindowCapturable(); + EXPECT_TRUE(w1->subtree_capture_id().is_valid()); + w1.reset(); + EXPECT_FALSE(request1.GetCaptureId().is_valid()); + EXPECT_FALSE(request2.GetCaptureId().is_valid()); +} + TEST_F(WindowTest, LayerReleasingAndSettingOfCapturableWindow) { std::unique_ptr<Window> w1(CreateTestWindowWithId(1, root_window())); EXPECT_FALSE(w1->subtree_capture_id().is_valid());
diff --git a/ui/gfx/mojom/presentation_feedback.mojom b/ui/gfx/mojom/presentation_feedback.mojom index d91fe6a4..2ddc661 100644 --- a/ui/gfx/mojom/presentation_feedback.mojom +++ b/ui/gfx/mojom/presentation_feedback.mojom
@@ -15,4 +15,5 @@ mojo_base.mojom.TimeTicks available_timestamp; mojo_base.mojom.TimeTicks ready_timestamp; mojo_base.mojom.TimeTicks latch_timestamp; + mojo_base.mojom.TimeTicks writes_done_timestamp; };
diff --git a/ui/gfx/mojom/presentation_feedback_mojom_traits.h b/ui/gfx/mojom/presentation_feedback_mojom_traits.h index 26b0f2e7..bee9e78 100644 --- a/ui/gfx/mojom/presentation_feedback_mojom_traits.h +++ b/ui/gfx/mojom/presentation_feedback_mojom_traits.h
@@ -42,6 +42,11 @@ return input.latch_timestamp; } + static base::TimeTicks writes_done_timestamp( + const gfx::PresentationFeedback& input) { + return input.writes_done_timestamp; + } + static bool Read(gfx::mojom::PresentationFeedbackDataView data, gfx::PresentationFeedback* out) { out->flags = data.flags(); @@ -49,7 +54,8 @@ data.ReadInterval(&out->interval) && data.ReadAvailableTimestamp(&out->available_timestamp) && data.ReadReadyTimestamp(&out->ready_timestamp) && - data.ReadLatchTimestamp(&out->latch_timestamp); + data.ReadLatchTimestamp(&out->latch_timestamp) && + data.ReadWritesDoneTimestamp(&out->writes_done_timestamp); } };
diff --git a/ui/gfx/presentation_feedback.h b/ui/gfx/presentation_feedback.h index d810219..d1b9502 100644 --- a/ui/gfx/presentation_feedback.h +++ b/ui/gfx/presentation_feedback.h
@@ -82,6 +82,10 @@ // next rendering update. On Android this corresponds to the SurfaceFlinger // latch time. base::TimeTicks latch_timestamp; + + // The time when write operations have completed, corresponding to the time + // when rendering on the GPU finished. + base::TimeTicks writes_done_timestamp; }; inline bool operator==(const PresentationFeedback& lhs, @@ -90,7 +94,8 @@ lhs.flags == rhs.flags && lhs.available_timestamp == rhs.available_timestamp && lhs.ready_timestamp == rhs.ready_timestamp && - lhs.latch_timestamp == rhs.latch_timestamp; + lhs.latch_timestamp == rhs.latch_timestamp && + lhs.writes_done_timestamp == rhs.writes_done_timestamp; } inline bool operator!=(const PresentationFeedback& lhs,
diff --git a/ui/gl/egl_timestamps.h b/ui/gl/egl_timestamps.h index 50ccdfb..429d852c 100644 --- a/ui/gl/egl_timestamps.h +++ b/ui/gl/egl_timestamps.h
@@ -25,6 +25,7 @@ virtual bool GetFrameTimestampInfoIfAvailable( base::TimeTicks* presentation_time, base::TimeDelta* composite_interval, + base::TimeTicks* writes_done_time, uint32_t* presentation_flags, int frame_id) = 0; };
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index 61fb45a..f7928a8a 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -1603,6 +1603,9 @@ presentation_flags_ = gfx::PresentationFeedback::kVSync | gfx::PresentationFeedback::kHWCompletion; break; + case EGL_RENDERING_COMPLETE_TIME_ANDROID: + writes_done_index_ = static_cast<int>(supported_egl_timestamps_.size()); + break; } // Stored in separate vectors so we can pass the egl timestamps @@ -1880,6 +1883,7 @@ bool NativeViewGLSurfaceEGL::GetFrameTimestampInfoIfAvailable( base::TimeTicks* presentation_time, base::TimeDelta* composite_interval, + base::TimeTicks* writes_done_time, uint32_t* presentation_flags, int frame_id) { DCHECK(presentation_time); @@ -1962,6 +1966,17 @@ base::TimeDelta::FromNanoseconds(presentation_time_ns); *presentation_flags = presentation_flags_; } + + // Get the WritesDone time if available, otherwise set to a null TimeTicks. + EGLnsecsANDROID writes_done_time_ns = egl_timestamps[writes_done_index_]; + if (writes_done_time_ns == EGL_TIMESTAMP_INVALID_ANDROID || + writes_done_time_ns == EGL_TIMESTAMP_PENDING_ANDROID) { + *writes_done_time = base::TimeTicks(); + } else { + *writes_done_time = base::TimeTicks() + + base::TimeDelta::FromNanoseconds(writes_done_time_ns); + } + return true; }
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h index c649b5f..abe2f3f 100644 --- a/ui/gl/gl_surface_egl.h +++ b/ui/gl/gl_surface_egl.h
@@ -189,6 +189,7 @@ bool GetFrameTimestampInfoIfAvailable(base::TimeTicks* presentation_time, base::TimeDelta* composite_interval, + base::TimeTicks* writes_done_time, uint32_t* presentation_flags, int frame_id) override; @@ -239,6 +240,7 @@ // PresentationFeedback support. int presentation_feedback_index_ = -1; int composition_start_index_ = -1; + int writes_done_index_ = -1; uint32_t presentation_flags_ = 0; base::queue<SwapInfo> swap_info_queue_;
diff --git a/ui/gl/gl_surface_presentation_helper.cc b/ui/gl/gl_surface_presentation_helper.cc index 0521b51d4..901e025 100644 --- a/ui/gl/gl_surface_presentation_helper.cc +++ b/ui/gl/gl_surface_presentation_helper.cc
@@ -67,12 +67,13 @@ const Frame& frame, base::TimeTicks* timestamp, base::TimeDelta* interval, + base::TimeTicks* writes_done, uint32_t* flags) { DCHECK(frame.timer || frame.fence || egl_timestamp_client_); if (egl_timestamp_client_) { bool result = egl_timestamp_client_->GetFrameTimestampInfoIfAvailable( - timestamp, interval, flags, frame.frame_id); + timestamp, interval, writes_done, flags, frame.frame_id); // Workaround null timestamp by setting it to TimeTicks::Now() snapped to // the next vsync interval. See @@ -319,14 +320,17 @@ base::TimeTicks timestamp; base::TimeDelta interval; + base::TimeTicks writes_done; uint32_t flags = 0; // Get timestamp info for a frame if available. If timestamp is not // available, it means this frame is not yet done. - if (!GetFrameTimestampInfoIfAvailable(frame, ×tamp, &interval, &flags)) + if (!GetFrameTimestampInfoIfAvailable(frame, ×tamp, &interval, + &writes_done, &flags)) break; - frame_presentation_callback( - gfx::PresentationFeedback(timestamp, interval, flags)); + gfx::PresentationFeedback feedback(timestamp, interval, flags); + feedback.writes_done_timestamp = writes_done; + frame_presentation_callback(feedback); } if (!pending_frames_.empty())
diff --git a/ui/gl/gl_surface_presentation_helper.h b/ui/gl/gl_surface_presentation_helper.h index 67a163c..097989f 100644 --- a/ui/gl/gl_surface_presentation_helper.h +++ b/ui/gl/gl_surface_presentation_helper.h
@@ -83,6 +83,7 @@ bool GetFrameTimestampInfoIfAvailable(const Frame& frame, base::TimeTicks* timestamp, base::TimeDelta* interval, + base::TimeTicks* writes_done, uint32_t* flags); // Check |pending_frames_| and run presentation callbacks.
diff --git a/ui/views/controls/focus_ring.cc b/ui/views/controls/focus_ring.cc index 67cce14..c4f27997 100644 --- a/ui/views/controls/focus_ring.cc +++ b/ui/views/controls/focus_ring.cc
@@ -13,8 +13,10 @@ #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/base/theme_provider.h" #include "ui/compositor/layer.h" #include "ui/gfx/canvas.h" +#include "ui/gfx/color_utils.h" #include "ui/views/controls/focusable_border.h" #include "ui/views/controls/highlight_path_generator.h" #include "ui/views/style/platform_style.h" @@ -25,6 +27,9 @@ namespace { +DEFINE_UI_CLASS_PROPERTY_KEY(int, kFocusRingBackgroundColorId, -1) +DEFINE_UI_CLASS_PROPERTY_KEY(int, kFocusRingFallbackColorId, -1) + bool IsPathUsable(const SkPath& path) { return !path.isEmpty() && (path.isRect(nullptr) || path.isOval(nullptr) || path.isRRect(nullptr)); @@ -35,6 +40,51 @@ : ui::NativeTheme::kColorId_AlertSeverityHigh; } +View* GetViewForSubtreeColors(View* view) { + int color_id_property = view->GetProperty(kFocusRingBackgroundColorId); + if (color_id_property != -1) + return view; + if (!view->parent()) + return nullptr; + return GetViewForSubtreeColors(view->parent()); +} + +SkColor GetColor(View* focus_ring, bool valid) { + const SkColor default_color = + focus_ring->GetNativeTheme()->GetSystemColor(ColorIdForValidity(valid)); + if (!valid) + return default_color; + + View* const fallback_color_view = GetViewForSubtreeColors(focus_ring); + if (!fallback_color_view) + return default_color; + + const SkColor background_color = focus_ring->GetThemeProvider()->GetColor( + fallback_color_view->GetProperty(kFocusRingBackgroundColorId)); + + // This blends towards the fully-opaque version of the focus-ring color until + // the minimum contrast is reached (if possible). If `default_color` is + // already contrasty enough it will be used directly. + const color_utils::BlendResult contrasty_color = + color_utils::BlendForMinContrast( + default_color, background_color, SkColorSetA(default_color, 0xFF), + color_utils::kMinimumVisibleContrastRatio); + + const float boosted_contrast = color_utils::GetContrastRatio( + color_utils::GetResultingPaintColor(contrasty_color.color, + background_color), + background_color); + + // If the contrast of the boosted color is enough, use it. If not, increasing + // opacity was insufficient to meet contrast minimums. This happens when + // painting a blue focus ring on a blue theme for instance. + if (boosted_contrast > color_utils::kMinimumVisibleContrastRatio) + return contrasty_color.color; + + return focus_ring->GetThemeProvider()->GetColor( + fallback_color_view->GetProperty(kFocusRingFallbackColorId)); +} + double GetCornerRadius() { double thickness = PlatformStyle::kFocusHaloThickness / 2.f; return FocusableBorder::kCornerRadiusDp + thickness; @@ -73,6 +123,13 @@ return parent->AddChildView(std::move(ring)); } +void FocusRing::SetColorContextForSubtree(View* view, + int background_color_id, + int fallback_color_id) { + view->SetProperty(kFocusRingBackgroundColorId, background_color_id); + view->SetProperty(kFocusRingFallbackColorId, fallback_color_id); +} + FocusRing::~FocusRing() = default; void FocusRing::SetPathGenerator( @@ -142,8 +199,7 @@ cc::PaintFlags paint; paint.setAntiAlias(true); - paint.setColor(color_.value_or( - GetNativeTheme()->GetSystemColor(ColorIdForValidity(!invalid_)))); + paint.setColor(color_.value_or(GetColor(this, !invalid_))); paint.setStyle(cc::PaintFlags::kStroke_Style); paint.setStrokeWidth(PlatformStyle::kFocusHaloThickness);
diff --git a/ui/views/controls/focus_ring.h b/ui/views/controls/focus_ring.h index 99330eb..b576d27 100644 --- a/ui/views/controls/focus_ring.h +++ b/ui/views/controls/focus_ring.h
@@ -37,6 +37,18 @@ // owned by the |parent|. static FocusRing* Install(View* parent); + // Configures `view` so that FocusRings under it are aware of the background + // they are painted against. If the default color can't be made to contrast + // against `background_color_id` then `fallback_color_id` will be used. + // Warning: The FocusRing ThemeProvider is queried for these IDs, do not use + // NativeTheme color IDs here. + // WARNING: This is temporary shenanigans to solve an accessibility problem. + // DO NOT COPY this pattern or its implementation to other places in its + // current state. + static void SetColorContextForSubtree(View* view, + int background_color_id, + int fallback_color_id); + ~FocusRing() override; // Sets the HighlightPathGenerator to draw this FocusRing around.
diff --git a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn index 2c5f4c15..61ff21c 100644 --- a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn +++ b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -196,6 +196,7 @@ ":mojo_interface_provider", ":onc_mojo", ":sim_lock_dialogs", + "//ui/webui/resources/cr_elements/cr_button:cr_button", "//ui/webui/resources/js:i18n_behavior", "//ui/webui/resources/js/cr/ui:focus_without_ink", ]
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_password_input.html b/ui/webui/resources/cr_components/chromeos/network/network_password_input.html index 92bca29c..2b06e2f 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_password_input.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_password_input.html
@@ -51,16 +51,20 @@ invalid="[[invalid]]" error-message="[[errorMessage]]"> <template is="dom-if" if="[[!showPolicyIndicator_]]" restamp> - <cr-icon-button id="icon" slot="suffix" - class$="[[getIconClass_(showPassword)]]" - aria-describedby="passwordVisibilityTooltip" - on-click="onShowPasswordTap_" - on-touchend="onShowPasswordTap_"> - </cr-icon-button> - <paper-tooltip id="passwordVisibilityTooltip" for="icon" position="left" - fit-to-visible-bounds role="tooltip"> - [[getShowPasswordTitle_(showPassword)]] - </paper-tooltip> + <div slot="suffix"> + <cr-icon-button id="icon" + class$="[[getIconClass_(showPassword)]]" + aria-describedby="passwordVisibilityTooltip" + on-click="onShowPasswordTap_" + on-touchend="onShowPasswordTap_"> + </cr-icon-button> + <paper-tooltip id="passwordVisibilityTooltip" + for="icon" + position="left" + fit-to-visible-bounds role="tooltip"> + [[getShowPasswordTitle_(showPassword)]] + </paper-tooltip> + </div> </template> </cr-input> <template is="dom-if" if="[[showPolicyIndicator_]]" restamp>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js b/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js index 2990d11..570b5e3 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js +++ b/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
@@ -120,6 +120,13 @@ return /** @type {?CrToggleElement} */ (this.$$('#simLockButton')); }, + /** + * @return {?CrButtonElement} + */ + getUnlockButton() { + return /** @type {?CrButtonElement} */ (this.$$('#unlockPinButton')); + }, + /** @private */ onDialogOpenChanged_() { if (this.isDialogOpen_) {
diff --git a/weblayer/browser/persistence/browser_persister.cc b/weblayer/browser/persistence/browser_persister.cc index 2298243..762cc4b 100644 --- a/weblayer/browser/persistence/browser_persister.cc +++ b/weblayer/browser/persistence/browser_persister.cc
@@ -61,7 +61,6 @@ sessions::CommandStorageManager::kOther, path, this, - /* use_marker */ true, browser->profile()->GetBrowserContext()->IsOffTheRecord(), decryption_key)), rebuild_on_next_save_(false),