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

Popover: update @floating-ui to latest version, remove custom fix for iframe positioning and scaling #46845

Merged
merged 9 commits into from
Aug 30, 2023

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Jan 2, 2023

What?

With floating-ui/floating-ui#2043 merged, this PR updates @floating-ui to its latest version and removes any custom fixes that around Popover positioning across different documents (ie. anchor inside iframe, reference in root document). (also see floating-ui/floating-ui#1869 for a description of the original issue)

Why?

The custom fix was supposed to be temporary, and hopefully @floating-ui's latest updates will allow us to remove it.

How?

  • Updated @floating-ui's version
  • Removed custom fixes

Testing Instructions

In the editor

Open the site editor, try editing a template (or the whole site). Select a block, make sure that the toolbar is anchored correctly to the selected block. Try scrolling, make sure that the toolbar scrolls as expected and then sticks at the edges of the viewport.

On storybook

Open the Popover's "With Slot outside IFrame" Storybook example, and make sure that the Popover follow its anchor's position correctly

Testing Instructions for Keyboard

N/A

Screenshots or screencast

N/A

@ciampo ciampo self-assigned this Jan 2, 2023
@github-actions
Copy link

github-actions bot commented Jan 2, 2023

Size Change: -104 B (0%)

Total Size: 1.51 MB

Filename Size Change
build/block-editor/index.min.js 213 kB -19 B (0%)
build/components/index.min.js 245 kB -84 B (0%)
build/rich-text/index.min.js 11 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.25 kB
build/block-editor/content.css 4.24 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 15 kB
build/block-editor/style.css 15 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 629 B
build/block-library/blocks/button/style.css 628 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.63 kB
build/block-library/blocks/cover/style.css 1.62 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.41 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.83 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 607 B
build/block-library/blocks/search/style.css 607 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 203 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.8 kB
build/block-library/style.css 13.8 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.2 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 932 B
build/commands/style.css 929 B
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.72 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.38 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.4 kB
build/edit-post/style-rtl.css 7.62 kB
build/edit-post/style.css 7.62 kB
build/edit-site/index.min.js 91.1 kB
build/edit-site/style-rtl.css 13.2 kB
build/edit-site/style.css 13.2 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.53 kB
build/editor/style.css 3.52 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.59 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 11.2 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 2.71 kB
build/patterns/style-rtl.css 240 B
build/patterns/style.css 240 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 958 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.85 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@ciampo ciampo added [Type] Enhancement A suggestion for improvement. [Package] Components /packages/components labels Jan 2, 2023
@gziolo
Copy link
Member

gziolo commented Aug 10, 2023

It would be great to take it to the finish line as it's causing issues when handling WordPress core releases. @tellthemachines highlighted some aspects of it in the Proposal: improve the editor tech workflow for major releases in the "Package ecosystem problems" section.

@gziolo gziolo added the [Priority] High Used to indicate top priority items that need quick attention label Aug 10, 2023
@ockham
Copy link
Contributor

ockham commented Aug 17, 2023

👋 @ciampo @jsnajdr @tyxla @noahtallen Any chance y'all could maybe prioritize this one? 😊 Seems like the pinned dependency is adding some extra friction to the WordPress release process 😅

@jsnajdr
Copy link
Member

jsnajdr commented Aug 18, 2023

I'm going to have a look 👍

@jsnajdr jsnajdr force-pushed the fix/popover-iframe branch from 59856b7 to 961758f Compare August 21, 2023 10:28
@jsnajdr
Copy link
Member

jsnajdr commented Aug 21, 2023

I just rebased the PR onto latest trunk (it was many months old). It now uses the latest @floating-ui/react-dom version 2.0.0, which is a major upgrade from the previous 1.x version.

There is a breaking change in version 2.0 where the useFloating hook no longer returns the floating and reference fields, they've been moved to refs.setFloating and refs.setReference. It was easy to update the 2-3 usages.

