Make WordPress Core

Changeset 57593


Ignore:
Timestamp:
02/12/2024 12:58:53 PM (12 months ago)
Author:
gziolo
Message:

Script Modules API: Add deregister module function

It was impossible to deregister a script module. It is changing to avoid problems for extenders that want to override any Core script module.

Fixes #60463.
Props cbravobernal, gziolo, mukesh27, youknowriad.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-script-modules.php

    r57492 r57593  
    149149            $this->registered[ $id ]['enqueue'] = false;
    150150        }
     151        unset( $this->enqueued_before_registered[ $id ] );
     152    }
     153
     154    /**
     155     * Removes a registered script module.
     156     *
     157     * @since 6.5.0
     158     *
     159     * @param string $id The identifier of the script module.
     160     */
     161    public function deregister( string $id ) {
     162        unset( $this->registered[ $id ] );
    151163        unset( $this->enqueued_before_registered[ $id ] );
    152164    }
  • trunk/src/wp-includes/script-modules.php

    r57503 r57593  
    113113    wp_script_modules()->dequeue( $id );
    114114}
     115
     116/**
     117 * Deregisters the script module.
     118 *
     119 * @since 6.5.0
     120 *
     121 * @param string $id The identifier of the script module.
     122 */
     123function wp_deregister_script_module( string $id ) {
     124    wp_script_modules()->deregister( $id );
     125}
  • trunk/tests/phpunit/tests/script-modules/wpScriptModules.php

    r57492 r57593  
    127127    }
    128128
     129
     130    /**
     131     * Tests that a script module can be deregistered
     132     * after being enqueued, and that will be removed
     133     * from the enqueue list too.
     134     *
     135     * @ticket 60463
     136     *
     137     * @covers ::register()
     138     * @covers ::enqueue()
     139     * @covers ::deregister()
     140     * @covers ::get_enqueued_script_modules()
     141     */
     142    public function test_wp_deregister_script_module() {
     143        $this->script_modules->register( 'foo', '/foo.js' );
     144        $this->script_modules->register( 'bar', '/bar.js' );
     145        $this->script_modules->enqueue( 'foo' );
     146        $this->script_modules->enqueue( 'bar' );
     147        $this->script_modules->deregister( 'foo' ); // Dequeued.
     148
     149        $enqueued_script_modules = $this->get_enqueued_script_modules();
     150
     151        $this->assertCount( 1, $enqueued_script_modules );
     152        $this->assertFalse( isset( $enqueued_script_modules['foo'] ) );
     153        $this->assertTrue( isset( $enqueued_script_modules['bar'] ) );
     154    }
     155
     156    /**
     157     * Tests that a script module is not deregistered
     158     * if it has not been registered before, causing
     159     * no errors.
     160     *
     161     * @ticket 60463
     162     *
     163     * @covers ::deregister()
     164     * @covers ::get_enqueued_script_modules()
     165     */
     166    public function test_wp_deregister_unexistent_script_module() {
     167        $this->script_modules->deregister( 'unexistent' );
     168        $enqueued_script_modules = $this->get_enqueued_script_modules();
     169
     170        $this->assertCount( 0, $enqueued_script_modules );
     171        $this->assertFalse( isset( $enqueued_script_modules['unexistent'] ) );
     172    }
     173
     174    /**
     175     * Tests that a script module is not deregistered
     176     * if it has been deregistered previously, causing
     177     * no errors.
     178     *
     179     * @ticket 60463
     180     *
     181     * @covers ::get_enqueued_script_modules()
     182     * @covers ::register()
     183     * @covers ::deregister()
     184     * @covers ::enqueue()
     185     */
     186    public function test_wp_deregister_already_deregistered_script_module() {
     187        $this->script_modules->register( 'foo', '/foo.js' );
     188        $this->script_modules->enqueue( 'foo' );
     189        $this->script_modules->deregister( 'foo' ); // Dequeued.
     190        $enqueued_script_modules = $this->get_enqueued_script_modules();
     191
     192        $this->assertCount( 0, $enqueued_script_modules );
     193        $this->assertFalse( isset( $enqueued_script_modules['foo'] ) );
     194
     195        $this->script_modules->deregister( 'foo' ); // Dequeued.
     196        $enqueued_script_modules = $this->get_enqueued_script_modules();
     197
     198        $this->assertCount( 0, $enqueued_script_modules );
     199        $this->assertFalse( isset( $enqueued_script_modules['foo'] ) );
     200    }
     201
    129202    /**
    130203    * Tests that a script module can be enqueued before it is registered, and will
Note: See TracChangeset for help on using the changeset viewer.