[webkit-changes] [WebKit/WebKit] c96dd4: Make fullscreen API use the top layer
Tim Nguyen
noreply at github.com
Tue Dec 6 21:10:11 PST 2022
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: c96dd4f574c01a761f875ce4222725c44693f2b1
https://github.com/WebKit/WebKit/commit/c96dd4f574c01a761f875ce4222725c44693f2b1
Author: Tim Nguyen <ntim at apple.com>
Date: 2022-12-06 (Tue, 06 Dec 2022)
Changed paths:
M LayoutTests/fullscreen/full-screen-enter-while-exiting-expected.txt
M Source/WebCore/css/CSSSelector.cpp
M Source/WebCore/css/CSSSelector.h
M Source/WebCore/css/SelectorChecker.cpp
M Source/WebCore/css/SelectorCheckerTestFunctions.h
M Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in
M Source/WebCore/css/fullscreen.css
M Source/WebCore/cssjit/SelectorCompiler.cpp
M Source/WebCore/dom/Document.cpp
M Source/WebCore/dom/Element.cpp
M Source/WebCore/dom/Element.h
M Source/WebCore/dom/FullscreenManager.cpp
M Source/WebCore/dom/FullscreenManager.h
M Source/WebCore/dom/Node.h
Log Message:
-----------
Make fullscreen API use the top layer
https://bugs.webkit.org/show_bug.cgi?id=84798
rdar://11313423
Reviewed by Darin Adler.
The fullscreen API should use the top layer instead of the fullscreen stack. Some notes:
- Pushing to the top layer causes visual changes, so we need to update the DOM methods to follow spec order to prevent unintended effects.
Visual changes can't happen before `willEnterFullscreen` and can't happen before `didExitFullscreen` when fully entering/exiting fullscreen.
- Since top layer handles visual z-ordering, we can remove old style hacks of clobbering the ancestor chain with special styling, and the associated
containsFullscreenElement node flag.
Spec: https://fullscreen.spec.whatwg.org
* LayoutTests/fullscreen/full-screen-enter-while-exiting-expected.txt:
Events are now scheduled and dispatched in didExitFullscreen instead of exitFullscreen(), hence the order change.
* Source/WebCore/css/CSSSelector.cpp:
(WebCore::CSSSelector::selectorText const):
* Source/WebCore/css/CSSSelector.h:
* Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in:
* Source/WebCore/cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::addPseudoClassType):
Remove temporary backdrop workaround that was landed in https://commits.webkit.org/256226@main .
* Source/WebCore/css/SelectorChecker.cpp:
(WebCore::SelectorChecker::checkOne const):
* Source/WebCore/css/SelectorCheckerTestFunctions.h:
(WebCore::matchesFullScreenPseudoClass):
(WebCore::matchesFullScreenAncestorPseudoClass):
Rewrite selector checker functions to account for removal of containsFullscreenElement flag.
Since :-webkit-fullscreen-ancestor main usage was for the UA stylesheet, we may be able to remove it in a followup clean up.
(WebCore::matchesFullScreenParentPseudoClass): Deleted. (part of the backdrop workaround)
* Source/WebCore/css/fullscreen.css:
(#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API):
(:root:-webkit-full-screen-document:not(:-webkit-full-screen)): Only keep overflow: hidden; since top layer does not make the root element unscrollable.
(iframe:-webkit-full-screen): Match the spec.
(:not(:root):-webkit-full-screen::backdrop): Match the spec by making the fullscreen backdrops black.
(:-webkit-full-screen): Deleted. (not needed with top layer)
(:root:-webkit-full-screen-document:not(:-webkit-full-screen), :root:-webkit-full-screen-ancestor): Deleted.
(:-webkit-full-screen-ancestor:not(iframe)): Deleted. (not needed with top layer)
(video:-webkit-full-screen, audio:-webkit-full-screen): Deleted. (to match the spec)
(:-webkit-full-screen-parent::before): Deleted. (fake backdrop workaround)
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::nodeChildrenWillBeRemoved):
(WebCore::Document::nodeWillBeRemoved):
Move element removal handling to `Element::removedFromAncestor()`
* Source/WebCore/dom/Element.cpp:
(WebCore::Element::insertedIntoAncestor):
(WebCore::Element::removedFromAncestor):
(WebCore::Element::setFullscreenFlag):
(WebCore::Element::setIframeFullscreenFlag):
(WebCore::parentCrossingFrameBoundaries): Deleted.
(WebCore::Element::setContainsFullScreenElement): Deleted.
(WebCore::Element::setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries): Deleted.
Removed the containsFullscreenElement flag and replace it with fullscreen flag and iframe fullscreen flag.
* Source/WebCore/dom/Element.h: Ditto
(WebCore::Element::hasFullscreenFlag const):
(WebCore::Element::hasIframeFullscreenFlag const):
(WebCore::Element::containsFullScreenElement const): Deleted.
* Source/WebCore/dom/FullscreenManager.cpp:
(WebCore::FullscreenManager::fullscreenElement const): Rewrite it to iterate through top layer instead of fullscreen stack.
(WebCore::FullscreenManager::requestFullscreenForElement): Removed all fullscreen stack handling. Top layer handling is now in `willEnterFullscreen` since it performs visual changes.
(WebCore::FullscreenManager::cancelFullscreen): Basically exitFullscreen() but always exits everything.
(WebCore::documentsToUnfullscreen): "collecting documents to unfullscreen" algorithm from spec
(WebCore::FullscreenManager::exitFullscreen): Steps 1 - 8 of exit fullscreen algorithm from spec
(WebCore::FullscreenManager::finishExitFullscreen): Steps 12 - 15 of exit fullscreen algorithm from spec
(WebCore::FullscreenManager::willEnterFullscreen): Push documents to top layer, add fullscreen flag & emit events (Step 12 of request fullscreen in spec)
(WebCore::FullscreenManager::didExitFullscreen): Everything else that is needed when fully exiting fullscreen.
(WebCore::FullscreenManager::exitRemovedFullscreenElementIfNeeded): "removing steps" for element from spec (except for top layer removal which is already done later on in Element::removedFromAncestor)
(WebCore::FullscreenManager::isSimpleFullscreenDocument const): "Simple fullscreen document" as defined by the spec, e.g. a document with only one fullscreen element in the top layer.
(WebCore::FullscreenManager::adjustFullscreenElementOnNodeRemoval): Deleted. Replaced by exitRemovedFullscreenElementIfNeeded called from Element::removedFromAncestor().
(WebCore::FullscreenManager::clearFullscreenElementStack): Deleted.
(WebCore::FullscreenManager::popFullscreenElementStack): Deleted.
(WebCore::FullscreenManager::pushFullscreenElementStack): Deleted.
(WebCore::FullscreenManager::clear):
Remove fullscreen stack remainders.
* Source/WebCore/dom/FullscreenManager.h:
* Source/WebCore/dom/Node.h:
Add IsFullscreen/IsIframeFullscreen flags, remove ContainsFullScreenElement.
Shuffle flags around, since Bit 31 is actually not usable (causes integer overflow when using it).
Canonical link: https://commits.webkit.org/257456@main
More information about the webkit-changes
mailing list