diff --git a/backport-changelog/7.1/12004.md b/backport-changelog/7.1/12004.md new file mode 100644 index 00000000000000..c7033525a085f7 --- /dev/null +++ b/backport-changelog/7.1/12004.md @@ -0,0 +1,3 @@ +https://github.com/WordPress/wordpress-develop/pull/12004 + +* https://github.com/WordPress/gutenberg/pull/78404 diff --git a/lib/media/load.php b/lib/media/load.php index cdd261158b43e0..b0cc5605b0dca9 100644 --- a/lib/media/load.php +++ b/lib/media/load.php @@ -295,6 +295,13 @@ function gutenberg_set_up_cross_origin_isolation() { return; } + // Skip when rendering the classic-theme home route, which shows the site + // preview in an iframe and must reach its `contentDocument` to neutralize + // interactive elements — DIP would block that. + if ( 'site-editor' === $screen->id && ! wp_is_block_theme() && ( ! isset( $_GET['p'] ) || '/' === $_GET['p'] ) ) { + return; + } + // Skip when a third-party page builder overrides the block editor. // DIP isolates the document into its own agent cluster, // which blocks same-origin iframe access that these editors rely on. diff --git a/test/e2e/specs/site-editor/site-preview.spec.js b/test/e2e/specs/site-editor/site-preview.spec.js new file mode 100644 index 00000000000000..200c6b5cce041e --- /dev/null +++ b/test/e2e/specs/site-editor/site-preview.spec.js @@ -0,0 +1,42 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +test.describe( 'Site preview', () => { + test.beforeAll( async ( { requestUtils } ) => { + // The site preview iframe is only rendered for classic (non-block) themes. + await requestUtils.activateTheme( 'twentytwentyone' ); + } ); + + test( 'makes interactive elements inside the preview non-interactive', async ( { + admin, + page, + } ) => { + await admin.visitSiteEditor(); + + const previewFrame = page.frameLocator( + 'iframe[title="Site Preview"]' + ); + + const interactiveSelector = [ + 'a[href]', + 'button:not([disabled])', + 'input:not([type="hidden"]):not([disabled])', + 'select:not([disabled])', + 'textarea:not([disabled])', + ] + .map( ( selector ) => `${ selector }:visible` ) + .join( ',' ); + const interactiveElements = previewFrame.locator( interactiveSelector ); + + await expect( interactiveElements.first() ).toBeVisible(); + + const count = await interactiveElements.count(); + for ( let i = 0; i < count; i++ ) { + const element = interactiveElements.nth( i ); + await expect( element ).toHaveAttribute( 'aria-hidden', 'true' ); + await expect( element ).toHaveCSS( 'pointer-events', 'none' ); + } + } ); +} );