diff options
Diffstat (limited to 'tests/javascript')
-rw-r--r-- | tests/javascript/index.php | 356 | ||||
-rw-r--r-- | tests/javascript/piwik.php | 53 | ||||
-rw-r--r-- | tests/javascript/testrunner.js | 10 |
3 files changed, 354 insertions, 65 deletions
diff --git a/tests/javascript/index.php b/tests/javascript/index.php index 0e65c112a3..6d9a5e55ee 100644 --- a/tests/javascript/index.php +++ b/tests/javascript/index.php @@ -15,6 +15,9 @@ if(file_exists("stub.tpl")) { function getToken() { return "<?php $token = md5(uniqid(mt_rand(), true)); echo $token; ?>"; } +function getContentToken() { + return "<?php $token = md5(uniqid(mt_rand(), true)); echo $token; ?>"; +} <?php $sqlite = false; if (file_exists("enable_sqlite")) { @@ -73,6 +76,15 @@ function _e(id){ return document.all[id]; } +function _s(selector) { // select node within content test scope + $nodes = $('#contenttest ' + selector); + if ($nodes.length) { + return $nodes[0]; + } else { + ok(false, 'selector not found but should: #contenttest ' + selector); + } +} + function loadJash() { var jashDiv = _e('jashDiv'); @@ -80,6 +92,11 @@ function loadJash() { document.body.appendChild(document.createElement('script')).src='jash/Jash.js'; } + function scrollToTop() + { + window.scroll(0, 0); + } + function triggerEvent(element, type) { if ( document.createEvent ) { event = document.createEvent( "MouseEvents" ); @@ -91,7 +108,29 @@ function triggerEvent(element, type) { } } -function dropCookie(cookieName, path, domain) { + function wait(msecs) + { + var start = new Date().getTime(); + var cur = start + while(cur - start < msecs) + { + cur = new Date().getTime(); + } + } + + function fetchTrackedRequests(token) + { + var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : + window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : + null; + + xhr.open("GET", "piwik.php?requests=" + token, false); + xhr.send(null); + + return xhr.responseText; + } + + function dropCookie(cookieName, path, domain) { var expiryDate = new Date(); expiryDate.setTime(expiryDate.getTime() - 3600); @@ -170,6 +209,11 @@ function deleteCookies() { var contentTestHtml = {}; + function removeContentTrackingFixture() + { + $('#contenttest').remove(); + } + function setupContentTrackingFixture(name, targetNode) { var url = 'content-fixtures/' + name + '.html' @@ -184,7 +228,7 @@ function setupContentTrackingFixture(name, targetNode) { var newNode = $('<div id="contenttest">' + contentTestHtml[name] + '</div>'); - $('#contenttest').remove(); + removeContentTrackingFixture(); if (targetNode) { $(targetNode).prepend(newNode); @@ -673,10 +717,6 @@ function PiwikTest() { }); test("contentFindContentBlock", function() { - function _s(selector) { // select node within content test scope - $nodes = $('#contenttest ' + selector); - if ($nodes.length) return $nodes[0]; - } var tracker = Piwik.getTracker(); var content = tracker.getContent(); @@ -726,7 +766,11 @@ function PiwikTest() { test("contentFindContentNodes", function() { function ex(testNumber) { // select node within content test scope $nodes = $('#contenttest #ex' + testNumber); - if ($nodes.length) return $nodes[0]; + if ($nodes.length) { + return $nodes[0]; + } else { + ok(false, 'selector was not found but should be "#contenttest #ex' + selector + '"') + } } var tracker = Piwik.getTracker(); @@ -1030,21 +1074,13 @@ function PiwikTest() { var content = tracker.getContent(); var actual; - function _s(selector) { // select node within content test scope - $nodes = $('#contenttest ' + selector); - if ($nodes.length) { - return $nodes[0]; - } else { - ok(false, 'selector was not found but should be "#contenttest ' + selector + '"') - } - } function _ex(testnumber) { // select node within content test scope return _s('#ex' + testnumber); } function assertContentNodeVisible(node, message) { - window.scroll(0,0); // make sure content nodes are actually in view port + scrollToTop(); // make sure content nodes are actually in view port if (!message) { message = ''; @@ -1054,7 +1090,7 @@ function PiwikTest() { function assertContentNodeNotVisible(node, message) { - window.scroll(0,0); // make sure content nodes are actually in view port + scrollToTop(); // make sure content nodes are actually in view port if (!message) { message = ''; @@ -1064,7 +1100,7 @@ function PiwikTest() { function assertInternalNodeVisible(node, message) { - window.scroll(0,0); // make sure content nodes are actually in view port + scrollToTop(); // make sure content nodes are actually in view port if (!message) { message = ''; @@ -1074,7 +1110,7 @@ function PiwikTest() { function assertInternalNodeNotVisible(node, message) { - window.scroll(0,0); // make sure content nodes are actually in view port + scrollToTop(); // make sure content nodes are actually in view port if (!message) { message = ''; @@ -1084,7 +1120,7 @@ function PiwikTest() { function assertNodeNotInViewport(node, message) { - window.scroll(0,0); // make sure content nodes are actually in view port + scrollToTop(); // make sure content nodes are actually in view port if (!message) { message = ''; @@ -1094,7 +1130,7 @@ function PiwikTest() { function assertNodeIsInViewport(node, message) { - window.scroll(0,0); // make sure content nodes are actually in view port + scrollToTop(); // make sure content nodes are actually in view port if (!message) { message = ''; @@ -1178,10 +1214,6 @@ function PiwikTest() { }); test("contentFindContentValues", function() { - function _s(selector) { // make sure to select node within content test scope - $nodes = $('#contenttest ' + selector); - if ($nodes.length) return $nodes[0]; - } function _st(id) { return id && (''+id) === id ? _s('#' + id) : id; @@ -1323,15 +1355,6 @@ function PiwikTest() { var origin = location.origin; var originEncoded = window.encodeURIComponent(origin); - function _s(selector) { // make sure to select node within content test scope - $nodes = $('#contenttest ' + selector); - if ($nodes.length) { - return $nodes[0]; - } else { - ok(false, 'selector #contenttest ' + selector + ' is not found but should'); - } - } - function assertTrackingRequest(actual, expectedStartsWith, message) { if (!message) { @@ -1549,7 +1572,7 @@ function PiwikTest() { var impression2 = {name: 'name2', piece: 'piece2', target: 'http://www.example.com'}; var impression3 = {name: 'name3', piece: 'piece3', target: 'Anything'}; - actual = tracker.buildContentImpressionsRequests([impression, impression2, impression, impression3], [_s('#ex101')]); + actual = tracker.buildContentImpressionsRequests([impression, impression, impression2, impression, impression3], [_s('#ex101')]); strictEqual(actual.length, 3, 'buildContentImpressionsRequests, should be only 3 requests as one impression was there twice and should be ignored once'); assertTrackingRequest(actual[0], 'c_n=name&c_p=5&c_t=target'); assertTrackingRequest(actual[1], 'c_n=name2&c_p=piece2&c_t=http%3A%2F%2Fwww.example.com'); @@ -1587,16 +1610,23 @@ function PiwikTest() { propEqual(actual, [], 'getVisibleImpressions, no nodes set'); _s('#ex115').scrollIntoView(true); + tracker.clearTrackedContentImpressions(); actual = tracker.getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet([_s('#ex116_hidden')]); propEqual(actual, [], 'getVisibleImpressions, if all are hidden should not return anything'); _s('#ex115').scrollIntoView(true); + tracker.clearTrackedContentImpressions(); actual = tracker.getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet([_s('#ex115'),_s('#ex115'), _s('#ex116_hidden')]); strictEqual(actual.length, 1, 'getVisibleImpressions, should not ignore the found requests but the visible ones, should not add the same one twice'); assertTrackingRequest(actual[0], 'c_n=img115.jpg&c_p=img115.jpg&c_t=http%3A%2F%2Fwww.example.com'); - $('#contenttest').remove(); + _s('#ex115').scrollIntoView(true); + tracker.clearTrackedContentImpressions(); + actual = tracker.getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet([_s('#ex116_hidden'), _s('#ex116_hidden'), _s('#ex115'),_s('#ex115')]); + strictEqual(actual.length, 1, 'getVisibleImpressions, two hidden ones before a visible ones to make sure removing hidden content block from array works and does not ignore one'); + assertTrackingRequest(actual[0], 'c_n=img115.jpg&c_p=img115.jpg&c_t=http%3A%2F%2Fwww.example.com'); + removeContentTrackingFixture(); }); test("Basic requirements", function() { @@ -1622,7 +1652,7 @@ function PiwikTest() { }); test("API methods", function() { - expect(57); + expect(64); equal( typeof Piwik.addPlugin, 'function', 'addPlugin' ); equal( typeof Piwik.getTracker, 'function', 'getTracker' ); @@ -1684,6 +1714,14 @@ function PiwikTest() { equal( typeof tracker.trackGoal, 'function', 'trackGoal' ); equal( typeof tracker.trackLink, 'function', 'trackLink' ); equal( typeof tracker.trackPageView, 'function', 'trackPageView' ); + // content + equal( typeof tracker.enableTrackOnlyVisibleContent, 'function', 'enableTrackOnlyVisibleContent' ); + equal( typeof tracker.trackContentImpressions, 'function', 'trackContentImpressions' ); + equal( typeof tracker.trackVisibleContentImpressions, 'function', 'trackVisibleContentImpressions' ); + equal( typeof tracker.trackContentImpression, 'function', 'trackContentImpression' ); + equal( typeof tracker.trackContentImpressionsWithinNode, 'function', 'trackContentImpressionsWithinNode' ); + equal( typeof tracker.trackContentInteraction, 'function', 'trackContentInteraction' ); + equal( typeof tracker.trackContentInteractionNode, 'function', 'trackContentInteractionNode' ); // ecommerce equal( typeof tracker.setEcommerceView, 'function', 'setEcommerceView' ); equal( typeof tracker.addEcommerceItem, 'function', 'addEcommerceItem' ); @@ -2270,16 +2308,6 @@ if ($sqlite) { tracker.setTrackerUrl("piwik.php"); tracker.setSiteId(1); - function wait(msecs) - { - var start = new Date().getTime(); - var cur = start - while(cur - start < msecs) - { - cur = new Date().getTime(); - } - } - var visitorIdStart = tracker.getVisitorId(); // need to wait at least 1 second so that the cookie would be different, if it wasnt persisted wait(2000); @@ -2620,6 +2648,240 @@ if ($sqlite) { start(); }, 5000); }); + + test("trackingContent", function() { + expect(65); + + function assertTrackingRequest(actual, expectedStartsWith, message) + { + if (!message) { + message = ''; + } else { + message += ', '; + } + + expectedStartsWith = '<span>/tests/javascript/piwik.php?' + expectedStartsWith; + + strictEqual(actual.indexOf(expectedStartsWith), 0, message + actual + ' should start with ' + expectedStartsWith); + strictEqual(actual.indexOf('&idsite=1&rec=1'), expectedStartsWith.length); + } + + var token = getContentToken(); + + var tracker = Piwik.getTracker(); + tracker.setTrackerUrl("piwik.php"); + tracker.setSiteId(1); + tracker.setCustomData({ "token" : token }); + tracker.clearEnableTrackOnlyVisibleContent(); + tracker.clearTrackedContentImpressions(); + + var visitorIdStart = tracker.getVisitorId(); + // need to wait at least 1 second so that the cookie would be different, if it wasnt persisted + wait(2000); + + var actual, expected, trackerUrl; + + tracker.trackContentImpressions(); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'getTrackedContentImpressions, there is no content block to track'); + tracker.trackContentImpressionsWithinNode(_e('other')); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'getTrackedContentImpressionsWithinNode, there is no content block to track'); + tracker.trackContentInteractionNode(); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'trackContentInteractionNode, no node given should not track anything'); + + setupContentTrackingFixture('trackingContent', document.body); + + tracker.trackContentImpressions(); + strictEqual(tracker.getTrackedContentImpressions().length, 7, 'should mark 7 content blocks as tracked'); + + wait(500); + + var token2 = '2' + token; + tracker.clearTrackedContentImpressions(); + tracker.setCustomData('token', token2); + tracker.trackContentImpressionsWithinNode(_s('#block1')); + strictEqual(tracker.getTrackedContentImpressions().length, 3, 'should mark 3 content blocks as tracked'); + + tracker.clearTrackedContentImpressions(); + tracker.trackContentImpressionsWithinNode(_e('click1')); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'should not track anything as does not contain content block'); + + wait(500); + + var token3 = '3' + token; + tracker.clearTrackedContentImpressions(); + tracker.setCustomData('token', token3); + tracker.trackContentImpression(); // should not track anything as name is required + tracker.trackContentImpression('MyName'); // piece should default to Unknown + wait(500); + tracker.trackContentImpression('Any://Name', 'AnyPiece?', 'http://www.example.com'); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'manual impression call should not be marked as already tracked'); + + wait(500); + + var token4 = '4' + token; + tracker.setCustomData('token', token4); + tracker.trackContentInteraction(); // should not track anything as interaction and name is required + tracker.trackContentInteraction('Clicki'); // should not track anything as interaction and name is required + tracker.trackContentInteraction('Clicke', 'IntName'); // should use default for piece and ignore target as it is not set + wait(500); + tracker.trackContentInteraction('Clicki', 'IntN:/ame', 'IntPiece?', 'http://int.example.com'); + + wait(500); + + var token5 = '5' + token; + tracker.clearTrackedContentImpressions(); + tracker.setCustomData('token', token5); + tracker.trackContentInteractionNode(_s('#ex5'), 'Clicki?iii'); + + wait(500); + + var token6 = '6' + token; + tracker.clearTrackedContentImpressions(); + tracker.enableTrackOnlyVisibleContent(false, 0); + tracker.setCustomData('token', token6); + scrollToTop(); + tracker.trackContentImpressions(); + strictEqual(tracker.getTrackedContentImpressions().length, 3, 'should only track visible ones this time'); + + var token7 = '7' + token; + tracker.clearTrackedContentImpressions(); + tracker.enableTrackOnlyVisibleContent(); + tracker.setCustomData('token', token7); + scrollToTop(); + tracker.trackContentImpressionsWithinNode(); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'should not track anything, no node provided'); + tracker.trackContentImpressionsWithinNode(_s('#block1')); + strictEqual(tracker.getTrackedContentImpressions().length, 0, 'should not track any block since all not visible'); + tracker.trackContentImpressionsWithinNode(_s('#block2')); + strictEqual(tracker.getTrackedContentImpressions().length, 2, 'should track the two visible ones'); + + wait(500); + + var token8 = '8' + token; + tracker.clearTrackedContentImpressions(); + tracker.clearEnableTrackOnlyVisibleContent(); + tracker.setCustomData('token', token8); + scrollToTop(); + tracker.trackVisibleContentImpressions(false, 0); + strictEqual(tracker.getTrackedContentImpressions().length, 3, 'should only track all visible impressions'); + + + removeContentTrackingFixture(); + + stop(); + setTimeout(function() { + + // trackContentImpressions() + var results = fetchTrackedRequests(token); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "7", "count trackContentImpressions requests. all content blocks should be tracked" ); + + var requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + assertTrackingRequest(requests[0], 'c_n=img1-en.jpg&c_p=img1-en.jpg'); + assertTrackingRequest(requests[1], 'c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fapache.piwik%2Fanylink5'); + assertTrackingRequest(requests[2], 'c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fimg6.example.com'); + assertTrackingRequest(requests[3], 'c_n=My%20Ad%207&c_p=Unknown&c_t=http%3A%2F%2Fimg7.example.com'); + assertTrackingRequest(requests[4], 'c_n=img.jpg&c_p=img.jpg&c_t=http%3A%2F%2Fimg2.example.com'); + assertTrackingRequest(requests[5], 'c_n=img3-en.jpg&c_p=img3-en.jpg&c_t=http%3A%2F%2Fimg3.example.com'); + assertTrackingRequest(requests[6], 'c_n=My%20content%204&c_p=My%20content%204&c_t=http%3A%2F%2Fimg4.example.com'); + + + // trackContentImpressionsWithinNode() + results = fetchTrackedRequests(token2); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "3", "count trackContentImpressionsWithinNode requests. should track only content blocks within node" ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + assertTrackingRequest(requests[0], 'c_n=img.jpg&c_p=img.jpg&c_t=http%3A%2F%2Fimg2.example.com'); + + // trackContentImpression() + results = fetchTrackedRequests(token3); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "2", "count trackContentImpression requests. " ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + var firstRequest = 0; + var secondRequest = 1; + if (-1 === requests[0].indexOf('MyName')) { + firstRequest = 1; + secondRequest = 0; + } + + assertTrackingRequest(requests[firstRequest], 'c_n=MyName&c_p=Unknown'); + assertTrackingRequest(requests[secondRequest], 'c_n=Any%3A%2F%2FName&c_p=AnyPiece%3F&c_t=http%3A%2F%2Fwww.example.com'); + + + // trackContentInteraction() + results = fetchTrackedRequests(token4); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "2", "count trackContentInteraction requests." ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + firstRequest = 0; + secondRequest = 1; + if (-1 === requests[0].indexOf('IntName')) { + firstRequest = 1; + secondRequest = 0; + } + + assertTrackingRequest(requests[firstRequest], 'c_i=Clicke&c_n=IntName&c_p=Unknown'); + assertTrackingRequest(requests[secondRequest], 'c_i=Clicki&c_n=IntN%3A%2Fame&c_p=IntPiece%3F&c_t=http%3A%2F%2Fint.example.com'); + + + // trackContentInteractionNode() + results = fetchTrackedRequests(token5); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "1", "count trackContentInteractionNode requests." ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + assertTrackingRequest(requests[0], 'c_i=Clicki%3Fiii&c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fapache.piwik%2Fanylink5'); + + + // enableTrackOnlyVisibleContent() && trackContentImpressions() + results = fetchTrackedRequests(token6); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "3", "count enabledVisibleContentImpressions requests." ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + assertTrackingRequest(requests[0], 'c_n=img1-en.jpg&c_p=img1-en.jpg'); + assertTrackingRequest(requests[1], 'c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fapache.piwik%2Fanylink5'); + assertTrackingRequest(requests[2], 'c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fimg6.example.com'); + + + // enableTrackOnlyVisibleContent() && trackContentImpressionsWithinNode() + results = fetchTrackedRequests(token7); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "2", "count enabledVisibleContentImpressionsWithinNode requests." ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + assertTrackingRequest(requests[0], 'c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fapache.piwik%2Fanylink5'); + assertTrackingRequest(requests[1], 'c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fimg6.example.com'); + + + // trackVisibleContentImpressions() + results = fetchTrackedRequests(token8); + equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "3", "count enabledVisibleContentImpressions requests." ); + + requests = results.match(/<span\>(.*?)\<\/span\>/g); + requests.shift(); + + assertTrackingRequest(requests[0], 'c_n=img1-en.jpg&c_p=img1-en.jpg'); + assertTrackingRequest(requests[1], 'c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fapache.piwik%2Fanylink5'); + assertTrackingRequest(requests[2], 'c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fimg6.example.com'); + + start(); + }, 5000); + +// enableTrackOnlyVisibleContent (checkOnSroll, timeIntervalInMs) + }); + <?php } ?> diff --git a/tests/javascript/piwik.php b/tests/javascript/piwik.php index 856193e330..e38102545e 100644 --- a/tests/javascript/piwik.php +++ b/tests/javascript/piwik.php @@ -9,6 +9,11 @@ function sendWebBug() { print(base64_decode($trans_gif_64)); } +function isPost() +{ + return $_SERVER['REQUEST_METHOD'] == 'POST'; +} + if (!file_exists("enable_sqlite")) { sendWebBug(); exit; @@ -35,6 +40,22 @@ if (filesize(dirname(__FILE__).'/unittest.dbf') == 0) } } +function logRequest($sqlite, $uri, $data) { + $ip = $_SERVER['REMOTE_ADDR']; + $ts = $_SERVER['REQUEST_TIME']; + +// $uri = htmlspecialchars($uri); + + $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; + $ua = $_SERVER['HTTP_USER_AGENT']; + + $token = isset($data['token']) ? $data['token'] : ''; + + $query = $sqlite->exec("INSERT INTO requests (token, ip, ts, uri, referer, ua) VALUES (\"$token\", \"$ip\", \"$ts\", \"$uri\", \"$referrer\", \"$ua\")"); + + return $query; +} + if (isset($_GET['requests'])) { $token = get_magic_quotes_gpc() ? stripslashes($_GET['requests']) : $_GET['requests']; $ua = $_SERVER['HTTP_USER_AGENT']; @@ -56,25 +77,31 @@ if (isset($_GET['requests'])) { echo "</body></html>\n"; } else { + if (!isset($_REQUEST['data'])) { - header("HTTP/1.0 400 Bad Request"); + header("HTTP/1.0 400 Bad Request"); } else { - $ip = $_SERVER['REMOTE_ADDR']; - $ts = $_SERVER['REQUEST_TIME']; - $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; - if($_SERVER['REQUEST_METHOD'] == 'POST') { - $uri .= '?' . file_get_contents('php://input'); - } -// $uri = htmlspecialchars($uri); + $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; + + $input = file_get_contents("php://input"); + $requests = @json_decode($input, true); + $data = json_decode(get_magic_quotes_gpc() ? stripslashes($_REQUEST['data']) : $_REQUEST['data'], true); + + if (!empty($requests) && isPost()) { + $query = true; + foreach ($requests['requests'] as $request) { + $query = $query && logRequest($sqlite, $uri . $request, $data); + } + } else { - $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; - $ua = $_SERVER['HTTP_USER_AGENT']; + if (isPost()) { + $uri .= '?' . file_get_contents('php://input'); + } - $data = json_decode(get_magic_quotes_gpc() ? stripslashes($_REQUEST['data']) : $_REQUEST['data'], true); - $token = isset($data['token']) ? $data['token'] : ''; + $query = logRequest($sqlite, $uri, $data); + } - $query = $sqlite->exec("INSERT INTO requests (token, ip, ts, uri, referer, ua) VALUES (\"$token\", \"$ip\", \"$ts\", \"$uri\", \"$referrer\", \"$ua\")"); if (!$query) { header("HTTP/1.0 500 Internal Server Error"); } else { diff --git a/tests/javascript/testrunner.js b/tests/javascript/testrunner.js index 61ca183f97..5b333a8a29 100644 --- a/tests/javascript/testrunner.js +++ b/tests/javascript/testrunner.js @@ -22,10 +22,10 @@ // IN THE SOFTWARE var fs = require("fs"); -var url = 'http://localhost/tests/javascript'; +var url = 'http://localhost/tests/javascript/'; function printError(message) { - fs.write("/dev/stderr", message + "\n", "w"); + fs.write("/dev/stderr", message + "\n", "w"); } var page = require("webpage").create(); @@ -38,7 +38,7 @@ page.onResourceReceived = function() { page.evaluate(function() { if (!window.QUnit || window.phantomAttached) return; - QUnit.config.done.push(function(obj) { + QUnit.done(function(obj) { console.log("Tests passed: " + obj.passed); console.log("Tests failed: " + obj.failed); console.log("Total tests: " + obj.total); @@ -47,6 +47,8 @@ page.onResourceReceived = function() { window.phantomResults = obj; }); + window.phantomAttached = true; + QUnit.log(function(obj) { if (!obj.result) { var errorMessage = "Test failed in module " + obj.module + ": '" + obj.name + "' \nError: " + obj.message; @@ -64,8 +66,6 @@ page.onResourceReceived = function() { console.log(errorMessage); } }); - - window.phantomAttached = true; }); } |