postDataToURL using ajax instead of DOM
Thomas Aylott committed
Nov 8, 2013 at 16:33 UTC
e3ced21c9d5d099cf0fc71ae5b5d7b2c496a0033
3 files changed
+38
-79
grunt/config/server.js
+3
-18
@@ -1,25 +1,12 @@
1
-var pxlgif = Buffer('R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==', 'base64');
2
-
1
module.exports = function(grunt){
4
-
5
- function printMiddleware(req, res, next) {
6
- if (req._parsedUrl.pathname != '/print') return next();
7
- if (req.query.message.indexOf('ok') === 0){
8
- grunt.log.ok(req.query.message);
9
- } else if (req.query.message.indexOf('not ok') === 0){
10
- grunt.log.error(req.query.message);
11
- } else {
12
- grunt[req.query.type || 'log'].writeln('[%s][%s]', req.headers['user-agent'], Date.now(), req.query.message);
13
- }
14
- res.end(pxlgif);
15
- }
2
+
3
function testResultLoggerMiddleware(req, res, next) {
4
if (!(req.body && req.body.data)) return next();
5
grunt.log.writeln('[%s][%s]', req.headers['user-agent'], Date.now(), req.body.data);
6
res.write('<!doctype html><meta charset=utf-8>');
7
res.end('Got it, thanks!');
8
}
22
-
9
+
10
return {
11
server: {
12
options: {
@@ -27,13 +14,11 @@ module.exports = function(grunt){
14
hostname: '*',
15
port: 9999,
16
middleware: function(connect, options) {
17
+
18
connect.logger.token('user-agent', function(req, res){ return req.headers['user-agent']; });
19
connect.logger.token('timestamp', function(req, res){ return Date.now(); });
20
21
return [
34
- connect.query(),
35
- printMiddleware,
36
-
22
connect.logger({format:'[:user-agent][:timestamp] :method :url', stream:grunt.verbose}),
23
connect.bodyParser(),
24
testResultLoggerMiddleware,
grunt/tasks/webdriver-jasmine.js
+1
-1
@@ -66,7 +66,7 @@ function getJSReport(browser){
66
throw Error("The test page didn't load properly. " + error);
67
})
68
.waitForCondition("typeof window.jasmine.getJSReport != 'undefined'", 10e3)
69
- .waitForCondition("window.testImageURL.running <= 0", 5e3)
69
+ .waitForCondition("window.postDataToURL.running <= 0", 30e3)
70
.eval("jasmine.getJSReport()")
71
;
72
}
test/lib/reportTestResults.browser.js
+34
-60
@@ -1,31 +1,16 @@
1
-console._error = console.error;
2
-console._warn = console.warn;
3
-console._log = console.log;
4
-
5
-console.log = window.print = function(message){
6
- console._log(message);
7
- testImageURL('/print?type=log&message=' + encodeURIComponent(message) + '&_=' + Date.now().toString(36));
8
-};
9
-
10
-console.error = function(message){
11
- console._error(message);
12
- testImageURL('/print?type=error&message=' + encodeURIComponent(message) + '&_=' + Date.now().toString(36));
13
-};
14
-
15
-console.warn = function(message){
16
- console._warn(message);
17
- testImageURL('/print?type=warn&message=' + encodeURIComponent(message) + '&_=' + Date.now().toString(36));
18
-};
19
-
1
;(function(env){
21
-
2
env.addReporter(new jasmine.JSReporter());
23
- env.addReporter(new TAPReporter(window.print));
3
4
function report(){
26
- if (typeof jasmine.getJSReport != 'function') return setTimeout(report, 100);
27
- postDataToURL(JSON.stringify(jasmine.getJSReport()), '/reportTestResults', function(error, event){
5
+ console.log('report');
6
+ if (typeof jasmine.getJSReport != 'function') {
7
+ console.log("typeof jasmine.getJSReport != 'function'");
8
+ return setTimeout(report, 100);
9
+ }
10
+ postDataToURL(jasmine.getJSReport(), '/reportTestResults', function(error, event){
11
+ console.log(error, event);
12
if (error) return console.error(error);
13
+ console.log(event);
14
});
15
}
16
@@ -35,42 +20,31 @@ console.warn = function(message){
20
report();
21
};
22
38
- function postDataToURL(data, url, callback){
39
- var id = '$' + (+new Date()).toString(36);
40
-
41
- var postReportingTarget = document.createElement('iframe');
42
- postReportingTarget.id = postReportingTarget.name = 'postReportingTarget' + id;
43
-
44
- var postReportingForm = document.createElement('form');
45
- postReportingForm.method = 'POST';
46
- postReportingForm.action = url;
47
- postReportingForm.target = postReportingTarget.name;
48
-
49
- var postReportingData = document.createElement('input');
50
- postReportingData.type = 'hidden';
51
- postReportingData.name = 'data';
52
- postReportingData.value = data || '{"error":"unknown error in postReportingData"}';
53
-
54
- postReportingForm.appendChild(postReportingData);
55
- postReportingForm.appendChild(postReportingTarget);
56
- postReportingForm.style.cssText = "visibility:hidden; position:absolute; bottom:100%; right:100%";
57
-
58
- function done(error, event){
59
- postReportingForm.parentNode.removeChild(postReportingForm);
60
- callback(error, event);
61
- }
62
-
63
- postReportingTarget.onerror = function(error){
64
- done(error);
65
- }
66
- postReportingTarget.onload = function(event){
67
- done(null, event);
68
- }
69
- document.body.appendChild(postReportingForm);
70
- setTimeout(function(){
71
- postReportingForm.submit();
72
- },0);
73
- }
74
-
23
}(window.jasmine.getEnv()));
24
25
+function createXMLHttpRequest(){
26
+ try{return new XMLHttpRequest();}
27
+ catch(e){}
28
+ try {return new ActiveXObject("Msxml2.XMLHTTP");}
29
+ catch (e) {}
30
+ try {return new ActiveXObject("Microsoft.XMLHTTP");}
31
+ catch (e) {}
32
+}
33
+function postDataToURL(data, url, callback) {
34
+ if (!callback) callback = postDataToURL.defaultCallback;
35
+ var request = createXMLHttpRequest();
36
+ if (!request) return callback(Error('XMLHttpRequest is unsupported'));
37
+ postDataToURL.running = (postDataToURL.running||0) + 1;
38
+ request.onreadystatechange = function(){
39
+ if (request.readyState != 4) return;
40
+ request.onreadystatechange = null;
41
+ postDataToURL.running = (postDataToURL.running||0) - 1;
42
+ callback(request.status == 200 ? null : request.status, request.responseText);
43
+ };
44
+ request.open('POST', url);
45
+ request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
46
+ request.send('data=' + encodeURIComponent(JSON.stringify(data)));
47
+}
48
+postDataToURL.defaultCallback = function(error){
49
+ // console.log('postDataToURL.defaultCallback', arguments)
50
+}