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

url: update filterURLForDisplay to include all image, video, and audio file types #54920

Merged
merged 11 commits into from Oct 11, 2023

Conversation

brookewp
Copy link
Contributor

@brookewp brookewp commented Sep 28, 2023

What?

Closes #53154

When replacing a file that is not a jpg, jpeg, gif, png, or svg, the link in the 'Replace' Popover overflows the width and covers up the edit icon. It makes editing extremely difficult as the link is much easier to click than the icon.

Why?

The current RegEx used only captures limited image file types. However, this filter is used in LinkControl, which is used in many other cases, including the Video and Audio blocks, where it is completely broken.

This particular RegEx is for the URL's display, so I'm unsure if there is a need for it to be so specific. If so, that might be beyond this PR's scope, but I wanted to see if we could get something started here, as it is a frustrating UX.

How?

By changing the RegEx for media in filterURLForDisplay to capture any file extension.

Testing Instructions

Ensure tests still pass: npm run test:unit packages/url/src/test/index.js

For MediaReplaceFlow

  1. Add a block that uses LinkControl (i.e. Video, Audio, Image)
  2. Add a file format that wasn't included before (jpg, jpeg, gif, png, or svg)
  3. See the URL is shortened, and the edit icon can easily be clicked again
Before After
Screenshot 2023-09-28 at 1 55 17 PM Screenshot 2023-09-28 at 1 53 48 PM

For LinkPreview

Ensure tests still pass: npm run test:unit packages/block-editor/src/components/link-control/test/index.js

  1. Add a Paragraph block
  2. Add an inline link and open the UI to edit
  3. Hover on or tab to the link to see a tooltip with the full URL
Screenshot 2023-10-06 at 9 04 45 AM

@brookewp brookewp added [Type] Bug An existing feature does not function as intended [Package] Url /packages/url [Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) labels Sep 28, 2023
@brookewp brookewp self-assigned this Sep 28, 2023
@github-actions
Copy link

github-actions bot commented Sep 28, 2023

Size Change: +3.08 kB (0%)

Total Size: 1.65 MB

