diff options
| author | niv-openerp <nicolas.vanhoren@openerp.com> | 2013-07-31 18:34:15 +0200 |
|---|---|---|
| committer | niv-openerp <nicolas.vanhoren@openerp.com> | 2013-07-31 18:34:15 +0200 |
| commit | dae87b45352d18f91a8e27b0b868c4fd8ef3a1b0 (patch) | |
| tree | 2d3f5c5e492146bcd5a008e00f83ca51024dde06 /addons/web/static/src/js | |
| parent | a51e0424004dcd3d06e34bd023cc08acca4218d8 (diff) | |
Try to reimplement jsonrpc with niv's methods, still a lot of tests fail
bzr revid: nicolas.vanhoren@openerp.com-20130731163415-v6ec0nqsr0qj91a6
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/openerpframework.js | 167 | ||||
| -rw-r--r-- | addons/web/static/src/js/testing.js | 15 |
2 files changed, 43 insertions, 139 deletions
diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js index e862c90557b..e84ad5f9061 100644 --- a/addons/web/static/src/js/openerpframework.js +++ b/addons/web/static/src/js/openerpframework.js @@ -840,7 +840,7 @@ openerp.web.JsonRPC = openerp.web.Class.extend(openerp.web.PropertiesMixin, { this.origin = origin ? origin.replace( /\/+$/, '') : window_origin; this.prefix = this.origin; this.server = this.origin; // keep chs happy - this.rpc_function = (this.origin == window_origin) ? this.rpc_json : this.rpc_jsonp; + this.is_jsonp = this.origin !== window_origin; }, /** * Executes an RPC call, registering the provided callbacks. @@ -859,153 +859,54 @@ openerp.web.JsonRPC = openerp.web.Class.extend(openerp.web.PropertiesMixin, { rpc: function(url, params, options) { var self = this; options = options || {}; - // url can be an $.ajax option object - if (_.isString(url)) { - url = { url: url }; + //TODO: remove + var jqOptions = {}; + if (! _.isString(url)) { + _.extend(jqOptions, url); + url = url.url; } - _.defaults(params, { - context: this.user_context || {} - }); - // Construct a JSON-RPC2 request, method is currently unused - var payload = { - jsonrpc: '2.0', - method: 'call', - params: params, - id: _.uniqueId('r') - }; - var deferred = $.Deferred(); - if (! options.shadow) - this.trigger('request', url, payload); - + // TODO correct handling of timeouts if (options.timeout) - url.timeout = options.timeout; - - this.rpc_function(url, payload).then( - function (response, textStatus, jqXHR) { + jqOptions.timeout = options.timeout; + if (! options.shadow) + this.trigger('request'); + var p; + if (! this.is_jsonp) { + p = openerp.web.jsonRpc(url, "call", params, jqOptions); + } else { + p = openerp.web.jsonpRpc(url, "call", params, jqOptions); + } + p = p.then(function (result) { + if (! options.shadow) + self.trigger('response'); + return result; + }, function(type, error, textStatus, errorThrown) { + if (type === "server") { if (! options.shadow) - self.trigger('response', response); - if (!response.error) { - deferred.resolve(response["result"], textStatus, jqXHR); - } else if (response.error.code === 100) { + self.trigger('response'); + if (error.code === 100) { self.uid = false; - } else { - deferred.reject(response.error, $.Event()); } - }, - function(jqXHR, textStatus, errorThrown) { + return $.Deferred().reject(error, $.Event()); + } else { if (! options.shadow) - self.trigger('response_failed', jqXHR); - var error = { + self.trigger('response_failed'); + var nerror = { code: -32098, message: "XmlHttpRequestError " + errorThrown, - data: {type: "xhr"+textStatus, debug: jqXHR.responseText, objects: [jqXHR, errorThrown] } + data: {type: "xhr"+textStatus, debug: error.responseText, objects: [error, errorThrown] } }; - deferred.reject(error, $.Event()); - }); - // Allow deferred user to disable rpc_error call in fail - deferred.fail(function() { - deferred.fail(function(error, event) { + return $.Deferred().reject(nerror, $.Event()); + } + }); + return p.fail(function() { // Allow deferred user to disable rpc_error call in fail + p.fail(function(error, event) { if (!event.isDefaultPrevented()) { self.trigger('error', error, event); } }); }); - return deferred; - }, - /** - * Raw JSON-RPC call - * - * @returns {jQuery.Deferred} ajax-webd deferred object - */ - rpc_json: function(url, payload) { - var self = this; - var ajax = _.extend({ - type: "POST", - dataType: 'json', - contentType: 'application/json', - data: JSON.stringify(payload), - processData: false, - headers: { - "X-Openerp-Session-Id": this.override_session ? this.session_id : undefined, - }, - }, url); - if (this.synch) - ajax.async = false; - return $.ajax(ajax); }, - rpc_jsonp: function(url, payload) { - var self = this; - // extracted from payload to set on the url - var data = { - session_id: this.session_id, - id: payload.id, - }; - - var set_sid = function (response, textStatus, jqXHR) { - // If response give us the http session id, we store it for next requests... - if (response.session_id) { - self.session_id = response.session_id; - } - }; - - url.url = this.url(url.url, null); - var ajax = _.extend({ - type: "GET", - dataType: 'jsonp', - jsonp: 'jsonp', - cache: false, - data: data - }, url); - if (this.synch) - ajax.async = false; - var payload_str = JSON.stringify(payload); - var payload_url = $.param({r:payload_str}); - if (payload_url.length < 2000) { - // Direct jsonp request - ajax.data.r = payload_str; - return $.ajax(ajax).done(set_sid); - } else { - // Indirect jsonp request - var ifid = _.uniqueId('oe_rpc_iframe'); - var display = 'none'; - var html = "<iframe src='javascript:false;' name='" + ifid + "' id='" + ifid + "' style='display:" + display + "'></iframe>"; - var $iframe = $(html); - var $form = $('<form>') - .attr('method', 'POST') - .attr('target', ifid) - .attr('enctype', "multipart/form-data") - .attr('action', ajax.url + '?jsonp=1&' + $.param(data)) - .append($('<input type="hidden" name="r" />').attr('value', payload_str)) - .hide() - .appendTo($('body')); - var cleanUp = function() { - if ($iframe) { - $iframe.unbind("load").remove(); - } - $form.remove(); - }; - var deferred = $.Deferred(); - // the first bind is fired up when the iframe is added to the DOM - $iframe.bind('load', function() { - // the second bind is fired up when the result of the form submission is received - $iframe.unbind('load').bind('load', function() { - $.ajax(ajax).always(function() { - cleanUp(); - }).done(function() { - deferred.resolve.apply(deferred, arguments); - }).fail(function() { - deferred.reject.apply(deferred, arguments); - }); - }); - // now that the iframe can receive data, we fill and submit the form - $form.submit(); - }); - // append the iframe to the DOM (will trigger the first load) - $form.after($iframe); - return deferred.done(set_sid); - } - }, - url: function(path, params) { params = _.extend(params || {}); if (this.override_session) diff --git a/addons/web/static/src/js/testing.js b/addons/web/static/src/js/testing.js index af434c4c0f4..54ffe8ce408 100644 --- a/addons/web/static/src/js/testing.js +++ b/addons/web/static/src/js/testing.js @@ -53,25 +53,28 @@ openerp.testing = {}; testing.mockifyRPC = function (instance, responses) { var session = instance.session; session.responses = responses || {}; - session.rpc_function = function (url, payload) { + session.rpc = function(url, rparams, options) { + if (_.isString(url)) { + url = {url: url}; + } var fn, params; - var needle = payload.params.model + ':' + payload.params.method; + var needle = rparams.model + ':' + rparams.method; if (url.url === '/web/dataset/call_kw' && needle in this.responses) { fn = this.responses[needle]; params = [ - payload.params.args || [], - payload.params.kwargs || {} + rparams.args || [], + rparams.kwargs || {} ]; } else { fn = this.responses[url.url]; - params = [payload]; + params = [{params: rparams}]; } if (!fn) { return $.Deferred().reject({}, 'failed', _.str.sprintf("Url %s not found in mock responses, with arguments %s", - url.url, JSON.stringify(payload.params)) + url.url, JSON.stringify(rparams)) ).promise(); } try { |
