aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Lal <james@lightsofapollo.com>2013-01-09 05:30:41 -0800
committerJames Lal <james@lightsofapollo.com>2013-01-09 05:30:41 -0800
commit75c6e99f3d3ff16cc6f5dc26b7bf1dbbb4b3f648 (patch)
treebf3539c61581137225f2e848f289271bd7fbb1a7
parent3f8833038d337d2840dc7ca06ddcb8c26a21bd14 (diff)
parentff00ab9fcaf0f791b1873ca1cd4d80e8a6dd6cda (diff)
downloadjsCalDAV-75c6e99f3d3ff16cc6f5dc26b7bf1dbbb4b3f648.tar.gz
Merge pull request #9 from mozilla-b2g/memory-improvements
Memory improvements
-rw-r--r--caldav.js56
-rw-r--r--lib/caldav/request/abstract.js3
-rw-r--r--lib/caldav/request/errors.js8
-rw-r--r--lib/caldav/xhr.js41
-rw-r--r--test/caldav/request/abstract_test.js4
-rw-r--r--test/caldav/xhr_test.js164
-rw-r--r--test/helper.js1
7 files changed, 105 insertions, 172 deletions
diff --git a/caldav.js b/caldav.js
index 32cfb34..7f3d367 100644
--- a/caldav.js
+++ b/caldav.js
@@ -2040,15 +2040,6 @@ function write (chunk) {
},
/**
- * Aborts request if its in progress.
- */
- abort: function abort() {
- if (this.xhr) {
- this.xhr.abort();
- }
- },
-
- /**
* @param {String} user basic auth user.
* @param {String} password basic auth pass.
* @return {String} basic auth token.
@@ -2077,9 +2068,6 @@ function write (chunk) {
} else {
xhr = new this.xhrClass();
}
-
- this.xhr = xhr;
-
// This hack is in place due to some platform
// bug in gecko when using mozSystem xhr
// the credentials only seem to work as expected
@@ -2094,6 +2082,12 @@ function write (chunk) {
));
}
+ var useMozChunkedText = false;
+ if (this.globalXhrOptions && this.globalXhrOptions.useMozChunkedText) {
+ useMozChunkedText = true;
+ xhr.responseType = 'moz-chunked-text';
+ }
+
for (header in this.headers) {
if (Object.hasOwnProperty.call(this.headers, header)) {
xhr.setRequestHeader(header, this.headers[header]);
@@ -2107,13 +2101,20 @@ function write (chunk) {
if ('onprogress' in xhr) {
hasProgressEvents = true;
var last = 0;
- xhr.onprogress = function onProgress(event) {
- var chunk = xhr.responseText.substr(last, event.loaded);
- last = event.loaded;
- if (this.ondata) {
- this.ondata(chunk);
- }
- }.bind(this);
+
+ if (useMozChunkedText) {
+ xhr.onprogress = function onChunkedProgress(event) {
+ this.ondata(xhr.responseText);
+ }.bind(this);
+ } else {
+ xhr.onprogress = function onProgress(event) {
+ var chunk = xhr.responseText.substr(last, event.loaded);
+ last = event.loaded;
+ if (this.ondata) {
+ this.ondata(chunk);
+ }
+ }.bind(this);
+ }
}
xhr.onreadystatechange = function onReadyStateChange() {
@@ -2136,6 +2137,8 @@ function write (chunk) {
this.waiting = true;
xhr.send(this._seralize());
+
+ return xhr;
}
};
@@ -2602,26 +2605,26 @@ function write (chunk) {
default:
message = this.code;
}
-
Error.call(this, message);
}
+
CaldavHttpError.prototype = {
__proto__: Error.prototype,
constructor: CaldavHttpError
}
-
+
// Unauthenticated error for
// Google Calendar
function UnauthenticatedError() {
var message = "Wrong username or/and password";
Error.call(this, message);
}
-
+
UnauthenticatedError.prototype = {
__proto__: Error.prototype,
constructor: UnauthenticatedError
}
-
+
module.exports = {
CaldavHttpError: CaldavHttpError,
UnauthenticatedError: UnauthenticatedError
@@ -2700,8 +2703,7 @@ function write (chunk) {
};
// in the future we may stream data somehow
- req.send(function xhrResult() {
- var xhr = req.xhr;
+ req.send(function xhrResult(err, xhr) {
if (xhr.status > 199 && xhr.status < 300) {
// success
self.sax.close();
@@ -3021,8 +3023,7 @@ function write (chunk) {
content += this.filter.toString();
}
- var out = this.template.render(content);
- return out;
+ return this.template.render(content);
}
};
@@ -3110,6 +3111,7 @@ function write (chunk) {
if (!principal) {
principal = findProperty('principal-URL', data, true);
}
+
if ('unauthenticated' in principal) {
callback(new Errors.UnauthenticatedError());
} else if (principal.href){
diff --git a/lib/caldav/request/abstract.js b/lib/caldav/request/abstract.js
index eb6297b..7116217 100644
--- a/lib/caldav/request/abstract.js
+++ b/lib/caldav/request/abstract.js
@@ -65,8 +65,7 @@
};
// in the future we may stream data somehow
- req.send(function xhrResult() {
- var xhr = req.xhr;
+ req.send(function xhrResult(err, xhr) {
if (xhr.status > 199 && xhr.status < 300) {
// success
self.sax.close();
diff --git a/lib/caldav/request/errors.js b/lib/caldav/request/errors.js
index c3c166e..700cfba 100644
--- a/lib/caldav/request/errors.js
+++ b/lib/caldav/request/errors.js
@@ -16,26 +16,26 @@
default:
message = this.code;
}
-
Error.call(this, message);
}
+
CaldavHttpError.prototype = {
__proto__: Error.prototype,
constructor: CaldavHttpError
}
-
+
// Unauthenticated error for
// Google Calendar
function UnauthenticatedError() {
var message = "Wrong username or/and password";
Error.call(this, message);
}
-
+
UnauthenticatedError.prototype = {
__proto__: Error.prototype,
constructor: UnauthenticatedError
}
-
+
module.exports = {
CaldavHttpError: CaldavHttpError,
UnauthenticatedError: UnauthenticatedError
diff --git a/lib/caldav/xhr.js b/lib/caldav/xhr.js
index abeae79..d49186b 100644
--- a/lib/caldav/xhr.js
+++ b/lib/caldav/xhr.js
@@ -58,15 +58,6 @@
},
/**
- * Aborts request if its in progress.
- */
- abort: function abort() {
- if (this.xhr) {
- this.xhr.abort();
- }
- },
-
- /**
* @param {String} user basic auth user.
* @param {String} password basic auth pass.
* @return {String} basic auth token.
@@ -95,9 +86,6 @@
} else {
xhr = new this.xhrClass();
}
-
- this.xhr = xhr;
-
// This hack is in place due to some platform
// bug in gecko when using mozSystem xhr
// the credentials only seem to work as expected
@@ -112,6 +100,12 @@
));
}
+ var useMozChunkedText = false;
+ if (this.globalXhrOptions && this.globalXhrOptions.useMozChunkedText) {
+ useMozChunkedText = true;
+ xhr.responseType = 'moz-chunked-text';
+ }
+
for (header in this.headers) {
if (Object.hasOwnProperty.call(this.headers, header)) {
xhr.setRequestHeader(header, this.headers[header]);
@@ -125,13 +119,20 @@
if ('onprogress' in xhr) {
hasProgressEvents = true;
var last = 0;
- xhr.onprogress = function onProgress(event) {
- var chunk = xhr.responseText.substr(last, event.loaded);
- last = event.loaded;
- if (this.ondata) {
- this.ondata(chunk);
- }
- }.bind(this);
+
+ if (useMozChunkedText) {
+ xhr.onprogress = function onChunkedProgress(event) {
+ this.ondata(xhr.responseText);
+ }.bind(this);
+ } else {
+ xhr.onprogress = function onProgress(event) {
+ var chunk = xhr.responseText.substr(last, event.loaded);
+ last = event.loaded;
+ if (this.ondata) {
+ this.ondata(chunk);
+ }
+ }.bind(this);
+ }
}
xhr.onreadystatechange = function onReadyStateChange() {
@@ -154,6 +155,8 @@
this.waiting = true;
xhr.send(this._seralize());
+
+ return xhr;
}
};
diff --git a/test/caldav/request/abstract_test.js b/test/caldav/request/abstract_test.js
index ee70b67..21bde48 100644
--- a/test/caldav/request/abstract_test.js
+++ b/test/caldav/request/abstract_test.js
@@ -79,11 +79,10 @@ suite('caldav/request/abstract.js', function() {
done();
});
-
xhr = getXhr();
xhr.respond('NOT XML <div>', 500);
});
-
+
test('on response', function() {
assert.equal(calledWith[0].code, 500);
});
@@ -110,7 +109,6 @@ suite('caldav/request/abstract.js', function() {
item: { value: 'value' }
}
});
- assert.equal(calledWith[2].xhr, xhr);
});
});
});
diff --git a/test/caldav/xhr_test.js b/test/caldav/xhr_test.js
index fdcbe37..6130346 100644
--- a/test/caldav/xhr_test.js
+++ b/test/caldav/xhr_test.js
@@ -36,16 +36,6 @@ suite('webacls/xhr', function() {
teardown(function() {
Xhr.prototype.globalXhrOptions = old;
});
-
- test('constructed xhr', function() {
- var subject = new Xhr({
- method: 'POST',
- xhrClass: FakeXhr
- });
- subject.send(function() {});
- assert.ok(subject.xhr);
- assert.equal(subject.xhr.constructorArgs[0], opts);
- });
});
});
@@ -64,33 +54,6 @@ suite('webacls/xhr', function() {
);
});
- suite('.abort', function() {
- suite('when there is an xhr object', function() {
- var aborted;
-
- setup(function() {
- aborted = false;
- subject.xhr = {
- abort: function() {
- aborted = true;
- }
- };
- subject.abort();
- });
-
- test('should call abort on the xhr object', function() {
- assert.equal(aborted, true);
- });
- });
-
- suite('when there is no xhr object', function() {
- test('should not fail', function() {
- subject.xhr = null;
- subject.abort();
- });
- });
- });
-
suite('.send', function() {
var data = '<html></html>',
@@ -108,65 +71,10 @@ suite('webacls/xhr', function() {
subject = new Xhr(options);
}
- function opensXHR() {
- test('should create xhr', function() {
- assert.instanceOf(subject.xhr, FakeXhr);
- });
-
- test('should set headers', function() {
- assert.deepEqual(subject.xhr.headers, subject.headers);
- });
-
- test('should parse and send data', function() {
- assert.deepEqual(subject.xhr.sendArgs[0], data);
- });
-
- test('should open xhr', function() {
- assert.deepEqual(subject.xhr.openArgs, [
- subject.method,
- subject.url,
- subject.async,
- subject.user,
- subject.password
- ]);
- });
- }
-
setup(function() {
responseXhr = null;
});
- test('with mozSystem', function() {
- if (typeof(window) === 'undefined')
- return;
-
- var user = 'user';
- var password = 'pass';
- var url = '/foo';
-
- request({
- globalXhrOptions: { mozSystem: true },
- user: user,
- password: password,
- method: 'GET',
- url: url
- });
-
-
- subject.send(function() {});
- var args = subject.xhr.openArgs;
-
- assert.deepEqual(
- args,
- ['GET', url, true]
- );
-
- assert.equal(
- subject.xhr.headers['Authorization'],
- subject._credentials(user, password)
- );
- });
-
suite('when xhr is a success and responds /w data', function() {
var response = '<html></html>', cb;
@@ -178,12 +86,11 @@ suite('webacls/xhr', function() {
method: 'PUT'
});
cb = callback.bind(this, done);
- subject.send(cb);
+ xhr = subject.send(cb);
//should be waiting inbetween requests
assert.equal(subject.waiting, true);
- xhr = subject.xhr;
xhr.readyState = 4;
xhr.responseText = response;
xhr.onreadystatechange();
@@ -192,18 +99,12 @@ suite('webacls/xhr', function() {
test('should not be waiting after response', function() {
assert.equal(subject.waiting, false);
});
-
- test('should send callback parsed data and xhr', function() {
- assert.equal(responseXhr, subject.xhr);
- });
-
- opensXHR();
});
});
suite('requests real files', function() {
- function request(path) {
+ function request(path, globalOptions) {
path = 'fixtures/' + path;
if (typeof(__dirname) !== 'undefined') {
@@ -212,7 +113,7 @@ suite('webacls/xhr', function() {
path = '/test/caldav/' + path;
}
- return new Xhr({ url: path });
+ return new Xhr({ url: path, globalXhrOptions: globalOptions });
}
test('get', function(done) {
@@ -224,27 +125,56 @@ suite('webacls/xhr', function() {
});
});
- test('.ondata', function(done) {
- var subject = request('long.txt');
- var gotData = '';
+ suite('.ondata', function() {
+ var expected;
+ var file = 'long.txt';
+
+ setup(function(done) {
+ if (expected) {
+ done();
+ }
+
+ var req = request(file);
+ req.send(function(err, xhr) {
+ expected = xhr.responseText;
+ done();
+ });
+ });
+
+ if (this.navigator && navigator.userAgent.indexOf('Mozilla') !== -1) {
+ test('.ondata with chunked', function(done) {
+ var subject = request('long.txt', { useMozChunkedText: true });
+ var gotData = '';
- subject.ondata = function(chunk) {
- gotData += chunk;
- };
+ subject.ondata = function(chunk) {
+ gotData += chunk;
+ };
- subject.send(function(err, xhr) {
- var data = xhr.responseText;
+ var xhr = subject.send(function(err, xhr) {
+ assert.ok(!xhr.responseText);
+ assert.equal(xhr.responseType, 'moz-chunked-text');
+ assert.equal(expected, gotData);
+ done();
+ });
+ });
+ }
- assert.equal(
- data.trim(),
- gotData.trim(),
- 'sends ondata'
- );
+ test('.ondata', function(done) {
+ var subject = request(file);
+ var gotData = '';
- done();
+ subject.ondata = function(chunk) {
+ gotData += chunk;
+ };
+
+ subject.send(function(err, xhr) {
+ assert.equal(expected, gotData);
+ done();
+ });
});
- });
+
+ });
});
});
diff --git a/test/helper.js b/test/helper.js
index 64346bd..df0c6d9 100644
--- a/test/helper.js
+++ b/test/helper.js
@@ -173,6 +173,7 @@
testSupport.lib('sax');
testSupport.lib('sax/base');
testSupport.lib('sax/dav_response');
+ testSupport.lib('request/errors');
testSupport.lib('request/abstract');
testSupport.lib('template');
testSupport.helper('fake_xhr');