@wordpress/block-library 9.48.0 → 9.48.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/build/columns/transforms.cjs +65 -0
- package/build/columns/transforms.cjs.map +2 -2
- package/build/gallery/edit.cjs +212 -331
- package/build/gallery/edit.cjs.map +2 -2
- package/build/gallery/transforms.cjs +43 -0
- package/build/gallery/transforms.cjs.map +2 -2
- package/build/heading/edit.cjs +0 -1
- package/build/heading/edit.cjs.map +2 -2
- package/build/list/edit.cjs +1 -8
- package/build/list/edit.cjs.map +2 -2
- package/build/list/ordered-list-settings.cjs +1 -44
- package/build/list/ordered-list-settings.cjs.map +2 -2
- package/build/list-item/hooks/use-merge.cjs +47 -24
- package/build/list-item/hooks/use-merge.cjs.map +2 -2
- package/build/navigation/edit/index.cjs +15 -26
- package/build/navigation/edit/index.cjs.map +2 -2
- package/build/navigation-link/edit.cjs +0 -1
- package/build/navigation-link/edit.cjs.map +2 -2
- package/build/navigation-submenu/edit.cjs +2 -1
- package/build/navigation-submenu/edit.cjs.map +2 -2
- package/build/paragraph/deprecated.cjs +1 -0
- package/build/paragraph/deprecated.cjs.map +2 -2
- package/build/paragraph/edit.cjs +10 -1
- package/build/paragraph/edit.cjs.map +3 -3
- package/build/playlist/block.json +12 -0
- package/build/playlist/edit.cjs +27 -1
- package/build/playlist/edit.cjs.map +2 -2
- package/build/playlist/save.cjs +8 -1
- package/build/playlist/save.cjs.map +2 -2
- package/build/playlist/view.cjs +1 -0
- package/build/playlist/view.cjs.map +2 -2
- package/build/post-time-to-read/index.cjs +1 -1
- package/build/post-time-to-read/index.cjs.map +2 -2
- package/build/post-time-to-read/variations.cjs +1 -1
- package/build/post-time-to-read/variations.cjs.map +2 -2
- package/build/pullquote/edit.cjs +2 -7
- package/build/pullquote/edit.cjs.map +2 -2
- package/build/quote/edit.cjs +4 -9
- package/build/quote/edit.cjs.map +2 -2
- package/build/shortcode/transforms.cjs +2 -2
- package/build/shortcode/transforms.cjs.map +2 -2
- package/build/utils/waveform-player.cjs +42 -9
- package/build/utils/waveform-player.cjs.map +2 -2
- package/build/utils/waveform-utils.cjs +6 -4
- package/build/utils/waveform-utils.cjs.map +2 -2
- package/build/video/edit-common-settings.cjs +3 -6
- package/build/video/edit-common-settings.cjs.map +2 -2
- package/build-module/columns/transforms.mjs +65 -0
- package/build-module/columns/transforms.mjs.map +2 -2
- package/build-module/gallery/edit.mjs +214 -334
- package/build-module/gallery/edit.mjs.map +2 -2
- package/build-module/gallery/transforms.mjs +43 -0
- package/build-module/gallery/transforms.mjs.map +2 -2
- package/build-module/heading/edit.mjs +1 -2
- package/build-module/heading/edit.mjs.map +2 -2
- package/build-module/list/edit.mjs +2 -9
- package/build-module/list/edit.mjs.map +2 -2
- package/build-module/list/ordered-list-settings.mjs +1 -45
- package/build-module/list/ordered-list-settings.mjs.map +2 -2
- package/build-module/list-item/hooks/use-merge.mjs +48 -25
- package/build-module/list-item/hooks/use-merge.mjs.map +2 -2
- package/build-module/navigation/edit/index.mjs +16 -33
- package/build-module/navigation/edit/index.mjs.map +2 -2
- package/build-module/navigation-link/edit.mjs +0 -1
- package/build-module/navigation-link/edit.mjs.map +2 -2
- package/build-module/navigation-submenu/edit.mjs +2 -1
- package/build-module/navigation-submenu/edit.mjs.map +2 -2
- package/build-module/paragraph/deprecated.mjs +1 -0
- package/build-module/paragraph/deprecated.mjs.map +2 -2
- package/build-module/paragraph/edit.mjs +12 -2
- package/build-module/paragraph/edit.mjs.map +2 -2
- package/build-module/playlist/block.json +12 -0
- package/build-module/playlist/edit.mjs +27 -1
- package/build-module/playlist/edit.mjs.map +2 -2
- package/build-module/playlist/save.mjs +8 -1
- package/build-module/playlist/save.mjs.map +2 -2
- package/build-module/playlist/view.mjs +1 -0
- package/build-module/playlist/view.mjs.map +2 -2
- package/build-module/post-time-to-read/index.mjs +1 -1
- package/build-module/post-time-to-read/index.mjs.map +2 -2
- package/build-module/post-time-to-read/variations.mjs +2 -2
- package/build-module/post-time-to-read/variations.mjs.map +2 -2
- package/build-module/pullquote/edit.mjs +2 -7
- package/build-module/pullquote/edit.mjs.map +2 -2
- package/build-module/quote/edit.mjs +5 -10
- package/build-module/quote/edit.mjs.map +2 -2
- package/build-module/shortcode/transforms.mjs +2 -2
- package/build-module/shortcode/transforms.mjs.map +2 -2
- package/build-module/utils/waveform-player.mjs +44 -11
- package/build-module/utils/waveform-player.mjs.map +2 -2
- package/build-module/utils/waveform-utils.mjs +6 -4
- package/build-module/utils/waveform-utils.mjs.map +2 -2
- package/build-module/video/edit-common-settings.mjs +4 -7
- package/build-module/video/edit-common-settings.mjs.map +2 -2
- package/build-style/comment-template/style-rtl.css +1 -0
- package/build-style/comment-template/style.css +1 -0
- package/build-style/common-rtl.css +30 -10
- package/build-style/common.css +30 -10
- package/build-style/cover/style-rtl.css +2 -1
- package/build-style/cover/style.css +2 -1
- package/build-style/editor-rtl.css +22 -11
- package/build-style/editor.css +22 -11
- package/build-style/form-input/style-rtl.css +2 -0
- package/build-style/form-input/style.css +2 -0
- package/build-style/gallery/style-rtl.css +4 -2
- package/build-style/gallery/style.css +4 -2
- package/build-style/media-text/style-rtl.css +2 -1
- package/build-style/media-text/style.css +2 -1
- package/build-style/playlist/style-rtl.css +3 -0
- package/build-style/playlist/style.css +3 -0
- package/build-style/query/editor-rtl.css +8 -4
- package/build-style/query/editor.css +8 -4
- package/build-style/read-more/style-rtl.css +1 -0
- package/build-style/read-more/style.css +1 -0
- package/build-style/reset-rtl.css +3 -1
- package/build-style/reset.css +3 -1
- package/build-style/search/style-rtl.css +3 -1
- package/build-style/search/style.css +3 -1
- package/build-style/site-logo/editor-rtl.css +2 -1
- package/build-style/site-logo/editor.css +2 -1
- package/build-style/style-rtl.css +53 -17
- package/build-style/style.css +53 -17
- package/build-style/tab/style-rtl.css +3 -1
- package/build-style/tab/style.css +3 -1
- package/build-style/template-part/editor-rtl.css +8 -4
- package/build-style/template-part/editor.css +8 -4
- package/build-style/video/style-rtl.css +2 -1
- package/build-style/video/style.css +2 -1
- package/package.json +49 -45
- package/src/accordion/README.md +97 -0
- package/src/accordion-heading/README.md +81 -0
- package/src/accordion-item/README.md +85 -0
- package/src/accordion-panel/README.md +74 -0
- package/src/archives/README.md +56 -0
- package/src/audio/README.md +55 -0
- package/src/avatar/README.md +74 -0
- package/src/block/README.md +56 -0
- package/src/breadcrumbs/README.md +67 -0
- package/src/button/README.md +93 -0
- package/src/buttons/README.md +80 -0
- package/src/calendar/README.md +51 -0
- package/src/categories/README.md +69 -0
- package/src/code/README.md +55 -0
- package/src/column/README.md +72 -0
- package/src/columns/README.md +90 -0
- package/src/columns/test/transforms.js +164 -0
- package/src/columns/transforms.js +74 -0
- package/src/comment-author-avatar/README.md +63 -0
- package/src/comment-author-name/README.md +67 -0
- package/src/comment-content/README.md +61 -0
- package/src/comment-date/README.md +67 -0
- package/src/comment-edit-link/README.md +67 -0
- package/src/comment-reply-link/README.md +63 -0
- package/src/comment-template/README.md +60 -0
- package/src/comments/README.md +88 -0
- package/src/comments-pagination/README.md +77 -0
- package/src/comments-pagination-next/README.md +64 -0
- package/src/comments-pagination-numbers/README.md +64 -0
- package/src/comments-pagination-previous/README.md +64 -0
- package/src/comments-title/README.md +70 -0
- package/src/common.scss +63 -10
- package/src/cover/README.md +111 -0
- package/src/details/README.md +65 -0
- package/src/embed/README.md +56 -0
- package/src/file/README.md +60 -0
- package/src/footnotes/README.md +64 -0
- package/src/form/README.md +90 -0
- package/src/form-input/README.md +74 -0
- package/src/form-submission-notification/README.md +50 -0
- package/src/form-submit-button/README.md +54 -0
- package/src/freeform/README.md +49 -0
- package/src/gallery/README.md +115 -0
- package/src/gallery/edit.js +213 -350
- package/src/gallery/test/transforms.js +155 -0
- package/src/gallery/transforms.js +47 -0
- package/src/group/README.md +80 -0
- package/src/heading/README.md +60 -0
- package/src/heading/edit.js +1 -2
- package/src/home-link/README.md +66 -0
- package/src/home-link/index.php +3 -15
- package/src/html/README.md +48 -0
- package/src/icon/README.md +63 -0
- package/src/image/README.md +102 -0
- package/src/image/index.php +4 -4
- package/src/latest-comments/README.md +57 -0
- package/src/latest-posts/README.md +71 -0
- package/src/list/README.md +70 -0
- package/src/list/edit.js +2 -9
- package/src/list/ordered-list-settings.js +46 -92
- package/src/list-item/README.md +71 -0
- package/src/list-item/hooks/use-merge.js +53 -46
- package/src/loginout/README.md +56 -0
- package/src/math/README.md +50 -0
- package/src/media-text/README.md +92 -0
- package/src/missing/README.md +55 -0
- package/src/more/README.md +49 -0
- package/src/navigation/README.md +115 -0
- package/src/navigation/edit/index.js +10 -30
- package/src/navigation-link/README.md +93 -0
- package/src/navigation-link/edit.js +0 -1
- package/src/navigation-link/index.php +1 -15
- package/src/navigation-overlay-close/README.md +48 -0
- package/src/navigation-submenu/README.md +84 -0
- package/src/navigation-submenu/edit.js +1 -0
- package/src/navigation-submenu/index.php +1 -17
- package/src/nextpage/README.md +50 -0
- package/src/page-list/README.md +84 -0
- package/src/page-list/index.php +3 -15
- package/src/page-list-item/README.md +77 -0
- package/src/paragraph/README.md +70 -0
- package/src/paragraph/deprecated.js +1 -0
- package/src/paragraph/edit.js +13 -1
- package/src/pattern/README.md +45 -0
- package/src/playlist/README.md +86 -0
- package/src/playlist/block.json +12 -0
- package/src/playlist/edit.js +27 -0
- package/src/playlist/index.php +10 -3
- package/src/playlist/save.js +9 -1
- package/src/playlist/style.scss +7 -0
- package/src/playlist/view.js +1 -0
- package/src/playlist-track/README.md +69 -0
- package/src/post-author/README.md +78 -0
- package/src/post-author-biography/README.md +59 -0
- package/src/post-author-name/README.md +63 -0
- package/src/post-author-name/index.php +1 -1
- package/src/post-comment/README.md +61 -0
- package/src/post-comments-count/README.md +58 -0
- package/src/post-comments-form/README.md +59 -0
- package/src/post-comments-link/README.md +60 -0
- package/src/post-content/README.md +71 -0
- package/src/post-date/README.md +65 -0
- package/src/post-date/index.php +1 -1
- package/src/post-excerpt/README.md +66 -0
- package/src/post-featured-image/README.md +85 -0
- package/src/post-featured-image/index.php +1 -1
- package/src/post-navigation-link/README.md +63 -0
- package/src/post-template/README.md +71 -0
- package/src/post-terms/README.md +65 -0
- package/src/post-time-to-read/README.md +63 -0
- package/src/post-time-to-read/index.js +1 -1
- package/src/post-time-to-read/variations.js +2 -2
- package/src/post-title/README.md +69 -0
- package/src/preformatted/README.md +50 -0
- package/src/pullquote/README.md +64 -0
- package/src/pullquote/edit.js +1 -7
- package/src/query/README.md +64 -0
- package/src/query-no-results/README.md +65 -0
- package/src/query-pagination/README.md +79 -0
- package/src/query-pagination-next/README.md +67 -0
- package/src/query-pagination-numbers/README.md +65 -0
- package/src/query-pagination-previous/README.md +67 -0
- package/src/query-title/README.md +65 -0
- package/src/query-total/README.md +66 -0
- package/src/quote/README.md +75 -0
- package/src/quote/edit.js +3 -9
- package/src/read-more/README.md +61 -0
- package/src/read-more/index.php +2 -2
- package/src/rss/README.md +62 -0
- package/src/search/README.md +66 -0
- package/src/separator/README.md +62 -0
- package/src/shortcode/README.md +44 -0
- package/src/shortcode/transforms.js +2 -2
- package/src/site-logo/README.md +72 -0
- package/src/site-tagline/README.md +56 -0
- package/src/site-title/README.md +57 -0
- package/src/social-link/README.md +64 -0
- package/src/social-links/README.md +98 -0
- package/src/spacer/README.md +53 -0
- package/src/tab/README.md +69 -0
- package/src/tab-list/README.md +79 -0
- package/src/tab-panel/README.md +75 -0
- package/src/tab-panels/README.md +75 -0
- package/src/table/README.md +71 -0
- package/src/table-of-contents/README.md +61 -0
- package/src/tabs/README.md +83 -0
- package/src/tag-cloud/README.md +62 -0
- package/src/template-part/README.md +48 -0
- package/src/term-count/README.md +59 -0
- package/src/term-description/README.md +60 -0
- package/src/term-name/README.md +65 -0
- package/src/term-template/README.md +65 -0
- package/src/terms-query/README.md +58 -0
- package/src/text-columns/README.md +51 -0
- package/src/utils/test/waveform-player.js +254 -0
- package/src/utils/waveform-player.js +90 -18
- package/src/utils/waveform-utils.js +15 -11
- package/src/verse/README.md +58 -0
- package/src/video/README.md +58 -0
- package/src/video/edit-common-settings.js +4 -7
- package/src/audio/edit.native.js +0 -250
- package/src/audio/style.native.scss +0 -13
- package/src/audio/test/__snapshots__/edit.native.js.snap +0 -546
- package/src/audio/test/__snapshots__/transforms.native.js.snap +0 -25
- package/src/audio/test/edit.native.js +0 -132
- package/src/audio/test/transforms.native.js +0 -43
- package/src/audio/transforms.native.js +0 -12
- package/src/block/edit-title.native.js +0 -67
- package/src/block/edit.native.js +0 -247
- package/src/block/editor.native.scss +0 -125
- package/src/block/test/__snapshots__/transforms.native.js.snap +0 -15
- package/src/block/test/edit.native.js +0 -262
- package/src/block/test/transforms.native.js +0 -40
- package/src/button/color-background.native.js +0 -41
- package/src/button/edit.native.js +0 -567
- package/src/button/editor.native.scss +0 -70
- package/src/button/rich-text.android.scss +0 -6
- package/src/button/rich-text.ios.scss +0 -6
- package/src/buttons/edit.native.js +0 -157
- package/src/buttons/editor.native.scss +0 -11
- package/src/buttons/test/__snapshots__/edit.native.js.snap +0 -99
- package/src/buttons/test/__snapshots__/transforms.native.js.snap +0 -31
- package/src/buttons/test/edit.native.js +0 -485
- package/src/buttons/test/transforms.native.js +0 -48
- package/src/buttons/transforms.native.js +0 -12
- package/src/code/edit.native.js +0 -70
- package/src/code/test/__snapshots__/edit.native.js.snap +0 -13
- package/src/code/test/edit.native.js +0 -65
- package/src/code/theme.native.scss +0 -22
- package/src/code/transforms.native.js +0 -12
- package/src/column/column-preview.native.js +0 -58
- package/src/column/edit.native.js +0 -273
- package/src/column/editor.native.scss +0 -75
- package/src/columns/columnCalculations.native.js +0 -178
- package/src/columns/edit.native.js +0 -507
- package/src/columns/editor.native.scss +0 -17
- package/src/columns/test/__snapshots__/edit.native.js.snap +0 -305
- package/src/columns/test/__snapshots__/transforms.native.js.snap +0 -61
- package/src/columns/test/edit.native.js +0 -496
- package/src/columns/test/transforms.native.js +0 -89
- package/src/columns/transforms.native.js +0 -12
- package/src/cover/controls.native.js +0 -307
- package/src/cover/edit.native.js +0 -708
- package/src/cover/focal-point-settings-button.native.js +0 -53
- package/src/cover/overlay-color-settings.native.js +0 -106
- package/src/cover/style.native.scss +0 -220
- package/src/cover/test/__snapshots__/edit.native.js.snap +0 -105
- package/src/cover/test/__snapshots__/transforms.native.js.snap +0 -73
- package/src/cover/test/edit.native.js +0 -701
- package/src/cover/test/transforms.native.js +0 -116
- package/src/cover/transforms.native.js +0 -12
- package/src/cover/use-cover-is-dark.native.js +0 -51
- package/src/embed/edit.native.js +0 -345
- package/src/embed/embed-controls.native.js +0 -65
- package/src/embed/embed-link-settings.native.js +0 -99
- package/src/embed/embed-loading.native.js +0 -29
- package/src/embed/embed-no-preview.native.js +0 -230
- package/src/embed/embed-placeholder.native.js +0 -178
- package/src/embed/embed-preview.native.js +0 -157
- package/src/embed/styles.native.scss +0 -196
- package/src/embed/test/__snapshots__/index.native.js.snap +0 -191
- package/src/embed/test/__snapshots__/transforms.native.js.snap +0 -23
- package/src/embed/test/index.native.js +0 -1125
- package/src/embed/test/transforms.native.js +0 -44
- package/src/embed/transforms.native.js +0 -12
- package/src/embed/wp-embed-preview.native.js +0 -80
- package/src/file/edit.native.js +0 -605
- package/src/file/style.native.scss +0 -79
- package/src/file/test/__snapshots__/edit.native.js.snap +0 -580
- package/src/file/test/__snapshots__/transforms.native.js.snap +0 -19
- package/src/file/test/edit.native.js +0 -93
- package/src/file/test/transforms.native.js +0 -43
- package/src/file/transforms.native.js +0 -12
- package/src/freeform/edit.native.js +0 -13
- package/src/freeform/test/__snapshots__/index.native.js.snap +0 -7
- package/src/freeform/test/__snapshots__/transforms.native.js.snap +0 -19
- package/src/freeform/test/index.native.js +0 -57
- package/src/freeform/test/transforms.native.js +0 -39
- package/src/gallery/gallery-styles.native.scss +0 -8
- package/src/gallery/gallery.native.js +0 -124
- package/src/gallery/styles.native.scss +0 -7
- package/src/gallery/test/__snapshots__/index.native.js.snap +0 -177
- package/src/gallery/test/__snapshots__/transforms.native.js.snap +0 -53
- package/src/gallery/test/helpers.native.js +0 -106
- package/src/gallery/test/index.native.js +0 -700
- package/src/gallery/test/transforms.native.js +0 -53
- package/src/gallery/test/use-get-media.native.js +0 -24
- package/src/gallery/transforms.native.js +0 -12
- package/src/gallery/use-get-media.native.js +0 -49
- package/src/group/edit.native.js +0 -137
- package/src/group/editor.native.scss +0 -56
- package/src/group/test/__snapshots__/edit.native.js.snap +0 -19
- package/src/group/test/__snapshots__/transforms.native.js.snap +0 -35
- package/src/group/test/edit.native.js +0 -100
- package/src/group/test/transforms.native.js +0 -73
- package/src/heading/edit.native.js +0 -159
- package/src/heading/test/__snapshots__/index.native.js.snap +0 -43
- package/src/heading/test/__snapshots__/transforms.native.js.snap +0 -47
- package/src/heading/test/index.native.js +0 -257
- package/src/heading/test/transforms.native.js +0 -46
- package/src/heading/transforms.native.js +0 -12
- package/src/html/transforms.native.js +0 -11
- package/src/image/edit.native.js +0 -959
- package/src/image/styles.native.scss +0 -70
- package/src/image/test/__snapshots__/transforms.native.js.snap +0 -49
- package/src/image/test/edit.native.js +0 -459
- package/src/image/test/transforms.native.js +0 -49
- package/src/image/transforms.native.js +0 -12
- package/src/index.native.js +0 -274
- package/src/latest-posts/edit.native.js +0 -294
- package/src/latest-posts/style.native.scss +0 -47
- package/src/latest-posts/test/__snapshots__/edit.native.js.snap +0 -3
- package/src/latest-posts/test/__snapshots__/transforms.native.js.snap +0 -15
- package/src/latest-posts/test/edit.native.js +0 -49
- package/src/latest-posts/test/transforms.native.js +0 -61
- package/src/list/tag-name.native.js +0 -12
- package/src/list/test/__snapshots__/edit.native.js.snap +0 -121
- package/src/list/test/__snapshots__/transforms.native.js.snap +0 -85
- package/src/list/test/edit.native.js +0 -602
- package/src/list/test/transforms.native.js +0 -56
- package/src/list/transforms.native.js +0 -12
- package/src/list-item/edit.native.js +0 -175
- package/src/list-item/hooks/use-enter.native.js +0 -81
- package/src/list-item/icons.native.js +0 -34
- package/src/list-item/list-style-type.native.js +0 -146
- package/src/list-item/style.native.scss +0 -57
- package/src/media-text/edit.native.js +0 -417
- package/src/media-text/icon-retry.native.js +0 -11
- package/src/media-text/media-container.native.js +0 -393
- package/src/media-text/style.native.scss +0 -191
- package/src/media-text/test/__snapshots__/transforms.native.js.snap +0 -73
- package/src/media-text/test/edit.native.js +0 -58
- package/src/media-text/test/transforms.native.js +0 -116
- package/src/media-text/transforms.native.js +0 -12
- package/src/missing/edit.native.js +0 -294
- package/src/missing/style.native.scss +0 -79
- package/src/missing/test/__snapshots__/edit.native.js.snap +0 -110
- package/src/missing/test/edit-integration.native.js +0 -168
- package/src/missing/test/edit.native.js +0 -81
- package/src/more/edit.native.js +0 -36
- package/src/more/editor.native.scss +0 -21
- package/src/more/test/__snapshots__/edit.native.js.snap +0 -7
- package/src/more/test/__snapshots__/transforms.native.js.snap +0 -19
- package/src/more/test/edit.native.js +0 -41
- package/src/more/test/transforms.native.js +0 -42
- package/src/more/transforms.native.js +0 -12
- package/src/navigation-link/shared/build-css-font-sizes.php +0 -43
- package/src/nextpage/edit.native.js +0 -58
- package/src/nextpage/editor.native.scss +0 -21
- package/src/nextpage/test/__snapshots__/transforms.native.js.snap +0 -19
- package/src/nextpage/test/transforms.native.js +0 -42
- package/src/nextpage/transforms.native.js +0 -12
- package/src/paragraph/edit.native.js +0 -116
- package/src/paragraph/test/__snapshots__/edit.native.js.snap +0 -88
- package/src/paragraph/test/__snapshots__/transforms.native.js.snap +0 -65
- package/src/paragraph/test/edit.native.js +0 -999
- package/src/paragraph/test/transforms.native.js +0 -51
- package/src/paragraph/transforms.native.js +0 -12
- package/src/preformatted/edit.native.js +0 -48
- package/src/preformatted/styles.native.scss +0 -30
- package/src/preformatted/test/__snapshots__/edit.native.js.snap +0 -95
- package/src/preformatted/test/__snapshots__/transforms.native.js.snap +0 -37
- package/src/preformatted/test/edit.native.js +0 -111
- package/src/preformatted/test/transforms.native.js +0 -47
- package/src/preformatted/transforms.native.js +0 -12
- package/src/pullquote/blockquote.native.js +0 -39
- package/src/pullquote/blockquote.native.scss +0 -8
- package/src/pullquote/edit.native.js +0 -128
- package/src/pullquote/figure.native.js +0 -33
- package/src/pullquote/figure.native.scss +0 -16
- package/src/pullquote/test/__snapshots__/transforms.native.js.snap +0 -47
- package/src/pullquote/test/edit.native.js +0 -73
- package/src/pullquote/test/transforms.native.js +0 -46
- package/src/pullquote/transforms.native.js +0 -12
- package/src/quote/test/__snapshots__/transforms.native.js.snap +0 -49
- package/src/quote/test/edit.native.js +0 -94
- package/src/quote/test/transforms.native.js +0 -69
- package/src/quote/transforms.native.js +0 -12
- package/src/search/edit.native.js +0 -486
- package/src/search/style.native.scss +0 -99
- package/src/search/test/__snapshots__/edit.native.js.snap +0 -827
- package/src/search/test/__snapshots__/transforms.native.js.snap +0 -15
- package/src/search/test/edit.native.js +0 -170
- package/src/search/test/transforms.native.js +0 -40
- package/src/separator/separator-settings.native.js +0 -3
- package/src/separator/test/__snapshots__/edit.native.js.snap +0 -7
- package/src/separator/test/__snapshots__/transforms.native.js.snap +0 -25
- package/src/separator/test/edit.native.js +0 -41
- package/src/separator/test/transforms.native.js +0 -42
- package/src/separator/transforms.native.js +0 -12
- package/src/shortcode/edit.native.js +0 -77
- package/src/shortcode/style.native.scss +0 -44
- package/src/shortcode/test/__snapshots__/edit.native.js.snap +0 -9
- package/src/shortcode/test/__snapshots__/transforms.native.js.snap +0 -19
- package/src/shortcode/test/edit.native.js +0 -70
- package/src/shortcode/test/transforms.native.js +0 -42
- package/src/shortcode/transforms.native.js +0 -12
- package/src/social-link/edit.native.js +0 -219
- package/src/social-link/editor.native.scss +0 -18
- package/src/social-links/edit.native.js +0 -147
- package/src/social-links/editor.native.scss +0 -25
- package/src/social-links/test/__snapshots__/edit.native.js.snap +0 -57
- package/src/social-links/test/__snapshots__/transforms.native.js.snap +0 -31
- package/src/social-links/test/edit.native.js +0 -266
- package/src/social-links/test/transforms.native.js +0 -53
- package/src/spacer/controls.native.js +0 -86
- package/src/spacer/edit.native.js +0 -110
- package/src/spacer/editor.native.scss +0 -18
- package/src/spacer/save.native.js +0 -18
- package/src/spacer/test/__snapshots__/index.native.js.snap +0 -43
- package/src/spacer/test/__snapshots__/transforms.native.js.snap +0 -25
- package/src/spacer/test/index.native.js +0 -257
- package/src/spacer/test/transforms.native.js +0 -42
- package/src/table/transforms.native.js +0 -11
- package/src/text-columns/transforms.native.js +0 -12
- package/src/utils/init-block.native.js +0 -40
- package/src/utils/transformation-categories.native.js +0 -47
- package/src/verse/test/__snapshots__/edit.native.js.snap +0 -13
- package/src/verse/test/__snapshots__/transforms.native.js.snap +0 -31
- package/src/verse/test/edit.native.js +0 -118
- package/src/verse/test/transforms.native.js +0 -46
- package/src/verse/transforms.native.js +0 -12
- package/src/video/edit.native.js +0 -406
- package/src/video/icon-retry.native.js +0 -11
- package/src/video/style.native.scss +0 -81
- package/src/video/test/__snapshots__/transforms.native.js.snap +0 -41
- package/src/video/test/edit.native.js +0 -53
- package/src/video/test/transforms.native.js +0 -49
- package/src/video/transforms.native.js +0 -12
|
@@ -1,1125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* External dependencies
|
|
3
|
-
*/
|
|
4
|
-
import {
|
|
5
|
-
getEditorHtml,
|
|
6
|
-
initializeEditor,
|
|
7
|
-
fireEvent,
|
|
8
|
-
waitFor,
|
|
9
|
-
waitForModalVisible,
|
|
10
|
-
within,
|
|
11
|
-
} from 'test/helpers';
|
|
12
|
-
import { Platform } from 'react-native';
|
|
13
|
-
import Clipboard from '@react-native-clipboard/clipboard';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* WordPress dependencies
|
|
17
|
-
*/
|
|
18
|
-
import {
|
|
19
|
-
getBlockTypes,
|
|
20
|
-
setDefaultBlockName,
|
|
21
|
-
unregisterBlockType,
|
|
22
|
-
} from '@wordpress/blocks';
|
|
23
|
-
import fetchRequest from '@wordpress/api-fetch';
|
|
24
|
-
import { store as coreStore } from '@wordpress/core-data';
|
|
25
|
-
import { dispatch } from '@wordpress/data';
|
|
26
|
-
import { requestPreview } from '@wordpress/react-native-bridge';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Internal dependencies
|
|
30
|
-
*/
|
|
31
|
-
import { WebView } from 'react-native-webview';
|
|
32
|
-
|
|
33
|
-
import * as paragraph from '../../paragraph';
|
|
34
|
-
import * as embed from '..';
|
|
35
|
-
|
|
36
|
-
// Override modal mock to prevent unmounting it when is not visible.
|
|
37
|
-
// This is required to be able to trigger onClose and onDismiss events when
|
|
38
|
-
// the modal is dismissed.
|
|
39
|
-
jest.mock( 'react-native-modal', () => {
|
|
40
|
-
const mockComponent = require( 'react-native/jest/mockComponent' );
|
|
41
|
-
return mockComponent( 'react-native-modal' );
|
|
42
|
-
} );
|
|
43
|
-
|
|
44
|
-
// Mock debounce to prevent potentially belated state updates.
|
|
45
|
-
jest.mock( '@wordpress/compose/src/utils/debounce', () => ( {
|
|
46
|
-
debounce: ( fn ) => {
|
|
47
|
-
fn.cancel = jest.fn();
|
|
48
|
-
return fn;
|
|
49
|
-
},
|
|
50
|
-
} ) );
|
|
51
|
-
|
|
52
|
-
const MODAL_DISMISS_EVENT = Platform.OS === 'ios' ? 'onDismiss' : 'onModalHide';
|
|
53
|
-
|
|
54
|
-
// OEmbed response mocks.
|
|
55
|
-
const RICH_TEXT_EMBED_SUCCESS_RESPONSE = {
|
|
56
|
-
url: 'https://twitter.com/notnownikki',
|
|
57
|
-
html: '<p>Mock success response.</p>',
|
|
58
|
-
type: 'rich',
|
|
59
|
-
provider_name: 'Twitter',
|
|
60
|
-
provider_url: 'https://twitter.com',
|
|
61
|
-
version: '1.0',
|
|
62
|
-
};
|
|
63
|
-
const VIDEO_EMBED_SUCCESS_RESPONSE = {
|
|
64
|
-
url: 'https://www.youtube.com/watch?v=lXMskKTw3Bc',
|
|
65
|
-
html: '<iframe width="16" height="9"></iframe>',
|
|
66
|
-
type: 'video',
|
|
67
|
-
provider_name: 'YouTube',
|
|
68
|
-
provider_url: 'https://youtube.com',
|
|
69
|
-
version: '1.0',
|
|
70
|
-
};
|
|
71
|
-
const MOCK_EMBED_PHOTO_SUCCESS_RESPONSE = {
|
|
72
|
-
url: 'https://cloudup.com/cQFlxqtY4ob',
|
|
73
|
-
html: '<p>Mock success response.</p>',
|
|
74
|
-
type: 'photo',
|
|
75
|
-
provider_name: 'Cloudup',
|
|
76
|
-
provider_url: 'https://cloudup.com',
|
|
77
|
-
version: '1.0',
|
|
78
|
-
};
|
|
79
|
-
const MOCK_BAD_WORDPRESS_RESPONSE = {
|
|
80
|
-
code: 'oembed_invalid_url',
|
|
81
|
-
message: 'Not Found',
|
|
82
|
-
data: {
|
|
83
|
-
status: 404,
|
|
84
|
-
},
|
|
85
|
-
html: false,
|
|
86
|
-
};
|
|
87
|
-
const MOCK_BAD_EMBED_PROVIDER_RESPONSE = {
|
|
88
|
-
url: 'https://youtu.be/BAD_URL',
|
|
89
|
-
html: '<p>Mock bad response.</p>',
|
|
90
|
-
provider_name: 'Embed Provider',
|
|
91
|
-
version: '1.0',
|
|
92
|
-
};
|
|
93
|
-
const EMBED_NULL_RESPONSE = null;
|
|
94
|
-
|
|
95
|
-
// Embed block HTML examples.
|
|
96
|
-
const EMPTY_EMBED_HTML = '<!-- wp:embed /-->';
|
|
97
|
-
const RICH_TEXT_EMBED_HTML = `<!-- wp:embed {"url":"https://twitter.com/notnownikki","type":"rich","providerNameSlug":"twitter","responsive":true} -->
|
|
98
|
-
<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
|
|
99
|
-
https://twitter.com/notnownikki
|
|
100
|
-
</div></figure>
|
|
101
|
-
<!-- /wp:embed -->`;
|
|
102
|
-
const RICH_TEXT_ERROR_EMBED_HTML = `<!-- wp:embed {"url":"https://twitter.com/testing","type":"rich","providerNameSlug":"twitter","responsive":true} -->
|
|
103
|
-
<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
|
|
104
|
-
https://twitter.com/testing
|
|
105
|
-
</div></figure>
|
|
106
|
-
<!-- /wp:embed -->`;
|
|
107
|
-
const PHOTO_EMBED_HTML = `<!-- wp:embed {"url":"https://cloudup.com/cQFlxqtY4ob","type":"photo","providerNameSlug":"cloudup","responsive":true} -->
|
|
108
|
-
<figure class="wp-block-embed is-type-photo is-provider-cloudup wp-block-embed-cloudup"><div class="wp-block-embed__wrapper">
|
|
109
|
-
https://cloudup.com/cQFlxqtY4ob
|
|
110
|
-
</div></figure>
|
|
111
|
-
<!-- /wp:embed -->`;
|
|
112
|
-
const WP_EMBED_HTML = `<!-- wp:embed {"url":"https://wordpress.org/news/2021/07/tatum/","type":"wp-embed","providerNameSlug":"wordpress-news"} -->
|
|
113
|
-
<figure class="wp-block-embed is-type-wp-embed is-provider-wordpress-news wp-block-embed-wordpress-news"><div class="wp-block-embed__wrapper">
|
|
114
|
-
https://wordpress.org/news/2021/07/tatum/
|
|
115
|
-
</div></figure>
|
|
116
|
-
<!-- /wp:embed -->`;
|
|
117
|
-
|
|
118
|
-
const EMPTY_PARAGRAPH_HTML =
|
|
119
|
-
'<!-- wp:paragraph --><p></p><!-- /wp:paragraph -->';
|
|
120
|
-
|
|
121
|
-
const MOST_USED_PROVIDERS = embed.settings.variations.filter( ( { name } ) =>
|
|
122
|
-
[ 'youtube', 'twitter', 'wordpress', 'vimeo' ].includes( name )
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
// Return specified mocked responses for the oembed endpoint.
|
|
126
|
-
const mockEmbedResponses = ( mockedResponses ) => {
|
|
127
|
-
fetchRequest.mockImplementation( async ( req ) => {
|
|
128
|
-
const matchedEmbedResponse = mockedResponses.find(
|
|
129
|
-
( mockedResponse ) =>
|
|
130
|
-
req.path ===
|
|
131
|
-
`/oembed/1.0/proxy?url=${ encodeURIComponent(
|
|
132
|
-
mockedResponse.url
|
|
133
|
-
) }`
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
return matchedEmbedResponse || mockOtherResponses( req );
|
|
137
|
-
} );
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
async function mockOtherResponses( { path } ) {
|
|
141
|
-
if ( path.startsWith( '/wp/v2/themes' ) ) {
|
|
142
|
-
return [
|
|
143
|
-
{
|
|
144
|
-
stylesheet: 'test-theme',
|
|
145
|
-
theme_supports: { 'responsive-embeds': true },
|
|
146
|
-
},
|
|
147
|
-
];
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if ( path.startsWith( '/wp/v2/block-patterns/patterns' ) ) {
|
|
151
|
-
return [];
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if ( path.startsWith( '/wp/v2/block-patterns/categories' ) ) {
|
|
155
|
-
return [];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return {};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const insertEmbedBlock = async ( blockTitle = 'Embed' ) => {
|
|
162
|
-
const editor = await initializeEditor( { initialHtml: '' } );
|
|
163
|
-
|
|
164
|
-
// Open inserter menu.
|
|
165
|
-
fireEvent.press( await editor.findByLabelText( 'Add block' ) );
|
|
166
|
-
|
|
167
|
-
// Insert embed block.
|
|
168
|
-
fireEvent.press( await editor.findByText( blockTitle ) );
|
|
169
|
-
|
|
170
|
-
// Return the embed block.
|
|
171
|
-
const [ block ] = await editor.findAllByLabelText( /Embed Block\. Row 1/ );
|
|
172
|
-
|
|
173
|
-
return { ...editor, block };
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
const initializeWithEmbedBlock = async ( initialHtml, selectBlock = true ) => {
|
|
177
|
-
const editor = await initializeEditor( { initialHtml } );
|
|
178
|
-
|
|
179
|
-
const [ block ] = await editor.findAllByLabelText( /Embed Block\. Row 1/ );
|
|
180
|
-
|
|
181
|
-
if ( selectBlock ) {
|
|
182
|
-
// Select block.
|
|
183
|
-
fireEvent.press( block );
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return { ...editor, block };
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
beforeAll( () => {
|
|
190
|
-
// Paragraph block needs to be registered because by default a paragraph
|
|
191
|
-
// block is added to empty posts.
|
|
192
|
-
paragraph.init();
|
|
193
|
-
embed.init();
|
|
194
|
-
setDefaultBlockName( paragraph.name );
|
|
195
|
-
} );
|
|
196
|
-
|
|
197
|
-
beforeEach( () => {
|
|
198
|
-
// Invalidate all resolutions of core-data to prevent
|
|
199
|
-
// caching embed preview and theme supports requests.
|
|
200
|
-
dispatch( coreStore ).invalidateResolutionForStore();
|
|
201
|
-
|
|
202
|
-
// Mock embed responses.
|
|
203
|
-
mockEmbedResponses( [
|
|
204
|
-
RICH_TEXT_EMBED_SUCCESS_RESPONSE,
|
|
205
|
-
VIDEO_EMBED_SUCCESS_RESPONSE,
|
|
206
|
-
MOCK_EMBED_PHOTO_SUCCESS_RESPONSE,
|
|
207
|
-
MOCK_BAD_EMBED_PROVIDER_RESPONSE,
|
|
208
|
-
] );
|
|
209
|
-
|
|
210
|
-
// Intentionally suppress the expected console logs to reduce noise in the
|
|
211
|
-
// test output.
|
|
212
|
-
jest.spyOn( console, 'log' ).mockImplementation( () => {} );
|
|
213
|
-
} );
|
|
214
|
-
|
|
215
|
-
afterAll( () => {
|
|
216
|
-
// Clean up registered blocks.
|
|
217
|
-
getBlockTypes().forEach( ( block ) => {
|
|
218
|
-
unregisterBlockType( block.name );
|
|
219
|
-
} );
|
|
220
|
-
} );
|
|
221
|
-
|
|
222
|
-
describe( 'Embed block', () => {
|
|
223
|
-
describe( 'insertion', () => {
|
|
224
|
-
it( 'inserts generic embed block', async () => {
|
|
225
|
-
const { block } = await insertEmbedBlock();
|
|
226
|
-
|
|
227
|
-
const blockName = within( block ).getByText( 'Embed' );
|
|
228
|
-
|
|
229
|
-
expect( blockName ).toBeDefined();
|
|
230
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
231
|
-
} );
|
|
232
|
-
|
|
233
|
-
MOST_USED_PROVIDERS.forEach( ( { title } ) =>
|
|
234
|
-
it( `inserts ${ title } block`, async () => {
|
|
235
|
-
const { block } = await insertEmbedBlock( title );
|
|
236
|
-
const blockName = within( block ).getByText( title );
|
|
237
|
-
|
|
238
|
-
expect( blockName ).toBeDefined();
|
|
239
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
240
|
-
} )
|
|
241
|
-
);
|
|
242
|
-
} );
|
|
243
|
-
|
|
244
|
-
describe( 'set URL upon block insertion', () => {
|
|
245
|
-
it( 'sets empty URL when dismissing edit URL modal', async () => {
|
|
246
|
-
const editor = await insertEmbedBlock();
|
|
247
|
-
|
|
248
|
-
// Wait for edit URL modal to be visible.
|
|
249
|
-
const embedEditURLModal = editor.getByTestId(
|
|
250
|
-
'link-settings-navigation'
|
|
251
|
-
);
|
|
252
|
-
await waitForModalVisible( embedEditURLModal );
|
|
253
|
-
|
|
254
|
-
// Dismiss the edit URL modal.
|
|
255
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
256
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
257
|
-
|
|
258
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
259
|
-
} );
|
|
260
|
-
|
|
261
|
-
it( 'sets a valid URL when dismissing edit URL modal', async () => {
|
|
262
|
-
const expectedURL = 'https://twitter.com/notnownikki';
|
|
263
|
-
|
|
264
|
-
const editor = await insertEmbedBlock();
|
|
265
|
-
|
|
266
|
-
// Wait for edit URL modal to be visible.
|
|
267
|
-
const embedEditURLModal = editor.getByTestId(
|
|
268
|
-
'link-settings-navigation'
|
|
269
|
-
);
|
|
270
|
-
await waitForModalVisible( embedEditURLModal );
|
|
271
|
-
|
|
272
|
-
// Set an URL.
|
|
273
|
-
const linkTextInput = editor.getByPlaceholderText( 'Add link' );
|
|
274
|
-
fireEvent( linkTextInput, 'focus' );
|
|
275
|
-
fireEvent.changeText( linkTextInput, expectedURL );
|
|
276
|
-
|
|
277
|
-
// Dismiss the edit URL modal.
|
|
278
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
279
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
280
|
-
|
|
281
|
-
// Wait until the WebView with the rich preview appears
|
|
282
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
283
|
-
// Wait until responsiveness settings appear, driven by `theme_supports.responsive-embeds`
|
|
284
|
-
await editor.findByText( 'Media settings' );
|
|
285
|
-
|
|
286
|
-
const blockSettingsModal = await editor.findByTestId(
|
|
287
|
-
'block-settings-modal'
|
|
288
|
-
);
|
|
289
|
-
// Get Twitter Embed link field.
|
|
290
|
-
const twitterLinkField = within(
|
|
291
|
-
blockSettingsModal
|
|
292
|
-
).getByLabelText( `Twitter Embed link, ${ expectedURL }` );
|
|
293
|
-
|
|
294
|
-
expect( twitterLinkField ).toBeDefined();
|
|
295
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
296
|
-
} );
|
|
297
|
-
|
|
298
|
-
it( 'auto-pastes the URL from clipboard', async () => {
|
|
299
|
-
const clipboardURL = 'https://twitter.com/notnownikki';
|
|
300
|
-
|
|
301
|
-
// Mock clipboard.
|
|
302
|
-
Clipboard.getString.mockResolvedValue( clipboardURL );
|
|
303
|
-
|
|
304
|
-
const editor = await insertEmbedBlock();
|
|
305
|
-
|
|
306
|
-
// Wait for edit URL modal to be visible.
|
|
307
|
-
const embedEditURLModal = editor.getByTestId(
|
|
308
|
-
'link-settings-navigation'
|
|
309
|
-
);
|
|
310
|
-
await waitForModalVisible( embedEditURLModal );
|
|
311
|
-
|
|
312
|
-
// Get embed link with auto-pasted URL.
|
|
313
|
-
const autopastedLinkField = await editor.findByText( clipboardURL );
|
|
314
|
-
|
|
315
|
-
// Dismiss the edit URL modal.
|
|
316
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
317
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
318
|
-
|
|
319
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
320
|
-
await editor.findByText( 'Media settings' );
|
|
321
|
-
|
|
322
|
-
const blockSettingsModal = await editor.findByTestId(
|
|
323
|
-
'block-settings-modal'
|
|
324
|
-
);
|
|
325
|
-
// Get Twitter Embed link field.
|
|
326
|
-
const twitterLinkField = within(
|
|
327
|
-
blockSettingsModal
|
|
328
|
-
).getByLabelText( `Twitter Embed link, ${ clipboardURL }` );
|
|
329
|
-
|
|
330
|
-
expect( autopastedLinkField ).toBeDefined();
|
|
331
|
-
expect( twitterLinkField ).toBeDefined();
|
|
332
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
333
|
-
|
|
334
|
-
Clipboard.getString.mockReset();
|
|
335
|
-
} );
|
|
336
|
-
} );
|
|
337
|
-
|
|
338
|
-
describe( 'set URL when empty block', () => {
|
|
339
|
-
it( 'sets empty URL when dismissing edit URL modal', async () => {
|
|
340
|
-
const editor = await initializeWithEmbedBlock( EMPTY_EMBED_HTML );
|
|
341
|
-
|
|
342
|
-
// Edit URL.
|
|
343
|
-
fireEvent.press( await editor.findByText( 'Add link' ) );
|
|
344
|
-
|
|
345
|
-
// Wait for edit URL modal to be visible.
|
|
346
|
-
const embedEditURLModal = editor.getByTestId(
|
|
347
|
-
'link-settings-navigation'
|
|
348
|
-
);
|
|
349
|
-
await waitForModalVisible( embedEditURLModal );
|
|
350
|
-
|
|
351
|
-
// Dismiss the edit URL modal.
|
|
352
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
353
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
354
|
-
|
|
355
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
356
|
-
} );
|
|
357
|
-
|
|
358
|
-
it( 'sets a valid URL when dismissing edit URL modal', async () => {
|
|
359
|
-
const expectedURL = 'https://twitter.com/notnownikki';
|
|
360
|
-
|
|
361
|
-
const editor = await initializeWithEmbedBlock( EMPTY_EMBED_HTML );
|
|
362
|
-
|
|
363
|
-
// Edit URL.
|
|
364
|
-
fireEvent.press( editor.getByText( 'Add link' ) );
|
|
365
|
-
|
|
366
|
-
// Wait for edit URL modal to be visible.
|
|
367
|
-
const embedEditURLModal = editor.getByTestId(
|
|
368
|
-
'link-settings-navigation'
|
|
369
|
-
);
|
|
370
|
-
await waitForModalVisible( embedEditURLModal );
|
|
371
|
-
|
|
372
|
-
// Set an URL.
|
|
373
|
-
const linkTextInput = editor.getByPlaceholderText( 'Add link' );
|
|
374
|
-
fireEvent( linkTextInput, 'focus' );
|
|
375
|
-
fireEvent.changeText( linkTextInput, expectedURL );
|
|
376
|
-
|
|
377
|
-
// Dismiss the edit URL modal.
|
|
378
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
379
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
380
|
-
|
|
381
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
382
|
-
await editor.findByText( 'Media settings' );
|
|
383
|
-
|
|
384
|
-
const blockSettingsModal = await editor.findByTestId(
|
|
385
|
-
'block-settings-modal'
|
|
386
|
-
);
|
|
387
|
-
// Get Twitter Embed link field.
|
|
388
|
-
const twitterLinkField = within(
|
|
389
|
-
blockSettingsModal
|
|
390
|
-
).getByLabelText( `Twitter Embed link, ${ expectedURL }` );
|
|
391
|
-
|
|
392
|
-
expect( twitterLinkField ).toBeDefined();
|
|
393
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
394
|
-
} );
|
|
395
|
-
|
|
396
|
-
it( 'auto-pastes the URL from clipboard', async () => {
|
|
397
|
-
const clipboardURL = 'https://twitter.com/notnownikki';
|
|
398
|
-
|
|
399
|
-
// Mock clipboard.
|
|
400
|
-
Clipboard.getString.mockResolvedValue( clipboardURL );
|
|
401
|
-
|
|
402
|
-
const editor = await initializeWithEmbedBlock( EMPTY_EMBED_HTML );
|
|
403
|
-
|
|
404
|
-
// Edit URL.
|
|
405
|
-
fireEvent.press( editor.getByText( 'Add link' ) );
|
|
406
|
-
|
|
407
|
-
// Wait for edit URL modal to be visible.
|
|
408
|
-
const embedEditURLModal = editor.getByTestId(
|
|
409
|
-
'link-settings-navigation'
|
|
410
|
-
);
|
|
411
|
-
await waitForModalVisible( embedEditURLModal );
|
|
412
|
-
|
|
413
|
-
// Get embed link.
|
|
414
|
-
const embedLink = await editor.findByText( clipboardURL );
|
|
415
|
-
|
|
416
|
-
// Dismiss the edit URL modal.
|
|
417
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
418
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
419
|
-
|
|
420
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
421
|
-
await editor.findByText( 'Media settings' );
|
|
422
|
-
|
|
423
|
-
const blockSettingsModal = await editor.findByTestId(
|
|
424
|
-
'block-settings-modal'
|
|
425
|
-
);
|
|
426
|
-
// Get Twitter Embed link field.
|
|
427
|
-
const twitterLinkField = within(
|
|
428
|
-
blockSettingsModal
|
|
429
|
-
).getByLabelText( `Twitter Embed link, ${ clipboardURL }` );
|
|
430
|
-
|
|
431
|
-
expect( embedLink ).toBeDefined();
|
|
432
|
-
expect( twitterLinkField ).toBeDefined();
|
|
433
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
434
|
-
|
|
435
|
-
Clipboard.getString.mockReset();
|
|
436
|
-
} );
|
|
437
|
-
} );
|
|
438
|
-
|
|
439
|
-
describe( 'edit URL', () => {
|
|
440
|
-
it( 'keeps the previous URL if no URL is set', async () => {
|
|
441
|
-
const editor =
|
|
442
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
443
|
-
|
|
444
|
-
// Open Block Settings.
|
|
445
|
-
fireEvent.press( await editor.findByLabelText( 'Open Settings' ) );
|
|
446
|
-
|
|
447
|
-
// Wait for Block Settings to be visible.
|
|
448
|
-
const blockSettingsModal = editor.getByTestId(
|
|
449
|
-
'block-settings-modal'
|
|
450
|
-
);
|
|
451
|
-
await waitForModalVisible( blockSettingsModal );
|
|
452
|
-
|
|
453
|
-
// Dismiss the Block Settings modal.
|
|
454
|
-
fireEvent( blockSettingsModal, 'backdropPress' );
|
|
455
|
-
fireEvent( blockSettingsModal, MODAL_DISMISS_EVENT );
|
|
456
|
-
|
|
457
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
458
|
-
} );
|
|
459
|
-
|
|
460
|
-
it( 'replaces URL', async () => {
|
|
461
|
-
const initialURL = 'https://twitter.com/notnownikki';
|
|
462
|
-
const expectedURL = 'https://www.youtube.com/watch?v=lXMskKTw3Bc';
|
|
463
|
-
|
|
464
|
-
const editor =
|
|
465
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
466
|
-
|
|
467
|
-
// Open Block Settings.
|
|
468
|
-
fireEvent.press( await editor.findByLabelText( 'Open Settings' ) );
|
|
469
|
-
|
|
470
|
-
// Wait for Block Settings to be visible.
|
|
471
|
-
const blockSettingsModal = editor.getByTestId(
|
|
472
|
-
'block-settings-modal'
|
|
473
|
-
);
|
|
474
|
-
await waitForModalVisible( blockSettingsModal );
|
|
475
|
-
|
|
476
|
-
// Start editing Embed link.
|
|
477
|
-
fireEvent.press(
|
|
478
|
-
within( blockSettingsModal ).getByLabelText(
|
|
479
|
-
`Twitter Embed link, ${ initialURL }`
|
|
480
|
-
)
|
|
481
|
-
);
|
|
482
|
-
|
|
483
|
-
// Replace URL.
|
|
484
|
-
const linkTextInput = editor.getByDisplayValue( initialURL );
|
|
485
|
-
fireEvent( linkTextInput, 'focus' );
|
|
486
|
-
fireEvent.changeText( linkTextInput, expectedURL );
|
|
487
|
-
|
|
488
|
-
// Dismiss the Block Settings modal.
|
|
489
|
-
fireEvent( blockSettingsModal, 'backdropPress' );
|
|
490
|
-
fireEvent( blockSettingsModal, MODAL_DISMISS_EVENT );
|
|
491
|
-
|
|
492
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
493
|
-
await editor.findByText( 'Media settings' );
|
|
494
|
-
|
|
495
|
-
// Get YouTube Embed link field.
|
|
496
|
-
const youtubeLinkField = await within(
|
|
497
|
-
blockSettingsModal
|
|
498
|
-
).findByLabelText( `YouTube Embed link, ${ expectedURL }` );
|
|
499
|
-
|
|
500
|
-
expect( youtubeLinkField ).toBeDefined();
|
|
501
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
502
|
-
} );
|
|
503
|
-
|
|
504
|
-
it( 'keeps the previous URL if an invalid URL is set', async () => {
|
|
505
|
-
const previousURL = 'https://twitter.com/notnownikki';
|
|
506
|
-
const invalidURL = 'http://';
|
|
507
|
-
|
|
508
|
-
const editor =
|
|
509
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
510
|
-
|
|
511
|
-
// Open Block Settings.
|
|
512
|
-
fireEvent.press( await editor.findByLabelText( 'Open Settings' ) );
|
|
513
|
-
|
|
514
|
-
// Wait for Block Settings to be visible.
|
|
515
|
-
const blockSettingsModal = editor.getByTestId(
|
|
516
|
-
'block-settings-modal'
|
|
517
|
-
);
|
|
518
|
-
await waitForModalVisible( blockSettingsModal );
|
|
519
|
-
|
|
520
|
-
// Start editing link.
|
|
521
|
-
fireEvent.press(
|
|
522
|
-
within( blockSettingsModal ).getByLabelText(
|
|
523
|
-
`Twitter Embed link, ${ previousURL }`
|
|
524
|
-
)
|
|
525
|
-
);
|
|
526
|
-
|
|
527
|
-
// Replace URL.
|
|
528
|
-
const linkTextInput = editor.getByDisplayValue( previousURL );
|
|
529
|
-
fireEvent( linkTextInput, 'focus' );
|
|
530
|
-
fireEvent.changeText( linkTextInput, invalidURL );
|
|
531
|
-
|
|
532
|
-
// Dismiss the Block Settings modal.
|
|
533
|
-
fireEvent( blockSettingsModal, 'backdropPress' );
|
|
534
|
-
fireEvent( blockSettingsModal, MODAL_DISMISS_EVENT );
|
|
535
|
-
|
|
536
|
-
const errorNotice = await editor.findByText(
|
|
537
|
-
'Invalid URL. Please enter a valid URL.'
|
|
538
|
-
);
|
|
539
|
-
|
|
540
|
-
expect( errorNotice ).toBeDefined();
|
|
541
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
542
|
-
} );
|
|
543
|
-
|
|
544
|
-
it( 'sets empty state when setting an empty URL', async () => {
|
|
545
|
-
const previousURL = 'https://twitter.com/notnownikki';
|
|
546
|
-
|
|
547
|
-
const editor =
|
|
548
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
549
|
-
|
|
550
|
-
// Open Block Settings.
|
|
551
|
-
fireEvent.press( await editor.findByLabelText( 'Open Settings' ) );
|
|
552
|
-
|
|
553
|
-
// Get Block Settings modal.
|
|
554
|
-
const blockSettingsModal = editor.getByTestId(
|
|
555
|
-
'block-settings-modal'
|
|
556
|
-
);
|
|
557
|
-
|
|
558
|
-
// Start editing link.
|
|
559
|
-
fireEvent.press(
|
|
560
|
-
within( blockSettingsModal ).getByLabelText(
|
|
561
|
-
`Twitter Embed link, ${ previousURL }`
|
|
562
|
-
)
|
|
563
|
-
);
|
|
564
|
-
|
|
565
|
-
// Replace URL with empty value.
|
|
566
|
-
const linkTextInput = editor.getByDisplayValue( previousURL );
|
|
567
|
-
fireEvent( linkTextInput, 'focus' );
|
|
568
|
-
fireEvent.changeText( linkTextInput, '' );
|
|
569
|
-
|
|
570
|
-
// Dismiss the Block Settings modal.
|
|
571
|
-
fireEvent( blockSettingsModal, 'backdropPress' );
|
|
572
|
-
fireEvent( blockSettingsModal, MODAL_DISMISS_EVENT );
|
|
573
|
-
|
|
574
|
-
// Get empty embed link.
|
|
575
|
-
const emptyLinkTextInput =
|
|
576
|
-
await editor.findByPlaceholderText( 'Add link' );
|
|
577
|
-
|
|
578
|
-
expect( emptyLinkTextInput ).toBeDefined();
|
|
579
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
580
|
-
} );
|
|
581
|
-
|
|
582
|
-
// This test case covers the bug fixed in PR #35460.
|
|
583
|
-
it( 'edits URL after dismissing two times the edit URL bottom sheet with empty value', async () => {
|
|
584
|
-
const editor = await insertEmbedBlock();
|
|
585
|
-
|
|
586
|
-
// Wait for edit URL modal to be visible.
|
|
587
|
-
const embedEditURLModal = editor.getByTestId(
|
|
588
|
-
'link-settings-navigation'
|
|
589
|
-
);
|
|
590
|
-
await waitForModalVisible( embedEditURLModal );
|
|
591
|
-
|
|
592
|
-
// Dismiss the edit URL modal.
|
|
593
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
594
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
595
|
-
|
|
596
|
-
// Select block.
|
|
597
|
-
fireEvent.press( editor.block );
|
|
598
|
-
|
|
599
|
-
// Edit URL.
|
|
600
|
-
fireEvent.press( editor.getByText( 'Add link' ) );
|
|
601
|
-
|
|
602
|
-
// Wait for edit URL modal to be visible.
|
|
603
|
-
await waitForModalVisible( embedEditURLModal );
|
|
604
|
-
|
|
605
|
-
// Dismiss the edit URL modal.
|
|
606
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
607
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
608
|
-
|
|
609
|
-
// Edit URL.
|
|
610
|
-
fireEvent.press( editor.getByText( 'Add link' ) );
|
|
611
|
-
|
|
612
|
-
// Wait for edit URL modal to be visible.
|
|
613
|
-
await waitForModalVisible( embedEditURLModal );
|
|
614
|
-
|
|
615
|
-
expect( embedEditURLModal.props.isVisible ).toBe( true );
|
|
616
|
-
} );
|
|
617
|
-
|
|
618
|
-
// This test case covers the bug fixed in PR #35013.
|
|
619
|
-
it( 'edits URL when edited after setting a bad URL of a provider', async () => {
|
|
620
|
-
const badURL = 'https://youtu.be/BAD_URL';
|
|
621
|
-
const expectedURL = 'https://twitter.com/notnownikki';
|
|
622
|
-
|
|
623
|
-
const editor = await insertEmbedBlock();
|
|
624
|
-
|
|
625
|
-
// Wait for edit URL modal to be visible.
|
|
626
|
-
const embedEditURLModal = editor.getByTestId(
|
|
627
|
-
'link-settings-navigation'
|
|
628
|
-
);
|
|
629
|
-
await waitForModalVisible( embedEditURLModal );
|
|
630
|
-
|
|
631
|
-
// Set an bad URL.
|
|
632
|
-
let linkTextInput = editor.getByPlaceholderText( 'Add link' );
|
|
633
|
-
fireEvent( linkTextInput, 'focus' );
|
|
634
|
-
fireEvent.changeText( linkTextInput, badURL );
|
|
635
|
-
|
|
636
|
-
// Dismiss the edit URL modal.
|
|
637
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
638
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
639
|
-
|
|
640
|
-
// Open Block Settings.
|
|
641
|
-
fireEvent.press( await editor.findByLabelText( 'Open Settings' ) );
|
|
642
|
-
|
|
643
|
-
// Wait for Block Settings to be visible.
|
|
644
|
-
const blockSettingsModal = editor.getByTestId(
|
|
645
|
-
'block-settings-modal'
|
|
646
|
-
);
|
|
647
|
-
await waitForModalVisible( blockSettingsModal );
|
|
648
|
-
|
|
649
|
-
// Start editing link.
|
|
650
|
-
fireEvent.press(
|
|
651
|
-
within( blockSettingsModal ).getByLabelText(
|
|
652
|
-
`Embed link, ${ badURL }`
|
|
653
|
-
)
|
|
654
|
-
);
|
|
655
|
-
|
|
656
|
-
// Replace URL.
|
|
657
|
-
linkTextInput = editor.getByDisplayValue( badURL );
|
|
658
|
-
fireEvent( linkTextInput, 'focus' );
|
|
659
|
-
fireEvent.changeText( linkTextInput, expectedURL );
|
|
660
|
-
|
|
661
|
-
// Dismiss the Block Settings modal.
|
|
662
|
-
fireEvent( blockSettingsModal, 'backdropPress' );
|
|
663
|
-
fireEvent( blockSettingsModal, MODAL_DISMISS_EVENT );
|
|
664
|
-
|
|
665
|
-
// Get Twitter Embed link field.
|
|
666
|
-
const twitterLinkField = await within(
|
|
667
|
-
blockSettingsModal
|
|
668
|
-
).findByLabelText( `Twitter Embed link, ${ expectedURL }` );
|
|
669
|
-
|
|
670
|
-
expect( twitterLinkField ).toBeDefined();
|
|
671
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
672
|
-
} );
|
|
673
|
-
} );
|
|
674
|
-
|
|
675
|
-
describe( 'alignment options', () => {
|
|
676
|
-
[
|
|
677
|
-
'Align left',
|
|
678
|
-
'Align center',
|
|
679
|
-
'Align right',
|
|
680
|
-
'Wide width',
|
|
681
|
-
'Full width',
|
|
682
|
-
].forEach( ( alignmentOption ) =>
|
|
683
|
-
it( `sets ${ alignmentOption } option`, async () => {
|
|
684
|
-
const editor =
|
|
685
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
686
|
-
|
|
687
|
-
// Open alignment options.
|
|
688
|
-
fireEvent.press( await editor.findByLabelText( 'Align' ) );
|
|
689
|
-
|
|
690
|
-
// Select alignment option.
|
|
691
|
-
fireEvent.press( await editor.findByText( alignmentOption ) );
|
|
692
|
-
|
|
693
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
694
|
-
} )
|
|
695
|
-
);
|
|
696
|
-
} );
|
|
697
|
-
|
|
698
|
-
describe( 'retry', () => {
|
|
699
|
-
it( 'retries loading the preview if initial request failed', async () => {
|
|
700
|
-
const expectedURL = 'https://twitter.com/notnownikki';
|
|
701
|
-
|
|
702
|
-
// Return bad response for the first request to oembed endpoint
|
|
703
|
-
// and success response for the rest of requests.
|
|
704
|
-
let isFirstEmbedRequest = true;
|
|
705
|
-
fetchRequest.mockImplementation( async ( req ) => {
|
|
706
|
-
if ( req.path.startsWith( '/oembed/1.0/proxy' ) ) {
|
|
707
|
-
if ( isFirstEmbedRequest ) {
|
|
708
|
-
isFirstEmbedRequest = false;
|
|
709
|
-
return MOCK_BAD_WORDPRESS_RESPONSE;
|
|
710
|
-
}
|
|
711
|
-
return RICH_TEXT_EMBED_SUCCESS_RESPONSE;
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
return mockOtherResponses( req );
|
|
715
|
-
} );
|
|
716
|
-
|
|
717
|
-
const editor =
|
|
718
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
719
|
-
|
|
720
|
-
await editor.findByText( 'Unable to embed media' );
|
|
721
|
-
|
|
722
|
-
// Retry request.
|
|
723
|
-
fireEvent.press( editor.getByText( 'More options' ) );
|
|
724
|
-
fireEvent.press( editor.getByText( 'Retry' ) );
|
|
725
|
-
|
|
726
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
727
|
-
await editor.findByText( 'Media settings' );
|
|
728
|
-
|
|
729
|
-
const blockSettingsModal = await editor.findByTestId(
|
|
730
|
-
'block-settings-modal'
|
|
731
|
-
);
|
|
732
|
-
// Get Twitter Embed link field.
|
|
733
|
-
const twitterLinkField = within(
|
|
734
|
-
blockSettingsModal
|
|
735
|
-
).getByLabelText( `Twitter Embed link, ${ expectedURL }` );
|
|
736
|
-
|
|
737
|
-
expect( twitterLinkField ).toBeDefined();
|
|
738
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
739
|
-
} );
|
|
740
|
-
|
|
741
|
-
it( 'converts to link if preview request failed', async () => {
|
|
742
|
-
// Return bad response for requests to oembed endpoint.
|
|
743
|
-
fetchRequest.mockImplementation( async ( req ) => {
|
|
744
|
-
if ( req.path.startsWith( '/oembed/1.0/proxy' ) ) {
|
|
745
|
-
return MOCK_BAD_WORDPRESS_RESPONSE;
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
return mockOtherResponses( req );
|
|
749
|
-
} );
|
|
750
|
-
|
|
751
|
-
const editor =
|
|
752
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
753
|
-
|
|
754
|
-
// Convert embed to link.
|
|
755
|
-
fireEvent.press( editor.getByText( 'More options' ) );
|
|
756
|
-
fireEvent.press( editor.getByText( 'Convert to link' ) );
|
|
757
|
-
|
|
758
|
-
// Get paragraph block where the link is created.
|
|
759
|
-
const [ paragraphBlock ] = await editor.findAllByLabelText(
|
|
760
|
-
/Paragraph Block\. Row 1/
|
|
761
|
-
);
|
|
762
|
-
|
|
763
|
-
expect( paragraphBlock ).toBeDefined();
|
|
764
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
765
|
-
} );
|
|
766
|
-
|
|
767
|
-
it( 'allows editing link if request failed', async () => {
|
|
768
|
-
const failURL = 'https://wordpress.org/news/2021/07/tatum/';
|
|
769
|
-
const successURL = 'https://twitter.com/notnownikki';
|
|
770
|
-
|
|
771
|
-
// Return bad response for WordPress URL and success for Twitter URL.
|
|
772
|
-
fetchRequest.mockImplementation( async ( req ) => {
|
|
773
|
-
const matchesPath = ( url ) =>
|
|
774
|
-
req.path ===
|
|
775
|
-
`/oembed/1.0/proxy?url=${ encodeURIComponent( url ) }`;
|
|
776
|
-
|
|
777
|
-
if ( matchesPath( failURL ) ) {
|
|
778
|
-
return MOCK_BAD_WORDPRESS_RESPONSE;
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
if ( matchesPath( successURL ) ) {
|
|
782
|
-
return RICH_TEXT_EMBED_SUCCESS_RESPONSE;
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
return mockOtherResponses( req );
|
|
786
|
-
} );
|
|
787
|
-
|
|
788
|
-
const editor = await initializeWithEmbedBlock( WP_EMBED_HTML );
|
|
789
|
-
|
|
790
|
-
fireEvent.press( editor.getByText( 'More options' ) );
|
|
791
|
-
fireEvent.press( editor.getByText( 'Edit link' ) );
|
|
792
|
-
|
|
793
|
-
// Start editing link.
|
|
794
|
-
fireEvent.press(
|
|
795
|
-
editor.getByLabelText( `WordPress link, ${ failURL }` )
|
|
796
|
-
);
|
|
797
|
-
|
|
798
|
-
// Set an URL.
|
|
799
|
-
const linkTextInput = editor.getByDisplayValue( failURL );
|
|
800
|
-
fireEvent( linkTextInput, 'focus' );
|
|
801
|
-
fireEvent.changeText( linkTextInput, successURL );
|
|
802
|
-
|
|
803
|
-
// Dismiss the edit URL modal.
|
|
804
|
-
const embedEditURLModal = editor.getByTestId(
|
|
805
|
-
'link-settings-navigation'
|
|
806
|
-
);
|
|
807
|
-
fireEvent( embedEditURLModal, 'backdropPress' );
|
|
808
|
-
fireEvent( embedEditURLModal, MODAL_DISMISS_EVENT );
|
|
809
|
-
|
|
810
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
811
|
-
|
|
812
|
-
const blockSettingsModal = await editor.findByTestId(
|
|
813
|
-
'block-settings-modal'
|
|
814
|
-
);
|
|
815
|
-
// Get Twitter embed link field.
|
|
816
|
-
const twitterLinkField = within(
|
|
817
|
-
blockSettingsModal
|
|
818
|
-
).getByLabelText( `Twitter Embed link, ${ successURL }` );
|
|
819
|
-
|
|
820
|
-
expect( twitterLinkField ).toBeDefined();
|
|
821
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
822
|
-
} );
|
|
823
|
-
} );
|
|
824
|
-
|
|
825
|
-
describe( 'preview coming soon', () => {
|
|
826
|
-
it( 'previews post for providers which embed preview is not available yet', async () => {
|
|
827
|
-
const { getByText, getByTestId } =
|
|
828
|
-
await initializeWithEmbedBlock( PHOTO_EMBED_HTML );
|
|
829
|
-
|
|
830
|
-
// Try to preview the post.
|
|
831
|
-
fireEvent.press( getByText( 'PREVIEW POST' ) );
|
|
832
|
-
|
|
833
|
-
// Wait for no preview modal to be visible.
|
|
834
|
-
const noPreviewModal = getByTestId( 'embed-no-preview-modal' );
|
|
835
|
-
await waitForModalVisible( noPreviewModal );
|
|
836
|
-
|
|
837
|
-
// Preview post.
|
|
838
|
-
fireEvent.press( getByText( 'Preview post' ) );
|
|
839
|
-
|
|
840
|
-
// Dismiss the no preview modal.
|
|
841
|
-
fireEvent( noPreviewModal, 'backdropPress' );
|
|
842
|
-
fireEvent( noPreviewModal, MODAL_DISMISS_EVENT );
|
|
843
|
-
|
|
844
|
-
expect( requestPreview ).toHaveBeenCalled();
|
|
845
|
-
} );
|
|
846
|
-
|
|
847
|
-
it( 'dismisses no preview modal', async () => {
|
|
848
|
-
const { getByText, getByTestId } =
|
|
849
|
-
await initializeWithEmbedBlock( PHOTO_EMBED_HTML );
|
|
850
|
-
|
|
851
|
-
// Try to preview the post.
|
|
852
|
-
fireEvent.press( getByText( 'PREVIEW POST' ) );
|
|
853
|
-
|
|
854
|
-
// Wait for no preview modal to be visible.
|
|
855
|
-
const noPreviewModal = getByTestId( 'embed-no-preview-modal' );
|
|
856
|
-
await waitForModalVisible( noPreviewModal );
|
|
857
|
-
|
|
858
|
-
// Dismiss modal.
|
|
859
|
-
fireEvent.press( getByText( 'Dismiss' ) );
|
|
860
|
-
|
|
861
|
-
// Wait for no preview modal to be not visible.
|
|
862
|
-
await waitFor( () =>
|
|
863
|
-
expect( noPreviewModal.props.isVisible ).toBe( false )
|
|
864
|
-
);
|
|
865
|
-
|
|
866
|
-
expect( requestPreview ).not.toHaveBeenCalled();
|
|
867
|
-
} );
|
|
868
|
-
} );
|
|
869
|
-
|
|
870
|
-
describe( 'create by pasting URL', () => {
|
|
871
|
-
it( 'creates embed block when pasting URL in paragraph block', async () => {
|
|
872
|
-
const expectedURL = 'https://www.youtube.com/watch?v=lXMskKTw3Bc';
|
|
873
|
-
|
|
874
|
-
const editor = await initializeEditor( {
|
|
875
|
-
initialHtml: EMPTY_PARAGRAPH_HTML,
|
|
876
|
-
} );
|
|
877
|
-
|
|
878
|
-
// Paste URL in paragraph block.
|
|
879
|
-
const paragraphText =
|
|
880
|
-
editor.getByPlaceholderText( 'Start writing…' );
|
|
881
|
-
fireEvent( paragraphText, 'focus' );
|
|
882
|
-
fireEvent( paragraphText, 'paste', {
|
|
883
|
-
preventDefault: jest.fn(),
|
|
884
|
-
nativeEvent: {
|
|
885
|
-
eventCount: 1,
|
|
886
|
-
target: undefined,
|
|
887
|
-
files: [],
|
|
888
|
-
pastedHtml: expectedURL,
|
|
889
|
-
pastedText: expectedURL,
|
|
890
|
-
},
|
|
891
|
-
} );
|
|
892
|
-
|
|
893
|
-
// Wait for embed handler picker to be visible.
|
|
894
|
-
const embedHandlerPicker = editor.getByTestId(
|
|
895
|
-
'embed-handler-picker'
|
|
896
|
-
);
|
|
897
|
-
await waitForModalVisible( embedHandlerPicker );
|
|
898
|
-
|
|
899
|
-
// Select create embed option.
|
|
900
|
-
fireEvent.press( editor.getByText( 'Create embed' ) );
|
|
901
|
-
expect( console ).toHaveLoggedWith(
|
|
902
|
-
'Processed HTML piece:\n\n',
|
|
903
|
-
`<p>${ expectedURL }</p>`
|
|
904
|
-
);
|
|
905
|
-
|
|
906
|
-
// Get the created embed block.
|
|
907
|
-
const [ embedBlock ] =
|
|
908
|
-
await editor.findAllByLabelText( /Embed Block\. Row 1/ );
|
|
909
|
-
|
|
910
|
-
expect( embedBlock ).toBeDefined();
|
|
911
|
-
|
|
912
|
-
await waitFor( () => editor.UNSAFE_getByType( WebView ) );
|
|
913
|
-
await editor.findByText( 'Media settings' );
|
|
914
|
-
|
|
915
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
916
|
-
} );
|
|
917
|
-
|
|
918
|
-
it( 'creates link when pasting URL in paragraph block', async () => {
|
|
919
|
-
const expectedURL = 'https://www.youtube.com/watch?v=lXMskKTw3Bc';
|
|
920
|
-
|
|
921
|
-
const editor = await initializeEditor( {
|
|
922
|
-
initialHtml: EMPTY_PARAGRAPH_HTML,
|
|
923
|
-
} );
|
|
924
|
-
|
|
925
|
-
// Paste URL in paragraph block.
|
|
926
|
-
const paragraphText =
|
|
927
|
-
editor.getByPlaceholderText( 'Start writing…' );
|
|
928
|
-
fireEvent( paragraphText, 'focus' );
|
|
929
|
-
fireEvent( paragraphText, 'paste', {
|
|
930
|
-
preventDefault: jest.fn(),
|
|
931
|
-
nativeEvent: {
|
|
932
|
-
eventCount: 1,
|
|
933
|
-
target: undefined,
|
|
934
|
-
files: [],
|
|
935
|
-
pastedHtml: expectedURL,
|
|
936
|
-
pastedText: expectedURL,
|
|
937
|
-
},
|
|
938
|
-
} );
|
|
939
|
-
|
|
940
|
-
// Wait for embed handler picker to be visible.
|
|
941
|
-
const embedHandlerPicker = editor.getByTestId(
|
|
942
|
-
'embed-handler-picker'
|
|
943
|
-
);
|
|
944
|
-
await waitForModalVisible( embedHandlerPicker );
|
|
945
|
-
|
|
946
|
-
// Select create link option.
|
|
947
|
-
fireEvent.press( editor.getByText( 'Create link' ) );
|
|
948
|
-
expect( console ).toHaveLoggedWith(
|
|
949
|
-
'Processed HTML piece:\n\n',
|
|
950
|
-
`<p>${ expectedURL }</p>`
|
|
951
|
-
);
|
|
952
|
-
|
|
953
|
-
// Get the link text.
|
|
954
|
-
const linkText = await editor.findByDisplayValue(
|
|
955
|
-
`<p><a href="${ expectedURL }">${ expectedURL }</a></p>`
|
|
956
|
-
);
|
|
957
|
-
|
|
958
|
-
expect( linkText ).toBeDefined();
|
|
959
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
960
|
-
} );
|
|
961
|
-
} );
|
|
962
|
-
|
|
963
|
-
describe( 'insert via slash inserter', () => {
|
|
964
|
-
it( 'insert generic embed block', async () => {
|
|
965
|
-
const embedBlockSlashInserter = '/Embed';
|
|
966
|
-
const editor = await initializeEditor( {
|
|
967
|
-
initialHtml: EMPTY_PARAGRAPH_HTML,
|
|
968
|
-
} );
|
|
969
|
-
|
|
970
|
-
const paragraphText =
|
|
971
|
-
editor.getByPlaceholderText( 'Start writing…' );
|
|
972
|
-
fireEvent( paragraphText, 'focus' );
|
|
973
|
-
// Trigger onSelectionChange to update both the current text and text selection.
|
|
974
|
-
// This event is required by the autocompleter, as it only displays the slash inserter
|
|
975
|
-
// if the text selection is located at the end of the text, for this reason,
|
|
976
|
-
// the start and end arguments match the text length.
|
|
977
|
-
fireEvent(
|
|
978
|
-
paragraphText,
|
|
979
|
-
'onSelectionChange',
|
|
980
|
-
embedBlockSlashInserter.length,
|
|
981
|
-
embedBlockSlashInserter.length,
|
|
982
|
-
embedBlockSlashInserter,
|
|
983
|
-
{
|
|
984
|
-
nativeEvent: {
|
|
985
|
-
eventCount: 1,
|
|
986
|
-
target: undefined,
|
|
987
|
-
text: embedBlockSlashInserter,
|
|
988
|
-
},
|
|
989
|
-
}
|
|
990
|
-
);
|
|
991
|
-
|
|
992
|
-
fireEvent.press( await editor.findByText( 'Embed' ) );
|
|
993
|
-
|
|
994
|
-
const [ block ] =
|
|
995
|
-
await editor.findAllByLabelText( /Embed Block\. Row 1/ );
|
|
996
|
-
|
|
997
|
-
const blockName = within( block ).getByText( 'Embed' );
|
|
998
|
-
|
|
999
|
-
expect( blockName ).toBeDefined();
|
|
1000
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
1001
|
-
} );
|
|
1002
|
-
|
|
1003
|
-
MOST_USED_PROVIDERS.forEach( ( { title } ) =>
|
|
1004
|
-
it( `inserts ${ title } block`, async () => {
|
|
1005
|
-
// Get just the first word of the title ("Twitter") as the full title ("Twitter Embed") breaks the test.
|
|
1006
|
-
const embedBlockSlashInserter = `/${ title.split( ' ' )[ 0 ] }`;
|
|
1007
|
-
const editor = await initializeEditor( {
|
|
1008
|
-
initialHtml: EMPTY_PARAGRAPH_HTML,
|
|
1009
|
-
} );
|
|
1010
|
-
|
|
1011
|
-
const paragraphText =
|
|
1012
|
-
editor.getByPlaceholderText( 'Start writing…' );
|
|
1013
|
-
fireEvent( paragraphText, 'focus' );
|
|
1014
|
-
// Trigger onSelectionChange to update both the current text and text selection.
|
|
1015
|
-
// This event is required by the autocompleter, as it only displays the slash inserter
|
|
1016
|
-
// if the text selection is located at the end of the text, for this reason,
|
|
1017
|
-
// the start and end arguments match the text length.
|
|
1018
|
-
fireEvent(
|
|
1019
|
-
paragraphText,
|
|
1020
|
-
'onSelectionChange',
|
|
1021
|
-
embedBlockSlashInserter.length,
|
|
1022
|
-
embedBlockSlashInserter.length,
|
|
1023
|
-
embedBlockSlashInserter,
|
|
1024
|
-
{
|
|
1025
|
-
nativeEvent: {
|
|
1026
|
-
eventCount: 1,
|
|
1027
|
-
target: undefined,
|
|
1028
|
-
text: embedBlockSlashInserter,
|
|
1029
|
-
},
|
|
1030
|
-
}
|
|
1031
|
-
);
|
|
1032
|
-
|
|
1033
|
-
fireEvent.press( await editor.findByText( title ) );
|
|
1034
|
-
|
|
1035
|
-
const [ block ] =
|
|
1036
|
-
await editor.findAllByLabelText( /Embed Block\. Row 1/ );
|
|
1037
|
-
|
|
1038
|
-
const blockName = within( block ).getByText( title );
|
|
1039
|
-
|
|
1040
|
-
expect( blockName ).toBeDefined();
|
|
1041
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
1042
|
-
} )
|
|
1043
|
-
);
|
|
1044
|
-
} );
|
|
1045
|
-
|
|
1046
|
-
it( 'sets block caption', async () => {
|
|
1047
|
-
const expectedCaption = 'Caption';
|
|
1048
|
-
|
|
1049
|
-
const screen = await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
1050
|
-
|
|
1051
|
-
// Set a caption.
|
|
1052
|
-
const captionField = screen.getByPlaceholderText( 'Add caption' );
|
|
1053
|
-
fireEvent( captionField, 'focus' );
|
|
1054
|
-
fireEvent( captionField, 'onChange', {
|
|
1055
|
-
nativeEvent: {
|
|
1056
|
-
eventCount: 1,
|
|
1057
|
-
target: undefined,
|
|
1058
|
-
text: expectedCaption,
|
|
1059
|
-
},
|
|
1060
|
-
} );
|
|
1061
|
-
|
|
1062
|
-
// Get current caption.
|
|
1063
|
-
const caption = await screen.findByDisplayValue(
|
|
1064
|
-
`<p>${ expectedCaption }</p>`
|
|
1065
|
-
);
|
|
1066
|
-
|
|
1067
|
-
expect( caption ).toBeDefined();
|
|
1068
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
1069
|
-
} );
|
|
1070
|
-
|
|
1071
|
-
it( 'displays cannot embed on the placeholder if preview data is null', async () => {
|
|
1072
|
-
// Return null response for requests to oembed endpoint.
|
|
1073
|
-
fetchRequest.mockImplementation( async ( req ) => {
|
|
1074
|
-
if ( req.path.startsWith( '/oembed/1.0/proxy' ) ) {
|
|
1075
|
-
return EMBED_NULL_RESPONSE;
|
|
1076
|
-
}
|
|
1077
|
-
|
|
1078
|
-
return mockOtherResponses( req );
|
|
1079
|
-
} );
|
|
1080
|
-
|
|
1081
|
-
const { getByText } = await initializeWithEmbedBlock(
|
|
1082
|
-
RICH_TEXT_ERROR_EMBED_HTML
|
|
1083
|
-
);
|
|
1084
|
-
|
|
1085
|
-
const cannotEmbedText = getByText( 'Unable to embed media' );
|
|
1086
|
-
|
|
1087
|
-
expect( cannotEmbedText ).toBeDefined();
|
|
1088
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
1089
|
-
} );
|
|
1090
|
-
|
|
1091
|
-
describe( 'block settings', () => {
|
|
1092
|
-
it( 'toggles resize for smaller devices media settings', async () => {
|
|
1093
|
-
const screen =
|
|
1094
|
-
await initializeWithEmbedBlock( RICH_TEXT_EMBED_HTML );
|
|
1095
|
-
|
|
1096
|
-
// Open Block Settings.
|
|
1097
|
-
fireEvent.press( await screen.findByLabelText( 'Open Settings' ) );
|
|
1098
|
-
|
|
1099
|
-
// Untoggle resize for smaller devices.
|
|
1100
|
-
fireEvent.press(
|
|
1101
|
-
await screen.findByText( /Resize for smaller devices/ )
|
|
1102
|
-
);
|
|
1103
|
-
|
|
1104
|
-
expect( getEditorHtml() ).toMatchSnapshot();
|
|
1105
|
-
} );
|
|
1106
|
-
|
|
1107
|
-
it( 'does not show media settings panel if responsive is not supported', async () => {
|
|
1108
|
-
const screen = await initializeWithEmbedBlock( WP_EMBED_HTML );
|
|
1109
|
-
|
|
1110
|
-
// Open Block Settings.
|
|
1111
|
-
fireEvent.press( await screen.findByLabelText( 'Open Settings' ) );
|
|
1112
|
-
|
|
1113
|
-
// Wait for media settings panel.
|
|
1114
|
-
let mediaSettingsPanel;
|
|
1115
|
-
try {
|
|
1116
|
-
mediaSettingsPanel =
|
|
1117
|
-
await screen.findByText( 'Media settings' );
|
|
1118
|
-
} catch {
|
|
1119
|
-
// NOOP.
|
|
1120
|
-
}
|
|
1121
|
-
|
|
1122
|
-
expect( mediaSettingsPanel ).not.toBeDefined();
|
|
1123
|
-
} );
|
|
1124
|
-
} );
|
|
1125
|
-
} );
|