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

Try: Aggressive TinyMCE deprecation #50387

Merged
merged 31 commits into from
Jul 3, 2023
Merged

Conversation

tyxla
Copy link
Member

@tyxla tyxla commented May 5, 2023

What?

This PR attempts to experiment with an aggressive strategy for deprecating TinyMCE.

I'd love to get some feedback from everyone!

Why?

The end goal is to fully deprecate the Classic block and all TinyMCE assets because they end up adding a lot of burden to the loading experience. With that approach, eventually, we could fully remove TinyMCE one day.

How?

The PR suggests that we wrap the functionality in a Gutenberg Experiment so that everyone can enable it to opt-in.

The experiment disables loading any TinyMCE assets and the classic block by default.

Then, if TinyMCE usage is detected, it refreshes the page and adds an additional query argument. On the subsequent page load, all assets are loaded, classic block as well.

That way, a new installation, or an installation that doesn't utilize tinyMCE will never have to load its assets or see the Classic block anymore.

Furthermore, we detect if the post has a classic block in the content and make sure to load it in that case.

Finally, we detect that the user just inputs some raw HTML in their editor, in which case we alter the messaging to suggest the user either convert to an HTML block (from where they can convert to blocks) or refresh the page if they insist on using the Classic block.

Testing Instructions

  • Checkout the PR and build Gutenberg.
  • Go to Experiments http://localhost:8888/wp-admin/admin.php?page=gutenberg-experiments.
  • Enable the "Disable TinyMCE and Classic block" experiment and click "Save Changes".
  • Open the post editor with a new post: http://localhost:8888/wp-admin/post-new.php
  • Verify that you don't see the Classic editor in the inserter.
  • Verify that you don't see any assets when you search for "tinymce" in the network tab of your browser dev tools (except for the tinymce-proxy.js file, which is expected as part of this experiment)
  • Verify that there are no errors in the console. If you are seeing any errors in the console, verify you also see them in trunk.
  • Head to /lib/experimental/disable-tinymce.php and uncomment the 8th line by removing the leading //.
  • Open the post editor with a new post: http://localhost:8888/wp-admin/post-new.php
  • Verify that the page gets refreshed shortly after loading.
  • Verify that you now have the Classic block available and it works well when inserted.
  • Verify that after the new page is loaded, you now have the requiresTinymce query argument set.
  • Disable the experiment from the Experiments page.
  • Open the post editor again.
  • Verify that Classic block is available and it works well.
  • Delete the query argument manually from your browser's URL address.
  • Verify that Classic block is still available and it works well.
  • Start a new post, and use the code editor to write a sentence.
  • Change back to the visual editor, and verify you can see a message like on the screenshot below.
  • Save the post, refresh the page, and verify you can see the paragraph loaded within the Classic block.

Testing Instructions for Keyboard

None

Screenshots or screencast

The message one sees when they edit their post in "code editor", they add some raw HTML and they switch back to the visual editor:

Screenshot 2023-05-25 at 17 52 41

@tyxla tyxla added [Status] In Progress Tracking issues with work in progress [Type] Experimental Experimental feature or API. labels May 5, 2023
@tyxla tyxla self-assigned this May 5, 2023
@tyxla tyxla force-pushed the try/aggressive-tinymce-deprecation branch from 5541250 to e040dc2 Compare May 5, 2023 15:14
@github-actions
Copy link

github-actions bot commented May 5, 2023

Size Change: +172 B (0%)

Total Size: 1.42 MB

