Skip to content

Commit

Permalink
High priority fixes for 6.3.1 (#53709)
Browse files Browse the repository at this point in the history
* Footnotes: Fix recursion into updating attributes when attributes is not an object (#53257)

* Fix crash by moving editor style logic into a hook with useMemo (#53596)

* Move editor style logic into a hook whith useMemo

* Remove unnecessary useMemo

* Move the  whole logic inside the 'useMemo'

* Add missing useSelect dep

---------

Co-authored-by: George Mamadashvili <[email protected]>

* Adding an is_array check before using count in case $footnotes is not countable (#53660)

* Footnotes: fix accidental  override (#53663)

* Footnotes: fix accidental  override

* Remove double quotes

* Footnotes: autosave is not slashing JSON (#53664)

* Footnotes: autosave saves decoded JSON

* wp_slash

* Curly quote

* Slash on save and restore

* Ensure the preview dropdown popover closes (<16.3) for e2e tests

---------

Co-authored-by: Andrew Serong <[email protected]>
Co-authored-by: Noah Allen <[email protected]>
Co-authored-by: George Mamadashvili <[email protected]>
Co-authored-by: Ramon <[email protected]>
Co-authored-by: Ella <[email protected]>
Co-authored-by: ramon <[email protected]>
  • Loading branch information
7 people authored Aug 16, 2023
1 parent 2e0dad9 commit 0e9862f
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 54 deletions.
15 changes: 7 additions & 8 deletions packages/block-library/src/footnotes/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ function render_block_core_footnotes( $attributes, $content, $block ) {

$footnotes = json_decode( $footnotes, true );

if ( count( $footnotes ) === 0 ) {
if ( ! is_array( $footnotes ) || count( $footnotes ) === 0 ) {
return '';
}

Expand Down Expand Up @@ -98,7 +98,7 @@ function wp_save_footnotes_meta( $revision_id ) {

if ( $footnotes ) {
// Can't use update_post_meta() because it doesn't allow revisions.
update_metadata( 'post', $revision_id, 'footnotes', $footnotes );
update_metadata( 'post', $revision_id, 'footnotes', wp_slash( $footnotes ) );
}
}
}
Expand Down Expand Up @@ -154,15 +154,14 @@ function wp_add_footnotes_revisions_to_post_meta( $post ) {

if ( $footnotes ) {
// Can't use update_post_meta() because it doesn't allow revisions.
update_metadata( 'post', $wp_temporary_footnote_revision_id, 'footnotes', $footnotes );
update_metadata( 'post', $wp_temporary_footnote_revision_id, 'footnotes', wp_slash( $footnotes ) );
}
}
}
}

foreach ( array( 'post', 'page' ) as $post_type ) {
add_action( "rest_after_insert_{$post_type}", 'wp_add_footnotes_revisions_to_post_meta' );
}
add_action( 'rest_after_insert_post', 'wp_add_footnotes_revisions_to_post_meta' );
add_action( 'rest_after_insert_page', 'wp_add_footnotes_revisions_to_post_meta' );

/**
* Restores the footnotes meta value from the revision.
Expand All @@ -176,7 +175,7 @@ function wp_restore_footnotes_from_revision( $post_id, $revision_id ) {
$footnotes = get_post_meta( $revision_id, 'footnotes', true );

if ( $footnotes ) {
update_post_meta( $post_id, 'footnotes', $footnotes );
update_post_meta( $post_id, 'footnotes', wp_slash( $footnotes ) );
} else {
delete_post_meta( $post_id, 'footnotes' );
}
Expand Down Expand Up @@ -243,7 +242,7 @@ function _wp_rest_api_autosave_meta( $autosave ) {
return;
}

update_post_meta( $id, 'footnotes', $body['meta']['footnotes'] );
update_post_meta( $id, 'footnotes', wp_slash( $body['meta']['footnotes'] ) );
}
// See https://github.com/WordPress/wordpress-develop/blob/2103cb9966e57d452c94218bbc3171579b536a40/src/wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php#L391C1-L391C1.
add_action( 'wp_creating_autosave', '_wp_rest_api_autosave_meta' );
Expand Down
9 changes: 9 additions & 0 deletions packages/core-data/src/entity-provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,15 @@ export function useEntityBlockEditor( kind, name, { id: _id } = {} ) {
);

function updateAttributes( attributes ) {
// Only attempt to update attributes, if attributes is an object.
if (
! attributes ||
Array.isArray( attributes ) ||
typeof attributes !== 'object'
) {
return attributes;
}

attributes = { ...attributes };

for ( const key in attributes ) {
Expand Down
94 changes: 54 additions & 40 deletions packages/edit-post/src/components/layout/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
InterfaceSkeleton,
store as interfaceStore,
} from '@wordpress/interface';
import { useState, useEffect, useCallback } from '@wordpress/element';
import { useState, useEffect, useCallback, useMemo } from '@wordpress/element';
import { store as keyboardShortcutsStore } from '@wordpress/keyboard-shortcuts';
import { store as noticesStore } from '@wordpress/notices';

Expand Down Expand Up @@ -70,6 +70,57 @@ const interfaceLabels = {
footer: __( 'Editor footer' ),
};

function useEditorStyles() {
const { hasThemeStyleSupport, editorSettings } = useSelect(
( select ) => ( {
hasThemeStyleSupport:
select( editPostStore ).isFeatureActive( 'themeStyles' ),
editorSettings: select( editorStore ).getEditorSettings(),
} ),
[]
);

// Compute the default styles.
return useMemo( () => {
const presetStyles =
editorSettings.styles?.filter(
( style ) =>
style.__unstableType && style.__unstableType !== 'theme'
) ?? [];

const defaultEditorStyles = [
...editorSettings.defaultEditorStyles,
...presetStyles,
];

// Has theme styles if the theme supports them and if some styles were not preset styles (in which case they're theme styles).
const hasThemeStyles =
hasThemeStyleSupport &&
presetStyles.length !== ( editorSettings.styles?.length ?? 0 );

// If theme styles are not present or displayed, ensure that
// base layout styles are still present in the editor.
if ( ! editorSettings.disableLayoutStyles && ! hasThemeStyles ) {
defaultEditorStyles.push( {
css: getLayoutStyles( {
style: {},
selector: 'body',
hasBlockGapSupport: false,
hasFallbackGapSupport: true,
fallbackGapValue: '0.5em',
} ),
} );
}

return hasThemeStyles ? editorSettings.styles : defaultEditorStyles;
}, [
editorSettings.defaultEditorStyles,
editorSettings.disableLayoutStyles,
editorSettings.styles,
hasThemeStyleSupport,
] );
}

function Layout() {
const isMobileViewport = useViewportMatch( 'medium', '<' );
const isHugeViewport = useViewportMatch( 'huge', '>=' );
Expand All @@ -94,45 +145,10 @@ function Layout() {
showBlockBreadcrumbs,
isTemplateMode,
documentLabel,
styles,
} = useSelect( ( select ) => {
const { getEditorSettings, getPostTypeLabel } = select( editorStore );
const { isFeatureActive } = select( editPostStore );
const editorSettings = getEditorSettings();
const postTypeLabel = getPostTypeLabel();
const hasThemeStyles = isFeatureActive( 'themeStyles' );

const themeStyles = [];
const presetStyles = [];
editorSettings.styles?.forEach( ( style ) => {
if ( ! style.__unstableType || style.__unstableType === 'theme' ) {
themeStyles.push( style );
} else {
presetStyles.push( style );
}
} );

const defaultEditorStyles = [
...editorSettings.defaultEditorStyles,
...presetStyles,
];

// If theme styles are not present or displayed, ensure that
// base layout styles are still present in the editor.
if (
! editorSettings.disableLayoutStyles &&
! ( hasThemeStyles && themeStyles.length )
) {
defaultEditorStyles.push( {
css: getLayoutStyles( {
style: {},
selector: 'body',
hasBlockGapSupport: false,
hasFallbackGapSupport: true,
fallbackGapValue: '0.5em',
} ),
} );
}

return {
isTemplateMode: select( editPostStore ).isEditingTemplate(),
Expand Down Expand Up @@ -165,13 +181,11 @@ function Layout() {
),
// translators: Default label for the Document in the Block Breadcrumb.
documentLabel: postTypeLabel || _x( 'Document', 'noun' ),
styles:
hasThemeStyles && themeStyles.length
? editorSettings.styles
: defaultEditorStyles,
};
}, [] );

const styles = useEditorStyles();

const openSidebarPanel = () =>
openGeneralSidebar(
hasBlockSelected ? 'edit-post/block' : 'edit-post/document'
Expand Down
36 changes: 30 additions & 6 deletions test/e2e/specs/editor/various/footnotes.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,8 @@ test.describe( 'Footnotes', () => {
await editor.clickBlockToolbarButton( 'More' );
await page.locator( 'button:text("Footnote")' ).click();

await page.keyboard.type( 'first footnote' );
// Check if content is correctly slashed on save and restore.
await page.keyboard.type( 'first footnote"' );

const id1 = await editor.canvas.evaluate( () => {
return document.activeElement.id;
Expand All @@ -316,7 +317,7 @@ test.describe( 'Footnotes', () => {
id: id2,
},
{
content: 'first footnote',
content: 'first footnote"',
id: id1,
},
] );
Expand All @@ -329,7 +330,7 @@ test.describe( 'Footnotes', () => {
// This also saves the post!
expect( await getFootnotes( page ) ).toMatchObject( [
{
content: 'first footnote',
content: 'first footnote"',
id: id1,
},
{
Expand All @@ -338,8 +339,20 @@ test.describe( 'Footnotes', () => {
},
] );

const editorPage = page;
const previewPage = await editor.openPreviewPage();

await expect(
previewPage.locator( 'ol.wp-block-footnotes' )
).toHaveText( 'first footnote” ↩︎second footnote ↩︎' );

await previewPage.close();
await editorPage.bringToFront();

// Open revisions.
await editor.openDocumentSettingsSidebar();
// Ensure the preview dropdown popover closes.
await editor.canvas.click( 'body' );
await page
.getByRole( 'region', { name: 'Editor settings' } )
.getByRole( 'button', { name: 'Post' } )
Expand All @@ -355,10 +368,19 @@ test.describe( 'Footnotes', () => {
id: id2,
},
{
content: 'first footnote',
content: 'first footnote"',
id: id1,
},
] );

const previewPage2 = await editor.openPreviewPage();

await expect(
previewPage2.locator( 'ol.wp-block-footnotes' )
).toHaveText( 'second footnote ↩︎first footnote” ↩︎' );

await previewPage2.close();
await editorPage.bringToFront();
} );

test( 'can be previewed when published', async ( { editor, page } ) => {
Expand Down Expand Up @@ -392,12 +414,14 @@ test.describe( 'Footnotes', () => {
// path).
await editor.canvas.click( 'ol.wp-block-footnotes li span' );
await page.keyboard.press( 'End' );
await page.keyboard.type( '3' );
// Test slashing.
await page.keyboard.type( '3"' );

const previewPage2 = await editor.openPreviewPage();

// Note: quote will get curled by wptexturize.
await expect(
previewPage2.locator( 'ol.wp-block-footnotes li' )
).toHaveText( '123 ↩︎' );
).toHaveText( '123 ↩︎' );
} );
} );

0 comments on commit 0e9862f

Please sign in to comment.