diff --git a/projects/packages/jetpack-mu-wpcom/changelog/add-agents-manager-block-editor-filter b/projects/packages/jetpack-mu-wpcom/changelog/add-agents-manager-block-editor-filter new file mode 100644 index 00000000000..be1be6069f7 --- /dev/null +++ b/projects/packages/jetpack-mu-wpcom/changelog/add-agents-manager-block-editor-filter @@ -0,0 +1,4 @@ +Significance: patch +Type: added + +Agents Manager: Add `agents_manager_enqueue_in_block_editor` filter to allow preventing enqueue in block editor contexts. diff --git a/projects/packages/jetpack-mu-wpcom/src/features/agents-manager/class-agents-manager.php b/projects/packages/jetpack-mu-wpcom/src/features/agents-manager/class-agents-manager.php index da079b10a22..891a2bb977f 100644 --- a/projects/packages/jetpack-mu-wpcom/src/features/agents-manager/class-agents-manager.php +++ b/projects/packages/jetpack-mu-wpcom/src/features/agents-manager/class-agents-manager.php @@ -311,6 +311,23 @@ private function get_variant() { * @return bool */ private function is_enabled() { + // Allow environments (e.g. CIAB) to prevent loading in block editor contexts + // where agents-manager is already running from the parent page. + /** + * Filter whether to enqueue Agents Manager assets inside the block editor iframe. + * + * This allows environments that already run Agents Manager from the parent page + * to disable enqueueing a second instance within the block editor context. + * + * @param bool $enqueue_in_block_editor Whether to enqueue Agents Manager assets + * in the block editor iframe. Default true. + * + * @return bool Whether to enqueue Agents Manager assets in the block editor iframe. + */ + if ( $this->is_block_editor() && ! apply_filters( 'agents_manager_enqueue_in_block_editor', true ) ) { + return false; + } + // Full unified experience: Agents Manager with support guides, Help Center takeover, etc. if ( apply_filters( 'agents_manager_use_unified_experience', false ) ) { return true; diff --git a/projects/packages/jetpack-mu-wpcom/tests/php/features/agents-manager/Agents_Manager_Test.php b/projects/packages/jetpack-mu-wpcom/tests/php/features/agents-manager/Agents_Manager_Test.php index b7920ed435f..bf9e545f715 100644 --- a/projects/packages/jetpack-mu-wpcom/tests/php/features/agents-manager/Agents_Manager_Test.php +++ b/projects/packages/jetpack-mu-wpcom/tests/php/features/agents-manager/Agents_Manager_Test.php @@ -1356,6 +1356,44 @@ public function test_should_enqueue_script_preview_check_takes_precedence_over_u $this->assertFalse( $result ); } + /** + * Tests that should_enqueue_script returns false in block editor when + * agents_manager_enqueue_in_block_editor filter returns false. + * + * This allows environments like CIAB to prevent duplicate loading when + * agents-manager is already running from the parent page. + */ + public function test_should_enqueue_script_returns_false_in_block_editor_when_filter_disables_it() { + require_once ABSPATH . 'wp-admin/includes/screen.php'; + + // Set up block editor context. + set_current_screen( 'post' ); + $screen = get_current_screen(); + + // Use reflection to set the is_block_editor property. + $reflection = new \ReflectionClass( $screen ); + $property = $reflection->getProperty( 'is_block_editor' ); + if ( PHP_VERSION_ID < 80100 ) { + $property->setAccessible( true ); + } + $property->setValue( $screen, true ); + + $_SERVER['REQUEST_URI'] = '/wp-admin/post.php'; + + // Enable unified experience so should_enqueue_script() would otherwise return true, + // ensuring this test actually exercises the agents_manager_enqueue_in_block_editor filter. + add_filter( 'agents_manager_use_unified_experience', '__return_true', 20 ); + // Disable enqueue in block editor via the new filter. + add_filter( 'agents_manager_enqueue_in_block_editor', '__return_false' ); + + $result = $this->call_should_enqueue_script(); + + remove_filter( 'agents_manager_use_unified_experience', '__return_true', 20 ); + remove_filter( 'agents_manager_enqueue_in_block_editor', '__return_false' ); + + $this->assertFalse( $result ); + } + /** * Helper to call the private get_current_user_data method via reflection. *