Filename Size Change
build/block-library/index.min.js 201 kB +172 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 6.99 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.25 kB
build/block-editor/content.css 4.24 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/index.min.js 209 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 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 409 B
build/block-library/blocks/columns/style.css 409 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.61 kB
build/block-library/blocks/cover/style.css 1.6 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 159 B
build/block-library/blocks/details/style.css 159 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 312 B
build/block-library/blocks/footnotes/style-rtl.css 191 B
build/block-library/blocks/footnotes/style.css 188 B
build/block-library/blocks/freeform/editor-rtl.css 2.58 kB
build/block-library/blocks/freeform/editor.css 2.58 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.42 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.46 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view.min.js 906 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 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 167 B
build/block-library/blocks/pullquote/theme.css 167 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 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 587 B
build/block-library/blocks/search/style.css 584 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 531 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.43 kB
build/block-library/blocks/social-links/style.css 1.42 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.7 kB
build/block-library/style.css 13.7 kB
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51 kB
build/commands/index.min.js 14.9 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/index.min.js 240 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12 kB
build/core-commands/index.min.js 2.26 kB
build/core-data/index.min.js 16.1 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.27 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.63 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.3 kB
build/edit-post/style-rtl.css 7.58 kB
build/edit-post/style.css 7.57 kB
build/edit-site/index.min.js 85.2 kB
build/edit-site/style-rtl.css 12.6 kB
build/edit-site/style.css 12.6 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/index.min.js 45.4 kB
build/editor/style-rtl.css 3.58 kB
build/editor/style.css 3.58 kB
build/element/index.min.js 4.8 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.62 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 10 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.84 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/plugins/index.min.js 1.77 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 943 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.39 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 10.9 kB
build/router/index.min.js 1.77 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.83 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.57 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@tyxla tyxla force-pushed the try/aggressive-tinymce-deprecation branch 2 times, most recently from 6eaa1cb to 0687bc7 Compare May 8, 2023 11:37
@github-actions
Copy link

github-actions bot commented May 8, 2023

Flaky tests detected in e5ce4e9.
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/5442538841
📝 Reported issues:

@tyxla tyxla added [Block] Classic Affects the Classic Editor Block [Package] Block library /packages/block-library [Type] Performance Related to performance efforts labels May 8, 2023
$gutenberg_experiments = get_option( 'gutenberg-experiments' );
if (
! $gutenberg_experiments ||
! array_key_exists( 'gutenberg-no-tinymce', $gutenberg_experiments ) ||
Copy link
Member Author

@tyxla tyxla May 8, 2023

Choose a reason for hiding this comment

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

We're now loading editor as a dependency of wp-block-library only if the experiment is disabled and the "require tinymce" cookie query argument isn't present.

lib/experimental/assets/tinymce-proxy.js Outdated Show resolved Hide resolved
async function markAsRequiringTinymce() {
const expiration = new Date( 'Dec 31, 2099 23:59:59' );
document.cookie = `requiresTinymce=1; expires=${ expiration }; path=/`;
window.location.reload();
Copy link
Member Author

Choose a reason for hiding this comment

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

@mtias we talked about displaying a popup to the user, but I reconsidered this as being too aggressive and invasive. With this approach, we're simply detecting usage of TinyMCE, and if there is any, we'll save a cookie and redirect, and on the next page load, the user will have the classic block and TinyMCE.

Copy link
Member

Choose a reason for hiding this comment

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

We should be able to detect usage server side on the parse_blocks loop before hitting the client. Isn't that more straightforward?

Copy link
Member Author

Choose a reason for hiding this comment

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

Well, I'm not sure about that - last time I checked, parse_blocks() would return an empty blockName for a classic block instance, and it returns the same if we have an empty space between blocks, too. Also, even if we were able to detect usage of a Classic block that way, we wouldn't be able to detect plugin usage that relies on the wp.tinymce global. Thoughts?

Copy link
Member

Choose a reason for hiding this comment

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

@tyxla I don't know if that would be a problem on the server for two reasons:

  • there is no "classic block" - it's implicitly "a block without a name" as a way of supporting raw HTML in a post that isn't block material. to that end we can be confident that a block without a name is a classic block because that's exactly the specification we made which determines if something is a classic block.
  • if a block's inner contents is only whitespace then I don't see any reason to consider it a real block, moreso if it's just \n\n. the editor ignores these blocks, so we can too on the server. even if a block has thirty newlines, several tabs, and spaces, it's still all one and the same in HTML.

so we could do something like this…

add_filter( 'render_block', function( $html, $block ) {
	if ( empty( $block['blockName'] ) && ! empty( trim( $html ) ) ) {
		wp_enqueue_script( … );
	}

	return $html;
} );

Copy link
Member Author

Choose a reason for hiding this comment

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

Makes sense to me. I'm happy to try it out for detecting a classic block usage. Stay tuned.

I still think we're still going to need the cookie approach on the client side for instances of plugins that rely on the tinymce globals - there's no way to catch those from the server.

Copy link
Member

Choose a reason for hiding this comment

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

what about setting a getter on window.tinymce that reloads the page with extra args to request it? no need to opt-in, and for those situations where we guessed wrong while being aggressive, we can correct that with a page refresh

if (!('tinymce' in window)) {
	Object.defineProperty(window, 'tinymce', {
		get() {
			reloadPageWithMCE()
		}
	});
}

Copy link
Contributor

Choose a reason for hiding this comment

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

what about setting a getter on window.tinymce that reloads the page with extra args to request it? no need to opt-in, and for those situations where we guessed wrong while being aggressive, we can correct that with a page refresh

I'd like to see this tested too

Copy link
Member Author

Choose a reason for hiding this comment

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

Sounds like a plan 👍 I wasn't very fond of the cookie solution either, so while I wanted to try with the block manager, this won't do (see here for more details), so I'll go with a query argument.

The only downside of that is that we might end up needing some extra effort to persist that query argument, but then again, we won't have to worry about cleaning it up either, so it might end up being quite a solid approach.

Will work on it and update y'all.

Copy link
Member Author

Choose a reason for hiding this comment

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

Updated in 896f8cf to use a query argument instead of a cookie. Other than not persisting the value, this approach appears to be working fine - let me know what you think @dmsnell @mcsf

*
* @access public
*/
final class _WP_Editors {
Copy link
Member Author

Choose a reason for hiding this comment

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

Much of the TinyMCE assets are hardcoded to be loaded and not enqueued in a pluggable way. So we're creating a new class and requiring it conditionally, in which case it just doesn't load them anymore.

Copy link
Contributor

Choose a reason for hiding this comment

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

Not sure I understand this part? How does loading this class prevents TinyMCE from loading?

Copy link
Member Author

Choose a reason for hiding this comment

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

This, by default, is a core WP class that takes care of generating and "enqueueing" the editor assets. The problem is that for some of the scripts it doesn't use the traditional way to enqueue scripts, rather it will just output a huge blob of them inline, see:

https://github.com/WordPress/wordpress-develop/blob/559e6cecf49505ecc3a21fbff647fdc5c3f892a3/src/wp-includes/class-wp-editor.php#L1567

So the only way to not spit that blob of scripts out is to override this class. This is actually an optimization because none of what it does will even get enqueued that way (look around the class I linked above, it also enqueued some assets), so we won't need to dequeue them either.

Luckily, redeclaring the class is possible because of the way that we check if the class is declared before being required, for example:

https://github.com/WordPress/wordpress-develop/blob/559e6cecf49505ecc3a21fbff647fdc5c3f892a3/src/wp-admin/includes/ajax-actions.php#L1923

and:

https://github.com/WordPress/wordpress-develop/blob/559e6cecf49505ecc3a21fbff647fdc5c3f892a3/src/wp-admin/includes/deprecated.php#L771

I realize this is a bold approach, but it makes it so straightforward to remove all editor assets that would otherwise be either enqueued or plainly spit out as inline scripts in the admin. This is one of the main reasons why I prefer having this whole thing wrapped as an experiment before releasing it to the public.

lib/experimental/disable-tinymce.php Outdated Show resolved Hide resolved
lib/experimental/disable-tinymce.php Outdated Show resolved Hide resolved
lib/experimental/disable-tinymce.php Outdated Show resolved Hide resolved
@@ -98,7 +98,9 @@ function gutenberg_enable_experiments() {
if ( $gutenberg_experiments && array_key_exists( 'gutenberg-theme-previews', $gutenberg_experiments ) ) {
wp_add_inline_script( 'wp-block-editor', 'window.__experimentalEnableThemePreviews = true', 'before' );
}

if ( $gutenberg_experiments && array_key_exists( 'gutenberg-no-tinymce', $gutenberg_experiments ) ) {
wp_add_inline_script( 'wp-block-library', 'window.__experimentalDisableTinymce = true', 'before' );
Copy link
Member Author

Choose a reason for hiding this comment

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

This is the global variable that we use to pass the experiment to the client side.

Copy link
Contributor

Choose a reason for hiding this comment

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

What's the thinking here? making this an experiment for some time to see the impact? What about removing the experiment but leaving this as a plugin-only (no backport to core) feature until we're certain.

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, I prefer adding it as an experiment just in case, so we can further polish it without breaking the experience for anyone. I've also explained some of the rationale here. After I have more confidence, I'm happy to remove the experiment wrapper altogether.

packages/block-library/src/index.js Outdated Show resolved Hide resolved
@tyxla
Copy link
Member Author

tyxla commented May 19, 2023

I haven't managed to make any progress on this one this week, but I'm planning to resume work on it next week.

@tyxla tyxla force-pushed the try/aggressive-tinymce-deprecation branch from 0687bc7 to 514605e Compare May 25, 2023 12:12
@tyxla
Copy link
Member Author

tyxla commented May 25, 2023

Update: the PR is in a better state now:

  • We're still using an experiment as a flag. I want to keep that since this will likely require some extensive testing with various site builders and custom editor plugins once it's shipped.
  • By default, we're still not loading any of TinyMCE's assets and the classic block at all.
  • We're still detecting a wp.tinymce global usage and refreshing the page to load it with TinyMCE and the classic block.
  • We're now properly detecting if the currently edited post has a classic block, and loading TinyMCE with the Classic block accordingly.
  • We're now handling the attempts of anyone to add raw HTML through the code editor with a custom message:

Screenshot 2023-05-25 at 17 52 41

After refreshing, the user will see the Classic block as expected. We're using that use case as a last resort to have them convert to an HTML block. At that time they can also convert the HTML to blocks. We could also add a "Convert to blocks" button next to the "Keep as HTML" button if that will help.

I still need to test thoroughly and see if there are any edge cases to fix, but I'm happy to accept any feedback already.

@tyxla tyxla force-pushed the try/aggressive-tinymce-deprecation branch from baa1535 to f3d0291 Compare May 30, 2023 13:18
* @package gutenberg
*/

// add_action( 'admin_footer', 'gutenberg_test_tinymce_access' ); // Uncomment the following line to force an external TinyMCE usage.
Copy link
Member Author

@tyxla tyxla May 30, 2023

Choose a reason for hiding this comment

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

Uncomment this line to force usage of TinyMCE. That can be used to test the cookie query argument logic.

lib/client-assets.php Outdated Show resolved Hide resolved
@dmsnell
Copy link
Member

dmsnell commented May 30, 2023

We're now handling the attempts of anyone to add raw HTML through the code editor with a custom message:

Does this show the HTML preview of the raw HTML or only show the error box? It can be very disorienting when all you get is the error box, because it removes the context of knowing what you're working with.

@tyxla
Copy link
Member Author

tyxla commented May 30, 2023

Does this show the HTML preview of the raw HTML or only show the error box? It can be very disorienting when all you get is the error box, because it removes the context of knowing what you're working with.

Good question - yes, it shows a preview below the error box - see below.

Typing in the code editor:
Screenshot 2023-05-30 at 16 37 01

Switching to the visual editor:
Screenshot 2023-05-30 at 16 37 07

@tyxla tyxla added Needs Design Feedback Needs general design feedback. Needs Technical Feedback Needs testing from a developer perspective. and removed [Status] In Progress Tracking issues with work in progress labels May 30, 2023
@tyxla tyxla marked this pull request as ready for review May 30, 2023 13:40
@tyxla
Copy link
Member Author

tyxla commented May 30, 2023

I'm pretty satisfied with the state of the PR at this point, I think it's a good time to get some more feedback 😉

@tyxla tyxla force-pushed the try/aggressive-tinymce-deprecation branch from 7b3ddac to d448cac Compare July 3, 2023 08:43
* @package gutenberg
*/

// add_action( 'admin_footer', 'gutenberg_test_tinymce_access' ); // Uncomment the following line to force an external TinyMCE usage.
Copy link
Member Author

Choose a reason for hiding this comment

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

I'm going to keep that for now, just in case we'd like to test 3rd party global usage.

@tyxla tyxla merged commit b819f63 into trunk Jul 3, 2023
@tyxla tyxla deleted the try/aggressive-tinymce-deprecation branch July 3, 2023 10:36
@github-actions github-actions bot added this to the Gutenberg 16.2 milestone Jul 3, 2023
@mtias
Copy link
Member

mtias commented Jul 3, 2023

Looking forward to seeing the performance impact of this one!

@tyxla
Copy link
Member Author

tyxla commented Jul 3, 2023

Looking forward to seeing the performance impact of this one!

Me too! In the meantime, since this is an experiment, I'm planning to run perf tests on it in #52245.

@cbravobernal
Copy link
Contributor

cbravobernal commented Jul 3, 2023

We already have this warning on console. Is due to disabling tinymce?

Screenshot 2023-07-03 at 15 06 07

@tyxla
Copy link
Member Author

tyxla commented Jul 3, 2023

@c4rl0sbr4v0 this is likely related - that's exactly why this work is an experiment, so one could be able to disable it and resolve the warning.

In the meantime, it would be really helpful to know more about:

  • On which admin page are you seeing the error?
  • What steps did you follow to reproduce the error?
  • What WP version are you using?
  • What plugins do you have active on your site?

Thanks in advance!

@cbravobernal
Copy link
Contributor

cbravobernal commented Jul 3, 2023

On which admin page are you seeing the error?

On page and post edit.

What steps did you follow to reproduce the error?

Just opening a console inside a post or a page edit.

What WP version are you using?

The one from wp-env. 6.3-alpha-56087/

What plugins do you have active on your site?

Just Gutenberg in trunk.

@tyxla
Copy link
Member Author

tyxla commented Jul 4, 2023

@c4rl0sbr4v0 thanks for providing more information, however I'm unable to reproduce, so I have a few more questions:

  • Are you using the latest trunk?
  • Have you run npm run dev on npm run build with that latest trunk?
  • Is the "Disable TinyMCE and Classic block" experiment turned on or off on your installation?
  • Can you share some more thorough error backtrace information? A screenshot of the entire error with the path where it's invoked could be of great help.

@cbravobernal
Copy link
Contributor

I tried again this morning and now I'm unable to reproduce too.

Are you using the latest trunk?

I was, I updated this morning.

Have you run npm run dev on npm run build with that latest trunk?

Yep

Is the "Disable TinyMCE and Classic block" experiment turned on or off on your installation?

I didn't know there was such option 😅 . Now I enabled/disabled and the error does not appear.

Can you share some more thorough error backtrace information? A screenshot of the entire error with the path where it's invoked could be of great help.

I will do if a get the error again. Sorry for the trouble!

@tyxla
Copy link
Member Author

tyxla commented Jul 4, 2023

Thank you for the extra information @c4rl0sbr4v0, I really appreciate it!

I tried deleting the option altogether to get to the state you were in before, but couldn't repro it even that way.

Please don't hesitate to ping me if it occurs again!

@tyxla
Copy link
Member Author

tyxla commented Jul 5, 2023

Following up to this with #52325 that makes it more interoperable with some plugins (like the Classic Editor)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Classic Affects the Classic Editor Block Needs Design Feedback Needs general design feedback. Needs Technical Feedback Needs testing from a developer perspective. [Package] Block library /packages/block-library [Type] Performance Related to performance efforts
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants