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

Block supports: Restore root DOMDocument save #25028

Merged
merged 10 commits into from
Sep 7, 2020

Conversation

sirreal
Copy link
Member

@sirreal sirreal commented Sep 2, 2020

Fix a regression from #25020 which was found to remove anything outside of the block root that may have been appended or prepended. This fix is achieved by concatenating all the childNodes in the DOMDocument body. See #25026 for additional details on the regression.

Add a test to ensure that appended HTML is preserved.

The regression from #25020 exposes an issue I'll raise in another PR with some failing tests. HTML appended to the block content works well. However, if additional output comes before the block content then then gutenberg_apply_block_supports will misbehave because it expects the block content to be the first element in the constructed DOM body:

$block_root = $xpath->query( '/html/body/*' )[0];

See #25053 for discussion around the expected behavior of gutenberg_apply_block_supports.

Fixes #25117

@github-actions
Copy link

github-actions bot commented Sep 2, 2020

Size Change: 0 B

Total Size: 1.2 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.67 kB 0 B
build/api-fetch/index.js 3.41 kB 0 B
build/autop/index.js 2.82 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 8.5 kB 0 B
build/block-directory/style-rtl.css 953 B 0 B
build/block-directory/style.css 952 B 0 B
build/block-editor/index.js 128 kB 0 B
build/block-editor/style-rtl.css 11.1 kB 0 B
build/block-editor/style.css 11.1 kB 0 B
build/block-library/editor-rtl.css 8.64 kB 0 B
build/block-library/editor.css 8.64 kB 0 B
build/block-library/index.js 138 kB 0 B
build/block-library/style-rtl.css 7.59 kB 0 B
build/block-library/style.css 7.58 kB 0 B
build/block-library/theme-rtl.css 754 B 0 B
build/block-library/theme.css 754 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 47.7 kB 0 B
build/components/index.js 200 kB 0 B
build/components/style-rtl.css 15.5 kB 0 B
build/components/style.css 15.5 kB 0 B
build/compose/index.js 9.67 kB 0 B
build/core-data/index.js 12.3 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.55 kB 0 B
build/date/index.js 31.9 kB 0 B
build/deprecated/index.js 772 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 4.48 kB 0 B
build/edit-navigation/index.js 11.7 kB 0 B
build/edit-navigation/style-rtl.css 1.16 kB 0 B
build/edit-navigation/style.css 1.16 kB 0 B
build/edit-post/index.js 305 kB 0 B
build/edit-post/style-rtl.css 6.26 kB 0 B
build/edit-post/style.css 6.25 kB 0 B
build/edit-site/index.js 17.1 kB 0 B
build/edit-site/style-rtl.css 3.06 kB 0 B
build/edit-site/style.css 3.06 kB 0 B
build/edit-widgets/index.js 12 kB 0 B
build/edit-widgets/style-rtl.css 2.46 kB 0 B
build/edit-widgets/style.css 2.45 kB 0 B
build/editor/editor-styles-rtl.css 492 B 0 B
build/editor/editor-styles.css 493 B 0 B
build/editor/index.js 45.6 kB 0 B
build/editor/style-rtl.css 3.81 kB 0 B
build/editor/style.css 3.81 kB 0 B
build/element/index.js 4.64 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.71 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.57 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.52 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.32 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.41 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 13.9 kB 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 4.06 kB 0 B
build/viewport/index.js 1.85 kB 0 B
build/warning/index.js 1.13 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

lib/block-supports/index.php Outdated Show resolved Hide resolved
@sirreal sirreal changed the title Revert "Save DOMDocument node instead of root + str_replace" Block supports: Restore root DOMDocument save Sep 3, 2020
@sirreal
Copy link
Member Author

sirreal commented Sep 3, 2020

This is no longer a simple revert. The regression should be addressed by this PR. The whitespace cleanup should be maintained here, and an additional test to cover the regression is introduced.