Filename Size Change
build/block-editor/index.min.js 218 kB +525 B (0%)
build/block-editor/style-rtl.css 15.6 kB +53 B (0%)
build/block-editor/style.css 15.6 kB +52 B (0%)
build/block-library/blocks/image/view.min.js 1.93 kB +24 B (+1%)
build/block-library/blocks/navigation/view.min.js 1.02 kB +13 B (+1%)
build/block-library/index.min.js 211 kB +137 B (0%)
build/blocks/index.min.js 51.5 kB +58 B (0%)
build/commands/index.min.js 15.5 kB +1 B (0%)
build/components/index.min.js 249 kB +624 B (0%)
build/components/style-rtl.css 11.9 kB -8 B (0%)
build/components/style.css 11.9 kB -8 B (0%)
build/core-commands/index.min.js 2.72 kB +3 B (0%)
build/core-data/index.min.js 70.8 kB +241 B (0%)
build/customize-widgets/index.min.js 12 kB -1 B (0%)
build/edit-post/index.min.js 35.6 kB -34 B (0%)
build/edit-site/index.min.js 203 kB +760 B (0%)
build/edit-site/style-rtl.css 14.2 kB +54 B (0%)
build/edit-site/style.css 14.2 kB +50 B (0%)
build/editor/index.min.js 45.9 kB +7 B (0%)
build/format-library/index.min.js 7.8 kB +9 B (0%)
build/patterns/index.min.js 3.7 kB +133 B (+4%)
build/patterns/style-rtl.css 518 B +193 B (+59%) 🆘
build/patterns/style.css 517 B +192 B (+59%) 🆘
build/private-apis/index.min.js 982 B +10 B (+1%)
build/reusable-blocks/index.min.js 2.73 kB +1 B (0%)
build/url/index.min.js 3.83 kB -12 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 964 B
build/annotations/index.min.js 2.71 kB
build/api-fetch/index.min.js 2.29 kB
build/autop/index.min.js 2.11 kB
build/blob/index.min.js 461 B
build/block-directory/index.min.js 7.07 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.28 kB
build/block-editor/content.css 4.27 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
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 138 B
build/block-library/blocks/audio/theme.css 138 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 633 B
build/block-library/blocks/button/style.css 632 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.7 kB
build/block-library/blocks/cover/style.css 1.69 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 138 B
build/block-library/blocks/embed/theme.css 138 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 311 B
build/block-library/blocks/file/style.css 312 B
build/block-library/blocks/file/view.min.js 321 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 228 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 343 B
build/block-library/blocks/form-submission-notification/editor.css 342 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 452 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 957 B
build/block-library/blocks/gallery/editor.css 962 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 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 189 B
build/block-library/blocks/heading/style.css 189 B
build/block-library/blocks/html/editor-rtl.css 340 B
build/block-library/blocks/html/editor.css 341 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.48 kB
build/block-library/blocks/image/style.css 1.47 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
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 671 B
build/block-library/blocks/navigation-link/editor.css 672 B
build/block-library/blocks/navigation-link/style-rtl.css 103 B
build/block-library/blocks/navigation-link/style.css 103 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 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.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 335 B
build/block-library/blocks/paragraph/style.css 335 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 345 B
build/block-library/blocks/post-featured-image/style.css 345 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 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 409 B
build/block-library/blocks/post-template/style.css 408 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 288 B
build/block-library/blocks/query-pagination/style.css 284 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 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/style-rtl.css 375 B
build/block-library/blocks/query/style.css 372 B
build/block-library/blocks/query/view.min.js 609 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 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 613 B
build/block-library/blocks/search/style.css 613 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 471 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 329 B
build/block-library/blocks/shortcode/editor.css 329 B
build/block-library/blocks/site-logo/editor-rtl.css 760 B
build/block-library/blocks/site-logo/editor.css 760 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.45 kB
build/block-library/blocks/social-links/style.css 1.45 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 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 646 B
build/block-library/blocks/table/style.css 645 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 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 191 B
build/block-library/blocks/video/style.css 191 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 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.4 kB
build/block-library/editor.css 12.4 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.4 kB
build/block-library/style.css 14.4 kB
build/block-library/theme-rtl.css 700 B
build/block-library/theme.css 705 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/style-rtl.css 947 B
build/commands/style.css 942 B
build/compose/index.min.js 12.7 kB
build/customize-widgets/style-rtl.css 1.51 kB
build/customize-widgets/style.css 1.5 kB
build/data-controls/index.min.js 651 B
build/data/index.min.js 8.78 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 462 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.68 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/style-rtl.css 7.89 kB
build/edit-post/style.css 7.88 kB
build/edit-widgets/index.min.js 17 kB
build/edit-widgets/style-rtl.css 4.84 kB
build/edit-widgets/style.css 4.84 kB
build/editor/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.87 kB
build/escape-html/index.min.js 548 B
build/format-library/style-rtl.css 577 B
build/format-library/style.css 577 B
build/hooks/index.min.js 1.57 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.61 kB
build/interactivity/index.min.js 11.4 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.76 kB
build/keycodes/index.min.js 1.9 kB
build/list-reusable-blocks/index.min.js 2.21 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 964 B
build/nux/index.min.js 2.01 kB
build/nux/style-rtl.css 775 B
build/nux/style.css 771 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 1.85 kB
build/preferences/index.min.js 1.26 kB
build/primitives/index.min.js 994 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 631 B
build/react-refresh-entry/index.min.js 9.46 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.71 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.2 kB
build/router/index.min.js 1.79 kB
build/server-side-render/index.min.js 1.96 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 1.98 kB
build/token-list/index.min.js 587 B
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 967 B
build/warning/index.min.js 259 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Sep 28, 2023

Flaky tests detected in 01f42ed.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/6487562019
📝 Reported issues:

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

Thanks for the PR 👍

I wonder whether you would be open to adding some unit tests for this function? Within those we could assert on your change.

Then future changes to this function will be easier to review and it will help to avoid any regressions.

Thanks.

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.

This is a neat fix, thanks 🙌

I wonder if instead, it's better to expand the list of allowed file types to contain the ones that are currently missing. It is a limited set of file extensions, after all (even if it's an extensible list). That would definitely make the regex longer, so don't consider that a requirement, but rather something to consider.

Otherwise, I agree that this change could use some tests to ensure we're getting the right results. There are already tests that cover cases like multiple periods, etc., but I guess we can add some tests that cover additional formats that weren't supported before.

Copy link
Contributor

@t-hamano t-hamano left a comment

