addSite('Site name here <-->', $urls); $jsTag = $generator->generate($idSite, 'http://piwik-server/piwik', $mergeSubdomains = true, $groupPageTitlesByDomain = true, $mergeAliasUrls = true, $visitorCustomVariables = array(array("name", "value"), array("name 2", "value 2")), $pageCustomVariables = array(array("page cvar", "page cvar value")), $customCampaignNameQueryParam = "campaignKey", $customCampaignKeywordParam = "keywordKey", $doNotTrack = true, $disableCookies = false, $trackNoScript = true, $crossDomain = true); $expected = "<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push([\"setDocumentTitle\", document.domain + \"/\" + document.title]); _paq.push([\"setCookieDomain\", \"*.localhost\"]); _paq.push([\"setDomains\", [\"*.localhost/piwik\",\"*.another-domain/piwik\",\"*.another-domain/piwik\"]]); _paq.push([\"enableCrossDomainLinking\"]);" . ($this->hasCustomVariables() ? " // you can set up to 5 custom variables for each visitor _paq.push([\"setCustomVariable\", 1, \"name\", \"value\", \"visit\"]); _paq.push([\"setCustomVariable\", 2, \"name 2\", \"value 2\", \"visit\"]); // you can set up to 5 custom variables for each action (page view, download, click, site search) _paq.push([\"setCustomVariable\", 1, \"page cvar\", \"page cvar value\", \"page\"]);" : "") . " _paq.push([\"setCampaignNameKey\", \"campaignKey\"]); _paq.push([\"setCampaignKeywordKey\", \"keywordKey\"]); _paq.push([\"setDoNotTrack\", true]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//piwik-server/piwik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); 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+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <noscript><p><img src="//piwik-server/piwik/matomo.php?idsite=1&amp;rec=1" style="border:0;" alt="" /></p></noscript> <!-- End Matomo Code --> "; $this->assertEquals($expected, $jsTag); } public function testJavascriptTrackingCode_noScriptTrackingDisabled_defaultTrackingCode() { $generator = new TrackerCodeGenerator(); $jsTag = $generator->generate($idSite = 1, $piwikUrl = 'http://localhost/piwik'); $expected = "<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//localhost/piwik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); 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+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> "; $this->assertEquals($expected, $jsTag); } /** * Tests the generated JS code with protocol override */ public function testJavascriptTrackingCode_withAllOptionsAndProtocolOverwrite() { $generator = new TrackerCodeGenerator(); Piwik::addAction('Tracker.getJavascriptCode', function (&$codeImpl) { $codeImpl['protocol'] = 'https://'; }); $jsTag = $generator->generate($idSite = 1, $piwikUrl = 'http://localhost/piwik', $mergeSubdomains = true, $groupPageTitlesByDomain = true, $mergeAliasUrls = true, $visitorCustomVariables = array(array("name", "value"), array("name 2", "value 2")), $pageCustomVariables = array(array("page cvar", "page cvar value")), $customCampaignNameQueryParam = "campaignKey", $customCampaignKeywordParam = "keywordKey", $doNotTrack = true); $expected = "<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push([\"setDocumentTitle\", document.domain + \"/\" + document.title]);" . ($this->hasCustomVariables() ? " // you can set up to 5 custom variables for each visitor _paq.push([\"setCustomVariable\", 1, \"name\", \"value\", \"visit\"]); _paq.push([\"setCustomVariable\", 2, \"name 2\", \"value 2\", \"visit\"]); // you can set up to 5 custom variables for each action (page view, download, click, site search) _paq.push([\"setCustomVariable\", 1, \"page cvar\", \"page cvar value\", \"page\"]);" : "") . " _paq.push([\"setCampaignNameKey\", \"campaignKey\"]); _paq.push([\"setCampaignKeywordKey\", \"keywordKey\"]); _paq.push([\"setDoNotTrack\", true]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://localhost/piwik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); 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+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> "; $this->assertEquals($expected, $jsTag); } /** * Tests the generated JS code with options before tracker url */ public function testJavascriptTrackingCode_withAllOptionsAndOptionsBeforeTrackerUrl() { $generator = new TrackerCodeGenerator(); Piwik::addAction('Tracker.getJavascriptCode', function (&$codeImpl) { $codeImpl['optionsBeforeTrackerUrl'] .= "_paq.push(['setAPIUrl', 'http://localhost/statistics']);\n "; }); $jsTag = $generator->generate($idSite = 1, $piwikUrl = 'http://localhost/piwik', $mergeSubdomains = true, $groupPageTitlesByDomain = true, $mergeAliasUrls = true, $visitorCustomVariables = array(array("name", "value"), array("name 2", "value 2")), $pageCustomVariables = array(array("page cvar", "page cvar value")), $customCampaignNameQueryParam = "campaignKey", $customCampaignKeywordParam = "keywordKey", $doNotTrack = true); $expected = "<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push([\"setDocumentTitle\", document.domain + \"/\" + document.title]);" . ($this->hasCustomVariables() ? " // you can set up to 5 custom variables for each visitor _paq.push([\"setCustomVariable\", 1, \"name\", \"value\", \"visit\"]); _paq.push([\"setCustomVariable\", 2, \"name 2\", \"value 2\", \"visit\"]); // you can set up to 5 custom variables for each action (page view, download, click, site search) _paq.push([\"setCustomVariable\", 1, \"page cvar\", \"page cvar value\", \"page\"]);" : "") . " _paq.push([\"setCampaignNameKey\", \"campaignKey\"]); _paq.push([\"setCampaignKeywordKey\", \"keywordKey\"]); _paq.push([\"setDoNotTrack\", true]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//localhost/piwik/"; _paq.push(['setAPIUrl', 'http://localhost/statistics']); _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); 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+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> "; $this->assertEquals($expected, $jsTag); } /** * Tests the generated JS code with options before tracker url */ public function testJavascriptTrackingCode_loadSync() { $generator = new TrackerCodeGenerator(); Piwik::addAction('Tracker.getJavascriptCode', function (&$codeImpl) { $codeImpl['loadAsync'] = false; }); $jsTag = $generator->generate($idSite = 1, $piwikUrl = 'http://localhost/piwik', $mergeSubdomains = true, $groupPageTitlesByDomain = true, $mergeAliasUrls = true); $expected = "<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push([\"setDocumentTitle\", document.domain + \"/\" + document.title]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//localhost/piwik/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); })(); </script> <script type='text/javascript' src="//localhost/piwik/matomo.js"></script> <!-- End Matomo Code --> "; $this->assertEquals($expected, $jsTag); } public function testStringsAreEscaped() { $generator = new TrackerCodeGenerator(); $jsTag = $generator->generate( $idSite = 1, $piwikUrl = 'abc"def', $mergeSubdomains = true, $groupPageTitlesByDomain = true, $mergeAliasUrls = true, $visitorCustomVariables = array(array('abc"def', 'abc"def')), $pageCustomVariables = array(array('abc"def', 'abc"def')), $customCampaignNameQueryParam = 'abc"def', $customCampaignKeywordParam = 'abc"def' ); $expected = '<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDocumentTitle", document.domain + "/" + document.title]);' . ($this->hasCustomVariables() ? ' // you can set up to 5 custom variables for each visitor _paq.push(["setCustomVariable", 1, "abc\"def", "abc\"def", "visit"]); // you can set up to 5 custom variables for each action (page view, download, click, site search) _paq.push(["setCustomVariable", 1, "abc\"def", "abc\"def", "page"]);' : '') . ' _paq.push(["setCampaignNameKey", "abc\"def"]); _paq.push(["setCampaignKeywordKey", "abc\"def"]); _paq.push([\'trackPageView\']); _paq.push([\'enableLinkTracking\']); (function() { var u="//abc"def/"; _paq.push([\'setTrackerUrl\', u+\'matomo.php\']); _paq.push([\'setSiteId\', \'1\']); 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+\'matomo.js\'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> '; $this->assertEquals($expected, $jsTag); } public function testJavascriptTrackingCode_withForceSsl() { Config::getInstance()->General['force_ssl'] = 1; $generator = new TrackerCodeGenerator(); $jsTag = $generator->generate($idSite = 1, $piwikUrl = 'http://localhost/piwik'); $expected = '<!-- Matomo --> <script type="text/javascript"> var _paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push([\'trackPageView\']); _paq.push([\'enableLinkTracking\']); (function() { var u="https://localhost/piwik/"; _paq.push([\'setTrackerUrl\', u+\'matomo.php\']); _paq.push([\'setSiteId\', \'1\']); 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+\'matomo.js\'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> '; $this->assertEquals($expected, $jsTag); } private function hasCustomVariables() { return Manager::getInstance()->isPluginActivated('CustomVariables'); } }