Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LBSE] Fix/enable zooming & panning - improve interop #5073

Conversation

nikolaszimmermann
Copy link
Contributor

@nikolaszimmermann nikolaszimmermann commented Oct 6, 2022

f2385c3

[LBSE] Fix/enable zooming & panning - improve interop
https://bugs.webkit.org/show_bug.cgi?id=245507

Reviewed by Rob Buis.

Zooming/panning is entirely broken and unprecdictable if LBSE is activated.
It often shows no immediate effect, or painting artefacts upon scrolling.

Fix panning by implementing RenderSVGRoot::updateFromElement() and using
it from SVGSVGElement::updateCurrentTranslate() to request pan updates.
Forward updateFromElement() calls to the viewportContainer() (the anonymous
RenderSVGViewportContainer wrapping the rest of the SVG render tree) to
update the layer transform.

Enforce 'HasSVGTransform' flag to be set on thew viewportContainer() if
it gained a SVG transform due to full page zoom or panning. It only used
to work if other means caused the flag to be set (e.g. viewBox transform).

This also improves interop with Blink/Gecko, resolving a 15+ year old issue.
SVGs with relative sized width/height cannot be zoomed (stroke-width enlarges,
but document stays at the same size, scrollbars never appear).
RenderSVGRoot::computeReplacedLogicalWidth() now multiples the result by the
effectiveZoom() if the document has no intrinsic width (e.g. % units!).
Likewise computeReplacedLogicalHeight() now also respects the zoom.

The other code paths in computeReplacedLogicalWidh() already implicitely took the
zoom into account, e.g. if isEmbeddedThroughFrameContainingSVGDocument() = true, the
containingBlock() availableLogicalWidth() is returned. These kind of CSS values are
multiplied by the effectiveZoom() by default during Length resolving, whereas SVG elements
don't - see Style::BuilderState::useSVGZoomRulesForLength. This is correct for the whole
SVG subtree, since the effectiveZoom() induced scaling is realized by applying a transform
to the outermost RenderSVGViewportContainer layer, not by scaling individual length values.

This PR fixes all page zoom / panning / .. issues in LBSE.
Covered by various existing tests (see TestExpectations changes).

* LayoutTests/platform/mac-monterey-wk2-lbse-text/TestExpectations:
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/custom/pan-direction-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/absolute-sized-document-no-scrollbars-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/absolute-sized-document-scrollbars-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/relative-sized-document-scrollbars-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/relative-sized-document-scrollbars-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-coords-viewattr-01-b-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-coords-viewattr-01-b-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreign-content-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreign-content-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreignObject-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreignObject-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-008-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-008-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-009-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-009-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-rendering-model-004-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-rendering-model-004-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-replaced-intrinsic-ratio-001-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-as-object-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-float-border-padding-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-float-border-padding-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-through-object-with-auto-size-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-through-object-with-override-size-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/text/zoom-hixie-mixed-008-expected.png: Added.
* Source/WebCore/rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::computeReplacedLogicalWidth const):
(WebCore::RenderSVGRoot::computeReplacedLogicalHeight const):
(WebCore::RenderSVGRoot::updateLayoutSizeIfNeeded):
(WebCore::RenderSVGRoot::updateFromElement):
(WebCore::RenderSVGRoot::updateFromStyle):
(WebCore::RenderSVGRoot::computeViewportSize const):
(WebCore::RenderSVGRoot::overflowClipRect const):
* Source/WebCore/rendering/svg/RenderSVGRoot.h:
* Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp:
(WebCore::RenderSVGViewportContainer::updateLayoutSizeIfNeeded):
(WebCore::RenderSVGViewportContainer::needsHasSVGTransformFlag const):
(WebCore::RenderSVGViewportContainer::updateFromStyle):
(WebCore::RenderSVGViewportContainer::updateLayerTransform):
* Source/WebCore/rendering/svg/RenderSVGViewportContainer.h:
* Source/WebCore/svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::updateCurrentTranslate):