Choose a reason for hiding this comment

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

Thanks for the PR, @brookewp!

As I understand it, the purpose of this function is to ensure that when a URL points to a file, the three-letter file name and extension are displayed at the end. I think this is to make it easier to understand what file is linked to instead of the URL starting from the beginning.

Therefore, I personally think it makes sense to target all files, not just media files.

For example, the inline link allows you to specify URLs with any extension that are not allowed to be uploaded by default. Below is an example where a .diff file with no media upload allowed was entered as a URL:

trunk this PR
before after

If it makes sense to allow all extensions, you might be better off with more explicit code like this:

const isFileUrl = !! filteredURL.match( /\/([^\/?]+)\.(?:[\w]+)(?=\?|$)/ );

if ( ! maxLength || filteredURL.length <= maxLength || ! isFileUrl ) {
	return filteredURL;
}

What do you think, everyone?

@brookewp
Copy link
Contributor Author

brookewp commented Oct 3, 2023

Thanks all for the feedback!

@t-hamano, if I'm understanding correctly, you're suggesting this behavior for all file URLs, for visual consistency. Perhaps that is something @jasmussen could weigh in on?

In the meantime, I'm happy to have an explicit list from the WP docs that @tyxla shared so we can safely and quickly resolve the UI issue for our UX. In that case, would other tests for various media types be helpful? Many use jpg, so we could consider replacing some with varying formats.

const mediaRegexp = /([\w|:])*\.(?:jpg|jpeg|gif|png|svg)/;

const mediaRegexp =
/([\w|:])*\.(?:jpg|jpeg|gif|png|svg|ico|webp|mp3|m4a|ogg|wav|mp4|m4v|mov|wmv|avi|mpg|ogv|3gp|3g2)/;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I didn't include the documents in the accepted file types, as this isn't a problem with the File block. But we could always add those to future-proof a bit.

Copy link
Member

Choose a reason for hiding this comment

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

Feel free to add them all IMHO.

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.

This LGTM 👍

I'd be happy with a solution that works with all files too, since as I mentioned in the earlier review, the list of allowed files can be expanded by a filter.

However, this seems to resolve the aforementioned issue for the commonly supported files, so I'm good with it.

🚀

@jasmussen
Copy link
Contributor

Perhaps #54920 (review) @jasmussen could weigh in on?

I share that instinct, and would love to see this across. It isn't useful to see a very very very long URL like that. If we absolutely have to see the full URL, it could be a tooltip, or you could see it in the input field when editing.

@getdave
Copy link
Contributor

getdave commented Oct 4, 2023

Perhaps #54920 (review) @jasmussen could weigh in on?

It isn't useful to see a very very very long URL like that. If we absolutely have to see the full URL, it could be a tooltip, or you could see it in the input field when editing.

I would like to sound a note of caution here. Based on my experience with how users utilise <LinkControl> there have been multiple points where users have wanted to see the entire URL.

Why?

Because sometimes this is the best way to help differentiate between near identical files. In the past we did try truncating the URL to a single line and we received near immediate feedback that this was causing severe difficulty for a set of our users.

This will continue to be a problem until we provide a better way to handle selecting attachments when creating links (which is another outstanding LinkControl issue 😓). A good example of this is PDF files.

Therefore, whilst I don't disagree that 80% of the time seeing a shortened URL is preferable, I would say that for attachments (at least) we should provide some means to see the entire URL.

Note that whatever solution is chosen needs to account for non-visual users and must be accessible and perceivable by users of a screenreader/keyboard.

🙏 Please note that we should also be testing this on the standard Link UI that is used when creating links in the paragraph block. That looks different to the Media block usage and needs to be considered. Thank you in advance 🙇

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

After some consideration I decided I feel strongly enough about this to leave a blocking review.

This will avoid us shipping a experience which could be detrimental to some users.

Thank you 🙇

@jasmussen jasmussen requested a review from a team October 4, 2023 08:31
@brookewp brookewp changed the title url: update filterURLForDisplay to include all file types url: update filterURLForDisplay to include all image, video, and audio file types Oct 5, 2023
@brookewp
Copy link
Contributor Author

brookewp commented Oct 5, 2023

Thanks all for the input! And @getdave for your caution, as I know you've been working on LinkControl a lot, so I appreciate that you've shared your experience with user feedback.

