From c72dff08fc0b8fbfc3ede25dfcfb9bce623976bc Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 19 Apr 2021 17:59:26 +0000 Subject: [PATCH] [selectors] Script focus and :focus-visible https://bugs.webkit.org/show_bug.cgi?id=224598 Reviewed by Darin Adler. LayoutTests/imported/w3c: Update expectations as the tests pass now. * web-platform-tests/css/selectors/focus-visible-008-expected.txt: * web-platform-tests/css/selectors/focus-visible-009-expected.txt: * web-platform-tests/css/selectors/focus-visible-010-expected.txt: * web-platform-tests/css/selectors/focus-visible-014-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-001-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-004-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-005-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-012-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-013-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-014-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-015-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative-expected.txt: * web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative-expected.txt: Source/WebCore: Implement :focus-visible behavior when a script moves focus. An element will match :focus-visible when a script move focus if the last focused element was not focused via mouse click. This patch makes WebKit behaves like Chromium and Firefox and pass all the related tests. There's an ongoing discussion about 6 tests that are marked as ".tentative" in the following issue: https://github.com/web-platform-tests/wpt/issues/28505 Test: web-platform-tests/css/selectors/focus-visible-script-focus-* * dom/Document.cpp: (WebCore::Document::adjustFocusedNodeOnNodeRemoval): Just update FocusOptions initializer. (WebCore::Document::setFocusedElement): Store if the last element has been focused by mouse click or not. * dom/Document.h: New member m_latestFocusTrigger. (WebCore::Document::wasLastFocusByClick const): Method to check status of m_latestFocusTrigger. * dom/Element.cpp: (WebCore::Element::focus): When there's a script focus, this checks if the last element was focused by mouse click in order to make it match :focus-visible. * dom/FocusOptions.h: Add FocusTrigger enum to know if an element has been focused via mouse click or not. This refers to the "focus trigger" concept on the HTML spec (see https://html.spec.whatwg.org/multipage/interaction.html). * page/EventHandler.cpp: (WebCore::EventHandler::dispatchMouseEvent): Pass FocusTrigger:Click in setFocusedElement() call. LayoutTests: Update expectations for tests, most of them are passing on Mac. On iOS a bunch timeout so they're skipped, as other :focus-visible tests. * platform/ios/TestExpectations: * platform/mac/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt: Removed as test passes now. * platform/mac/TestExpectations: Canonical link: https://commits.webkit.org/236746@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@276264 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 13 ++++++++ LayoutTests/imported/w3c/ChangeLog | 27 +++++++++++++++++ .../selectors/focus-visible-008-expected.txt | 2 +- .../selectors/focus-visible-009-expected.txt | 2 +- .../selectors/focus-visible-010-expected.txt | 2 +- .../selectors/focus-visible-014-expected.txt | 2 +- ...ocus-visible-script-focus-001-expected.txt | 2 +- ...le-script-focus-002.tentative-expected.txt | 2 +- ...le-script-focus-003.tentative-expected.txt | 2 +- ...ocus-visible-script-focus-004-expected.txt | 2 +- ...ocus-visible-script-focus-005-expected.txt | 2 +- ...le-script-focus-006.tentative-expected.txt | 2 +- ...le-script-focus-007.tentative-expected.txt | 2 +- ...ocus-visible-script-focus-012-expected.txt | 2 +- ...ocus-visible-script-focus-013-expected.txt | 2 +- ...ocus-visible-script-focus-014-expected.txt | 2 +- ...ocus-visible-script-focus-015-expected.txt | 2 +- ...le-script-focus-016.tentative-expected.txt | 2 +- ...le-script-focus-017.tentative-expected.txt | 2 +- LayoutTests/platform/ios/TestExpectations | 26 +++++++--------- LayoutTests/platform/mac/TestExpectations | 15 ++-------- .../selectors/focus-visible-009-expected.txt | 7 ----- Source/WebCore/ChangeLog | 30 +++++++++++++++++++ Source/WebCore/dom/Document.cpp | 3 +- Source/WebCore/dom/Document.h | 3 ++ Source/WebCore/dom/Element.cpp | 7 ++++- Source/WebCore/dom/FocusOptions.h | 5 +++- Source/WebCore/page/EventHandler.cpp | 3 +- 28 files changed, 117 insertions(+), 56 deletions(-) delete mode 100644 LayoutTests/platform/mac/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 1caf1a99f130..05bbe24d2db4 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,16 @@ +2021-04-19 Manuel Rego Casasnovas + + [selectors] Script focus and :focus-visible + https://bugs.webkit.org/show_bug.cgi?id=224598 + + Reviewed by Darin Adler. + + Update expectations for tests, most of them are passing on Mac. On iOS a bunch timeout so they're skipped, as other :focus-visible tests. + + * platform/ios/TestExpectations: + * platform/mac/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt: Removed as test passes now. + * platform/mac/TestExpectations: + 2021-04-19 Darin Adler Nullptr crash in CSSCalcValue::category() via HTMLConverterCaches::floatPropertyValueForNode diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog index 3f4bbf1d4296..44bf71d36a66 100644 --- a/LayoutTests/imported/w3c/ChangeLog +++ b/LayoutTests/imported/w3c/ChangeLog @@ -1,3 +1,30 @@ +2021-04-19 Manuel Rego Casasnovas + + [selectors] Script focus and :focus-visible + https://bugs.webkit.org/show_bug.cgi?id=224598 + + Reviewed by Darin Adler. + + Update expectations as the tests pass now. + + * web-platform-tests/css/selectors/focus-visible-008-expected.txt: + * web-platform-tests/css/selectors/focus-visible-009-expected.txt: + * web-platform-tests/css/selectors/focus-visible-010-expected.txt: + * web-platform-tests/css/selectors/focus-visible-014-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-001-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-004-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-005-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-012-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-013-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-014-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-015-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative-expected.txt: + * web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative-expected.txt: + 2021-04-19 Darin Adler Nullptr crash in CSSCalcValue::category() via HTMLConverterCaches::floatPropertyValueForNode diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-008-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-008-expected.txt index 80fd6eb4aa1f..ca81f33dd614 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-008-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-008-expected.txt @@ -6,5 +6,5 @@ If the element that says "I will be focused programmatically." has a red backgro Tab to me and press ENTER. I will be focused programmatically. -FAIL Programmatic focus after keypress should match :focus-visible assert_equals: outlineColor for DIV#el should be green expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)" +PASS Programmatic focus after keypress should match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt index 9c7bd1df1438..8eb484e41521 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt @@ -3,5 +3,5 @@ If the button that says "I will be focused automatically" has a red background, I will be focused automatically. -FAIL Autofocus should match :focus-visible assert_equals: outlineColor for BUTTON#button should be green expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)" +PASS Autofocus should match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-010-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-010-expected.txt index 26bdec846758..0485dac8a78f 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-010-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-010-expected.txt @@ -3,5 +3,5 @@ If the element that says "I will be focused automatically" has a red background, I will be focused automatically. -FAIL Programmatic focus on page load should match :focus-visible assert_equals: outlineColor for DIV#el should be green expected "rgb(0, 128, 0)" but got "rgb(0, 0, 0)" +PASS Programmatic focus on page load should match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-014-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-014-expected.txt index dd2f29a8896b..f1810806b2c7 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-014-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-014-expected.txt @@ -1,5 +1,5 @@ Target -FAIL :focus-visible matches after script focus move assert_equals: backgroundColor for DIV#target should be lime expected "rgb(0, 255, 0)" but got "rgb(255, 0, 0)" +PASS :focus-visible matches after script focus move diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-001-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-001-expected.txt index 49e408f27a32..582e8ca895e6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-001-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-001-expected.txt @@ -4,5 +4,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus without any previous user interaction matches :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus without any previous user interaction matches :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative-expected.txt index a7396a689536..7c3c7b0e7c08 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative-expected.txt @@ -5,5 +5,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after mouse click does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after mouse click does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative-expected.txt index cbc9875bcd25..a20965c802b3 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative-expected.txt @@ -5,5 +5,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after blur after mouse click does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after blur after mouse click does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004-expected.txt index fefd95a5ff02..2c05d765b669 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004-expected.txt @@ -5,5 +5,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after keyboard event does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after keyboard event does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005-expected.txt index 141c1383209e..5a87b8016032 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005-expected.txt @@ -5,5 +5,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after blur after keyboard event does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after blur after keyboard event does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative-expected.txt index d4da7af0b358..c5eed9049a96 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative-expected.txt @@ -6,5 +6,5 @@ Click me Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after mouse click on a NOT focusable element does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after mouse click on a NOT focusable element does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative-expected.txt index 8772fbc9dfb2..66571da2b8a9 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative-expected.txt @@ -6,5 +6,5 @@ Click me Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after blur after mouse click on a NOT focusable element does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after blur after mouse click on a NOT focusable element does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012-expected.txt index de45e39218cb..45d832729f4c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012-expected.txt @@ -6,5 +6,5 @@ Focus me Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after keyboard focus does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after keyboard focus does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013-expected.txt index b697311c1c5f..41ec2ed76b85 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013-expected.txt @@ -6,5 +6,5 @@ Focus me Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after blur after keyboard focus does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after blur after keyboard focus does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014-expected.txt index 675a54cefe4c..982796a8ed05 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014-expected.txt @@ -6,5 +6,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after keyboard input does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after keyboard input does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015-expected.txt index 17d83f2adc61..d8a80fe8a519 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015-expected.txt @@ -6,5 +6,5 @@ If the element that says "Focused" has a red background then the test result is Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after blur after keyboard input does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after blur after keyboard input does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative-expected.txt index 0966180f3963..569f801712a6 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative-expected.txt @@ -8,5 +8,5 @@ Click me Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after mouse click on a NOT focusable element after editing an input does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after mouse click on a NOT focusable element after editing an input does match :focus-visible diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative-expected.txt index 09dfead66a24..8abd4d258c92 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative-expected.txt @@ -8,5 +8,5 @@ Click me Focused PASS ":focus-visible" should be a valid selector -FAIL Script focus after blur after mouse click on a NOT focusable element after editing an input does match :focus-visible assert_equals: outlineColor for DIV#target should be green expected "rgb(0, 128, 0)" but got "rgba(46, 52, 54, 0.59)" +PASS Script focus after blur after mouse click on a NOT focusable element after editing an input does match :focus-visible diff --git a/LayoutTests/platform/ios/TestExpectations b/LayoutTests/platform/ios/TestExpectations index b4412e0e209b..5909a20d75d2 100644 --- a/LayoutTests/platform/ios/TestExpectations +++ b/LayoutTests/platform/ios/TestExpectations @@ -3276,6 +3276,7 @@ webkit.org/b/209250 imported/w3c/web-platform-tests/css/css-text/line-break/line webkit.org/b/207858 fast/canvas/webgl/simulated-vertexAttrib0-invalid-indicies.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-001.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-005.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-006.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-007.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-008.html [ Skip ] @@ -3284,22 +3285,17 @@ webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible- webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-012.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-013.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-019.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-018.html [ Skip ] +webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-019.html [ Skip ] webkit.org/b/209734 imported/w3c/web-platform-tests/css/selectors/hover-002.html [ Skip ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-001.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-018.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-019.html [ Failure ] # Certain versions of iOS use different text security characters. webkit.org/b/209692 platform/ios/fast/text/text-security-disc-bullet-pua-ios-new.html [ Pass ] diff --git a/LayoutTests/platform/mac/TestExpectations b/LayoutTests/platform/mac/TestExpectations index 1aa0147c4eef..0d5cc6bcd405 100644 --- a/LayoutTests/platform/mac/TestExpectations +++ b/LayoutTests/platform/mac/TestExpectations @@ -2291,16 +2291,5 @@ webkit.org/b/224396 webgl/1.0.3/conformance/glsl/constructors/glsl-construct-ive webkit.org/b/224631 [ BigSur ] imported/w3c/web-platform-tests/css/css-fonts/font-feature-settings-tibetan.html [ Pass ImageOnlyFailure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-001.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-002.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-003.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-004.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-005.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-006.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-007.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-012.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-013.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-014.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-015.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-016.tentative.html [ Failure ] -webkit.org/b/224598 imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-017.tentative.html [ Failure ] +# Buttons are not focusable on Mac so this test doesn't work as expected. +webkit.org/b/22261 imported/w3c/web-platform-tests/css/selectors/focus-visible-005.html [ Skip ] diff --git a/LayoutTests/platform/mac/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt b/LayoutTests/platform/mac/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt deleted file mode 100644 index 002208296642..000000000000 --- a/LayoutTests/platform/mac/imported/w3c/web-platform-tests/css/selectors/focus-visible-009-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -This test checks that any element focused via an autofocus attribute will have :focus-visible matching enabled. -If the button that says "I will be focused automatically" has a red background, then the test result is FAILURE. If it has a green outline, then the test result is SUCCESS. - -I will be focused automatically. - -FAIL Autofocus should match :focus-visible assert_equals: outlineColor for BUTTON#button should be green expected "rgb(0, 128, 0)" but got "rgba(0, 0, 0, 0.847)" - diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 6575151b7e1f..fb03f53b6e00 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,33 @@ +2021-04-19 Manuel Rego Casasnovas + + [selectors] Script focus and :focus-visible + https://bugs.webkit.org/show_bug.cgi?id=224598 + + Reviewed by Darin Adler. + + Implement :focus-visible behavior when a script moves focus. + An element will match :focus-visible when a script move focus if the last focused element was not focused via mouse click. + + This patch makes WebKit behaves like Chromium and Firefox and pass all the related tests. + + There's an ongoing discussion about 6 tests that are marked as ".tentative" in the following issue: + https://github.com/web-platform-tests/wpt/issues/28505 + + Test: web-platform-tests/css/selectors/focus-visible-script-focus-* + + * dom/Document.cpp: + (WebCore::Document::adjustFocusedNodeOnNodeRemoval): Just update FocusOptions initializer. + (WebCore::Document::setFocusedElement): Store if the last element has been focused by mouse click or not. + * dom/Document.h: New member m_latestFocusTrigger. + (WebCore::Document::wasLastFocusByClick const): Method to check status of m_latestFocusTrigger. + * dom/Element.cpp: + (WebCore::Element::focus): When there's a script focus, this checks if the last element was focused + by mouse click in order to make it match :focus-visible. + * dom/FocusOptions.h: Add FocusTrigger enum to know if an element has been focused via mouse click or not. + This refers to the "focus trigger" concept on the HTML spec (see https://html.spec.whatwg.org/multipage/interaction.html). + * page/EventHandler.cpp: + (WebCore::EventHandler::dispatchMouseEvent): Pass FocusTrigger:Click in setFocusedElement() call. + 2021-04-19 Darin Adler Nullptr crash in CSSCalcValue::category() via HTMLConverterCaches::floatPropertyValueForNode diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp index b6c8ae41efb3..e61f5effe991 100644 --- a/Source/WebCore/dom/Document.cpp +++ b/Source/WebCore/dom/Document.cpp @@ -4357,7 +4357,7 @@ void Document::adjustFocusedNodeOnNodeRemoval(Node& node, NodeRemoval nodeRemova // FIXME: We should avoid synchronously updating the style inside setFocusedElement. // FIXME: Object elements should avoid loading a frame synchronously in a post style recalc callback. SubframeLoadingDisabler disabler(is(node) ? &downcast(node) : nullptr); - setFocusedElement(nullptr, { { }, { }, FocusRemovalEventsMode::DoNotDispatch, { } }); + setFocusedElement(nullptr, { { }, { }, FocusRemovalEventsMode::DoNotDispatch, { }, { } }); // Set the focus navigation starting node to the previous focused element so that // we can fallback to the siblings or parent node for the next search. // Also we need to call removeFocusNavigationNodeOfSubtree after this function because @@ -4530,6 +4530,7 @@ bool Document::setFocusedElement(Element* element, const FocusOptions& options) m_focusedElement = newFocusedElement; setFocusNavigationStartingNode(m_focusedElement.get()); m_focusedElement->setFocus(true); + m_latestFocusTrigger = options.trigger; // The setFocus call triggers a blur and a focus event. Event handlers could cause the focused element to be cleared. if (m_focusedElement != newFocusedElement) { diff --git a/Source/WebCore/dom/Document.h b/Source/WebCore/dom/Document.h index baeafb16c327..020d98c1eeea 100644 --- a/Source/WebCore/dom/Document.h +++ b/Source/WebCore/dom/Document.h @@ -761,6 +761,7 @@ class Document // The element could have already been focused or may not be focusable (e.g. ). WEBCORE_EXPORT bool setFocusedElement(Element*, const FocusOptions& = { }); Element* focusedElement() const { return m_focusedElement.get(); } + bool wasLastFocusByClick() const { return m_latestFocusTrigger == FocusTrigger::Click; } UserActionElementSet& userActionElements() { return m_userActionElements; } const UserActionElementSet& userActionElements() const { return m_userActionElements; } @@ -2126,6 +2127,8 @@ class Document bool m_updateTitleTaskScheduled { false }; + FocusTrigger m_latestFocusTrigger { FocusTrigger::Other }; + OrientationNotifier m_orientationNotifier; mutable RefPtr m_logger; RefPtr m_consoleMessageListener; diff --git a/Source/WebCore/dom/Element.cpp b/Source/WebCore/dom/Element.cpp index ad57b64bb1c7..b24ced66aadd 100644 --- a/Source/WebCore/dom/Element.cpp +++ b/Source/WebCore/dom/Element.cpp @@ -3078,11 +3078,16 @@ void Element::focus(const FocusOptions& options) if (!frame.hasHadUserInteraction() && !frame.isMainFrame() && !document->topDocument().securityOrigin().isSameOriginDomain(document->securityOrigin())) return; + if (!document->wasLastFocusByClick()) + newTarget->setHasFocusVisible(true); + // Focus and change event handlers can cause us to lose our last ref. // If a focus event handler changes the focus to a different node it // does not make sense to continue and update appearence. - if (!page->focusController().setFocusedElement(newTarget.get(), *document->frame(), options)) + if (!page->focusController().setFocusedElement(newTarget.get(), *document->frame(), options)) { + newTarget->setHasFocusVisible(false); return; + } } newTarget->findTargetAndUpdateFocusAppearance(options.selectionRestorationMode, options.preventScroll ? SelectionRevealMode::DoNotReveal : SelectionRevealMode::Reveal); diff --git a/Source/WebCore/dom/FocusOptions.h b/Source/WebCore/dom/FocusOptions.h index ec804f24be85..94b8ab6b690e 100644 --- a/Source/WebCore/dom/FocusOptions.h +++ b/Source/WebCore/dom/FocusOptions.h @@ -30,12 +30,15 @@ namespace WebCore { -enum class FocusRemovalEventsMode { Dispatch, DoNotDispatch }; +enum class FocusRemovalEventsMode : bool { Dispatch, DoNotDispatch }; + +enum class FocusTrigger : bool { Other, Click }; struct FocusOptions { SelectionRestorationMode selectionRestorationMode { SelectionRestorationMode::RestoreOrSelectAll }; FocusDirection direction { FocusDirection::None }; FocusRemovalEventsMode removalEventsMode { FocusRemovalEventsMode::Dispatch }; + FocusTrigger trigger { FocusTrigger::Other }; bool preventScroll { false }; }; diff --git a/Source/WebCore/page/EventHandler.cpp b/Source/WebCore/page/EventHandler.cpp index c3533e4076fe..0148506d099a 100644 --- a/Source/WebCore/page/EventHandler.cpp +++ b/Source/WebCore/page/EventHandler.cpp @@ -48,6 +48,7 @@ #include "FloatPoint.h" #include "FloatRect.h" #include "FocusController.h" +#include "FocusOptions.h" #include "Frame.h" #include "FrameLoader.h" #include "FrameSelection.h" @@ -2722,7 +2723,7 @@ bool EventHandler::dispatchMouseEvent(const AtomString& eventType, Node* targetN // If focus shift is blocked, we eat the event. auto* page = m_frame.page(); - if (page && !page->focusController().setFocusedElement(element.get(), m_frame)) + if (page && !page->focusController().setFocusedElement(element.get(), m_frame, { { }, { }, { }, FocusTrigger::Click, { } })) return false; if (element && m_mouseDownDelegatedFocus)