@@ -1134,41 +1134,80 @@ define('ConnectionManager',["structures/Response", "structures/Request", "struct
11341134 * @param [url="/"] {String} requested REST resource
11351135 * @param [body=""] {String} a string which should be passed in request body to the REST service
11361136 * @param [headers={ }] {object} object literal describing request headers
1137+ * @param [requestEventHandlers] {Object} a set of callbacks to apply on a specific XHR event like onload, onerror, onprogress, etc.
11371138 * @param callback {Function} function, which will be executed on request success
1139+ * @example
1140+ * var connectionManager = jsCAPI.getConnectionManager();
1141+ *
1142+ * connectionManager.request(
1143+ * 'GET',
1144+ * '/endpoint',
1145+ * '',
1146+ * {Accept: 'application/json'},
1147+ * {
1148+ * upload: {
1149+ * onloadstart: someUploadCallback,
1150+ * onload: someUploadCallback,
1151+ * onloadend: someUploadCallback,
1152+ * onprogress: someUploadCallback,
1153+ * onabort: someUploadCallback,
1154+ * onerror: someUploadCallback,
1155+ * ontimeout: someUploadCallback,
1156+ * },
1157+ * onloadstart: someCallback,
1158+ * onload: someCallback,
1159+ * onloadend: someCallback,
1160+ * onprogress: someCallback,
1161+ * onabort: someCallback,
1162+ * onerror: someCallback,
1163+ * ontimeout: someCallback,
1164+ * },
1165+ * callback
1166+ * );
11381167 */
1139- ConnectionManager . prototype . request = function ( method , url , body , headers , callback ) {
1168+ ConnectionManager . prototype . request = function ( method , url , body , headers , requestEventHandlers , callback ) {
11401169 var that = this ,
11411170 request ,
11421171 nextRequest ,
11431172 defaultMethod = "GET" ,
11441173 defaultUrl = "/" ,
11451174 defaultBody = "" ,
1146- defaultHeaders = { } ;
1175+ defaultHeaders = { } ,
1176+ defaultRequestEventHandlers = { } ;
11471177
11481178 // default values for omitted parameters (if any)
1149- if ( arguments . length < 5 ) {
1150- if ( typeof method == " function" ) {
1151- //no optional parameteres are passed
1179+ if ( arguments . length < 6 ) {
1180+ if ( typeof method === ' function' ) {
1181+ // no optional parameteres are passed
11521182 callback = method ;
11531183 method = defaultMethod ;
11541184 url = defaultUrl ;
11551185 body = defaultBody ;
11561186 headers = defaultHeaders ;
1157- } else if ( typeof url == "function" ) {
1187+ requestEventHandlers = defaultRequestEventHandlers ;
1188+ } else if ( typeof url === 'function' ) {
11581189 // only first 1 optional parameter is passed
1190+ requestEventHandlers = body ;
11591191 callback = url ;
11601192 url = defaultUrl ;
11611193 body = defaultBody ;
11621194 headers = defaultHeaders ;
1163- } else if ( typeof body == "function" ) {
1195+ requestEventHandlers = defaultRequestEventHandlers ;
1196+ } else if ( typeof body === 'function' ) {
11641197 // only first 2 optional parameters are passed
11651198 callback = body ;
11661199 body = defaultBody ;
11671200 headers = defaultHeaders ;
1168- } else {
1201+ requestEventHandlers = defaultRequestEventHandlers ;
1202+ } else if ( typeof headers === 'function' ) {
11691203 // only first 3 optional parameters are passed
11701204 callback = headers ;
11711205 headers = defaultHeaders ;
1206+ requestEventHandlers = defaultRequestEventHandlers ;
1207+ } else if ( typeof requestEventHandlers === 'function' ) {
1208+ // only first 4 optional parameters are passed
1209+ callback = requestEventHandlers ;
1210+ requestEventHandlers = defaultRequestEventHandlers ;
11721211 }
11731212 }
11741213
@@ -1225,7 +1264,7 @@ define('ConnectionManager',["structures/Response", "structures/Request", "struct
12251264 console . dir ( request ) ;
12261265 }
12271266 // Main goal
1228- that . _connectionFactory . createConnection ( ) . execute ( authenticatedRequest , callback ) ;
1267+ that . _connectionFactory . createConnection ( ) . execute ( authenticatedRequest , requestEventHandlers , callback ) ;
12291268 }
12301269 ) ;
12311270 } // while
@@ -1363,22 +1402,37 @@ define('connections/XmlHttpRequestConnection',["structures/Response", "structure
13631402 * @constructor
13641403 */
13651404 var XmlHttpRequestConnection = function ( ) {
1366- this . _xhr = new XMLHttpRequest ( ) ;
1367- } ;
1405+ this . _xhr = new XMLHttpRequest ( ) ;
1406+ } ,
1407+ _assignCallback = function ( xhr , eventName , callback ) {
1408+ if ( typeof callback !== 'function' ) {
1409+ return xhr ;
1410+ }
1411+
1412+ xhr [ eventName ] = callback ;
1413+
1414+ return xhr ;
1415+ } ;
13681416
13691417 /**
13701418 * Basic request implemented via XHR technique
13711419 *
13721420 * @method execute
13731421 * @param request {Request} structure containing all needed params and data
1422+ * @param [requestEventHandlers] {Object} a set of callbacks to apply on a specific XHR event like onload, onerror, onprogress, etc.
13741423 * @param callback {Function} function, which will be executed on request success
13751424 */
1376- XmlHttpRequestConnection . prototype . execute = function ( request , callback ) {
1425+ XmlHttpRequestConnection . prototype . execute = function ( request , requestEventHandlers , callback ) {
13771426 var XHR = this . _xhr ,
13781427 headerType ,
13791428 method = request . method ,
13801429 standardMethods = { "OPTIONS" : 1 , "GET" : 1 , "HEAD" : 1 , "POST" : 1 , "PUT" : 1 , "DELETE" : 1 , "TRACE" : 1 } ;
13811430
1431+ if ( typeof requestEventHandlers === 'function' ) {
1432+ callback = requestEventHandlers ;
1433+ requestEventHandlers = { } ;
1434+ }
1435+
13821436 // Create the state change handler:
13831437 XHR . onreadystatechange = function ( ) {
13841438 var response ;
@@ -1407,6 +1461,26 @@ define('connections/XmlHttpRequestConnection',["structures/Response", "structure
14071461 method = "POST" ;
14081462 }
14091463
1464+ if ( requestEventHandlers && Object . keys ( requestEventHandlers ) . length ) {
1465+ if ( requestEventHandlers . upload && Object . keys ( requestEventHandlers . upload ) . length ) {
1466+ _assignCallback ( XHR . upload , 'onloadstart' , requestEventHandlers . upload . onloadstart ) ;
1467+ _assignCallback ( XHR . upload , 'onload' , requestEventHandlers . upload . onload ) ;
1468+ _assignCallback ( XHR . upload , 'onloadend' , requestEventHandlers . upload . onloadend ) ;
1469+ _assignCallback ( XHR . upload , 'onprogress' , requestEventHandlers . upload . onprogress ) ;
1470+ _assignCallback ( XHR . upload , 'onabort' , requestEventHandlers . upload . onabort ) ;
1471+ _assignCallback ( XHR . upload , 'onerror' , requestEventHandlers . upload . onerror ) ;
1472+ _assignCallback ( XHR . upload , 'ontimeout' , requestEventHandlers . upload . ontimeout ) ;
1473+ }
1474+
1475+ _assignCallback ( XHR , 'onloadstart' , requestEventHandlers . onloadstart ) ;
1476+ _assignCallback ( XHR , 'onload' , requestEventHandlers . onload ) ;
1477+ _assignCallback ( XHR , 'onloadend' , requestEventHandlers . onloadend ) ;
1478+ _assignCallback ( XHR , 'onprogress' , requestEventHandlers . onprogress ) ;
1479+ _assignCallback ( XHR , 'onabort' , requestEventHandlers . onabort ) ;
1480+ _assignCallback ( XHR , 'onerror' , requestEventHandlers . onerror ) ;
1481+ _assignCallback ( XHR , 'ontimeout' , requestEventHandlers . ontimeout ) ;
1482+ }
1483+
14101484 if ( request . httpBasicAuth ) {
14111485 XHR . open ( method , request . url , true , request . login , request . password ) ;
14121486 } else {
@@ -3599,12 +3673,46 @@ define('services/ContentService',["structures/ContentCreateStruct", "structures/
35993673 *
36003674 * @method createContent
36013675 * @param contentCreateStruct {ContentCreateStruct} object describing content to be created
3676+ * @param [requestEventHandlers] {Object} a set of callbacks to apply on a specific XHR event like onload, onerror, onprogress, etc.
36023677 * @param callback {Function} callback executed after performing the request (see
36033678 * {{#crossLink "ContentService"}}Note on the callbacks usage{{/crossLink}} for more info)
3679+ * @example
3680+ * var contentService = jsCAPI.getContentService();
3681+ *
3682+ * contentService.createContent(
3683+ * {
3684+ * body: '',
3685+ * headers: {}
3686+ * },
3687+ * {
3688+ * upload: {
3689+ * onloadstart: someUploadCallback,
3690+ * onload: someUploadCallback,
3691+ * onloadend: someUploadCallback,
3692+ * onprogress: someUploadCallback,
3693+ * onabort: someUploadCallback,
3694+ * onerror: someUploadCallback,
3695+ * ontimeout: someUploadCallback,
3696+ * },
3697+ * onloadstart: someCallback,
3698+ * onload: someCallback,
3699+ * onloadend: someCallback,
3700+ * onprogress: someCallback,
3701+ * onabort: someCallback,
3702+ * onerror: someCallback,
3703+ * ontimeout: someCallback,
3704+ * },
3705+ * callback
3706+ * );
36043707 */
3605- ContentService . prototype . createContent = function ( contentCreateStruct , callback ) {
3708+ ContentService . prototype . createContent = function ( contentCreateStruct , requestEventHandlers , callback ) {
36063709 var that = this ;
36073710
3711+ if ( typeof requestEventHandlers === 'function' ) {
3712+ callback = requestEventHandlers ;
3713+ requestEventHandlers = { } ;
3714+ }
3715+
36083716 this . _discoveryService . getInfoObject (
36093717 "content" ,
36103718 function ( error , contentObjects ) {
@@ -3618,6 +3726,7 @@ define('services/ContentService',["structures/ContentCreateStruct", "structures/
36183726 contentObjects . _href ,
36193727 JSON . stringify ( contentCreateStruct . body ) ,
36203728 contentCreateStruct . headers ,
3729+ requestEventHandlers ,
36213730 callback
36223731 ) ;
36233732 }
@@ -4322,7 +4431,7 @@ define('services/ContentService',["structures/ContentCreateStruct", "structures/
43224431 if ( viewCreateStruct . getCriteria ( ) && Object . keys ( viewCreateStruct . getCriteria ( ) ) . length !== 0 ) {
43234432 console . warn ( '[DEPRECATED] virtual property Criteria is deprecated' ) ;
43244433 }
4325-
4434+
43264435 that . _connectionManager . request (
43274436 "POST" ,
43284437 views . _href ,
0 commit comments