@sirreal sirreal added Needs Technical Feedback Needs testing from a developer perspective. [Feature] Blocks Overall functionality of blocks [Type] Bug An existing feature does not function as intended labels Sep 4, 2020
@sirreal sirreal self-assigned this Sep 4, 2020
@sirreal sirreal requested a review from westonruter September 4, 2020 20:55
sirreal added a commit that referenced this pull request Sep 7, 2020
It will be fragile to match exact strings to be removed from a saved
DOMDocument. It's already been observed that this introduces extraneous
newlines and other document normalization could change the strings we
expect to match.

Instead of matching some HTML strings to remove, concatenate the
children of the document body element in order to produce the expected
HTML.

Noted in #25028 (comment)
@sirreal sirreal force-pushed the revert-25020-update/improve-dom-saving branch from add0f99 to 0a92f0d Compare September 7, 2020 10:03
@sirreal
Copy link
Member Author

sirreal commented Sep 7, 2020

Addressed comments and rebased to fix conflicts.

@sirreal sirreal added this to the Gutenberg 8.9 milestone Sep 7, 2020
@sirreal
Copy link
Member Author

sirreal commented Sep 7, 2020

I'll investigate the test failures…

@@ -71,8 +77,8 @@ function gutenberg_apply_block_supports( $block_content, $block ) {
return $block_content;
}

$xpath = new DOMXPath( $dom );
$block_root = $xpath->query( '/html/body/*' )[0];
$body_element = $dom->getElementByID( $body_id );
Copy link
Contributor

Choose a reason for hiding this comment

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

I think it'd be sufficient to

Suggested change
$body_element = $dom->getElementByID( $body_id );
$body_element = $dom->getElementsByTagName( 'body' )[0];

(which means requiring that no other <body /> be prepended, which I think is a fair assumption).

Also fine if you wanna play it even safer though 👍

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 don't like going through the NodeList to get the first element, but I don't feel strongly.

I've implemented an alternative in b252259e2c52ecff711f812f48d026db700f85b0 that traverses simple, known path to the body.

@sirreal sirreal force-pushed the revert-25020-update/improve-dom-saving branch from 0a92f0d to 1f69bff Compare September 7, 2020 11:53
Copy link
Contributor

@ockham ockham left a comment

Choose a reason for hiding this comment

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

Looking good, thanks. One non-blocking note here.

Feel free to merge once green!

It will be fragile to match exact strings to be removed from a saved
DOMDocument. It's already been observed that this introduces extraneous
newlines and other document normalization could change the strings we
expect to match.

Instead of matching some HTML strings to remove, concatenate the
children of the document body element in order to produce the expected
HTML.

Noted in #25028 (comment)
@sirreal sirreal force-pushed the revert-25020-update/improve-dom-saving branch from b252259 to de01660 Compare September 7, 2020 13:05
@ntsekouras
Copy link
Contributor

This will also fix #25117

@youknowriad youknowriad merged commit 124eee7 into master Sep 7, 2020
@youknowriad youknowriad deleted the revert-25020-update/improve-dom-saving branch September 7, 2020 14:56
sirreal added a commit that referenced this pull request Sep 11, 2020
In some versions of PHP (< 7.3) the `DOMDocument::saveHtml( $node )`
method would format HTML introducing whitespace that could result in
different rendered results in the browser.

Avoid using the `DOMDocument::saveHtml( $node )` to ensure consistent
behavior with supported PHP versions.

Mentioned here:
#25028 (comment)
sirreal added a commit that referenced this pull request Sep 11, 2020
…25240)

Get DOM root and extract substring contents

In some versions of PHP (< 7.3) the `DOMDocument::saveHtml( $node )`
method would format HTML introducing whitespace that could result in
different rendered results in the browser.

Avoid using the `DOMDocument::saveHtml( $node )` to ensure consistent
behavior with supported PHP versions.

Mentioned here:
#25028 (comment)
@mcsf mcsf mentioned this pull request Oct 14, 2020
11 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Blocks Overall functionality of blocks Needs Technical Feedback Needs testing from a developer perspective. [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Query block in front end renders only the first element
5 participants