X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=lib%2Fdijit%2Flayout%2FContentPane.js;h=1e2a2036bb4bc93d266d26b714d4361da824dbee;hb=1354d17270961fff662d40f90521223f8fd0d73b;hp=399ec1bc9e4844804a207e3362b0bcc00fadb06e;hpb=d04f8c826f5283765f52cf6b98b42a1ed8f2d6bc;p=tt-rss.git diff --git a/lib/dijit/layout/ContentPane.js b/lib/dijit/layout/ContentPane.js index 399ec1bc..1e2a2036 100644 --- a/lib/dijit/layout/ContentPane.js +++ b/lib/dijit/layout/ContentPane.js @@ -1,593 +1,2 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dijit.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.ContentPane"] = true; -dojo.provide("dijit.layout.ContentPane"); -dojo.require("dijit._Widget"); -dojo.require("dijit.layout._ContentPaneResizeMixin"); -dojo.require("dojo.string"); -dojo.require("dojo.html"); -dojo.requireLocalization("dijit", "loading", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw"); - - -dojo.declare( - "dijit.layout.ContentPane", [dijit._Widget, dijit.layout._ContentPaneResizeMixin], -{ - // summary: - // A widget containing an HTML fragment, specified inline - // or by uri. Fragment may include widgets. - // - // description: - // This widget embeds a document fragment in the page, specified - // either by uri, javascript generated markup or DOM reference. - // Any widgets within this content are instantiated and managed, - // but laid out according to the HTML structure. Unlike IFRAME, - // ContentPane embeds a document fragment as would be found - // inside the BODY tag of a full HTML document. It should not - // contain the HTML, HEAD, or BODY tags. - // For more advanced functionality with scripts and - // stylesheets, see dojox.layout.ContentPane. This widget may be - // used stand alone or as a base class for other widgets. - // ContentPane is useful as a child of other layout containers - // such as BorderContainer or TabContainer, but note that those - // widgets can contain any widget as a child. - // - // example: - // Some quick samples: - // To change the innerHTML: cp.set('content', 'new content') - // - // Or you can send it a NodeList: cp.set('content', dojo.query('div [class=selected]', userSelection)) - // - // To do an ajax update: cp.set('href', url) - - // href: String - // The href of the content that displays now. - // Set this at construction if you want to load data externally when the - // pane is shown. (Set preload=true to load it immediately.) - // Changing href after creation doesn't have any effect; Use set('href', ...); - href: "", - -/*===== - // content: String || DomNode || NodeList || dijit._Widget - // The innerHTML of the ContentPane. - // Note that the initialization parameter / argument to set("content", ...) - // can be a String, DomNode, Nodelist, or _Widget. - content: "", -=====*/ - - // extractContent: Boolean - // Extract visible content from inside of .... . - // I.e., strip and (and it's contents) from the href - extractContent: false, - - // parseOnLoad: Boolean - // Parse content and create the widgets, if any. - parseOnLoad: true, - - // parserScope: String - // Flag passed to parser. Root for attribute names to search for. If scopeName is dojo, - // will search for data-dojo-type (or dojoType). For backwards compatibility - // reasons defaults to dojo._scopeName (which is "dojo" except when - // multi-version support is used, when it will be something like dojo16, dojo20, etc.) - parserScope: dojo._scopeName, - - // preventCache: Boolean - // Prevent caching of data from href's by appending a timestamp to the href. - preventCache: false, - - // preload: Boolean - // Force load of data on initialization even if pane is hidden. - preload: false, - - // refreshOnShow: Boolean - // Refresh (re-download) content when pane goes from hidden to shown - refreshOnShow: false, - - // loadingMessage: String - // Message that shows while downloading - loadingMessage: "${loadingState}", - - // errorMessage: String - // Message that shows if an error occurs - errorMessage: "${errorState}", - - // isLoaded: [readonly] Boolean - // True if the ContentPane has data in it, either specified - // during initialization (via href or inline content), or set - // via set('content', ...) / set('href', ...) - // - // False if it doesn't have any content, or if ContentPane is - // still in the process of downloading href. - isLoaded: false, - - baseClass: "dijitContentPane", - - // ioArgs: Object - // Parameters to pass to xhrGet() request, for example: - // |
- ioArgs: {}, - - // onLoadDeferred: [readonly] dojo.Deferred - // This is the `dojo.Deferred` returned by set('href', ...) and refresh(). - // Calling onLoadDeferred.addCallback() or addErrback() registers your - // callback to be called only once, when the prior set('href', ...) call or - // the initial href parameter to the constructor finishes loading. - // - // This is different than an onLoad() handler which gets called any time any href - // or content is loaded. - onLoadDeferred: null, - - // Override _Widget's attributeMap because we don't want the title attribute (used to specify - // tab labels) to be copied to ContentPane.domNode... otherwise a tooltip shows up over the - // entire pane. - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - title: [] - }), - - // Flag to parser that I'll parse my contents, so it shouldn't. - stopParser: true, - - // template: [private] Boolean - // Flag from the parser that this ContentPane is inside a template - // so the contents are pre-parsed. - // (TODO: this declaration can be commented out in 2.0) - template: false, - - create: function(params, srcNodeRef){ - // Convert a srcNodeRef argument into a content parameter, so that the original contents are - // processed in the same way as contents set via set("content", ...), calling the parser etc. - // Avoid modifying original params object since that breaks NodeList instantiation, see #11906. - if((!params || !params.template) && srcNodeRef && !("href" in params) && !("content" in params)){ - var df = dojo.doc.createDocumentFragment(); - srcNodeRef = dojo.byId(srcNodeRef) - while(srcNodeRef.firstChild){ - df.appendChild(srcNodeRef.firstChild); - } - params = dojo.delegate(params, {content: df}); - } - this.inherited(arguments, [params, srcNodeRef]); - }, - - postMixInProperties: function(){ - this.inherited(arguments); - var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang); - this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages); - this.errorMessage = dojo.string.substitute(this.errorMessage, messages); - }, - - buildRendering: function(){ - this.inherited(arguments); - - // Since we have no template we need to set this.containerNode ourselves, to make getChildren() work. - // For subclasses of ContentPane that do have a template, does nothing. - if(!this.containerNode){ - this.containerNode = this.domNode; - } - - // remove the title attribute so it doesn't show up when hovering - // over a node (TODO: remove in 2.0, no longer needed after #11490) - this.domNode.title = ""; - - if(!dojo.attr(this.domNode,"role")){ - dijit.setWaiRole(this.domNode, "group"); - } - }, - - _startChildren: function(){ - // summary: - // Call startup() on all children including non _Widget ones like dojo.dnd.Source objects - - // This starts all the widgets - this.inherited(arguments); - - // And this catches stuff like dojo.dnd.Source - if(this._contentSetter){ - dojo.forEach(this._contentSetter.parseResults, function(obj){ - if(!obj._started && !obj._destroyed && dojo.isFunction(obj.startup)){ - obj.startup(); - obj._started = true; - } - }, this); - } - }, - - setHref: function(/*String|Uri*/ href){ - // summary: - // Deprecated. Use set('href', ...) instead. - dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.", "", "2.0"); - return this.set("href", href); - }, - _setHrefAttr: function(/*String|Uri*/ href){ - // summary: - // Hook so set("href", ...) works. - // description: - // Reset the (external defined) content of this pane and replace with new url - // Note: It delays the download until widget is shown if preload is false. - // href: - // url to the page you want to get, must be within the same domain as your mainpage - - // Cancel any in-flight requests (a set('href', ...) will cancel any in-flight set('href', ...)) - this.cancel(); - - this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel")); - this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad")); - - this._set("href", href); - - // _setHrefAttr() is called during creation and by the user, after creation. - // Assuming preload == false, only in the second case do we actually load the URL; - // otherwise it's done in startup(), and only if this widget is shown. - if(this.preload || (this._created && this._isShown())){ - this._load(); - }else{ - // Set flag to indicate that href needs to be loaded the next time the - // ContentPane is made visible - this._hrefChanged = true; - } - - return this.onLoadDeferred; // dojo.Deferred - }, - - setContent: function(/*String|DomNode|Nodelist*/data){ - // summary: - // Deprecated. Use set('content', ...) instead. - dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.", "", "2.0"); - this.set("content", data); - }, - _setContentAttr: function(/*String|DomNode|Nodelist*/data){ - // summary: - // Hook to make set("content", ...) work. - // Replaces old content with data content, include style classes from old content - // data: - // the new Content may be String, DomNode or NodeList - // - // if data is a NodeList (or an array of nodes) nodes are copied - // so you can import nodes from another document implicitly - - // clear href so we can't run refresh and clear content - // refresh should only work if we downloaded the content - this._set("href", ""); - - // Cancel any in-flight requests (a set('content', ...) will cancel any in-flight set('href', ...)) - this.cancel(); - - // Even though user is just setting content directly, still need to define an onLoadDeferred - // because the _onLoadHandler() handler is still getting called from setContent() - this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel")); - if(this._created){ - // For back-compat reasons, call onLoad() for set('content', ...) - // calls but not for content specified in srcNodeRef (ie:
...
) - // or as initialization parameter (ie: new ContentPane({content: ...}) - this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad")); - } - - this._setContent(data || ""); - - this._isDownloaded = false; // mark that content is from a set('content') not a set('href') - - return this.onLoadDeferred; // dojo.Deferred - }, - _getContentAttr: function(){ - // summary: - // Hook to make get("content") work - return this.containerNode.innerHTML; - }, - - cancel: function(){ - // summary: - // Cancels an in-flight download of content - if(this._xhrDfd && (this._xhrDfd.fired == -1)){ - this._xhrDfd.cancel(); - } - delete this._xhrDfd; // garbage collect - - this.onLoadDeferred = null; - }, - - uninitialize: function(){ - if(this._beingDestroyed){ - this.cancel(); - } - this.inherited(arguments); - }, - - destroyRecursive: function(/*Boolean*/ preserveDom){ - // summary: - // Destroy the ContentPane and its contents - - // if we have multiple controllers destroying us, bail after the first - if(this._beingDestroyed){ - return; - } - this.inherited(arguments); - }, - - _onShow: function(){ - // summary: - // Called when the ContentPane is made visible - // description: - // For a plain ContentPane, this is called on initialization, from startup(). - // If the ContentPane is a hidden pane of a TabContainer etc., then it's - // called whenever the pane is made visible. - // - // Does necessary processing, including href download and layout/resize of - // child widget(s) - - this.inherited(arguments); - - if(this.href){ - if(!this._xhrDfd && // if there's an href that isn't already being loaded - (!this.isLoaded || this._hrefChanged || this.refreshOnShow) - ){ - return this.refresh(); // If child has an href, promise that fires when the load is complete - } - } - }, - - refresh: function(){ - // summary: - // [Re]download contents of href and display - // description: - // 1. cancels any currently in-flight requests - // 2. posts "loading..." message - // 3. sends XHR to download new data - - // Cancel possible prior in-flight request - this.cancel(); - - this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel")); - this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad")); - this._load(); - return this.onLoadDeferred; // If child has an href, promise that fires when refresh is complete - }, - - _load: function(){ - // summary: - // Load/reload the href specified in this.href - - // display loading message - this._setContent(this.onDownloadStart(), true); - - var self = this; - var getArgs = { - preventCache: (this.preventCache || this.refreshOnShow), - url: this.href, - handleAs: "text" - }; - if(dojo.isObject(this.ioArgs)){ - dojo.mixin(getArgs, this.ioArgs); - } - - var hand = (this._xhrDfd = (this.ioMethod || dojo.xhrGet)(getArgs)); - - hand.addCallback(function(html){ - try{ - self._isDownloaded = true; - self._setContent(html, false); - self.onDownloadEnd(); - }catch(err){ - self._onError('Content', err); // onContentError - } - delete self._xhrDfd; - return html; - }); - - hand.addErrback(function(err){ - if(!hand.canceled){ - // show error message in the pane - self._onError('Download', err); // onDownloadError - } - delete self._xhrDfd; - return err; - }); - - // Remove flag saying that a load is needed - delete this._hrefChanged; - }, - - _onLoadHandler: function(data){ - // summary: - // This is called whenever new content is being loaded - this._set("isLoaded", true); - try{ - this.onLoadDeferred.callback(data); - }catch(e){ - console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message); - } - }, - - _onUnloadHandler: function(){ - // summary: - // This is called whenever the content is being unloaded - this._set("isLoaded", false); - try{ - this.onUnload(); - }catch(e){ - console.error('Error '+this.widgetId+' running custom onUnload code: ' + e.message); - } - }, - - destroyDescendants: function(){ - // summary: - // Destroy all the widgets inside the ContentPane and empty containerNode - - // Make sure we call onUnload (but only when the ContentPane has real content) - if(this.isLoaded){ - this._onUnloadHandler(); - } - - // Even if this.isLoaded == false there might still be a "Loading..." message - // to erase, so continue... - - // For historical reasons we need to delete all widgets under this.containerNode, - // even ones that the user has created manually. - var setter = this._contentSetter; - dojo.forEach(this.getChildren(), function(widget){ - if(widget.destroyRecursive){ - widget.destroyRecursive(); - } - }); - if(setter){ - // Most of the widgets in setter.parseResults have already been destroyed, but - // things like Menu that have been moved to haven't yet - dojo.forEach(setter.parseResults, function(widget){ - if(widget.destroyRecursive && widget.domNode && widget.domNode.parentNode == dojo.body()){ - widget.destroyRecursive(); - } - }); - delete setter.parseResults; - } - - // And then clear away all the DOM nodes - dojo.html._emptyNode(this.containerNode); - - // Delete any state information we have about current contents - delete this._singleChild; - }, - - _setContent: function(/*String|DocumentFragment*/ cont, /*Boolean*/ isFakeContent){ - // summary: - // Insert the content into the container node - - // first get rid of child widgets - this.destroyDescendants(); - - // dojo.html.set will take care of the rest of the details - // we provide an override for the error handling to ensure the widget gets the errors - // configure the setter instance with only the relevant widget instance properties - // NOTE: unless we hook into attr, or provide property setters for each property, - // we need to re-configure the ContentSetter with each use - var setter = this._contentSetter; - if(! (setter && setter instanceof dojo.html._ContentSetter)){ - setter = this._contentSetter = new dojo.html._ContentSetter({ - node: this.containerNode, - _onError: dojo.hitch(this, this._onError), - onContentError: dojo.hitch(this, function(e){ - // fires if a domfault occurs when we are appending this.errorMessage - // like for instance if domNode is a UL and we try append a DIV - var errMess = this.onContentError(e); - try{ - this.containerNode.innerHTML = errMess; - }catch(e){ - console.error('Fatal '+this.id+' could not change content due to '+e.message, e); - } - })/*, - _onError */ - }); - }; - - var setterParams = dojo.mixin({ - cleanContent: this.cleanContent, - extractContent: this.extractContent, - parseContent: this.parseOnLoad, - parserScope: this.parserScope, - startup: false, - dir: this.dir, - lang: this.lang - }, this._contentSetterParams || {}); - - setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams ); - - // setter params must be pulled afresh from the ContentPane each time - delete this._contentSetterParams; - - if(this.doLayout){ - this._checkIfSingleChild(); - } - - if(!isFakeContent){ - if(this._started){ - // Startup each top level child widget (and they will start their children, recursively) - this._startChildren(); - - // Call resize() on each of my child layout widgets, - // or resize() on my single child layout widget... - // either now (if I'm currently visible) or when I become visible - this._scheduleLayout(); - } - - this._onLoadHandler(cont); - } - }, - - _onError: function(type, err, consoleText){ - this.onLoadDeferred.errback(err); - - // shows user the string that is returned by on[type]Error - // override on[type]Error and return your own string to customize - var errText = this['on' + type + 'Error'].call(this, err); - if(consoleText){ - console.error(consoleText, err); - }else if(errText){// a empty string won't change current content - this._setContent(errText, true); - } - }, - - // EVENT's, should be overide-able - onLoad: function(data){ - // summary: - // Event hook, is called after everything is loaded and widgetified - // tags: - // callback - }, - - onUnload: function(){ - // summary: - // Event hook, is called before old content is cleared - // tags: - // callback - }, - - onDownloadStart: function(){ - // summary: - // Called before download starts. - // description: - // The string returned by this function will be the html - // that tells the user we are loading something. - // Override with your own function if you want to change text. - // tags: - // extension - return this.loadingMessage; - }, - - onContentError: function(/*Error*/ error){ - // summary: - // Called on DOM faults, require faults etc. in content. - // - // In order to display an error message in the pane, return - // the error message from this method, as an HTML string. - // - // By default (if this method is not overriden), it returns - // nothing, so the error message is just printed to the console. - // tags: - // extension - }, - - onDownloadError: function(/*Error*/ error){ - // summary: - // Called when download error occurs. - // - // In order to display an error message in the pane, return - // the error message from this method, as an HTML string. - // - // Default behavior (if this method is not overriden) is to display - // the error message inside the pane. - // tags: - // extension - return this.errorMessage; - }, - - onDownloadEnd: function(){ - // summary: - // Called when download is finished. - // tags: - // callback - } -}); - -} +//>>built +define("dijit/layout/ContentPane",["dojo/_base/kernel","dojo/_base/lang","../_Widget","./_ContentPaneResizeMixin","dojo/string","dojo/html","dojo/i18n!../nls/loading","dojo/_base/array","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-attr","dojo/_base/window","dojo/_base/xhr","dojo/i18n"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){return _9("dijit.layout.ContentPane",[_3,_4],{href:"",content:"",extractContent:false,parseOnLoad:true,parserScope:_1._scopeName,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"${loadingState}",errorMessage:"${errorState}",isLoaded:false,baseClass:"dijitContentPane",ioArgs:{},onLoadDeferred:null,_setTitleAttr:null,stopParser:true,template:false,create:function(_10,_11){if((!_10||!_10.template)&&_11&&!("href" in _10)&&!("content" in _10)){var df=_d.doc.createDocumentFragment();_11=_b.byId(_11);while(_11.firstChild){df.appendChild(_11.firstChild);}_10=_2.delegate(_10,{content:df});}this.inherited(arguments,[_10,_11]);},postMixInProperties:function(){this.inherited(arguments);var _12=_f.getLocalization("dijit","loading",this.lang);this.loadingMessage=_5.substitute(this.loadingMessage,_12);this.errorMessage=_5.substitute(this.errorMessage,_12);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!_c.get(this.domNode,"role")){this.domNode.setAttribute("role","group");}},startup:function(){this.inherited(arguments);if(this._contentSetter){_8.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&_2.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},setHref:function(_13){_1.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",_13);},_setHrefAttr:function(_14){this.cancel();this.onLoadDeferred=new _a(_2.hitch(this,"cancel"));this.onLoadDeferred.addCallback(_2.hitch(this,"onLoad"));this._set("href",_14);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(_15){_1.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",_15);},_setContentAttr:function(_16){this._set("href","");this.cancel();this.onLoadDeferred=new _a(_2.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.addCallback(_2.hitch(this,"onLoad"));}this._setContent(_16||"");this._isDownloaded=false;return this.onLoadDeferred;},_getContentAttr:function(){return this.containerNode.innerHTML;},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;this.onLoadDeferred=null;},uninitialize:function(){if(this._beingDestroyed){this.cancel();}this.inherited(arguments);},destroyRecursive:function(_17){if(this._beingDestroyed){return;}this.inherited(arguments);},_onShow:function(){this.inherited(arguments);if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){return this.refresh();}}},refresh:function(){this.cancel();this.onLoadDeferred=new _a(_2.hitch(this,"cancel"));this.onLoadDeferred.addCallback(_2.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var _18=this;var _19={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(_2.isObject(this.ioArgs)){_2.mixin(_19,this.ioArgs);}var _1a=(this._xhrDfd=(this.ioMethod||_e.get)(_19));_1a.addCallback(function(_1b){try{_18._isDownloaded=true;_18._setContent(_1b,false);_18.onDownloadEnd();}catch(err){_18._onError("Content",err);}delete _18._xhrDfd;return _1b;});_1a.addErrback(function(err){if(!_1a.canceled){_18._onError("Download",err);}delete _18._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(_1c){this._set("isLoaded",true);try{this.onLoadDeferred.callback(_1c);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this._set("isLoaded",false);try{this.onUnload();}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message);}},destroyDescendants:function(_1d){if(this.isLoaded){this._onUnloadHandler();}var _1e=this._contentSetter;_8.forEach(this.getChildren(),function(_1f){if(_1f.destroyRecursive){_1f.destroyRecursive(_1d);}});if(_1e){_8.forEach(_1e.parseResults,function(_20){if(_20.destroyRecursive&&_20.domNode&&_20.domNode.parentNode==_d.body()){_20.destroyRecursive(_1d);}});delete _1e.parseResults;}if(!_1d){_6._emptyNode(this.containerNode);}delete this._singleChild;},_setContent:function(_21,_22){this.destroyDescendants();var _23=this._contentSetter;if(!(_23&&_23 instanceof _6._ContentSetter)){_23=this._contentSetter=new _6._ContentSetter({node:this.containerNode,_onError:_2.hitch(this,this._onError),onContentError:_2.hitch(this,function(e){var _24=this.onContentError(e);try{this.containerNode.innerHTML=_24;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _25=_2.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:!_21.domNode&&this.parseOnLoad,parserScope:this.parserScope,startup:false,dir:this.dir,lang:this.lang,textDir:this.textDir},this._contentSetterParams||{});_23.set((_2.isObject(_21)&&_21.domNode)?_21.domNode:_21,_25);delete this._contentSetterParams;if(this.doLayout){this._checkIfSingleChild();}if(!_22){if(this._started){delete this._started;this.startup();this._scheduleLayout();}this._onLoadHandler(_21);}},_onError:function(_26,err,_27){this.onLoadDeferred.errback(err);var _28=this["on"+_26+"Error"].call(this,err);if(_27){console.error(_27,err);}else{if(_28){this._setContent(_28,true);}}},onLoad:function(){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(){},onDownloadError:function(){return this.errorMessage;},onDownloadEnd:function(){}});}); \ No newline at end of file