Please note that we should also be testing this on the standard Link UI that is used when creating links in the paragraph block.

If I'm looking at the correct Link UI, then the behavior already exists in trunk for limited image file types:

Screenshot 2023-10-04 at 7 45 23 PM

This will avoid us shipping a experience which could be detrimental to some users.

I didn't include PDFs and other documents, just video, image, and audio files, to try to resolve the UI issue with these blocks so it isn't so difficult to replace media. Since we have this in place for image files already, it didn't appear to be a big change to extend it to include a few other image formats, video, and audio files.

I do understand the hesitation in adding more files or all of them. This is why I decided to limit the scope of the files after the initial feedback, to make a smaller and more cautious change. If this is still too big and we need to reassess the design and implementation, it might be beyond the scope of this PR.

@getdave
Copy link
Contributor

getdave commented Oct 5, 2023

No problem. Appreciate you being open to feedback.

I'm keen not to overcomplicate this but I am also keen not to regress something that users actively asked us not to do.

Therefore I wonder if one solution could be:

  • add a tooltip on hover which could display the full URL.
  • add an aria-describedby or aria-details attribute to the element containing the url to make it perceivable by assitive tech (cc @alexstine for confirmation this is appropriate).

the behavior already exists in trunk for limited image file types:

I think that's because (on anything other than localhost) there would be a preview of the media file if it is an image in the "rich preview" section (once the link is submitted).

@alexstine
Copy link
Contributor

@getdave I'm not entirely sure how to test this... Not really following this well.

@alexstine alexstine added the Needs Accessibility Feedback Need input from accessibility label Oct 5, 2023
@getdave
Copy link
Contributor

getdave commented Oct 5, 2023

@getdave I'm not entirely sure how to test this... Not really following this well.

Sorry. Here is some more context.

This PR seeks to truncate the url that is displayed in the Link UI's "preview". For a normal link that URL would be something like www.wordpress.org. However, if it's an attachment (e.g. media) then it can be a very long string (think large filenames...etc) and so we want to truncate the text but show the final portion of the url.

As an example the URL www.mysite.com/uploads/images/2019/09/my-really-long-image-file-path-is-super-long-and-hard-to-type-out-haha.jpg would become something like ../../hard-to-type-out-haha.jpg.

Note that this truncation is not a visual thing. It actually removes the characters from the string.

I raised a red flag that (when we tried a similar thing in the past) users communicated that they needed to see the entire URL in certain circumstances as a way of differentiating between attachment files (think PDF files).

My suggestion is:

  • allow truncation of the URL for visual / aeathetic purposes
  • provide another means to view/access the full URL

It is for the later point that I"m requesting your input on the approach. Hypothetically would it be ok to do something like this where the element referenced as aria-describedby contains the full URL and also acts as a tooltip for sighted users:

<span aria-describedby="full-url">../../hard-to-type-out-haha.jpg</span>
<span class="tooltip" id="full-url">www.mysite.com/uploads/images/2019/09/my-really-long-image-file-path-is-super-long-and-hard-to-type-out-haha.jpg</span>

I'm not sure how easy it is for you to access the HTML example above so if that's not helpful then perhaps @brookewp would consider pulling together an working example implementation in this PR for review?

Thanks in advance.

@alexstine
Copy link
Contributor

@getdave I don't think aria-describedby will work on a span as its not an interactive element.

@getdave
Copy link
Contributor

getdave commented Oct 5, 2023

@getdave I don't think aria-describedby will work on a span as its not an interactive element.

Ok thanks.

Interestingly I just noticed that our <Tooltip> component adds an aria-describedby (referencing the tooltip popover) to whatever triggers/acts as anchor for the tooltip.

Note this from the docs:

The text shown in the tooltip when anchor element is focused or hovered.

Given the above, and Alex's reminder to use "interactive" elements, then perhaps we can anchor the tooltip to the <a> tag in the Link Preview instead?

<ExternalLink
className="block-editor-link-control__search-item-title"
href={ value.url }
>
{ displayTitle }
</ExternalLink>

Seems like that would be accessible (in all senses of the word) by default given our Tooltip implementation, but as with all such things it would require testing once implemented to be sure.

@alexstine
Copy link
Contributor

@getdave Would not hurt to try.

@brookewp
Copy link
Contributor Author

brookewp commented Oct 6, 2023

