flectra.define('web.ajax', function (require) { "use strict"; var core = require('web.core'); var utils = require('web.utils'); var time = require('web.time'); function genericJsonRpc (fct_name, params, settings, fct) { var shadow = settings.shadow || false; delete settings.shadow; if (! shadow) core.bus.trigger('rpc_request'); var data = { jsonrpc: "2.0", method: fct_name, params: params, id: Math.floor(Math.random() * 1000 * 1000 * 1000) }; var xhr = fct(data); var result = xhr.pipe(function(result) { core.bus.trigger('rpc:result', data, result); if (result.error !== undefined) { if (result.error.data.arguments[0] !== "bus.Bus not available in test mode") { console.error("Server application error", JSON.stringify(result.error)); } return $.Deferred().reject("server", result.error); } else { return result.result; } }, function() { //console.error("JsonRPC communication error", _.toArray(arguments)); var def = $.Deferred(); return def.reject.apply(def, ["communication"].concat(_.toArray(arguments))); }); // FIXME: jsonp? result.abort = function () { if (xhr.abort) xhr.abort(); }; var p = result.then(function (result) { if (!shadow) { core.bus.trigger('rpc_response'); } return result; }, function (type, error, textStatus, errorThrown) { if (type === "server") { if (!shadow) { core.bus.trigger('rpc_response'); } if (error.code === 100) { core.bus.trigger('invalidate_session'); } return $.Deferred().reject(error, $.Event()); } else { if (!shadow) { core.bus.trigger('rpc_response_failed'); } var nerror = { code: -32098, message: "XmlHttpRequestError " + errorThrown, data: { type: "xhr"+textStatus, debug: error.responseText, objects: [error, errorThrown] }, }; 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()) { core.bus.trigger('rpc_error', error, event); } }); }); } function jsonRpc(url, fct_name, params, settings) { settings = settings || {}; return genericJsonRpc(fct_name, params, settings, function(data) { return $.ajax(url, _.extend({}, settings, { url: url, dataType: 'json', type: 'POST', data: JSON.stringify(data, time.date_to_utc), contentType: 'application/json' })); }); } function jsonpRpc(url, fct_name, params, settings) { settings = settings || {}; return genericJsonRpc(fct_name, params, settings, function(data) { var payload_str = JSON.stringify(data, time.date_to_utc); var payload_url = $.param({r:payload_str}); var force2step = settings.force2step || false; delete settings.force2step; var session_id = settings.session_id || null; delete settings.session_id; if (payload_url.length < 2000 && ! force2step) { return $.ajax(url, _.extend({}, settings, { url: url, dataType: 'jsonp', jsonp: 'jsonp', type: 'GET', cache: false, data: {r: payload_str, session_id: session_id} })); } else { var args = {session_id: session_id, id: data.id}; var ifid = _.uniqueId('oe_rpc_iframe'); var html = ""; var $iframe = $(html); var nurl = 'jsonp=1&' + $.param(args); nurl = url.indexOf("?") !== -1 ? url + "&" + nurl : url + "?" + nurl; var $form = $('