Canonical link: https://commits.webkit.org/255727@main

caca2a9

Misc iOS, tvOS & watchOS macOS Linux Windows
βœ… πŸ§ͺ style βœ… πŸ›  ios βœ… πŸ›  mac βœ… πŸ›  wpe   πŸ›  πŸ§ͺ win
βœ… πŸ§ͺ bindings βœ… πŸ›  ios-sim βœ… πŸ›  mac-debug βœ… πŸ›  gtk   πŸ›  wincairo
βœ… πŸ§ͺ webkitperl   πŸ§ͺ ios-wk2 βœ… πŸ›  mac-AS-debug   πŸ§ͺ gtk-wk2
βœ… πŸ§ͺ api-ios βœ… πŸ§ͺ api-mac   πŸ§ͺ api-gtk
βœ… πŸ›  tv   πŸ§ͺ mac-wk1
βœ… πŸ›  tv-sim   πŸ§ͺ mac-wk2
βœ… πŸ›  πŸ§ͺ merge βœ… πŸ›  watch   πŸ§ͺ mac-AS-debug-wk2
βœ… πŸ›  watch-sim βœ… πŸ§ͺ mac-wk2-stress

@nikolaszimmermann nikolaszimmermann self-assigned this Oct 6, 2022
@nikolaszimmermann nikolaszimmermann added SVG For bugs in the SVG implementation. WebKit Local Build labels Oct 6, 2022
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Oct 6, 2022
@nikolaszimmermann nikolaszimmermann removed the merging-blocked Applied to prevent a change from being merged label Oct 17, 2022
@nikolaszimmermann nikolaszimmermann changed the title [LBSE] Fix/enable zooming & panning - improve interop [LBSE] Oct 17, 2022
@nikolaszimmermann nikolaszimmermann force-pushed the eng/LBSE-Fixenable-zooming--panning---improve-interop branch from 60aeb73 to 388d09f Compare October 17, 2022 08:29
@webkit-early-warning-system
Copy link
Collaborator

Starting EWS tests for 388d09f. Live statuses available at the PR page, #5073

@nikolaszimmermann nikolaszimmermann changed the title [LBSE] [LBSE] Fix/enable zooming & panning - improve interop Oct 17, 2022
@nikolaszimmermann
Copy link
Contributor Author