But currently, after the upgrade, the positioning doesn't work. A block toolbar is not aligned to the block, but to the entire document canvas. We need to figure out what's wrong. @mirka have you been looking at this issue, too?

Another thing that's very likely to be broken now is the "Zoom out mode" stuff that @ellatrix added in #47004. We'll need to test the behavior when the iframe is zoomed.

@jsnajdr
Copy link
Member

jsnajdr commented Aug 22, 2023

But currently, after the upgrade, the positioning doesn't work. A block toolbar is not aligned to the block, but to the entire document canvas.

This is fixed now. To take iframes into account, the "virtual elements" passed to Floating UI, i.e., the objects with custom getBoundingClientRect methods, also need a contextElement field. That field is accessed in order to look up its ownerDocument, its window and the window's frameElement.

What remains is to fix the "zoom out mode". I suspect we're accounting for the iframe's scale twice now.

@jsnajdr jsnajdr force-pushed the fix/popover-iframe branch from 7e43290 to 2962306 Compare August 23, 2023 10:34
@jsnajdr jsnajdr changed the title [WIP] Popover: Update @floating-ui to latest version, remove custom fix for iframe positioning Popover: update @floating-ui to latest version, remove custom fix for iframe positioning and scaling Aug 23, 2023
@jsnajdr jsnajdr marked this pull request as ready for review August 23, 2023 10:47
@jsnajdr jsnajdr requested review from mirka, tyxla and flootr August 23, 2023 10:47
@jsnajdr jsnajdr force-pushed the fix/popover-iframe branch from a1015d6 to 26b3e1a Compare August 23, 2023 10:49
@jsnajdr
Copy link
Member

jsnajdr commented Aug 23, 2023

I believe this upgrade is ready for review, testing, and merging.

The last issue I fixed today was the experimental "zoom out" mode in Site Editor. I needed to:

  • remove the code that manually figures out the owner iframe scale and applies it to the reference element, in a custom getBoundingClientRect function. The iframe scale is applied automatically inside floating-ui.
  • re-add the scroll handler to the owner iframe, to update positioning every time the iframe scrolls.
  • patch the getReferenceOwnerDocument function to correctly find the ownerDocument when the anchor is a VirtualElement with a .contextElement field.

How to test:
Test all kinds of popovers inside Gutenberg. I specifically tested block toolbars on individual blocks, and the "in between" popovers both in regular Post Editor and also in Site Editor's zoom-out mode.

tyxla
tyxla previously requested changes Aug 24, 2023
packages/components/src/popover/index.tsx Show resolved Hide resolved
@tyxla tyxla dismissed their stale review August 24, 2023 13:52

Just needed to re-run npm install

Copy link
Member

@tyxla tyxla left a comment

Choose a reason for hiding this comment

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

Doing some testing, I spotted some clunkiness that I see only with this branch. When opening the post editor more menu in a small window, and scrolling aggressively to the top, you can see some of that weird jumping around. Previously, that wasn't there.

This branch:

Screen.Recording.2023-08-24.at.16.56.48.mov

trunk:

Screen.Recording.2023-08-24.at.17.01.06.mov

Is this something we should be worried about?

@jsnajdr
Copy link
Member

jsnajdr commented Aug 24, 2023

scrolling aggressively to the top, you can see some of that weird jumping around.

That's indeed an interesting observation, I'll try to figure out why the jumping is happening. Maybe it has something to do with the scroll listener we talked about yesterday. Looking at Floating UI changelog, I noticed some changes about usage of Intersection Observers etc. Maybe there are two scroll-detecting mechanisms in action, both trying to handle the same scrolling.

@ciampo
Copy link
Contributor Author

ciampo commented Aug 29, 2023

Not sure if it helps, but I wonder if these lines could be related:

whileElementsMounted: ( referenceParam, floatingParam, updateParam ) =>
autoUpdate( referenceParam, floatingParam, updateParam, {
animationFrame: true,
} ),

