Merge pull request #793 from mailpoet/conflict_resolver_fix
Replaces reliance on style/script names with asset location [MAILPOET-723]
This commit is contained in:
@@ -2,23 +2,19 @@
|
|||||||
namespace MailPoet\Util;
|
namespace MailPoet\Util;
|
||||||
|
|
||||||
class ConflictResolver {
|
class ConflictResolver {
|
||||||
public $allowed_assets = array(
|
public $permitted_assets_locations = array(
|
||||||
'styles' => array(
|
'styles' => array(
|
||||||
// WP default
|
// WP default
|
||||||
'admin-bar',
|
'^/wp-admin',
|
||||||
'colors',
|
'^/wp-includes',
|
||||||
'ie',
|
|
||||||
'wp-auth-check',
|
|
||||||
// third-party
|
// third-party
|
||||||
'query-monitor'
|
'query-monitor'
|
||||||
),
|
),
|
||||||
'scripts' => array(
|
'scripts' => array(
|
||||||
// WP default
|
// WP default
|
||||||
'common',
|
'^/wp-admin',
|
||||||
'admin-bar',
|
'^/wp-includes',
|
||||||
'utils',
|
'googleapis.com/ajax/libs',
|
||||||
'svg-painter',
|
|
||||||
'wp-auth-check',
|
|
||||||
// third-party
|
// third-party
|
||||||
'query-monitor'
|
'query-monitor'
|
||||||
)
|
)
|
||||||
@@ -57,16 +53,19 @@ class ConflictResolver {
|
|||||||
// unload all styles except from the list of allowed
|
// unload all styles except from the list of allowed
|
||||||
$dequeue_styles = function() {
|
$dequeue_styles = function() {
|
||||||
global $wp_styles;
|
global $wp_styles;
|
||||||
|
if(empty($wp_styles->queue)) return;
|
||||||
foreach($wp_styles->queue as $wp_style) {
|
foreach($wp_styles->queue as $wp_style) {
|
||||||
if(!in_array($wp_style, $this->allowed_assets['styles'])) {
|
if(empty($wp_styles->registered[$wp_style])) continue;
|
||||||
|
$registered_style = $wp_styles->registered[$wp_style];
|
||||||
|
if(!preg_match('!' . implode('|', $this->permitted_assets_locations['styles']) . '!i', $registered_style->src)) {
|
||||||
wp_dequeue_style($wp_style);
|
wp_dequeue_style($wp_style);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
add_action('wp_print_styles', $dequeue_styles);
|
add_action('wp_print_styles', $dequeue_styles, PHP_INT_MAX);
|
||||||
add_action('admin_print_styles', $dequeue_styles);
|
add_action('admin_print_styles', $dequeue_styles, PHP_INT_MAX);
|
||||||
add_action('admin_print_footer_scripts', $dequeue_styles);
|
add_action('admin_print_footer_scripts', $dequeue_styles, PHP_INT_MAX);
|
||||||
add_action('admin_footer', $dequeue_styles);
|
add_action('admin_footer', $dequeue_styles, PHP_INT_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
function resolveScriptsConflict() {
|
function resolveScriptsConflict() {
|
||||||
@@ -74,12 +73,14 @@ class ConflictResolver {
|
|||||||
$dequeue_scripts = function() {
|
$dequeue_scripts = function() {
|
||||||
global $wp_scripts;
|
global $wp_scripts;
|
||||||
foreach($wp_scripts->queue as $wp_script) {
|
foreach($wp_scripts->queue as $wp_script) {
|
||||||
if(!in_array($wp_script, $this->allowed_assets['scripts'])) {
|
if(empty($wp_scripts->registered[$wp_script])) continue;
|
||||||
|
$registered_script = $wp_scripts->registered[$wp_script];
|
||||||
|
if(!preg_match('!' . implode('|', $this->permitted_assets_locations['scripts']) . '!i', $registered_script->src)) {
|
||||||
wp_dequeue_script($wp_script);
|
wp_dequeue_script($wp_script);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
add_action('wp_print_scripts', $dequeue_scripts);
|
add_action('wp_print_scripts', $dequeue_scripts, PHP_INT_MAX);
|
||||||
add_action('admin_print_footer_scripts', $dequeue_scripts);
|
add_action('admin_print_footer_scripts', $dequeue_scripts, PHP_INT_MAX);
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -7,10 +7,6 @@ class ConflictResolverTest extends MailPoetTest {
|
|||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
$this->conflict_resolver = new ConflictResolver();
|
$this->conflict_resolver = new ConflictResolver();
|
||||||
$this->conflict_resolver->allowed_assets = array(
|
|
||||||
'scripts' => array('abc', 'xyz'),
|
|
||||||
'styles' => array('abc', 'xyz'),
|
|
||||||
);
|
|
||||||
$this->conflict_resolver->init();
|
$this->conflict_resolver->init();
|
||||||
global $wp_filter;
|
global $wp_filter;
|
||||||
$this->wp_filter = $wp_filter;
|
$this->wp_filter = $wp_filter;
|
||||||
@@ -28,11 +24,11 @@ class ConflictResolverTest extends MailPoetTest {
|
|||||||
|
|
||||||
function testItUnloadsAllStylesFromLocationsNotOnPermittedList() {
|
function testItUnloadsAllStylesFromLocationsNotOnPermittedList() {
|
||||||
expect(!empty($this->wp_filter['mailpoet_conflict_resolver_styles']))->true();
|
expect(!empty($this->wp_filter['mailpoet_conflict_resolver_styles']))->true();
|
||||||
// grab a random permitted style
|
// grab a random permitted style location
|
||||||
$permitted_style_name = $this->conflict_resolver->allowed_assets['styles'][array_rand($this->conflict_resolver->allowed_assets['styles'], 1)];
|
$permitted_asset_location = $this->conflict_resolver->permitted_assets_locations['styles'][array_rand($this->conflict_resolver->permitted_assets_locations['styles'], 1)];
|
||||||
// enqueue styles
|
// enqueue styles
|
||||||
wp_enqueue_style('select2', 'select2');
|
wp_enqueue_style('select2', '/wp-content/some/offending/plugin/select2.css');
|
||||||
wp_enqueue_style($permitted_style_name, 'permitted_style.css');
|
wp_enqueue_style('permitted_style', trim($permitted_asset_location, '^'));
|
||||||
$this->conflict_resolver->resolveStylesConflict();
|
$this->conflict_resolver->resolveStylesConflict();
|
||||||
do_action('wp_print_styles');
|
do_action('wp_print_styles');
|
||||||
do_action('admin_print_styles');
|
do_action('admin_print_styles');
|
||||||
@@ -40,27 +36,27 @@ class ConflictResolverTest extends MailPoetTest {
|
|||||||
do_action('admin_footer');
|
do_action('admin_footer');
|
||||||
global $wp_styles;
|
global $wp_styles;
|
||||||
$queued_styles = array_flip($wp_styles->queue);
|
$queued_styles = array_flip($wp_styles->queue);
|
||||||
// it should dequeue all styles except those found on the permitted list
|
// it should dequeue all styles except those found on the list of permitted locations
|
||||||
expect(empty($queued_styles['select2']))->true();
|
expect(empty($queued_styles['select2']))->true();
|
||||||
expect(empty($queued_styles[$permitted_style_name]))->false();
|
expect(empty($queued_styles['permitted_style']))->false();
|
||||||
}
|
}
|
||||||
|
|
||||||
function testItUnloadsAllScriptsFromLocationsNotOnPermittedList() {
|
function testItUnloadsAllScriptsFromLocationsNotOnPermittedList() {
|
||||||
expect(!empty($this->wp_filter['mailpoet_conflict_resolver_scripts']))->true();
|
expect(!empty($this->wp_filter['mailpoet_conflict_resolver_scripts']))->true();
|
||||||
// grab a random permitted script
|
// grab a random permitted script location
|
||||||
$permitted_script_name = $this->conflict_resolver->allowed_assets['scripts'][array_rand($this->conflict_resolver->allowed_assets['scripts'], 1)];
|
$permitted_asset_location = $this->conflict_resolver->permitted_assets_locations['scripts'][array_rand($this->conflict_resolver->permitted_assets_locations['scripts'], 1)];
|
||||||
// enqueue scripts
|
// enqueue scripts
|
||||||
wp_enqueue_script('select2', 'select2');
|
wp_enqueue_script('select2', '/wp-content/some/offending/plugin/select2.js');
|
||||||
wp_enqueue_script('random_script_in_footer', 'http://example.com/random-script.js', null, null, $in_footer = true);
|
wp_enqueue_script('some_random_script', 'http://example.com/some_script.js', null, null, $in_footer = true); // test inside footer
|
||||||
wp_enqueue_script($permitted_script_name, 'permitted_script.js');
|
wp_enqueue_script('permitted_script', trim($permitted_asset_location, '^'));
|
||||||
$this->conflict_resolver->resolveScriptsConflict();
|
$this->conflict_resolver->resolveScriptsConflict();
|
||||||
do_action('wp_print_scripts');
|
do_action('wp_print_scripts');
|
||||||
do_action('admin_print_footer_scripts');
|
do_action('admin_print_footer_scripts');
|
||||||
global $wp_scripts;
|
global $wp_scripts;
|
||||||
$queued_scripts = array_flip($wp_scripts->queue);
|
$queued_scripts = array_flip($wp_scripts->queue);
|
||||||
// it should dequeue all scripts except those found on the permitted list
|
// it should dequeue all scripts except those found on the list of permitted locations
|
||||||
expect(empty($queued_scripts['select2']))->true();
|
expect(empty($queued_scripts['select2']))->true();
|
||||||
expect(empty($queued_scripts['random_script_in_footer']))->true();
|
expect(empty($queued_scripts['some_random_script']))->true();
|
||||||
expect(empty($queued_scripts[$permitted_script_name]))->false();
|
expect(empty($queued_scripts['permitted_script']))->false();
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user