I've added a Tooltip to LinkPreview which required a couple other changes:

  • The tooltip from MediaReplaceFlow can be removed so the tooltip isn't duplicated from LinkPreview
  • The filter regex was restored to include all files again, so we don't have full URLs and tooltips for only some urls.

I also added a couple of tests. One to check the tooltip and one for new formats in the filter, based on what @tyxla suggested:

we can add some tests that cover additional formats that weren't supported before

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

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

Thank you for all the iterations here. I tested this and it works as described.

I tested standard Link UI and also the one in Media replace flow.

Example PDF.pdf

I left some minor suggestions.

Great work 👏

Comment on lines 276 to 290
it( 'returns the filename for a variety of formats', () => {
expect( getFilename( 'https://wordpress.org/file.pdf' ) ).toBe(
'file.pdf'
);
expect(
getFilename( 'https://wordpress.org/image.webp?query=test' )
).toBe( 'image.webp' );
expect( getFilename( 'https://wordpress.org/video.mov#anchor' ) ).toBe(
'video.mov'
);
expect(
getFilename( 'http://localhost:8080/a/path/to/audio.mp3' )
).toBe( 'audio.mp3' );
} );

Copy link
Contributor

Choose a reason for hiding this comment

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

It feels like we could make a single test by combining this one with returns the filename part of the URL and using it.each() to run over a variety of formats. What do you think?

Copy link
Member

Choose a reason for hiding this comment

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

I wouldn't be opposed to that, since it could add some extra durability to this feature in the case of future changes.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Sounds good!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Do we need it.each() in this case? Rather than just combining them?

it( 'returns the filename part of the URL', () => {
expect( getFilename( 'https://wordpress.org/image.jpg' ) ).toBe(
'image.jpg'
);
expect(
getFilename( 'https://wordpress.org/image.jpg?query=test' )
).toBe( 'image.jpg' );
expect( getFilename( 'https://wordpress.org/image.jpg#anchor' ) ).toBe(
'image.jpg'
);
expect(
getFilename( 'http://localhost:8080/a/path/to/an/image.jpg' )
).toBe( 'image.jpg' );
expect( getFilename( '/path/to/an/image.jpg' ) ).toBe( 'image.jpg' );
expect( getFilename( 'path/to/an/image.jpg' ) ).toBe( 'image.jpg' );
expect( getFilename( '/image.jpg' ) ).toBe( 'image.jpg' );
expect( getFilename( 'https://wordpress.org/file.pdf' ) ).toBe(
'file.pdf'
);
expect(
getFilename( 'https://wordpress.org/image.webp?query=test' )
).toBe( 'image.webp' );
expect( getFilename( 'https://wordpress.org/video.mov#anchor' ) ).toBe(
'video.mov'
);
expect(
getFilename( 'http://localhost:8080/a/path/to/audio.mp3' )
).toBe( 'audio.mp3' );
} );

Copy link
Contributor

Choose a reason for hiding this comment

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

Strictly speaking, we don't need to use each() here, but this is precisely the sort of scenario that it was designed for, and can make the intent of the test much clearer.

it.each( [
  [ 'https://wordpress.org/image.jpg', 'image.jpg' ],
  [ 'https://wordpress.org/image.jpg?query=test', 'image.jpg' ],
  [ 'https://wordpress.org/image.jpg#anchor', 'image.jpg' ],
  [ 'http://localhost:8080/a/path/to/an/image.jpg', 'image.jpg' ],
  [ '/path/to/an/image.jpg', 'image.jpg' ],
  [ 'path/to/an/image.jpg', 'image.jpg' ],
  [ '/image.jpg', 'image.jpg' ],
  [ 'https://wordpress.org/file.pdf', 'file.pdf' ],
  [ 'https://wordpress.org/image.webp?query=test', 'image.webp' ],
  [ 'https://wordpress.org/video.mov#anchor', 'video.mov' ],
  [ 'http://localhost:8080/a/path/to/audio.mp3', 'audio.mp3' ],
] )( 'returns the filename part of the URL: %s', ( url, filename ) => { 
  expect( getFilename( url ) ).toBe( filename ); 
} ); 

Rather than having to read through the entire test to understand what's expected, we can see quite quickly that the intention is to have the same expectation for each set of parameters.

