From 60214e9a09928f9a2e94d4d7bdd796fa6ebeb04b Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 12:35:54 +0100 Subject: [PATCH 01/12] Add test case --- .../generator-scope/block.json | 15 +++++++++ .../generator-scope/render.php | 16 ++++++++++ .../generator-scope/view.asset.php | 1 + .../generator-scope/view.js | 23 ++++++++++++++ .../interactivity/generator-scope.spec.ts | 31 +++++++++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 packages/e2e-tests/plugins/interactive-blocks/generator-scope/block.json create mode 100644 packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php create mode 100644 packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.asset.php create mode 100644 packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js create mode 100644 test/e2e/specs/interactivity/generator-scope.spec.ts diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/block.json b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/block.json new file mode 100644 index 00000000000000..32388d7a641d60 --- /dev/null +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/block.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "test/generator-scope", + "title": "E2E Interactivity tests - generator scope", + "category": "text", + "icon": "heart", + "description": "", + "supports": { + "interactivity": true + }, + "textdomain": "e2e-interactivity", + "viewScriptModule": "file:./view.js", + "render": "file:./render.php" +} diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php new file mode 100644 index 00000000000000..a6a78c1682a8fa --- /dev/null +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php @@ -0,0 +1,16 @@ + + +
'' ) ) ?> +> + + + +
diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.asset.php b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.asset.php new file mode 100644 index 00000000000000..db23afdf657a19 --- /dev/null +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.asset.php @@ -0,0 +1 @@ + array( '@wordpress/interactivity' ) ); diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js new file mode 100644 index 00000000000000..cddeed425d3f62 --- /dev/null +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js @@ -0,0 +1,23 @@ +/** + * WordPress dependencies + */ +import { store, getContext } from '@wordpress/interactivity'; + +store( 'test/generator-scope', { + callbacks: { + *resolve() { + try { + getContext().result = yield Promise.resolve( 'ok' ); + } catch (err) { + getContext().result = err.toString() + } + }, + *reject() { + try { + getContext().result = yield Promise.reject( new Error( '😘' ) ) + } catch (err) { + getContext().result = err.toString() + } + } + } +} ); diff --git a/test/e2e/specs/interactivity/generator-scope.spec.ts b/test/e2e/specs/interactivity/generator-scope.spec.ts new file mode 100644 index 00000000000000..b1684095cd5441 --- /dev/null +++ b/test/e2e/specs/interactivity/generator-scope.spec.ts @@ -0,0 +1,31 @@ +/** + * Internal dependencies + */ +import { test, expect } from './fixtures'; + +test.describe( 'generator scope', () => { + test.beforeAll( async ( { interactivityUtils: utils } ) => { + await utils.activatePlugins(); + await utils.addPostWithBlock( 'test/generator-scope' ); + } ); + test.beforeEach( async ( { interactivityUtils: utils, page } ) => { + await page.goto( utils.getLink( 'test/generator-scope' ) ); + } ); + test.afterAll( async ( { interactivityUtils: utils } ) => { + await utils.deactivatePlugins(); + await utils.deleteAllPosts(); + } ); + + test( 'Promise generator callbacks should restore scope on resolve and reject', async ( { + page, + } ) => { + const resultInput = page.getByTestId( 'result' ); + await expect( resultInput ).toHaveValue( '' ); + + await page.getByTestId( 'resolve' ).click(); + await expect( resultInput ).toHaveValue( 'ok' ); + + await page.getByTestId( 'reject' ).click(); + await expect( resultInput ).toHaveValue( 'Error: 😘' ); + } ); +} ); From ecb25347169514b7f1d45978904a8116a93001d3 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 12:43:29 +0100 Subject: [PATCH 02/12] Fix scoping behavior --- packages/interactivity/src/store.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/interactivity/src/store.ts b/packages/interactivity/src/store.ts index ca65bbbc6aa180..10a449e9b77a47 100644 --- a/packages/interactivity/src/store.ts +++ b/packages/interactivity/src/store.ts @@ -109,7 +109,7 @@ const handlers = { const scope = getScope(); const gen: Generator< any > = result( ...args ); - let value: any; + let value: unknown; let it: IteratorResult< any >; while ( true ) { @@ -117,15 +117,12 @@ const handlers = { setScope( scope ); try { it = gen.next( value ); - } finally { - resetScope(); - resetNamespace(); - } - - try { value = await it.value; } catch ( e ) { gen.throw( e ); + } finally { + resetScope(); + resetNamespace(); } if ( it.done ) break; From cfaa0a77a250b20f907edf3f783b138683600db5 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 12:58:29 +0100 Subject: [PATCH 03/12] Restore 2 try/catch --- packages/interactivity/src/store.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/interactivity/src/store.ts b/packages/interactivity/src/store.ts index 10a449e9b77a47..055e6e3cc99ff4 100644 --- a/packages/interactivity/src/store.ts +++ b/packages/interactivity/src/store.ts @@ -117,8 +117,16 @@ const handlers = { setScope( scope ); try { it = gen.next( value ); + } finally { + resetScope(); + resetNamespace(); + } + + try { value = await it.value; } catch ( e ) { + setNamespace( ns ); + setScope( scope ); gen.throw( e ); } finally { resetScope(); From 382a9246e54c36e127eede8505973e3250cb6bf6 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 13:08:33 +0100 Subject: [PATCH 04/12] Fix render comment --- .../plugins/interactive-blocks/generator-scope/render.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php index a6a78c1682a8fa..42ea06f3e59ef5 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php @@ -1,6 +1,6 @@ Date: Fri, 8 Mar 2024 11:48:22 +0100 Subject: [PATCH 05/12] Exclude *.asset.php files from the hyphen naming rule --- phpcs.xml.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 882eaa06b15e02..c3c2cf631600f1 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -77,6 +77,7 @@ /phpunit/* + *.asset.php /phpunit/* From b14634d4e0b420be578059e984a4d682f7eaff7a Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 13:09:52 +0100 Subject: [PATCH 06/12] Fix lint --- .../plugins/interactive-blocks/generator-scope/render.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php index 42ea06f3e59ef5..6c24cd805a34b7 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php @@ -8,7 +8,7 @@
'' ) ) ?> + '' ) ); ?> > From 314833397f37e2aea12013b8964fcbc0a0dc2663 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 13:12:58 +0100 Subject: [PATCH 07/12] Improve exclude pattern Co-authored-by: Anton Vlasenko <43744263+anton-vlasenko@users.noreply.github.com> --- phpcs.xml.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpcs.xml.dist b/phpcs.xml.dist index c3c2cf631600f1..ae9de1707e5308 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -77,7 +77,7 @@ /phpunit/* - *.asset.php +*\.asset\.php$ /phpunit/* From 04fd91bffcbd34478aecbdd0f6ca143648cd421e Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 13:13:53 +0100 Subject: [PATCH 08/12] Fix alignment --- phpcs.xml.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpcs.xml.dist b/phpcs.xml.dist index ae9de1707e5308..279ed611bf4bd6 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -77,7 +77,7 @@ /phpunit/* -*\.asset\.php$ + *\.asset\.php$ /phpunit/* From 09889c5016d76c072de4b6b70d7f1b49a2003228 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Fri, 8 Mar 2024 13:16:53 +0100 Subject: [PATCH 09/12] Use consistent HTML quoting --- .../plugins/interactive-blocks/generator-scope/render.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php index 6c24cd805a34b7..c9991e441627d1 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/render.php @@ -11,6 +11,6 @@ '' ) ); ?> > - - + +
From 443983abfb067fb01cb961ffc4923c9db9c2cfcd Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Mon, 11 Mar 2024 14:12:08 +0100 Subject: [PATCH 10/12] Prettier view file --- .../interactive-blocks/generator-scope/view.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js index cddeed425d3f62..26d526263cb462 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js +++ b/packages/e2e-tests/plugins/interactive-blocks/generator-scope/view.js @@ -8,16 +8,16 @@ store( 'test/generator-scope', { *resolve() { try { getContext().result = yield Promise.resolve( 'ok' ); - } catch (err) { - getContext().result = err.toString() + } catch ( err ) { + getContext().result = err.toString(); } }, *reject() { try { - getContext().result = yield Promise.reject( new Error( '😘' ) ) - } catch (err) { - getContext().result = err.toString() + getContext().result = yield Promise.reject( new Error( '😘' ) ); + } catch ( err ) { + getContext().result = err.toString(); } - } - } + }, + }, } ); From fa015701c5abaf37d2b28767dc85b6600159d4ff Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Mon, 11 Mar 2024 14:14:26 +0100 Subject: [PATCH 11/12] Rename test file --- .../{generator-scope.spec.ts => async-actions.spec.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/e2e/specs/interactivity/{generator-scope.spec.ts => async-actions.spec.ts} (95%) diff --git a/test/e2e/specs/interactivity/generator-scope.spec.ts b/test/e2e/specs/interactivity/async-actions.spec.ts similarity index 95% rename from test/e2e/specs/interactivity/generator-scope.spec.ts rename to test/e2e/specs/interactivity/async-actions.spec.ts index b1684095cd5441..55e44d6cd4a085 100644 --- a/test/e2e/specs/interactivity/generator-scope.spec.ts +++ b/test/e2e/specs/interactivity/async-actions.spec.ts @@ -3,7 +3,7 @@ */ import { test, expect } from './fixtures'; -test.describe( 'generator scope', () => { +test.describe( 'async actions', () => { test.beforeAll( async ( { interactivityUtils: utils } ) => { await utils.activatePlugins(); await utils.addPostWithBlock( 'test/generator-scope' ); From 242f138e2f243a8a8282a7298206ac7739407d97 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Mon, 11 Mar 2024 14:22:44 +0100 Subject: [PATCH 12/12] Add changelog --- packages/interactivity/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/interactivity/CHANGELOG.md b/packages/interactivity/CHANGELOG.md index 3cd8c5ef3e598c..cb3f2fc97dac1d 100644 --- a/packages/interactivity/CHANGELOG.md +++ b/packages/interactivity/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Bug Fixes + +- Ensure scope is restored when catching exceptions thrown in async generator actions. ([#59708](https://github.com/WordPress/gutenberg/pull/59708)) + ## 5.2.0 (2024-03-06) ### Bug Fixes