Skip to content

Commit

Permalink
[view-transitions] Skip view transition when new element becomes hidden
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=270815
rdar://124406569

Reviewed by Ryosuke Niwa.

As mandated by the spec.

* LayoutTests/TestExpectations:
* Source/WebCore/dom/ViewTransition.cpp:
(WebCore::ViewTransition::captureOldState):
(WebCore::ViewTransition::activateViewTransition):
(WebCore::ViewTransition::updatePseudoElementStyles):
* Source/WebCore/dom/ViewTransition.h:

Canonical link: https://commits.webkit.org/275956@main
  • Loading branch information
nt1m committed Mar 12, 2024
1 parent 5e785e8 commit 092ba08
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 7 deletions.
1 change: 0 additions & 1 deletion LayoutTests/TestExpectations
Original file line number Diff line number Diff line change
Expand Up @@ -6922,7 +6922,6 @@ imported/w3c/web-platform-tests/css/css-view-transitions/content-visibility-auto
imported/w3c/web-platform-tests/css/css-view-transitions/content-with-transform-new-image.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/dialog-in-top-layer-during-transition-old.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/element-with-overflow.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/exit-transition-with-anonymous-layout-object.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/far-away-capture.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/fractional-box-with-overflow-children-new.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html [ ImageOnlyFailure ]
Expand Down
22 changes: 17 additions & 5 deletions Source/WebCore/dom/ViewTransition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,9 @@ ExceptionOr<void> ViewTransition::captureOldState()
if (auto name = effectiveViewTransitionName(element); !name.isNull()) {
if (auto check = checkDuplicateViewTransitionName(name, usedTransitionNames); check.hasException())
return check.releaseException();

// FIXME: Skip fragmented content.

captureElements.append(element);
}
return { };
Expand Down Expand Up @@ -493,7 +496,11 @@ void ViewTransition::activateViewTransition()
}

setupTransitionPseudoElements();
updatePseudoElementStyles();
checkFailure = updatePseudoElementStyles();
if (checkFailure.hasException()) {
skipViewTransition(checkFailure.releaseException());
return;
}

m_phase = ViewTransitionPhase::Animating;
m_ready.second->resolve();
Expand Down Expand Up @@ -618,15 +625,19 @@ Ref<MutableStyleProperties> ViewTransition::copyElementBaseProperties(Element& e
}

// https://drafts.csswg.org/css-view-transitions-1/#update-pseudo-element-styles
void ViewTransition::updatePseudoElementStyles()
ExceptionOr<void> ViewTransition::updatePseudoElementStyles()
{
auto& resolver = protectedDocument()->styleScope().resolver();

for (auto& [name, capturedElement] : m_namedElements.map()) {
RefPtr<MutableStyleProperties> properties;
if (capturedElement->newElement) {
CheckedPtr renderBox = dynamicDowncast<RenderBox>(capturedElement->newElement->renderer());
properties = copyElementBaseProperties(*capturedElement->newElement, renderBox ? renderBox->size() : LayoutSize { });
if (RefPtr newElement = capturedElement->newElement.get()) {
// FIXME: Also check fragmented content here.
CheckVisibilityOptions visibilityOptions { .contentVisibilityAuto = true };
if (!newElement->checkVisibility(visibilityOptions))
return Exception { ExceptionCode::InvalidStateError, "One of the transitioned elements has become hidden."_s };
CheckedPtr renderBox = dynamicDowncast<RenderBox>(newElement->renderer());
properties = copyElementBaseProperties(*newElement, renderBox ? renderBox->size() : LayoutSize { });
} else
properties = capturedElement->oldProperties;

Expand All @@ -641,6 +652,7 @@ void ViewTransition::updatePseudoElementStyles()
}

protectedDocument()->styleScope().didChangeStyleSheetContents();
return { };
}

}
2 changes: 1 addition & 1 deletion Source/WebCore/dom/ViewTransition.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class ViewTransition : public RefCounted<ViewTransition>, public CanMakeWeakPtr<

Ref<MutableStyleProperties> copyElementBaseProperties(Element&, const LayoutSize&);

void updatePseudoElementStyles();
ExceptionOr<void> updatePseudoElementStyles();
void setupDynamicStyleSheet(const AtomString&, const CapturedElement&);

WeakPtr<Document, WeakPtrImplWithEventTargetData> m_document;
Expand Down

0 comments on commit 092ba08

Please sign in to comment.