If we need to test additional parameters, it is clearer how to do that. And if we need to change the expectation, we will have more certainty that we've correctly applied that in every case.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thank you, @andrewhayward 🙌 This is very helpful!

Copy link
Contributor

Choose a reason for hiding this comment

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

Exactly Andrew. This is precisely what I had in mind. Thank you.


it( 'should show tooltip with full URL alongside filtered display', async () => {
const user = userEvent.setup();
const url = 'https://example.com';
Copy link
Contributor

Choose a reason for hiding this comment

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

I think our test should be for a longer URL and probably one that includes a file format. That would add an extra layer of resilience to the test.

Copy link
Member

Choose a reason for hiding this comment

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

Agreed, a longer URL would make sense here.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Will do!

@getdave
Copy link
Contributor

getdave commented Oct 9, 2023

...when there's a PR with this change to review.

Re-adding the a11y label now as requested.

@getdave getdave added the Needs Accessibility Feedback Need input from accessibility label Oct 9, 2023
Copy link
Contributor

@t-hamano t-hamano left a comment

Choose a reason for hiding this comment

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

I think this latest PR looks like it provides a good way to consistently see the full URL in both the inline link and MediaReplaceFlow.

The screencast below shows that you can display a tooltip with the full URL using only the keyboard, and that a screen reader (NVDA) will also read the full URL.

e81f7cabdd276541e2520481adf1f650.mp4

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.

Nice work @brookewp 🙌 🚀 Thanks!


const link = screen.getByRole( 'link' );

expect( screen.getByRole( 'link' ) ).toHaveTextContent(
Copy link
Member

Choose a reason for hiding this comment

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

We can totally go with the constant above instead of doing another query here.

Suggested change
expect( screen.getByRole( 'link' ) ).toHaveTextContent(
expect( link ).toHaveTextContent(


it( 'should show tooltip with full URL alongside filtered display', async () => {
const user = userEvent.setup();
const url = 'https://example.com';
Copy link
Member

Choose a reason for hiding this comment

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

Agreed, a longer URL would make sense here.

Comment on lines 276 to 290
it( 'returns the filename for a variety of formats', () => {
expect( getFilename( 'https://wordpress.org/file.pdf' ) ).toBe(
'file.pdf'
);
expect(
getFilename( 'https://wordpress.org/image.webp?query=test' )
).toBe( 'image.webp' );
expect( getFilename( 'https://wordpress.org/video.mov#anchor' ) ).toBe(
'video.mov'
);
expect(
getFilename( 'http://localhost:8080/a/path/to/audio.mp3' )
).toBe( 'audio.mp3' );
} );

Copy link
Member

Choose a reason for hiding this comment

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

I wouldn't be opposed to that, since it could add some extra durability to this feature in the case of future changes.

@@ -21,7 +21,7 @@ export function filterURLForDisplay( url, maxLength = null ) {
filteredURL = filteredURL.replace( '/', '' );
}

const mediaRegexp = /([\w|:])*\.(?:jpg|jpeg|gif|png|svg)/;
const mediaRegexp = /\/([^\/?]+)\.(?:[\w]+)(?=\?|$)/;
Copy link
Contributor

Choose a reason for hiding this comment

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

Small point, but I wonder if it's worth renaming this regex now that it's not explicitly looking for "media" any more?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good point!

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.

Looks and works great, thanks once again @brookewp 🚀

Co-authored-by: Marin Atanasov <8436925+tyxla@users.noreply.github.com>
@brookewp brookewp merged commit 9f38ee3 into trunk Oct 11, 2023
50 checks passed
@brookewp brookewp deleted the fix/media-url-filter branch October 11, 2023 21:01
@github-actions github-actions bot added this to the Gutenberg 16.9 milestone Oct 11, 2023
@getdave
Copy link
Contributor

getdave commented Oct 12, 2023

Thank you for all the effort here @brookewp 👏

@t-hamano
Copy link
Contributor

#57391 was reported in relation to this PR.

The current truncation logic relies on media always having an extension. If there is no extension, the URL without the protocol will be returned. So, as reported in #57391, if the media is rendered server-side and the URL does not include the file extension, truncation does not seem to occur correctly.

The logic of filterURLForDisplay may need to be improved a bit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) Needs Accessibility Feedback Need input from accessibility [Package] Url /packages/url [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

url: filterURLForDisplay only considers basic image extensions
9 participants