Ready for review, all dependencies were merged (PR #4995 and PR #5021) - thanks again @rwlbuis.

@nikolaszimmermann nikolaszimmermann force-pushed the eng/LBSE-Fixenable-zooming--panning---improve-interop branch from 388d09f to fb8afc0 Compare October 17, 2022 22:00
Source/WebCore/svg/SVGSVGElement.cpp Outdated Show resolved Hide resolved
@nikolaszimmermann nikolaszimmermann force-pushed the eng/LBSE-Fixenable-zooming--panning---improve-interop branch from fb8afc0 to caca2a9 Compare October 19, 2022 09:59
Copy link
Contributor

@rwlbuis rwlbuis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@nikolaszimmermann nikolaszimmermann added the merge-queue Applied to send a pull request to merge-queue label Oct 19, 2022
https://bugs.webkit.org/show_bug.cgi?id=245507

Reviewed by Rob Buis.

Zooming/panning is entirely broken and unprecdictable if LBSE is activated.
It often shows no immediate effect, or painting artefacts upon scrolling.

Fix panning by implementing RenderSVGRoot::updateFromElement() and using
it from SVGSVGElement::updateCurrentTranslate() to request pan updates.
Forward updateFromElement() calls to the viewportContainer() (the anonymous
RenderSVGViewportContainer wrapping the rest of the SVG render tree) to
update the layer transform.

Enforce 'HasSVGTransform' flag to be set on thew viewportContainer() if
it gained a SVG transform due to full page zoom or panning. It only used
to work if other means caused the flag to be set (e.g. viewBox transform).

This also improves interop with Blink/Gecko, resolving a 15+ year old issue.
SVGs with relative sized width/height cannot be zoomed (stroke-width enlarges,
but document stays at the same size, scrollbars never appear).
RenderSVGRoot::computeReplacedLogicalWidth() now multiples the result by the
effectiveZoom() if the document has no intrinsic width (e.g. % units!).
Likewise computeReplacedLogicalHeight() now also respects the zoom.

The other code paths in computeReplacedLogicalWidh() already implicitely took the
zoom into account, e.g. if isEmbeddedThroughFrameContainingSVGDocument() = true, the
containingBlock() availableLogicalWidth() is returned. These kind of CSS values are
multiplied by the effectiveZoom() by default during Length resolving, whereas SVG elements
don't - see Style::BuilderState::useSVGZoomRulesForLength. This is correct for the whole
SVG subtree, since the effectiveZoom() induced scaling is realized by applying a transform
to the outermost RenderSVGViewportContainer layer, not by scaling individual length values.

This PR fixes all page zoom / panning / .. issues in LBSE.
Covered by various existing tests (see TestExpectations changes).

* LayoutTests/platform/mac-monterey-wk2-lbse-text/TestExpectations:
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/custom/pan-direction-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/absolute-sized-document-no-scrollbars-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/absolute-sized-document-scrollbars-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/relative-sized-document-scrollbars-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/relative-sized-document-scrollbars-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-coords-viewattr-01-b-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-coords-viewattr-01-b-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreign-content-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreign-content-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreignObject-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-foreignObject-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-008-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-008-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-009-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-mixed-009-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-rendering-model-004-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-hixie-rendering-model-004-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-img-preserveAspectRatio-support-1-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-replaced-intrinsic-ratio-001-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-as-object-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-float-border-padding-expected.png: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-float-border-padding-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-through-object-with-absolute-size-2-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-through-object-with-auto-size-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/page/zoom-svg-through-object-with-override-size-expected.txt: Added.
* LayoutTests/platform/mac-monterey-wk2-lbse-text/svg/zoom/text/zoom-hixie-mixed-008-expected.png: Added.
* Source/WebCore/rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::computeReplacedLogicalWidth const):
(WebCore::RenderSVGRoot::computeReplacedLogicalHeight const):
(WebCore::RenderSVGRoot::updateLayoutSizeIfNeeded):
(WebCore::RenderSVGRoot::updateFromElement):
(WebCore::RenderSVGRoot::updateFromStyle):
(WebCore::RenderSVGRoot::computeViewportSize const):
(WebCore::RenderSVGRoot::overflowClipRect const):
* Source/WebCore/rendering/svg/RenderSVGRoot.h:
* Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp:
(WebCore::RenderSVGViewportContainer::updateLayoutSizeIfNeeded):
(WebCore::RenderSVGViewportContainer::needsHasSVGTransformFlag const):
(WebCore::RenderSVGViewportContainer::updateFromStyle):
(WebCore::RenderSVGViewportContainer::updateLayerTransform):
* Source/WebCore/rendering/svg/RenderSVGViewportContainer.h:
* Source/WebCore/svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::updateCurrentTranslate):

Canonical link: https://commits.webkit.org/255727@main
@webkit-early-warning-system webkit-early-warning-system force-pushed the eng/LBSE-Fixenable-zooming--panning---improve-interop branch from caca2a9 to f2385c3 Compare October 19, 2022 11:06
@webkit-commit-queue
Copy link
Collaborator

Committed 255727@main (f2385c3): https://commits.webkit.org/255727@main

Reviewed commits have been landed. Closing PR #5073 and removing active labels.

@webkit-commit-queue webkit-commit-queue removed the merge-queue Applied to send a pull request to merge-queue label Oct 19, 2022
@webkit-early-warning-system webkit-early-warning-system merged commit f2385c3 into WebKit:main Oct 19, 2022
@nikolaszimmermann nikolaszimmermann deleted the eng/LBSE-Fixenable-zooming--panning---improve-interop branch October 19, 2022 11:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
SVG For bugs in the SVG implementation.
Projects
None yet
5 participants