[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 YUI.add('yui2-connectioncore', function(Y) { 2 var YAHOO = Y.YUI2; 3 /* 4 Copyright (c) 2011, Yahoo! Inc. All rights reserved. 5 Code licensed under the BSD License: 6 http://developer.yahoo.com/yui/license.html 7 version: 2.9.0 8 */ 9 /** 10 * The Connection Manager provides a simplified interface to the XMLHttpRequest 11 * object. It handles cross-browser instantiantion of XMLHttpRequest, negotiates the 12 * interactive states and server response, returning the results to a pre-defined 13 * callback you create. 14 * 15 * @namespace YAHOO.util 16 * @module connection 17 * @requires yahoo 18 * @requires event 19 */ 20 21 /** 22 * The Connection Manager singleton provides methods for creating and managing 23 * asynchronous transactions. 24 * 25 * @class YAHOO.util.Connect 26 */ 27 28 YAHOO.util.Connect = 29 { 30 /** 31 * @description Array of MSFT ActiveX ids for XMLHttpRequest. 32 * @property _msxml_progid 33 * @private 34 * @static 35 * @type array 36 */ 37 _msxml_progid:[ 38 'Microsoft.XMLHTTP', 39 'MSXML2.XMLHTTP.3.0', 40 'MSXML2.XMLHTTP' 41 ], 42 43 /** 44 * @description Object literal of HTTP header(s) 45 * @property _http_header 46 * @private 47 * @static 48 * @type object 49 */ 50 _http_headers:{}, 51 52 /** 53 * @description Determines if HTTP headers are set. 54 * @property _has_http_headers 55 * @private 56 * @static 57 * @type boolean 58 */ 59 _has_http_headers:false, 60 61 /** 62 * @description Determines if a default header of 63 * Content-Type of 'application/x-www-form-urlencoded' 64 * will be added to any client HTTP headers sent for POST 65 * transactions. 66 * @property _use_default_post_header 67 * @private 68 * @static 69 * @type boolean 70 */ 71 _use_default_post_header:true, 72 73 /** 74 * @description The default header used for POST transactions. 75 * @property _default_post_header 76 * @private 77 * @static 78 * @type boolean 79 */ 80 _default_post_header:'application/x-www-form-urlencoded; charset=UTF-8', 81 82 /** 83 * @description The default header used for transactions involving the 84 * use of HTML forms. 85 * @property _default_form_header 86 * @private 87 * @static 88 * @type boolean 89 */ 90 _default_form_header:'application/x-www-form-urlencoded', 91 92 /** 93 * @description Determines if a default header of 94 * 'X-Requested-With: XMLHttpRequest' 95 * will be added to each transaction. 96 * @property _use_default_xhr_header 97 * @private 98 * @static 99 * @type boolean 100 */ 101 _use_default_xhr_header:true, 102 103 /** 104 * @description The default header value for the label 105 * "X-Requested-With". This is sent with each 106 * transaction, by default, to identify the 107 * request as being made by YUI Connection Manager. 108 * @property _default_xhr_header 109 * @private 110 * @static 111 * @type boolean 112 */ 113 _default_xhr_header:'XMLHttpRequest', 114 115 /** 116 * @description Determines if custom, default headers 117 * are set for each transaction. 118 * @property _has_default_header 119 * @private 120 * @static 121 * @type boolean 122 */ 123 _has_default_headers:true, 124 125 /** 126 * @description Property modified by setForm() to determine if the data 127 * should be submitted as an HTML form. 128 * @property _isFormSubmit 129 * @private 130 * @static 131 * @type boolean 132 */ 133 _isFormSubmit:false, 134 135 /** 136 * @description Determines if custom, default headers 137 * are set for each transaction. 138 * @property _has_default_header 139 * @private 140 * @static 141 * @type boolean 142 */ 143 _default_headers:{}, 144 145 /** 146 * @description Collection of polling references to the polling mechanism in handleReadyState. 147 * @property _poll 148 * @private 149 * @static 150 * @type object 151 */ 152 _poll:{}, 153 154 /** 155 * @description Queue of timeout values for each transaction callback with a defined timeout value. 156 * @property _timeOut 157 * @private 158 * @static 159 * @type object 160 */ 161 _timeOut:{}, 162 163 /** 164 * @description The polling frequency, in milliseconds, for HandleReadyState. 165 * when attempting to determine a transaction's XHR readyState. 166 * The default is 50 milliseconds. 167 * @property _polling_interval 168 * @private 169 * @static 170 * @type int 171 */ 172 _polling_interval:50, 173 174 /** 175 * @description A transaction counter that increments the transaction id for each transaction. 176 * @property _transaction_id 177 * @private 178 * @static 179 * @type int 180 */ 181 _transaction_id:0, 182 183 /** 184 * @description Custom event that fires at the start of a transaction 185 * @property startEvent 186 * @private 187 * @static 188 * @type CustomEvent 189 */ 190 startEvent: new YAHOO.util.CustomEvent('start'), 191 192 /** 193 * @description Custom event that fires when a transaction response has completed. 194 * @property completeEvent 195 * @private 196 * @static 197 * @type CustomEvent 198 */ 199 completeEvent: new YAHOO.util.CustomEvent('complete'), 200 201 /** 202 * @description Custom event that fires when handleTransactionResponse() determines a 203 * response in the HTTP 2xx range. 204 * @property successEvent 205 * @private 206 * @static 207 * @type CustomEvent 208 */ 209 successEvent: new YAHOO.util.CustomEvent('success'), 210 211 /** 212 * @description Custom event that fires when handleTransactionResponse() determines a 213 * response in the HTTP 4xx/5xx range. 214 * @property failureEvent 215 * @private 216 * @static 217 * @type CustomEvent 218 */ 219 failureEvent: new YAHOO.util.CustomEvent('failure'), 220 221 /** 222 * @description Custom event that fires when a transaction is successfully aborted. 223 * @property abortEvent 224 * @private 225 * @static 226 * @type CustomEvent 227 */ 228 abortEvent: new YAHOO.util.CustomEvent('abort'), 229 230 /** 231 * @description A reference table that maps callback custom events members to its specific 232 * event name. 233 * @property _customEvents 234 * @private 235 * @static 236 * @type object 237 */ 238 _customEvents: 239 { 240 onStart:['startEvent', 'start'], 241 onComplete:['completeEvent', 'complete'], 242 onSuccess:['successEvent', 'success'], 243 onFailure:['failureEvent', 'failure'], 244 onUpload:['uploadEvent', 'upload'], 245 onAbort:['abortEvent', 'abort'] 246 }, 247 248 /** 249 * @description Member to add an ActiveX id to the existing xml_progid array. 250 * In the event(unlikely) a new ActiveX id is introduced, it can be added 251 * without internal code modifications. 252 * @method setProgId 253 * @public 254 * @static 255 * @param {string} id The ActiveX id to be added to initialize the XHR object. 256 * @return void 257 */ 258 setProgId:function(id) 259 { 260 this._msxml_progid.unshift(id); 261 YAHOO.log('ActiveX Program Id ' + id + ' added to _msxml_progid.', 'info', 'Connection'); 262 }, 263 264 /** 265 * @description Member to override the default POST header. 266 * @method setDefaultPostHeader 267 * @public 268 * @static 269 * @param {boolean} b Set and use default header - true or false . 270 * @return void 271 */ 272 setDefaultPostHeader:function(b) 273 { 274 if(typeof b == 'string'){ 275 this._default_post_header = b; 276 this._use_default_post_header = true; 277 278 YAHOO.log('Default POST header set to ' + b, 'info', 'Connection'); 279 } 280 else if(typeof b == 'boolean'){ 281 this._use_default_post_header = b; 282 } 283 }, 284 285 /** 286 * @description Member to override the default transaction header.. 287 * @method setDefaultXhrHeader 288 * @public 289 * @static 290 * @param {boolean} b Set and use default header - true or false . 291 * @return void 292 */ 293 setDefaultXhrHeader:function(b) 294 { 295 if(typeof b == 'string'){ 296 this._default_xhr_header = b; 297 YAHOO.log('Default XHR header set to ' + b, 'info', 'Connection'); 298 } 299 else{ 300 this._use_default_xhr_header = b; 301 } 302 }, 303 304 /** 305 * @description Member to modify the default polling interval. 306 * @method setPollingInterval 307 * @public 308 * @static 309 * @param {int} i The polling interval in milliseconds. 310 * @return void 311 */ 312 setPollingInterval:function(i) 313 { 314 if(typeof i == 'number' && isFinite(i)){ 315 this._polling_interval = i; 316 YAHOO.log('Default polling interval set to ' + i +'ms', 'info', 'Connection'); 317 } 318 }, 319 320 /** 321 * @description Instantiates a XMLHttpRequest object and returns an object with two properties: 322 * the XMLHttpRequest instance and the transaction id. 323 * @method createXhrObject 324 * @private 325 * @static 326 * @param {int} transactionId Property containing the transaction id for this transaction. 327 * @return object 328 */ 329 createXhrObject:function(transactionId) 330 { 331 var obj,http,i; 332 try 333 { 334 // Instantiates XMLHttpRequest in non-IE browsers and assigns to http. 335 http = new XMLHttpRequest(); 336 // Object literal with http and tId properties 337 obj = { conn:http, tId:transactionId, xhr: true }; 338 YAHOO.log('XHR object created for transaction ' + transactionId, 'info', 'Connection'); 339 } 340 catch(e) 341 { 342 for(i=0; i<this._msxml_progid.length; ++i){ 343 try 344 { 345 // Instantiates XMLHttpRequest for IE and assign to http 346 http = new ActiveXObject(this._msxml_progid[i]); 347 // Object literal with conn and tId properties 348 obj = { conn:http, tId:transactionId, xhr: true }; 349 YAHOO.log('ActiveX XHR object created for transaction ' + transactionId, 'info', 'Connection'); 350 break; 351 } 352 catch(e1){} 353 } 354 } 355 finally 356 { 357 return obj; 358 } 359 }, 360 361 /** 362 * @description This method is called by asyncRequest to create a 363 * valid connection object for the transaction. It also passes a 364 * transaction id and increments the transaction id counter. 365 * @method getConnectionObject 366 * @private 367 * @static 368 * @return {object} 369 */ 370 getConnectionObject:function(t) 371 { 372 var o, tId = this._transaction_id; 373 374 try 375 { 376 if(!t){ 377 o = this.createXhrObject(tId); 378 } 379 else{ 380 o = {tId:tId}; 381 if(t==='xdr'){ 382 o.conn = this._transport; 383 o.xdr = true; 384 } 385 else if(t==='upload'){ 386 o.upload = true; 387 } 388 } 389 390 if(o){ 391 this._transaction_id++; 392 } 393 } 394 catch(e){} 395 return o; 396 }, 397 398 /** 399 * @description Method for initiating an asynchronous request via the XHR object. 400 * @method asyncRequest 401 * @public 402 * @static 403 * @param {string} method HTTP transaction method 404 * @param {string} uri Fully qualified path of resource 405 * @param {callback} callback User-defined callback function or object 406 * @param {string} postData POST body 407 * @return {object} Returns the connection object 408 */ 409 asyncRequest:function(method, uri, callback, postData) 410 { 411 var args = callback&&callback.argument?callback.argument:null, 412 YCM = this, 413 o, t; 414 415 if(this._isFileUpload){ 416 t = 'upload'; 417 } 418 else if(callback && callback.xdr){ 419 t = 'xdr'; 420 } 421 422 o = this.getConnectionObject(t); 423 if(!o){ 424 YAHOO.log('Unable to create connection object.', 'error', 'Connection'); 425 return null; 426 } 427 else{ 428 429 // Intialize any transaction-specific custom events, if provided. 430 if(callback && callback.customevents){ 431 this.initCustomEvents(o, callback); 432 } 433 434 if(this._isFormSubmit){ 435 if(this._isFileUpload){ 436 window.setTimeout(function(){YCM.uploadFile(o, callback, uri, postData);}, 10); 437 return o; 438 } 439 440 // If the specified HTTP method is GET, setForm() will return an 441 // encoded string that is concatenated to the uri to 442 // create a querystring. 443 if(method.toUpperCase() == 'GET'){ 444 if(this._sFormData.length !== 0){ 445 // If the URI already contains a querystring, append an ampersand 446 // and then concatenate _sFormData to the URI. 447 uri += ((uri.indexOf('?') == -1)?'?':'&') + this._sFormData; 448 } 449 } 450 else if(method.toUpperCase() == 'POST'){ 451 // If POST data exist in addition to the HTML form data, 452 // it will be concatenated to the form data. 453 postData = postData?this._sFormData + "&" + postData:this._sFormData; 454 } 455 } 456 457 if(method.toUpperCase() == 'GET' && (callback && callback.cache === false)){ 458 // If callback.cache is defined and set to false, a 459 // timestamp value will be added to the querystring. 460 uri += ((uri.indexOf('?') == -1)?'?':'&') + "rnd=" + new Date().valueOf().toString(); 461 } 462 463 // Each transaction will automatically include a custom header of 464 // "X-Requested-With: XMLHttpRequest" to identify the request as 465 // having originated from Connection Manager. 466 if(this._use_default_xhr_header){ 467 if(!this._default_headers['X-Requested-With']){ 468 this.initHeader('X-Requested-With', this._default_xhr_header, true); 469 YAHOO.log('Initialize transaction header X-Request-Header to XMLHttpRequest.', 'info', 'Connection'); 470 } 471 } 472 473 //If the transaction method is POST and the POST header value is set to true 474 //or a custom value, initalize the Content-Type header to this value. 475 if((method.toUpperCase() === 'POST' && this._use_default_post_header) && this._isFormSubmit === false){ 476 this.initHeader('Content-Type', this._default_post_header); 477 YAHOO.log('Initialize header Content-Type to application/x-www-form-urlencoded; UTF-8 for POST transaction.', 'info', 'Connection'); 478 } 479 480 if(o.xdr){ 481 this.xdr(o, method, uri, callback, postData); 482 return o; 483 } 484 485 o.conn.open(method, uri, true); 486 //Initialize all default and custom HTTP headers, 487 if(this._has_default_headers || this._has_http_headers){ 488 this.setHeader(o); 489 } 490 491 this.handleReadyState(o, callback); 492 o.conn.send(postData || ''); 493 YAHOO.log('Transaction ' + o.tId + ' sent.', 'info', 'Connection'); 494 495 // Reset the HTML form data and state properties as 496 // soon as the data are submitted. 497 if(this._isFormSubmit === true){ 498 this.resetFormState(); 499 } 500 501 // Fire global custom event -- startEvent 502 this.startEvent.fire(o, args); 503 504 if(o.startEvent){ 505 // Fire transaction custom event -- startEvent 506 o.startEvent.fire(o, args); 507 } 508 509 return o; 510 } 511 }, 512 513 /** 514 * @description This method creates and subscribes custom events, 515 * specific to each transaction 516 * @method initCustomEvents 517 * @private 518 * @static 519 * @param {object} o The connection object 520 * @param {callback} callback The user-defined callback object 521 * @return {void} 522 */ 523 initCustomEvents:function(o, callback) 524 { 525 var prop; 526 // Enumerate through callback.customevents members and bind/subscribe 527 // events that match in the _customEvents table. 528 for(prop in callback.customevents){ 529 if(this._customEvents[prop][0]){ 530 // Create the custom event 531 o[this._customEvents[prop][0]] = new YAHOO.util.CustomEvent(this._customEvents[prop][1], (callback.scope)?callback.scope:null); 532 YAHOO.log('Transaction-specific Custom Event ' + o[this._customEvents[prop][1]] + ' created.', 'info', 'Connection'); 533 534 // Subscribe the custom event 535 o[this._customEvents[prop][0]].subscribe(callback.customevents[prop]); 536 YAHOO.log('Transaction-specific Custom Event ' + o[this._customEvents[prop][1]] + ' subscribed.', 'info', 'Connection'); 537 } 538 } 539 }, 540 541 /** 542 * @description This method serves as a timer that polls the XHR object's readyState 543 * property during a transaction, instead of binding a callback to the 544 * onreadystatechange event. Upon readyState 4, handleTransactionResponse 545 * will process the response, and the timer will be cleared. 546 * @method handleReadyState 547 * @private 548 * @static 549 * @param {object} o The connection object 550 * @param {callback} callback The user-defined callback object 551 * @return {void} 552 */ 553 554 handleReadyState:function(o, callback) 555 556 { 557 var oConn = this, 558 args = (callback && callback.argument)?callback.argument:null; 559 560 if(callback && callback.timeout){ 561 this._timeOut[o.tId] = window.setTimeout(function(){ oConn.abort(o, callback, true); }, callback.timeout); 562 } 563 564 this._poll[o.tId] = window.setInterval( 565 function(){ 566 if(o.conn && o.conn.readyState === 4){ 567 568 // Clear the polling interval for the transaction 569 // and remove the reference from _poll. 570 window.clearInterval(oConn._poll[o.tId]); 571 delete oConn._poll[o.tId]; 572 573 if(callback && callback.timeout){ 574 window.clearTimeout(oConn._timeOut[o.tId]); 575 delete oConn._timeOut[o.tId]; 576 } 577 578 // Fire global custom event -- completeEvent 579 oConn.completeEvent.fire(o, args); 580 581 if(o.completeEvent){ 582 // Fire transaction custom event -- completeEvent 583 o.completeEvent.fire(o, args); 584 } 585 586 oConn.handleTransactionResponse(o, callback); 587 } 588 } 589 ,this._polling_interval); 590 }, 591 592 /** 593 * @description This method attempts to interpret the server response and 594 * determine whether the transaction was successful, or if an error or 595 * exception was encountered. 596 * @method handleTransactionResponse 597 * @private 598 * @static 599 * @param {object} o The connection object 600 * @param {object} callback The user-defined callback object 601 * @param {boolean} isAbort Determines if the transaction was terminated via abort(). 602 * @return {void} 603 */ 604 handleTransactionResponse:function(o, callback, isAbort) 605 { 606 var httpStatus, responseObject, 607 args = (callback && callback.argument)?callback.argument:null, 608 xdrS = (o.r && o.r.statusText === 'xdr:success')?true:false, 609 xdrF = (o.r && o.r.statusText === 'xdr:failure')?true:false, 610 xdrA = isAbort; 611 612 try 613 { 614 if((o.conn.status !== undefined && o.conn.status !== 0) || xdrS){ 615 // XDR requests will not have HTTP status defined. The 616 // statusText property will define the response status 617 // set by the Flash transport. 618 httpStatus = o.conn.status; 619 } 620 else if(xdrF && !xdrA){ 621 // Set XDR transaction failure to a status of 0, which 622 // resolves as an HTTP failure, instead of an exception. 623 httpStatus = 0; 624 } 625 else{ 626 httpStatus = 13030; 627 } 628 } 629 catch(e){ 630 631 // 13030 is a custom code to indicate the condition -- in Mozilla/FF -- 632 // when the XHR object's status and statusText properties are 633 // unavailable, and a query attempt throws an exception. 634 httpStatus = 13030; 635 } 636 637 if((httpStatus >= 200 && httpStatus < 300) || httpStatus === 1223 || xdrS){ 638 responseObject = o.xdr ? o.r : this.createResponseObject(o, args); 639 if(callback && callback.success){ 640 if(!callback.scope){ 641 callback.success(responseObject); 642 YAHOO.log('Success callback. HTTP code is ' + httpStatus, 'info', 'Connection'); 643 } 644 else{ 645 // If a scope property is defined, the callback will be fired from 646 // the context of the object. 647 callback.success.apply(callback.scope, [responseObject]); 648 YAHOO.log('Success callback with scope. HTTP code is ' + httpStatus, 'info', 'Connection'); 649 } 650 } 651 652 // Fire global custom event -- successEvent 653 this.successEvent.fire(responseObject); 654 655 if(o.successEvent){ 656 // Fire transaction custom event -- successEvent 657 o.successEvent.fire(responseObject); 658 } 659 } 660 else{ 661 switch(httpStatus){ 662 // The following cases are wininet.dll error codes that may be encountered. 663 case 12002: // Server timeout 664 case 12029: // 12029 to 12031 correspond to dropped connections. 665 case 12030: 666 case 12031: 667 case 12152: // Connection closed by server. 668 case 13030: // See above comments for variable status. 669 // XDR transactions will not resolve to this case, since the 670 // response object is already built in the xdr response. 671 responseObject = this.createExceptionObject(o.tId, args, (isAbort?isAbort:false)); 672 if(callback && callback.failure){ 673 if(!callback.scope){ 674 callback.failure(responseObject); 675 YAHOO.log('Failure callback. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection'); 676 } 677 else{ 678 callback.failure.apply(callback.scope, [responseObject]); 679 YAHOO.log('Failure callback with scope. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection'); 680 } 681 } 682 683 break; 684 default: 685 responseObject = (o.xdr) ? o.response : this.createResponseObject(o, args); 686 if(callback && callback.failure){ 687 if(!callback.scope){ 688 callback.failure(responseObject); 689 YAHOO.log('Failure callback. HTTP status code is ' + httpStatus, 'warn', 'Connection'); 690 } 691 else{ 692 callback.failure.apply(callback.scope, [responseObject]); 693 YAHOO.log('Failure callback with scope. HTTP status code is ' + httpStatus, 'warn', 'Connection'); 694 } 695 } 696 } 697 698 // Fire global custom event -- failureEvent 699 this.failureEvent.fire(responseObject); 700 701 if(o.failureEvent){ 702 // Fire transaction custom event -- failureEvent 703 o.failureEvent.fire(responseObject); 704 } 705 706 } 707 708 this.releaseObject(o); 709 responseObject = null; 710 }, 711 712 /** 713 * @description This method evaluates the server response, creates and returns the results via 714 * its properties. Success and failure cases will differ in the response 715 * object's property values. 716 * @method createResponseObject 717 * @private 718 * @static 719 * @param {object} o The connection object 720 * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback 721 * @return {object} 722 */ 723 createResponseObject:function(o, callbackArg) 724 { 725 var obj = {}, headerObj = {}, 726 i, headerStr, header, delimitPos; 727 728 try 729 { 730 headerStr = o.conn.getAllResponseHeaders(); 731 header = headerStr.split('\n'); 732 for(i=0; i<header.length; i++){ 733 delimitPos = header[i].indexOf(':'); 734 if(delimitPos != -1){ 735 headerObj[header[i].substring(0,delimitPos)] = YAHOO.lang.trim(header[i].substring(delimitPos+2)); 736 } 737 } 738 } 739 catch(e){} 740 741 obj.tId = o.tId; 742 // Normalize IE's response to HTTP 204 when Win error 1223. 743 obj.status = (o.conn.status == 1223)?204:o.conn.status; 744 // Normalize IE's statusText to "No Content" instead of "Unknown". 745 obj.statusText = (o.conn.status == 1223)?"No Content":o.conn.statusText; 746 obj.getResponseHeader = headerObj; 747 obj.getAllResponseHeaders = headerStr; 748 obj.responseText = o.conn.responseText; 749 obj.responseXML = o.conn.responseXML; 750 751 if(callbackArg){ 752 obj.argument = callbackArg; 753 } 754 755 return obj; 756 }, 757 758 /** 759 * @description If a transaction cannot be completed due to dropped or closed connections, 760 * there may be not be enough information to build a full response object. 761 * The failure callback will be fired and this specific condition can be identified 762 * by a status property value of 0. 763 * 764 * If an abort was successful, the status property will report a value of -1. 765 * 766 * @method createExceptionObject 767 * @private 768 * @static 769 * @param {int} tId The Transaction Id 770 * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback 771 * @param {boolean} isAbort Determines if the exception case is caused by a transaction abort 772 * @return {object} 773 */ 774 createExceptionObject:function(tId, callbackArg, isAbort) 775 { 776 var COMM_CODE = 0, 777 COMM_ERROR = 'communication failure', 778 ABORT_CODE = -1, 779 ABORT_ERROR = 'transaction aborted', 780 obj = {}; 781 782 obj.tId = tId; 783 if(isAbort){ 784 obj.status = ABORT_CODE; 785 obj.statusText = ABORT_ERROR; 786 } 787 else{ 788 obj.status = COMM_CODE; 789 obj.statusText = COMM_ERROR; 790 } 791 792 if(callbackArg){ 793 obj.argument = callbackArg; 794 } 795 796 return obj; 797 }, 798 799 /** 800 * @description Method that initializes the custom HTTP headers for the each transaction. 801 * @method initHeader 802 * @public 803 * @static 804 * @param {string} label The HTTP header label 805 * @param {string} value The HTTP header value 806 * @param {string} isDefault Determines if the specific header is a default header 807 * automatically sent with each transaction. 808 * @return {void} 809 */ 810 initHeader:function(label, value, isDefault) 811 { 812 var headerObj = (isDefault)?this._default_headers:this._http_headers; 813 814 headerObj[label] = value; 815 if(isDefault){ 816 this._has_default_headers = true; 817 } 818 else{ 819 this._has_http_headers = true; 820 } 821 }, 822 823 824 /** 825 * @description Accessor that sets the HTTP headers for each transaction. 826 * @method setHeader 827 * @private 828 * @static 829 * @param {object} o The connection object for the transaction. 830 * @return {void} 831 */ 832 setHeader:function(o) 833 { 834 var prop; 835 if(this._has_default_headers){ 836 for(prop in this._default_headers){ 837 if(YAHOO.lang.hasOwnProperty(this._default_headers, prop)){ 838 o.conn.setRequestHeader(prop, this._default_headers[prop]); 839 YAHOO.log('Default HTTP header ' + prop + ' set with value of ' + this._default_headers[prop], 'info', 'Connection'); 840 } 841 } 842 } 843 844 if(this._has_http_headers){ 845 for(prop in this._http_headers){ 846 if(YAHOO.lang.hasOwnProperty(this._http_headers, prop)){ 847 o.conn.setRequestHeader(prop, this._http_headers[prop]); 848 YAHOO.log('HTTP header ' + prop + ' set with value of ' + this._http_headers[prop], 'info', 'Connection'); 849 } 850 } 851 852 this._http_headers = {}; 853 this._has_http_headers = false; 854 } 855 }, 856 857 /** 858 * @description Resets the default HTTP headers object 859 * @method resetDefaultHeaders 860 * @public 861 * @static 862 * @return {void} 863 */ 864 resetDefaultHeaders:function(){ 865 this._default_headers = {}; 866 this._has_default_headers = false; 867 }, 868 869 /** 870 * @description Method to terminate a transaction, if it has not reached readyState 4. 871 * @method abort 872 * @public 873 * @static 874 * @param {object} o The connection object returned by asyncRequest. 875 * @param {object} callback User-defined callback object. 876 * @param {string} isTimeout boolean to indicate if abort resulted from a callback timeout. 877 * @return {boolean} 878 */ 879 abort:function(o, callback, isTimeout) 880 { 881 var abortStatus, 882 args = (callback && callback.argument)?callback.argument:null; 883 o = o || {}; 884 885 if(o.conn){ 886 if(o.xhr){ 887 if(this.isCallInProgress(o)){ 888 // Issue abort request 889 o.conn.abort(); 890 891 window.clearInterval(this._poll[o.tId]); 892 delete this._poll[o.tId]; 893 894 if(isTimeout){ 895 window.clearTimeout(this._timeOut[o.tId]); 896 delete this._timeOut[o.tId]; 897 } 898 899 abortStatus = true; 900 } 901 } 902 else if(o.xdr){ 903 o.conn.abort(o.tId); 904 abortStatus = true; 905 } 906 } 907 else if(o.upload){ 908 var frameId = 'yuiIO' + o.tId; 909 var io = document.getElementById(frameId); 910 911 if(io){ 912 // Remove all listeners on the iframe prior to 913 // its destruction. 914 YAHOO.util.Event.removeListener(io, "load"); 915 // Destroy the iframe facilitating the transaction. 916 document.body.removeChild(io); 917 YAHOO.log('File upload iframe destroyed. Id is:' + frameId, 'info', 'Connection'); 918 919 if(isTimeout){ 920 window.clearTimeout(this._timeOut[o.tId]); 921 delete this._timeOut[o.tId]; 922 } 923 924 abortStatus = true; 925 } 926 } 927 else{ 928 abortStatus = false; 929 } 930 931 if(abortStatus === true){ 932 // Fire global custom event -- abortEvent 933 this.abortEvent.fire(o, args); 934 935 if(o.abortEvent){ 936 // Fire transaction custom event -- abortEvent 937 o.abortEvent.fire(o, args); 938 } 939 940 this.handleTransactionResponse(o, callback, true); 941 YAHOO.log('Transaction ' + o.tId + ' aborted.', 'info', 'Connection'); 942 } 943 944 return abortStatus; 945 }, 946 947 /** 948 * @description Determines if the transaction is still being processed. 949 * @method isCallInProgress 950 * @public 951 * @static 952 * @param {object} o The connection object returned by asyncRequest 953 * @return {boolean} 954 */ 955 isCallInProgress:function(o) 956 { 957 o = o || {}; 958 // if the XHR object assigned to the transaction has not been dereferenced, 959 // then check its readyState status. Otherwise, return false. 960 if(o.xhr && o.conn){ 961 return o.conn.readyState !== 4 && o.conn.readyState !== 0; 962 } 963 else if(o.xdr && o.conn){ 964 return o.conn.isCallInProgress(o.tId); 965 } 966 else if(o.upload === true){ 967 return document.getElementById('yuiIO' + o.tId)?true:false; 968 } 969 else{ 970 return false; 971 } 972 }, 973 974 /** 975 * @description Dereference the XHR instance and the connection object after the transaction is completed. 976 * @method releaseObject 977 * @private 978 * @static 979 * @param {object} o The connection object 980 * @return {void} 981 */ 982 releaseObject:function(o) 983 { 984 if(o && o.conn){ 985 //dereference the XHR instance. 986 o.conn = null; 987 988 YAHOO.log('Connection object for transaction ' + o.tId + ' destroyed.', 'info', 'Connection'); 989 990 //dereference the connection object. 991 o = null; 992 } 993 } 994 }; 995 996 YAHOO.register("connection_core", YAHOO.util.Connect, {version: "2.9.0", build: "2800"}); 997 998 }, '2.9.0' ,{"requires": ["yui2-yahoo", "yui2-event"]});
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |