diff --git a/libraries/src/HTML/HTMLHelper.php b/libraries/src/HTML/HTMLHelper.php index 28becb2a0b4d9..d6bdde152b07f 100644 --- a/libraries/src/HTML/HTMLHelper.php +++ b/libraries/src/HTML/HTMLHelper.php @@ -424,14 +424,22 @@ protected static function includeRelativeFiles($folder, $file, $relative, $detec $browser = $navigator->getBrowser(); $major = $navigator->getMajor(); $minor = $navigator->getMinor(); + $minExt = ''; + + if (strlen($strip) > 4 && preg_match('#\.min$#', $strip)) + { + $minExt = '.min'; + $strip = preg_replace('#\.min$#', '', $strip); + + } // Try to include files named filename.ext, filename_browser.ext, filename_browser_major.ext, filename_browser_major_minor.ext // where major and minor are the browser version names $potential = array( - $strip, - $strip . '_' . $browser, - $strip . '_' . $browser . '_' . $major, - $strip . '_' . $browser . '_' . $major . '_' . $minor, + $strip . $minExt, + $strip . '_' . $browser . $minExt, + $strip . '_' . $browser . '_' . $major . $minExt, + $strip . '_' . $browser . '_' . $major . '_' . $minor . $minExt, ); } else @@ -699,14 +707,14 @@ public static function stylesheet($file, $options = array(), $attribs = array()) $attribs = $argList[1] ?? array(); $options['relative'] = $argList[2] ?? false; $options['pathOnly'] = $argList[3] ?? false; - $options['detectBrowser'] = $argList[4] ?? true; + $options['detectBrowser'] = $argList[4] ?? false; $options['detectDebug'] = $argList[5] ?? true; } else { $options['relative'] = $options['relative'] ?? false; $options['pathOnly'] = $options['pathOnly'] ?? false; - $options['detectBrowser'] = $options['detectBrowser'] ?? true; + $options['detectBrowser'] = $options['detectBrowser'] ?? false; $options['detectDebug'] = $options['detectDebug'] ?? true; } @@ -772,7 +780,7 @@ public static function script($file, $options = array(), $attribs = array()) $options['framework'] = $argList[1] ?? false; $options['relative'] = $argList[2] ?? false; $options['pathOnly'] = $argList[3] ?? false; - $options['detectBrowser'] = $argList[4] ?? true; + $options['detectBrowser'] = $argList[4] ?? false; $options['detectDebug'] = $argList[5] ?? true; } else @@ -780,7 +788,7 @@ public static function script($file, $options = array(), $attribs = array()) $options['framework'] = $options['framework'] ?? false; $options['relative'] = $options['relative'] ?? false; $options['pathOnly'] = $options['pathOnly'] ?? false; - $options['detectBrowser'] = $options['detectBrowser'] ?? true; + $options['detectBrowser'] = $options['detectBrowser'] ?? false; $options['detectDebug'] = $options['detectDebug'] ?? true; } @@ -830,7 +838,7 @@ public static function script($file, $options = array(), $attribs = array()) * Also passing a key = fullPolyfill and value= true we force the whole polyfill instead * of just the custom element. (Polyfills loaded as needed, no force load) * @param array $options The relative, version, detect browser and detect debug options for the custom element - * or web component. Files need to have a -es5(.min).js (or -es5(.min).html) for the non ES6 + * or web component. Files need to have a -es5(.min).js for the non ES6 * Browsers. * * @since 4.0.0 diff --git a/tests/unit/suites/libraries/cms/html/JHtmlTest.php b/tests/unit/suites/libraries/cms/html/JHtmlTest.php index ecaa7e377e18d..ee78da8550799 100644 --- a/tests/unit/suites/libraries/cms/html/JHtmlTest.php +++ b/tests/unit/suites/libraries/cms/html/JHtmlTest.php @@ -580,7 +580,7 @@ public function testScript() { // These are some paths to pass to JHtml for testing purposes. $urlpath = 'test' . uniqid() . '/'; - $urlfilename = 'script' . uniqid() . '.js'; + $urlfilename = 'script' . uniqid() . '.min.js'; // We generate a random template name so that we don't collide or hit anything. $template = 'mytemplate' . uniqid(); @@ -685,7 +685,7 @@ public function testScript() $extension = 'testextension' . uniqid(); $element = 'element' . uniqid(); $urlpath = 'path' . uniqid() . '/'; - $urlfilename = 'script1.js'; + $urlfilename = 'script1.min.js'; mkdir(JPATH_ROOT . '/media/' . $extension . '/' . $element . '/js/' . $urlpath, 0777, true); @@ -769,12 +769,12 @@ public function testScript() mkdir(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath, 0777, true); file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . $urlfilename, 'test'); - file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.js', 'test'); - file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0.js', 'test'); - file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0_0.js', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.min.js', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0.min.js', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0_0.min.js', 'test'); JBrowser::getInstance()->setBrowser('mybrowser'); - JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true)); + JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'detectBrowser' => true)); $this->assertArrayHasKey( '/media/system/js/' . $element . '/' . $urlpath . $urlfilename, @@ -783,18 +783,18 @@ public function testScript() ); $this->assertArrayHasKey( - '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.js', + '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.min.js', JFactory::$document->_scripts, 'Line:' . __LINE__ . ' JHtml::script failed when we should get it from the media directory' ); $this->assertEquals( - JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true)), + JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true, 'detectBrowser' => true)), array( JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . $urlfilename, - JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.js', - JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0.js', - JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0_0.js' + JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.min.js', + JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0.min.js', + JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0_0.min.js' ), 'Line:' . __LINE__ . ' JHtml::script failed in URL only mode when it should come from the media directory' ); @@ -807,22 +807,22 @@ public function testScript() JFactory::$document->_scripts = array(); unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . $urlfilename); - unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.js'); - unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0.js'); - unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0_0.js'); + unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser.min.js'); + unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0.min.js'); + unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1_mybrowser_0_0.min.js'); rmdir(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath); rmdir(JPATH_ROOT . '/media/system/js/' . $element); mkdir(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath, 0777, true); file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . $urlfilename, 'test'); - file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', 'test'); JFactory::getConfig()->set('debug', 1); JFactory::$document->_scripts = array(); JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true)); $this->assertArrayHasKey( - '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js', + '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', JFactory::$document->_scripts, 'Line:' . __LINE__ . ' JHtml::script failed when we should get it from the media directory' ); @@ -835,7 +835,7 @@ public function testScript() $this->assertEquals( JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true)), - JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js', + JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', 'Line:' . __LINE__ . ' JHtml::script failed in URL only mode when it should come from the media directory' ); @@ -850,14 +850,14 @@ public function testScript() ); $this->assertArrayNotHasKey( - '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js', + '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', JFactory::$document->_scripts, 'Line:' . __LINE__ . ' JHtml::script failed when we should get it from the media directory' ); $this->assertEquals( JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true)), - JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', + JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1.min.js', 'Line:' . __LINE__ . ' JHtml::script failed in URL only mode when it should come from the media directory' ); @@ -872,7 +872,7 @@ public function testScript() ); $this->assertArrayNotHasKey( - '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js', + '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', JFactory::$document->_scripts, 'Line:' . __LINE__ . ' JHtml::script failed when we should get it from the media directory' ); @@ -894,20 +894,20 @@ public function testScript() ); $this->assertArrayNotHasKey( - '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js', + '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', JFactory::$document->_scripts, 'Line:' . __LINE__ . ' JHtml::script failed when we should get it from the media directory' ); $this->assertEquals( JHtml::script($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true, 'detectDebug' => false)), - JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1.js', + JUri::base(true) . '/media/system/js/' . $element . '/' . $urlpath . 'script1.min.js', 'Line:' . __LINE__ . ' JHtml::script failed in URL only mode when it should come from the media directory' ); JFactory::$document->_scripts = array(); unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . $urlfilename); - unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1-uncompressed.js'); + unlink(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath . 'script1.js'); rmdir(JPATH_ROOT . '/media/system/js/' . $element . '/' . $urlpath); rmdir(JPATH_ROOT . '/media/system/js/' . $element); } @@ -923,7 +923,7 @@ public function testStylesheet() { // These are some paths to pass to JHtml for testing purposes. $urlpath = 'test' . uniqid() . '/'; - $urlfilename = 'style' . uniqid() . '.css'; + $urlfilename = 'style' . uniqid() . '.min.css'; // We generate a random template name so that we don't collide or hit anything. $template = 'mytemplate' . uniqid(); @@ -1026,7 +1026,7 @@ public function testStylesheet() $extension = 'testextension' . uniqid(); $element = 'element' . uniqid(); $urlpath = 'path' . uniqid() . '/'; - $urlfilename = 'style1.css'; + $urlfilename = 'style1.min.css'; mkdir(JPATH_ROOT . '/media/' . $extension . '/' . $element . '/css/' . $urlpath, 0777, true); file_put_contents(JPATH_ROOT . '/media/' . $extension . '/' . $element . '/css/' . $urlpath . $urlfilename, 'test'); @@ -1118,12 +1118,12 @@ public function testStylesheet() mkdir(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath, 0777, true); } file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . $urlfilename, 'test'); - file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.css', 'test'); - file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0.css', 'test'); - file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0_0.css', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.min.css', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0.min.css', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0_0.min.css', 'test'); JBrowser::getInstance()->setBrowser('mybrowser'); - JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true)); + JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'detectBrowser' => true, 'debug' => false)); $this->assertArrayHasKey( '/media/system/css/' . $element . '/' . $urlpath . $urlfilename, JFactory::$document->_styleSheets, @@ -1131,18 +1131,18 @@ public function testStylesheet() ); $this->assertArrayHasKey( - '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.css', + '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.min.css', JFactory::$document->_styleSheets, 'Line:' . __LINE__ . ' JHtml::stylesheet failed when we should get it from the media directory' ); $this->assertEquals( - JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true)), + JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true, 'detectBrowser' => true)), array( JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . $urlfilename, - JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.css', - JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0.css', - JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0_0.css' + JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.min.css', + JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0.min.css', + JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0_0.min.css' ), 'Line:' . __LINE__ . ' JHtml::stylesheet failed in URL only mode when it should come from the media directory' ); @@ -1155,22 +1155,22 @@ public function testStylesheet() JFactory::$document->_styleSheets = array(); unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . $urlfilename); - unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.css'); - unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0.css'); - unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0_0.css'); + unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser.min.css'); + unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0.min.css'); + unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1_mybrowser_0_0.min.css'); rmdir(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath); rmdir(JPATH_ROOT . '/media/system/css/' . $element); mkdir(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath, 0777, true); file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . $urlfilename, 'test'); - file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css', 'test'); + file_put_contents(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', 'test'); JFactory::getConfig()->set('debug', 1); JFactory::$document->_styleSheets = array(); JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true)); $this->assertArrayHasKey( - '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css', + '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', JFactory::$document->_styleSheets, 'Line:' . __LINE__ . ' JHtml::stylesheet failed when we should get it from the media directory' ); @@ -1183,7 +1183,7 @@ public function testStylesheet() $this->assertEquals( JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true)), - JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css', + JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', 'Line:' . __LINE__ . ' JHtml::stylesheet failed in URL only mode when it should come from the media directory' ); @@ -1198,14 +1198,14 @@ public function testStylesheet() ); $this->assertArrayNotHasKey( - '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css', + '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', JFactory::$document->_styleSheets, 'Line:' . __LINE__ . ' JHtml::stylesheet failed when we should get it from the media directory' ); $this->assertEquals( JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true)), - JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', + JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1.min.css', 'Line:' . __LINE__ . ' JHtml::stylesheet failed in URL only mode when it should come from the media directory' ); @@ -1220,7 +1220,7 @@ public function testStylesheet() ); $this->assertArrayNotHasKey( - '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css', + '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', JFactory::$document->_styleSheets, 'Line:' . __LINE__ . ' JHtml::stylesheet failed when we should get it from the media directory' ); @@ -1242,20 +1242,20 @@ public function testStylesheet() ); $this->assertArrayNotHasKey( - '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css', + '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', JFactory::$document->_styleSheets, 'Line:' . __LINE__ . ' JHtml::stylesheet failed when we should get it from the media directory' ); $this->assertEquals( JHtml::stylesheet($extension . '/' . $element . '/' . $urlpath . $urlfilename, array('relative' => true, 'pathOnly' => true, 'detectDebug' => false)), - JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1.css', + JUri::base(true) . '/media/system/css/' . $element . '/' . $urlpath . 'style1.min.css', 'Line:' . __LINE__ . ' JHtml::stylesheet failed in URL only mode when it should come from the media directory' ); JFactory::$document->_styleSheets = array(); unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . $urlfilename); - unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1-uncompressed.css'); + unlink(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath . 'style1.css'); rmdir(JPATH_ROOT . '/media/system/css/' . $element . '/' . $urlpath); rmdir(JPATH_ROOT . '/media/system/css/' . $element); @@ -1278,7 +1278,7 @@ public function testStylesheet() 'options' => array( 'relative' => true, 'pathOnly' => false, - 'detectBrowser' => true, + 'detectBrowser' => false, 'detectDebug' => true, ), ),