summaryrefslogtreecommitdiff
path: root/lib/dojo/request/iframe.js.uncompressed.js
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2013-03-18 10:26:24 +0400
committerAndrew Dolgov <[email protected]>2013-03-18 10:26:26 +0400
commitf0cfe83e3725f9a3928da97a6e3085e79cb25309 (patch)
tree4b0af188defaa807c7bc6ff3a101b41c9166c463 /lib/dojo/request/iframe.js.uncompressed.js
parent9a2885da170ffd64358b99194095851a2d09c1b6 (diff)
upgrade dojo to 1.8.3 (refs #570)
Diffstat (limited to 'lib/dojo/request/iframe.js.uncompressed.js')
-rw-r--r--lib/dojo/request/iframe.js.uncompressed.js430
1 files changed, 430 insertions, 0 deletions
diff --git a/lib/dojo/request/iframe.js.uncompressed.js b/lib/dojo/request/iframe.js.uncompressed.js
new file mode 100644
index 000000000..aee6b0c4d
--- /dev/null
+++ b/lib/dojo/request/iframe.js.uncompressed.js
@@ -0,0 +1,430 @@
+define("dojo/request/iframe", [
+ 'module',
+ 'require',
+ './watch',
+ './util',
+ './handlers',
+ '../_base/lang',
+ '../io-query',
+ '../query',
+ '../has',
+ '../dom',
+ '../dom-construct',
+ '../_base/window'/*=====,
+ '../request',
+ '../_base/declare' =====*/
+], function(module, require, watch, util, handlers, lang, ioQuery, query, has, dom, domConstruct, win/*=====, request, declare =====*/){
+ var mid = module.id.replace(/[\/\.\-]/g, '_'),
+ onload = mid + '_onload';
+
+ if(!win.global[onload]){
+ win.global[onload] = function(){
+ var dfd = iframe._currentDfd;
+ if(!dfd){
+ iframe._fireNextRequest();
+ return;
+ }
+
+ var response = dfd.response,
+ options = response.options,
+ formNode = dom.byId(options.form) || dfd._tmpForm;
+
+ if(formNode){
+ // remove all the hidden content inputs
+ var toClean = dfd._contentToClean;
+ for(var i=0; i<toClean.length; i++){
+ var key = toClean[i];
+ //Need to cycle over all nodes since we may have added
+ //an array value which means that more than one node could
+ //have the same .name value.
+ for(var j=0; j<formNode.childNodes.length; j++){
+ var childNode = formNode.childNodes[j];
+ if(childNode.name === key){
+ domConstruct.destroy(childNode);
+ break;
+ }
+ }
+ }
+
+ // restore original action + target
+ dfd._originalAction && formNode.setAttribute('action', dfd._originalAction);
+ if(dfd._originalMethod){
+ formNode.setAttribute('method', dfd._originalMethod);
+ formNode.method = dfd._originalMethod;
+ }
+ if(dfd._originalTarget){
+ formNode.setAttribute('target', dfd._originalTarget);
+ formNode.target = dfd._originalTarget;
+ }
+ }
+
+ if(dfd._tmpForm){
+ domConstruct.destroy(dfd._tmpForm);
+ delete dfd._tmpForm;
+ }
+
+ dfd._finished = true;
+ };
+ }
+
+ function create(name, onloadstr, uri){
+ if(win.global[name]){
+ return win.global[name];
+ }
+
+ if(win.global.frames[name]){
+ return win.global.frames[name];
+ }
+
+ if(!uri){
+ if(has('config-useXDomain') && !has('config-dojoBlankHtmlUrl')){
+ console.warn('dojo/request/iframe: When using cross-domain Dojo builds,' +
+ ' please save dojo/resources/blank.html to your domain and set dojoConfig.dojoBlankHtmlUrl' +
+ ' to the path on your domain to blank.html');
+ }
+ uri = (has('config-dojoBlankHtmlUrl')||require.toUrl('dojo/resources/blank.html'));
+ }
+
+ var frame = domConstruct.place(
+ '<iframe id="'+name+'" name="'+name+'" src="'+uri+'" onload="'+onloadstr+
+ '" style="position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden">',
+ win.body());
+
+ win.global[name] = frame;
+
+ return frame;
+ }
+
+ function setSrc(_iframe, src, replace){
+ var frame = win.global.frames[_iframe.name];
+
+ if(frame.contentWindow){
+ // We have an iframe node instead of the window
+ frame = frame.contentWindow;
+ }
+
+ try{
+ if(!replace){
+ frame.location = src;
+ }else{
+ frame.location.replace(src);
+ }
+ }catch(e){
+ console.log('dojo/request/iframe.setSrc: ', e);
+ }
+ }
+
+ function doc(iframeNode){
+ if(iframeNode.contentDocument){
+ return iframeNode.contentDocument;
+ }
+ var name = iframeNode.name;
+ if(name){
+ var iframes = win.doc.getElementsByTagName('iframe');
+ if(iframeNode.document && iframes[name].contentWindow && iframes[name].contentWindow.document){
+ return iframes[name].contentWindow.document;
+ }else if(win.doc.frames[name] && win.doc.frames[name].document){
+ return win.doc.frames[name].document;
+ }
+ }
+ return null;
+ }
+
+ function createForm(){
+ return domConstruct.create('form', {
+ name: mid + '_form',
+ style: {
+ position: 'absolute',
+ top: '-1000px',
+ left: '-1000px'
+ }
+ }, win.body());
+ }
+
+ function fireNextRequest(){
+ // summary:
+ // Internal method used to fire the next request in the queue.
+ var dfd;
+ try{
+ if(iframe._currentDfd || !iframe._dfdQueue.length){
+ return;
+ }
+ do{
+ dfd = iframe._currentDfd = iframe._dfdQueue.shift();
+ }while(dfd && (dfd.canceled || (dfd.isCanceled && dfd.isCanceled())) && iframe._dfdQueue.length);
+
+ if(!dfd || dfd.canceled || (dfd.isCanceled && dfd.isCanceled())){
+ iframe._currentDfd = null;
+ return;
+ }
+
+ var response = dfd.response,
+ options = response.options,
+ c2c = dfd._contentToClean = [],
+ formNode = dom.byId(options.form),
+ notify = util.notify,
+ data = options.data || null,
+ queryStr;
+
+ if(!dfd._legacy && options.method === 'POST' && !formNode){
+ formNode = dfd._tmpForm = createForm();
+ }else if(options.method === 'GET' && formNode && response.url.indexOf('?') > -1){
+ queryStr = response.url.slice(response.url.indexOf('?') + 1);
+ data = lang.mixin(ioQuery.queryToObject(queryStr), data);
+ }
+
+ if(formNode){
+ if(!dfd._legacy){
+ var parentNode = formNode;
+ do{
+ parentNode = parentNode.parentNode;
+ }while(parentNode !== win.doc.documentElement);
+
+ // Append the form node or some browsers won't work
+ if(!parentNode){
+ formNode.style.position = 'absolute';
+ formNode.style.left = '-1000px';
+ formNode.style.top = '-1000px';
+ win.body().appendChild(formNode);
+ }
+
+ if(!formNode.name){
+ formNode.name = mid + '_form';
+ }
+ }
+
+ // if we have things in data, we need to add them to the form
+ // before submission
+ if(data){
+ var createInput = function(name, value){
+ domConstruct.create('input', {
+ type: 'hidden',
+ name: name,
+ value: value
+ }, formNode);
+ c2c.push(name);
+ };
+ for(var x in data){
+ var val = data[x];
+ if(lang.isArray(val) && val.length > 1){
+ for(var i=0; i<val.length; i++){
+ createInput(x, val[i]);
+ }
+ }else{
+ if(!formNode[x]){
+ createInput(x, val);
+ }else{
+ formNode[x].value = val;
+ }
+ }
+ }
+ }
+
+ //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
+ //so use it for all. See #2844
+ var actionNode = formNode.getAttributeNode('action'),
+ methodNode = formNode.getAttributeNode('method'),
+ targetNode = formNode.getAttributeNode('target');
+
+ if(response.url){
+ dfd._originalAction = actionNode ? actionNode.value : null;
+ if(actionNode){
+ actionNode.value = response.url;
+ }else{
+ formNode.setAttribute('action', response.url);
+ }
+ }
+
+ if(!dfd._legacy){
+ dfd._originalMethod = methodNode ? methodNode.value : null;
+ if(methodNode){
+ methodNode.value = options.method;
+ }else{
+ formNode.setAttribute('method', options.method);
+ }
+ }else{
+ if(!methodNode || !methodNode.value){
+ if(mthdNode){
+ mthdNode.value = options.method;
+ }else{
+ fn.setAttribute("method", options.method);
+ }
+ }
+ }
+
+ dfd._originalTarget = targetNode ? targetNode.value : null;
+ if(targetNode){
+ targetNode.value = iframe._iframeName;
+ }else{
+ formNode.setAttribute('target', iframe._iframeName);
+ }
+ formNode.target = iframe._iframeName;
+
+ notify && notify.emit('send', response, dfd.promise.cancel);
+ iframe._notifyStart(response);
+ formNode.submit();
+ }else{
+ // otherwise we post a GET string by changing URL location for the
+ // iframe
+
+ var extra = '';
+ if(response.options.data){
+ extra = response.options.data;
+ if(typeof extra !== 'string'){
+ extra = ioQuery.objectToQuery(extra);
+ }
+ }
+ var tmpUrl = response.url + (response.url.indexOf('?') > -1 ? '&' : '?') + extra;
+ notify && notify.emit('send', response, dfd.promise.cancel);
+ iframe._notifyStart(response);
+ iframe.setSrc(iframe._frame, tmpUrl, true);
+ }
+ }catch(e){
+ dfd.reject(e);
+ }
+ }
+
+ // dojo/request/watch handlers
+ function isValid(response){
+ return !this.isFulfilled();
+ }
+ function isReady(response){
+ return !!this._finished;
+ }
+ function handleResponse(response, error){
+ if(!error){
+ try{
+ var options = response.options,
+ doc = iframe.doc(iframe._frame),
+ handleAs = options.handleAs;
+
+ if(handleAs !== 'html'){
+ if(handleAs === 'xml'){
+ // IE6-8 have to parse the XML manually. See http://bugs.dojotoolkit.org/ticket/6334
+ if(doc.documentElement.tagName.toLowerCase() === 'html'){
+ query('a', doc.documentElement).orphan();
+ var xmlText = doc.documentElement.innerText;
+ xmlText = xmlText.replace(/>\s+</g, '><');
+ response.text = lang.trim(xmlText);
+ }else{
+ response.data = doc;
+ }
+ }else{
+ // 'json' and 'javascript' and 'text'
+ response.text = doc.getElementsByTagName('textarea')[0].value; // text
+ }
+ handlers(response);
+ }else{
+ response.data = doc;
+ }
+ }catch(e){
+ error = e;
+ }
+ }
+
+ if(error){
+ this.reject(error);
+ }else if(this._finished){
+ this.resolve(response);
+ }else{
+ this.reject(new Error('Invalid dojo/request/iframe request state'));
+ }
+ }
+ function last(response){
+ this._callNext();
+ }
+
+ var defaultOptions = {
+ method: 'POST'
+ };
+ function iframe(url, options, returnDeferred){
+ var response = util.parseArgs(url, util.deepCreate(defaultOptions, options), true);
+ url = response.url;
+ options = response.options;
+
+ if(options.method !== 'GET' && options.method !== 'POST'){
+ throw new Error(options.method + ' not supported by dojo/request/iframe');
+ }
+
+ if(!iframe._frame){
+ iframe._frame = iframe.create(iframe._iframeName, onload + '();');
+ }
+
+ var dfd = util.deferred(response, null, isValid, isReady, handleResponse, last);
+ dfd._callNext = function(){
+ if(!this._calledNext){
+ this._calledNext = true;
+ iframe._currentDfd = null;
+ iframe._fireNextRequest();
+ }
+ };
+ dfd._legacy = returnDeferred;
+
+ iframe._dfdQueue.push(dfd);
+ iframe._fireNextRequest();
+
+ watch(dfd);
+
+ return returnDeferred ? dfd : dfd.promise;
+ }
+
+ /*=====
+ iframe = function(url, options){
+ // summary:
+ // Sends a request using an iframe element with the given URL and options.
+ // url: String
+ // URL to request
+ // options: dojo/request/iframe.__Options?
+ // Options for the request.
+ // returns: dojo/request.__Promise
+ };
+ iframe.__BaseOptions = declare(request.__BaseOptions, {
+ // form: DOMNode?
+ // A form node to use to submit data to the server.
+ // data: String|Object?
+ // Data to transfer. When making a GET request, this will
+ // be converted to key=value parameters and appended to the
+ // URL.
+ });
+ iframe.__MethodOptions = declare(null, {
+ // method: String?
+ // The HTTP method to use to make the request. Must be
+ // uppercase. Only `"GET"` and `"POST"` are accepted.
+ // Default is `"POST"`.
+ });
+ iframe.__Options = declare([iframe.__BaseOptions, iframe.__MethodOptions]);
+
+ iframe.get = function(url, options){
+ // summary:
+ // Send an HTTP GET request using an iframe element with the given URL and options.
+ // url: String
+ // URL to request
+ // options: dojo/request/iframe.__BaseOptions?
+ // Options for the request.
+ // returns: dojo/request.__Promise
+ };
+ iframe.post = function(url, options){
+ // summary:
+ // Send an HTTP POST request using an iframe element with the given URL and options.
+ // url: String
+ // URL to request
+ // options: dojo/request/iframe.__BaseOptions?
+ // Options for the request.
+ // returns: dojo/request.__Promise
+ };
+ =====*/
+ iframe.create = create;
+ iframe.doc = doc;
+ iframe.setSrc = setSrc;
+
+ // TODO: Make these truly private in 2.0
+ iframe._iframeName = mid + '_IoIframe';
+ iframe._notifyStart = function(){};
+ iframe._dfdQueue = [];
+ iframe._currentDfd = null;
+ iframe._fireNextRequest = fireNextRequest;
+
+ util.addCommonMethods(iframe, ['GET', 'POST']);
+
+ return iframe;
+});