Notice, in particular, the animationFrame option. I originally had to add it to get smoother updates, but I wonder if it may be in conflict with something else now?

Related docs:

@jsnajdr
Copy link
Member

jsnajdr commented Aug 29, 2023

Notice, in particular, the animationFrame option.

There are some news about animationFrame in the Floating UI changelog: https://github.com/floating-ui/floating-ui/releases/tag/%40floating-ui%2Fdom%401.4.0 It says that there is a new layoutShift option for autoUpdate that supersedes animationFrame and uses IntersectionObserver instead. And after removing animationFrame, the jumping that @tyxla reported becomes indeed much calmer.

animationFrame: true is now recommended only if you want to recompute the position in reaction to an ongoing animation of the transform CSS property.

By the way, maybe the Post Editor More menu could benefit from using the overscroll-behavior CSS property which would disable the "rubber band" overscroll of the menu element.

@jsnajdr jsnajdr force-pushed the fix/popover-iframe branch from f42b785 to adb9a2e Compare August 29, 2023 10:39
@jsnajdr jsnajdr force-pushed the fix/popover-iframe branch from adb9a2e to 3d62c20 Compare August 29, 2023 11:50
@jsnajdr jsnajdr requested a review from peterwilsoncc as a code owner August 29, 2023 11:50
@jsnajdr
Copy link
Member

jsnajdr commented Aug 29, 2023

After spending some more time with the animationFrame option and the menu scrolling behavior, and testing various scenarios, I came up with the final configuration for autoUpdate:

autoUpdate( r, f, u, {
  layoutShift: false,
  animationFrame: true,
} );

I'm explicitly disabling the new layoutShift update checking, which uses IntersectionObserver on the reference element, and using only animationFrame.

It seems that it was this combination of two update checks that caused the menu jumping. Using only one check fixes that.

Using layoutShift: true, animationFrame: false, i.e., the default configuration, also works fairly well, but it's not the best. The IntersectionObserver fires its updates with certain time lag, and the popover repositioning also has a visible time lag when scrolling. For example, the block toolbar doesn't feel as it was "glued" to the block, but it's rather "flying behind" it.


updateFrameOffset();
defaultView.addEventListener( 'resize', update );
scrollContainer?.addEventListener( 'scroll', update );
Copy link
Member

Choose a reason for hiding this comment

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

The reason why we need to attach our own listeners to the iframe's scroll container is described in floating-ui/floating-ui#2518. Once that's fixed, Floating UI will attach them automatically for us, will watch for scroll position changes for us, and our workaround code can be removed.

@jsnajdr
Copy link
Member

jsnajdr commented Aug 29, 2023

After addressing feedback, I once again believe this is ready for final review 🙂 @ciampo can you have an expert look at this? There surely are popover configurations I didn't test.

@ciampo
Copy link
Contributor Author

ciampo commented Aug 30, 2023

Your findings about the animationFrame flag match my memories from when I worked on Popover last year - the animationFrame flag was the only way I could get popovers and dropdowns to render smoothly and follow the page while scrolling (even though they definitely come at a cost in terms of rendering perf)

I spent some time testing popovers across the editor and couldn't see any regression (although I admit that it's been 2 months since I last worked in the editor).

I say we merge this PR, and keep our eyes peeled for any report of regression, since we have a couple of months before the next WP release.

Feel free to approve this PR on my behalf (I can't, since I'm the original author)

@jsnajdr jsnajdr merged commit 67dc1bc into trunk Aug 30, 2023
51 checks passed
@jsnajdr jsnajdr deleted the fix/popover-iframe branch August 30, 2023 13:05
@github-actions github-actions bot added this to the Gutenberg 16.6 milestone Aug 30, 2023
@ockham
Copy link
Contributor

ockham commented Aug 30, 2023

Thanks a lot for fixing this @ciampo @jsnajdr and @tyxla! 👏

@tellthemachines
Copy link
Contributor

Thank you all so much for fixing this ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Priority] High Used to indicate top priority items that need quick attention [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants