From 3af2c0b447de7244c188b953a0c3918e98e3690d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Oli=C5=A1ar?= Date: Thu, 28 Apr 2016 16:47:46 +0200 Subject: [PATCH] Add async and defer --- WebLoader/Compiler.php | 42 +++++++++++++++++++++++++ WebLoader/Nette/Extension.php | 8 ++++- WebLoader/Nette/JavaScriptLoader.php | 5 ++- tests/Nette/ExtensionTest.php | 36 +++++++++++++++++++++ tests/fixtures/extensionAsyncFalse.neon | 3 ++ tests/fixtures/extensionAsyncTrue.neon | 3 ++ tests/fixtures/extensionDeferFalse.neon | 3 ++ tests/fixtures/extensionDeferTrue.neon | 3 ++ 8 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/extensionAsyncFalse.neon create mode 100644 tests/fixtures/extensionAsyncTrue.neon create mode 100644 tests/fixtures/extensionDeferFalse.neon create mode 100644 tests/fixtures/extensionDeferTrue.neon diff --git a/WebLoader/Compiler.php b/WebLoader/Compiler.php index 370995e..f06286e 100644 --- a/WebLoader/Compiler.php +++ b/WebLoader/Compiler.php @@ -34,6 +34,12 @@ class Compiler /** @var bool */ private $debugging = FALSE; + /** @var bool */ + private $async = FALSE; + + /** @var bool */ + private $defer = FALSE; + public function __construct(IFileCollection $files, IOutputNamingConvention $convention, $outputDir) { $this->collection = $files; @@ -117,6 +123,42 @@ public function setJoinFiles($joinFiles) $this->joinFiles = (bool) $joinFiles; } + /** + * @return boolean + */ + public function isAsync() + { + return $this->async; + } + + /** + * @param boolean $async + * @return Compiler + */ + public function setAsync($async) + { + $this->async = (bool) $async; + return $this; + } + + /** + * @return boolean + */ + public function isDefer() + { + return $this->defer; + } + + /** + * @param boolean $defer + * @return Compiler + */ + public function setDefer($defer) + { + $this->defer = $defer; + return $this; + } + /** * Set check last modified * @param bool $checkLastModified diff --git a/WebLoader/Nette/Extension.php b/WebLoader/Nette/Extension.php index 4e5013e..1db2e1c 100644 --- a/WebLoader/Nette/Extension.php +++ b/WebLoader/Nette/Extension.php @@ -37,6 +37,8 @@ public function getDefaultConfig() 'filters' => array(), 'fileFilters' => array(), 'joinFiles' => TRUE, + 'async' => FALSE, + 'defer' => FALSE, 'namingConvention' => '@' . $this->prefix('jsNamingConvention'), ), 'cssDefaults' => array( @@ -51,6 +53,8 @@ public function getDefaultConfig() 'filters' => array(), 'fileFilters' => array(), 'joinFiles' => TRUE, + 'async' => FALSE, + 'defer' => FALSE, 'namingConvention' => '@' . $this->prefix('cssNamingConvention'), ), 'js' => array( @@ -126,7 +130,9 @@ private function addWebLoader(ContainerBuilder $builder, $name, $config) $config['tempDir'], )); - $compiler->addSetup('setJoinFiles', array($config['joinFiles'])); + $compiler->addSetup('setJoinFiles', array($config['joinFiles'])) + ->addSetup('setAsync', array($config['async'])) + ->addSetup('setDefer', array($config['defer'])); if ($builder->parameters['webloader']['debugger']) { $compiler->addSetup('@' . $this->prefix('tracyPanel') . '::addLoader', array( diff --git a/WebLoader/Nette/JavaScriptLoader.php b/WebLoader/Nette/JavaScriptLoader.php index 1b138b2..a2e0f11 100644 --- a/WebLoader/Nette/JavaScriptLoader.php +++ b/WebLoader/Nette/JavaScriptLoader.php @@ -20,7 +20,10 @@ class JavaScriptLoader extends WebLoader */ public function getElement($source) { - return Html::el("script")->type("text/javascript")->src($source); + $el = Html::el("script"); + $this->getCompiler()->isAsync() ? $el = $el->addAttributes(['async' => TRUE]) : NULL; + $this->getCompiler()->isDefer() ? $el = $el->addAttributes(['defer' => TRUE]) : NULL; + return $el->type("text/javascript")->src($source); } } \ No newline at end of file diff --git a/tests/Nette/ExtensionTest.php b/tests/Nette/ExtensionTest.php index 2260335..3149148 100644 --- a/tests/Nette/ExtensionTest.php +++ b/tests/Nette/ExtensionTest.php @@ -77,6 +77,42 @@ public function testJoinFilesOffInOneService() $this->assertFalse($this->container->getService('webloader.cssJoinOffCompiler')->getJoinFiles()); } + public function testAsyncOn() + { + $this->prepareContainer(array( + __DIR__ . '/../fixtures/extension.neon', + __DIR__ . '/../fixtures/extensionAsyncTrue.neon', + )); + $this->assertTrue($this->container->getService('webloader.jsDefaultCompiler')->isAsync()); + } + + public function testAsyncOff() + { + $this->prepareContainer(array( + __DIR__ . '/../fixtures/extension.neon', + __DIR__ . '/../fixtures/extensionAsyncFalse.neon', + )); + $this->assertFalse($this->container->getService('webloader.jsDefaultCompiler')->isAsync()); + } + + public function testDeferOn() + { + $this->prepareContainer(array( + __DIR__ . '/../fixtures/extension.neon', + __DIR__ . '/../fixtures/extensionDeferTrue.neon', + )); + $this->assertTrue($this->container->getService('webloader.jsDefaultCompiler')->isDefer()); + } + + public function testDeferOff() + { + $this->prepareContainer(array( + __DIR__ . '/../fixtures/extension.neon', + __DIR__ . '/../fixtures/extensionDeferFalse.neon', + )); + $this->assertFalse($this->container->getService('webloader.jsDefaultCompiler')->isDefer()); + } + public function testExtensionName() { $tempDir = __DIR__ . '/../temp'; diff --git a/tests/fixtures/extensionAsyncFalse.neon b/tests/fixtures/extensionAsyncFalse.neon new file mode 100644 index 0000000..6e3ba08 --- /dev/null +++ b/tests/fixtures/extensionAsyncFalse.neon @@ -0,0 +1,3 @@ +webloader: + jsDefaults: + async: false \ No newline at end of file diff --git a/tests/fixtures/extensionAsyncTrue.neon b/tests/fixtures/extensionAsyncTrue.neon new file mode 100644 index 0000000..68adbbd --- /dev/null +++ b/tests/fixtures/extensionAsyncTrue.neon @@ -0,0 +1,3 @@ +webloader: + jsDefaults: + async: true \ No newline at end of file diff --git a/tests/fixtures/extensionDeferFalse.neon b/tests/fixtures/extensionDeferFalse.neon new file mode 100644 index 0000000..7a55e03 --- /dev/null +++ b/tests/fixtures/extensionDeferFalse.neon @@ -0,0 +1,3 @@ +webloader: + jsDefaults: + defer: false \ No newline at end of file diff --git a/tests/fixtures/extensionDeferTrue.neon b/tests/fixtures/extensionDeferTrue.neon new file mode 100644 index 0000000..7be6fe6 --- /dev/null +++ b/tests/fixtures/extensionDeferTrue.neon @@ -0,0 +1,3 @@ +webloader: + jsDefaults: + defer: true \ No newline at end of file