Skip to content

Commit

Permalink
[inert] Stop propagating inertness into nested browsing contexts
Browse files Browse the repository at this point in the history
Doing so was a cross-site leak. This change is against the HTML spec,
but it aligns Blink with Gecko. WebKit is also not propagating inertness
for the selection API, but it does for focusability.

I already changed the spec whatwg/html#7605
and updated WPT in #32817.

Note this only affects the webexposed behavior. The accessibility tree
still considers the contents of an inert frame to be inert, as tested by
All/DumpAccessibilityTreeTestWithIgnoredNodes.AccessibilityModalDialogAndIframes/*

Therefore Frame::is_inert_ and related flags are kept for accessibility,
but they will no longer effect ComputedStyle::IsInert().

Also note that even if the contents in the nested browsing contexts are
not marked as inert, if the browsing context container is inert, they
won't respond to mouse interactions, and they won't be reached by
sequential navigation.

Bug: 1293191

TEST=All/DumpAccessibilityTreeTestWithIgnoredNodes.InertAttribute/*
TEST=All/SitePerProcessBrowserTest.CrossProcessInertSubframe/*
TEST=All/SitePerProcessBrowserTest.CrossProcessIsInertPropagation/*
TEST=third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/inert-focus-in-frames.html
TEST=third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/inertness-with-modal-dialogs-and-iframes.html
TEST=third_party/blink/web_tests/fast/dom/inert/inert-focus-in-frames.html

AX-Relnotes: n/a.

Change-Id: I70820d2aeca98e1c4036bd3f8c41ef0129a97a63
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3302103
Reviewed-by: Aaron Leventhal <[email protected]>
Reviewed-by: Mason Freed <[email protected]>
Reviewed-by: Arthur Sonzogni <[email protected]>
Commit-Queue: Oriol Brufau <[email protected]>
Cr-Commit-Position: refs/heads/main@{#973015}
  • Loading branch information
Loirooriol authored and chromium-wpt-export-bot committed Feb 18, 2022
1 parent 9f1f3df commit 9c81c01
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,11 @@
let focusedElement = null;
element.addEventListener('focus', function() { focusedElement = element; }, false);
element.focus();
assert_equals(focusedElement === element, expectFocus, element.id);
if (expectFocus) {
assert_equals(focusedElement, element, element.id);
} else {
assert_not_equals(focusedElement, element, element.id);
}
}

// Opening a modal dialog in frame1. It blocks other nodes in its document.
Expand All @@ -46,7 +50,7 @@

testFocus(frame1.querySelector('.target'), false);
const iframe = frame1.querySelector('#iframe1').contentDocument;
testFocus(iframe.querySelector('.target'), false);
testFocus(iframe.querySelector('.target'), true);

// Even a modal dialog in the iframe is blocked by the modal dialog in the parent frame1.
iframe.querySelector('dialog').showModal();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
<link rel="author" title="Oriol Brufau" href="mailto:[email protected]">
<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#inert">
<meta name="assert" content="Checks that a modal dialog marks outer nodes as inert,
but only in its document, not in the parent browsing context.
Also, when an iframe is marked as inert by a modal dialog,
all contents in the nested browsing context are marked as inert too.">
but only in its document, not in the parent browsing context,
nor in nested browsing contexts.">
<div id="log"></div>
<div id="wrapper">
(main document: outer text)
Expand Down Expand Up @@ -103,30 +102,30 @@

checkSelection(window, "(main document: dialog)");
checkSelection(innerIframeWindow, "(inner iframe: outer text)(inner iframe: dialog)");
checkSelection(outerIframeWindow, "");
}, "Modal dialog in the main document marks outer nodes as inert. All contents of the outer iframe are also marked as inert.");
checkSelection(outerIframeWindow, "(outer iframe: outer text)(outer iframe: dialog)");
}, "Modal dialog in the main document marks outer nodes as inert. Contents of the outer iframe aren't marked as inert.");

promise_test(async function() {
showModals(this, [innerIframeWindow, window]);

checkSelection(window, "(main document: dialog)");
checkSelection(innerIframeWindow, "(inner iframe: dialog)");
checkSelection(outerIframeWindow, "");
}, "Modal dialogs in the main document and inner iframe mark outer nodes as inert. All contents of the outer iframe are also marked as inert.");
checkSelection(outerIframeWindow, "(outer iframe: outer text)(outer iframe: dialog)");
}, "Modal dialogs in the main document and inner iframe mark outer nodes as inert. Contents of the outer iframe aren't marked as inert.");

promise_test(async function() {
showModals(this, [outerIframeWindow, window]);

checkSelection(window, "(main document: dialog)");
checkSelection(innerIframeWindow, "(inner iframe: outer text)(inner iframe: dialog)");
checkSelection(outerIframeWindow, "");
}, "Modal dialogs in the main document and outer iframe mark outer nodes as inert. All contents of the outer iframe are also marked as inert.");
checkSelection(outerIframeWindow, "(outer iframe: dialog)");
}, "Modal dialogs in the main document and outer iframe mark outer nodes as inert. Contents of the outer iframe aren't marked as inert.");

promise_test(async function() {
showModals(this, [innerIframeWindow, outerIframeWindow, window]);

checkSelection(window, "(main document: dialog)");
checkSelection(innerIframeWindow, "(inner iframe: dialog)");
checkSelection(outerIframeWindow, "");
}, "Modal dialogs in the main document and both iframes mark outer nodes as inert. All contents of the outer iframe are also marked as inert.");
checkSelection(outerIframeWindow, "(outer iframe: dialog)");
}, "Modal dialogs in the main document and both iframes mark outer nodes as inert. Contents of the outer iframe aren't marked as inert.");
</script>

0 comments on commit 9c81c01

Please sign in to comment.