From 6c8e19a3212e5bbc6f94ad377dc2fd6d7d8fff8d Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Sun, 4 Nov 2012 14:40:23 -0800 Subject: [PATCH] Update vendor/backbone. Former-commit-id: dc1a37f3c44eecc1fcd1cba2018d70e8c337d6f3 --- vendor/backbone/backbone.js | 23 +++++++------ vendor/backbone/test/environment.js | 6 ++++ vendor/backbone/test/model.js | 8 +++++ vendor/backbone/test/router.js | 5 +++ vendor/backbone/test/sync.js | 52 ++++++++++++++++++++++------- 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/vendor/backbone/backbone.js b/vendor/backbone/backbone.js index 8953d47c7..d1ce4f538 100644 --- a/vendor/backbone/backbone.js +++ b/vendor/backbone/backbone.js @@ -185,16 +185,16 @@ var defaults; var attrs = attributes || {}; if (options && options.collection) this.collection = options.collection; - if (options && options.parse) attrs = this.parse(attrs); - if (defaults = _.result(this, 'defaults')) { - attrs = _.extend({}, defaults, attrs); - } this.attributes = {}; this._escapedAttributes = {}; this.cid = _.uniqueId('c'); this.changed = {}; this._changes = {}; this._pending = {}; + if (options && options.parse) attrs = this.parse(attrs); + if (defaults = _.result(this, 'defaults')) { + attrs = _.extend({}, defaults, attrs); + } this.set(attrs, {silent: true}); // Reset change tracking. this.changed = {}; @@ -989,7 +989,7 @@ }; // Cached regex for cleaning leading hashes and slashes. - var routeStripper = /^[#\/]/; + var routeStripper = /^[#\/]|\s+$/; // Cached regex for stripping leading and trailing slashes. var rootStripper = /^\/+|\/+$/g; @@ -1365,7 +1365,10 @@ var type = methodMap[method]; // Default options, unless specified. - options || (options = {}); + _.defaults(options || (options = {}), { + emulateHTTP: Backbone.emulateHTTP, + emulateJSON: Backbone.emulateJSON + }); // Default JSON-request options. var params = {type: type, dataType: 'json'}; @@ -1382,16 +1385,16 @@ } // For older servers, emulate JSON by encoding the request into an HTML-form. - if (Backbone.emulateJSON) { + if (options.emulateJSON) { params.contentType = 'application/x-www-form-urlencoded'; params.data = params.data ? {model: params.data} : {}; } // For older servers, emulate HTTP by mimicking the HTTP method with `_method` // And an `X-HTTP-Method-Override` header. - if (Backbone.emulateHTTP && (type === 'PUT' || type === 'DELETE')) { + if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE')) { params.type = 'POST'; - if (Backbone.emulateJSON) params.data._method = type; + if (options.emulateJSON) params.data._method = type; var beforeSend = options.beforeSend; options.beforeSend = function(xhr) { xhr.setRequestHeader('X-HTTP-Method-Override', type); @@ -1400,7 +1403,7 @@ } // Don't process data on a non-GET request. - if (params.type !== 'GET' && !Backbone.emulateJSON) { + if (params.type !== 'GET' && !options.emulateJSON) { params.processData = false; } diff --git a/vendor/backbone/test/environment.js b/vendor/backbone/test/environment.js index 62292dcb3..54aa2c407 100644 --- a/vendor/backbone/test/environment.js +++ b/vendor/backbone/test/environment.js @@ -8,6 +8,10 @@ sync: Backbone.sync, + emulateHTTP: Backbone.emulateHTTP, + + emulateJSON: Backbone.emulateJSON, + setup: function() { var env = this; @@ -32,6 +36,8 @@ this.ajaxSettings = null; Backbone.sync = this.sync; Backbone.ajax = this.ajax; + Backbone.emulateHTTP = this.emulateHTTP; + Backbone.emulateJSON = this.emulateJSON; } }); diff --git a/vendor/backbone/test/model.js b/vendor/backbone/test/model.js index 283469846..c962de4b7 100644 --- a/vendor/backbone/test/model.js +++ b/vendor/backbone/test/model.js @@ -889,4 +889,12 @@ $(document).ready(function() { deepEqual(changes, ['a',1,'item']); }); + test("#1791 - `attributes` is available for `parse`", function() { + var Model = Backbone.Model.extend({ + parse: function() { this.has('a'); } // shouldn't throw an error + }); + var model = new Model(null, {parse: true}); + expect(0); + }); + }); diff --git a/vendor/backbone/test/router.js b/vendor/backbone/test/router.js index 459f49e3a..32d4ff4c3 100644 --- a/vendor/backbone/test/router.js +++ b/vendor/backbone/test/router.js @@ -492,4 +492,9 @@ $(document).ready(function() { new Router; }); + test("#1794 - Trailing space in fragments.", 1, function() { + var history = new Backbone.History; + strictEqual(history.getFragment('fragment '), 'fragment'); + }); + }); diff --git a/vendor/backbone/test/sync.js b/vendor/backbone/test/sync.js index 23d5e62a3..8fddb47fa 100644 --- a/vendor/backbone/test/sync.js +++ b/vendor/backbone/test/sync.js @@ -64,8 +64,10 @@ $(document).ready(function() { }); test("update with emulateHTTP and emulateJSON", 7, function() { - Backbone.emulateHTTP = Backbone.emulateJSON = true; - library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); + library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, { + emulateHTTP: true, + emulateJSON: true + }); equal(this.ajaxSettings.url, '/library/2-the-tempest'); equal(this.ajaxSettings.type, 'POST'); equal(this.ajaxSettings.dataType, 'json'); @@ -74,12 +76,12 @@ $(document).ready(function() { equal(data.id, '2-the-tempest'); equal(data.author, 'Tim Shakespeare'); equal(data.length, 123); - Backbone.emulateHTTP = Backbone.emulateJSON = false; }); test("update with just emulateHTTP", 6, function() { - Backbone.emulateHTTP = true; - library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); + library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, { + emulateHTTP: true + }); equal(this.ajaxSettings.url, '/library/2-the-tempest'); equal(this.ajaxSettings.type, 'POST'); equal(this.ajaxSettings.contentType, 'application/json'); @@ -87,12 +89,12 @@ $(document).ready(function() { equal(data.id, '2-the-tempest'); equal(data.author, 'Tim Shakespeare'); equal(data.length, 123); - Backbone.emulateHTTP = false; }); test("update with just emulateJSON", 6, function() { - Backbone.emulateJSON = true; - library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); + library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}, { + emulateJSON: true + }); equal(this.ajaxSettings.url, '/library/2-the-tempest'); equal(this.ajaxSettings.type, 'PUT'); equal(this.ajaxSettings.contentType, 'application/x-www-form-urlencoded'); @@ -100,7 +102,6 @@ $(document).ready(function() { equal(data.id, '2-the-tempest'); equal(data.author, 'Tim Shakespeare'); equal(data.length, 123); - Backbone.emulateJSON = false; }); test("read model", 3, function() { @@ -121,12 +122,13 @@ $(document).ready(function() { test("destroy with emulateHTTP", 3, function() { library.first().save({id: '2-the-tempest', author: 'Tim Shakespeare'}); - Backbone.emulateHTTP = Backbone.emulateJSON = true; - library.first().destroy(); + library.first().destroy({ + emulateHTTP: true, + emulateJSON: true + }); equal(this.ajaxSettings.url, '/library/2-the-tempest'); equal(this.ajaxSettings.type, 'POST'); equal(JSON.stringify(this.ajaxSettings.data), '{"_method":"DELETE"}'); - Backbone.emulateHTTP = Backbone.emulateJSON = false; }); test("urlError", 2, function() { @@ -162,6 +164,32 @@ $(document).ready(function() { this.ajaxSettings.error(); }); + test('Use Backbone.emulateHTTP as default.', 2, function() { + var model = new Backbone.Model; + model.url = '/test'; + + Backbone.emulateHTTP = true; + model.sync('create', model); + strictEqual(this.ajaxSettings.emulateHTTP, true); + + Backbone.emulateHTTP = false; + model.sync('create', model); + strictEqual(this.ajaxSettings.emulateHTTP, false); + }); + + test('Use Backbone.emulateJSON as default.', 2, function() { + var model = new Backbone.Model; + model.url = '/test'; + + Backbone.emulateJSON = true; + model.sync('create', model); + strictEqual(this.ajaxSettings.emulateJSON, true); + + Backbone.emulateJSON = false; + model.sync('create', model); + strictEqual(this.ajaxSettings.emulateJSON, false); + }); + test("#1756 - Call user provided beforeSend function.", 4, function() { Backbone.emulateHTTP = true; var model = new Backbone.Model;