diff --git a/core/Tracker/TrackerCodeGenerator.php b/core/Tracker/TrackerCodeGenerator.php index ae1ef6d2e811c09f5919660da039df6ad0d3c23e..ffeea91b6a85ce2ff021333d102f04d445562c92 100644 --- a/core/Tracker/TrackerCodeGenerator.php +++ b/core/Tracker/TrackerCodeGenerator.php @@ -12,6 +12,7 @@ use Piwik\Common; use Piwik\Piwik; use Piwik\Plugins\CustomVariables\CustomVariables; use Piwik\Plugins\SitesManager\API as APISitesManager; +use Piwik\View; /** * Generates the Javascript code to be inserted on every page of the website to track. @@ -46,8 +47,7 @@ class TrackerCodeGenerator $disableCookies = false ) { // changes made to this code should be mirrored in plugins/CoreAdminHome/javascripts/jsTrackingGenerator.js var generateJsCode - $jsCode = file_get_contents(PIWIK_INCLUDE_PATH . "/plugins/Morpheus/templates/javascriptCode.tpl"); - $jsCode = htmlentities($jsCode); + if (substr($piwikUrl, 0, 4) !== 'http') { $piwikUrl = 'http://' . $piwikUrl; } @@ -150,12 +150,6 @@ class TrackerCodeGenerator */ Piwik::postEvent('Piwik.getJavascriptCode', array(&$codeImpl, $parameters)); - if (!empty($codeImpl['loadAsync'])) { - $codeImpl['loadAsync'] = 'true'; - } else { - $codeImpl['loadAsync'] = 'false'; - } - $setTrackerUrl = 'var u="' . $codeImpl['protocol'] . '{$piwikUrl}/";'; if (!empty($codeImpl['httpsPiwikUrl'])) { @@ -164,6 +158,12 @@ class TrackerCodeGenerator } $codeImpl = array('setTrackerUrl' => htmlentities($setTrackerUrl)) + $codeImpl; + $view = new View('@Morpheus/javascriptCode'); + $view->disableCacheBuster(); + $view->loadAsync = $codeImpl['loadAsync']; + $jsCode = $view->render(); + $jsCode = htmlentities($jsCode); + foreach ($codeImpl as $keyToReplace => $replaceWith) { $jsCode = str_replace('{$' . $keyToReplace . '}', $replaceWith, $jsCode); } diff --git a/core/View.php b/core/View.php index 0a2cbabb67a9bea507b7ca6a6dc33068227f0ef9..0c9b379a6741d8b0df095ddef48d9a25794057df 100644 --- a/core/View.php +++ b/core/View.php @@ -116,6 +116,7 @@ class View implements ViewInterface protected $templateVars = array(); private $contentType = 'text/html; charset=utf-8'; private $xFrameOptions = null; + private $enableCacheBuster = true; /** * Constructor. @@ -145,6 +146,14 @@ class View implements ViewInterface } } + /** + * Disables the cache buster (adding of ?cb=...) to JavaScript and stylesheet files + */ + public function disableCacheBuster() + { + $this->enableCacheBuster = false; + } + /** * Returns the template filename. * @@ -237,9 +246,8 @@ class View implements ViewInterface } else { $cacheBuster = UIAssetCacheBuster::getInstance()->piwikVersionBasedCacheBuster(); } - $this->cacheBuster = $cacheBuster; - + $this->loginModule = Piwik::getLoginPluginName(); $user = APIUsersManager::getInstance()->getUser($this->userLogin); @@ -260,6 +268,16 @@ class View implements ViewInterface return $this->renderTwigTemplate(); } + /** + * @internal + * @ignore + * @return Twig_Environment + */ + public function getTwig() + { + return $this->twig; + } + protected function renderTwigTemplate() { try { @@ -272,7 +290,9 @@ class View implements ViewInterface throw $ex; } - $output = $this->applyFilter_cacheBuster($output); + if ($this->enableCacheBuster) { + $output = $this->applyFilter_cacheBuster($output); + } $helper = new Theme; $output = $helper->rewriteAssetsPathToTheme($output); diff --git a/plugins/Morpheus/templates/javascriptCode.tpl b/plugins/Morpheus/templates/javascriptCode.twig similarity index 58% rename from plugins/Morpheus/templates/javascriptCode.tpl rename to plugins/Morpheus/templates/javascriptCode.twig index 1a9ea321c18c246992e9c1c37f90e1508bc9a176..c18d850d345d988bf24a3e1731965e873f5dfeff 100644 --- a/plugins/Morpheus/templates/javascriptCode.tpl +++ b/plugins/Morpheus/templates/javascriptCode.twig @@ -7,9 +7,12 @@ {$setTrackerUrl} {$optionsBeforeTrackerUrl}_paq.push(['setTrackerUrl', u+'piwik.php']); _paq.push(['setSiteId', '{$idSite}']); - var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; - g.type='text/javascript'; g.async={$loadAsync}; g.defer={$loadAsync}; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); + {% if loadAsync %}var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);{% endif %} + })(); </script> +{% if not loadAsync %}<script type='text/javascript' src="{$protocol}{$piwikUrl}/piwik.js"> +{% endif %} <noscript><p><img src="{$protocol}{$piwikUrl}/piwik.php?idsite={$idSite}" style="border:0;" alt="" /></p></noscript> <!-- End Piwik Code --> diff --git a/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php b/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php index 06f4bb5916b2e92458113c5e85536608487917be..c8bce62d517200830163f3a45c93b07a22157315 100644 --- a/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php +++ b/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php @@ -152,6 +152,41 @@ class TrackerCodeGeneratorTest extends IntegrationTestCase $this->assertEquals($expected, $jsTag); } + /** + * Tests the generated JS code with options before tracker url + */ + public function testJavascriptTrackingCode_loadSync() + { + $generator = new TrackerCodeGenerator(); + + Piwik::addAction('Piwik.getJavascriptCode', function (&$codeImpl) { + $codeImpl['loadAsync'] = false; + }); + + $jsTag = $generator->generate($idSite = 1, $piwikUrl = 'http://localhost/piwik', + $mergeSubdomains = true, $groupPageTitlesByDomain = true, $mergeAliasUrls = true); + + $expected = "<!-- Piwik --> +<script type="text/javascript"> + var _paq = _paq || []; + _paq.push([\"setDocumentTitle\", document.domain + \"/\" + document.title]); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + (function() { + var u="//localhost/piwik/"; + _paq.push(['setTrackerUrl', u+'piwik.php']); + _paq.push(['setSiteId', '1']); + + })(); +</script> +<script type='text/javascript' src="//localhost/piwik/piwik.js"> +<noscript><p><img src="//localhost/piwik/piwik.php?idsite=1" style="border:0;" alt="" /></p></noscript> +<!-- End Piwik Code --> +"; + + $this->assertEquals($expected, $jsTag); + } + public function testStringsAreEscaped() { $generator = new TrackerCodeGenerator();