Changeset 4420
- Timestamp:
- 06/17/06 01:39:37 (4 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 9 modified
-
buildscripts/buildUtil.js (modified) (2 diffs)
-
dojo.js (modified) (1 diff)
-
src/loader.js (modified) (1 diff)
-
src/namespace.js (added)
-
src/namespaces (added)
-
src/namespaces/dojo.js (added)
-
src/uri/Uri.js (modified) (2 diffs)
-
src/widget/DomWidget.js (modified) (1 diff)
-
src/widget/Parse.js (modified) (9 diffs)
-
src/widget/Widget.js (modified) (5 diffs)
-
src/xml/Parse.js (modified) (5 diffs)
-
tests/testns.tgz (added)
-
tests/widget/test_Accordion.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/buildscripts/buildUtil.js
r4238 r4420 29 29 load("../src/hostenv_rhino.js"); 30 30 load("../src/bootstrap2.js"); 31 31 32 // FIXME: is this really what we want to say? 32 33 dojo.render.html.capable = true; … … 59 60 dojo.hostenv.loadedUris.push("../src/bootstrap2.js"); 60 61 62 dojo.hostenv.loadedUris.push("../src/namespace.js"); 61 63 62 64 if(dependencies["prefixes"]){ -
trunk/dojo.js
r4185 r4420 27 27 28 28 tmps.push("bootstrap2.js"); 29 tmps.push("namespace.js"); 29 30 30 31 if((this["djConfig"])&&(djConfig["baseScriptUri"])){ -
trunk/src/loader.js
r4275 r4420 272 272 // things slightly diffrently 273 273 var nsyms = modulename.split("."); 274 if(djConfig.autoLoadNamespace){ dojo.getNamespace(syms[0]); } 274 275 if(last=="*"){ 275 276 modulename = (nsyms.slice(0, -1)).join('.'); -
trunk/src/uri/Uri.js
r2547 r4420 3 3 dojo.uri = new function() { 4 4 this.joinPath = function() { 5 // DEPRECATED: use the dojo.uri.Uri object instead5 dojo.deprecated("dojo.uri.joinPath", "use the dojo.uri.Uri object instead", "0.4"); 6 6 var arr = []; 7 7 for(var i = 0; i < arguments.length; i++) { arr.push(arguments[i]); } … … 13 13 return new dojo.uri.Uri(dojo.hostenv.getBaseScriptUri(), uri); 14 14 } 15 15 16 //returns a URI of a widget in a namespace, for example dojo.uri.nsUri("dojo","Editor"), or dojo.uri.nsUri("customNS","someWidget") 17 this.nsUri = function(namespace,uri){ 18 var ns = dojo.getNamespace(namespace); 19 if(!ns){ 20 return null; 21 } 22 var loc = ns.location; 23 if(loc.lastIndexOf("/") != loc.length - 1){ 24 loc += "/"; 25 } 26 return new dojo.uri.Uri(dojo.hostenv.getBaseScriptUri()+loc,uri); 27 } 28 16 29 this.Uri = function (/*uri1, uri2, [...]*/) { 17 30 // An object representing a Uri. -
trunk/src/widget/DomWidget.js
r4398 r4420 390 390 391 391 getFragNodeRef: function(frag){ 392 if( !frag || !frag["dojo:"+this.widgetType.toLowerCase()] ){ 393 dojo.raise("Error: no frag for widget type " + this.widgetType + 394 ", id " + this.widgetId + " (maybe a widget has set it's type incorrectly)"); 395 } 396 return (frag ? frag["dojo:"+this.widgetType.toLowerCase()]["nodeRef"] : null); 392 if(!frag || !frag[this.namespace+":"+this.widgetType.toLowerCase()]){ 393 dojo.raise("Error: no frag for widget type " + this.widgetType 394 + " with namespace "+this.namespace + ", id " + this.widgetId 395 + " (maybe a widget has set it's type incorrectly)"); 396 } 397 return frag ? frag[this.namespace+":"+this.widgetType.toLowerCase()]["nodeRef"] : null; 397 398 }, 398 399 -
trunk/src/widget/Parse.js
r4270 r4420 9 9 10 10 this.createComponents = function(frag, parentComp){ 11 var comps = [ ];11 var comps = []; 12 12 var built = false; 13 13 // if we have items to parse/create at this level, do it! … … 20 20 for(var x=0; x<tna.length; x++){ 21 21 var ltn = (tna[x].replace(/^\s+|\s+$/g, "")).toLowerCase(); 22 23 //if we don't already have a tag registered for this widget, try to load it's 24 //namespace, if it has one 25 if(!djTags[ltn] && dojo.getNamespace && dojo.lang.isString(ltn)){ 26 var pos = ltn.indexOf(":"); 27 if(pos > 0){ 28 var nsName = ltn.substring(0,pos); 29 var ns = dojo.getNamespace(nsName); 30 var tagName = ltn.substring(pos+1,ltn.length); 31 var domain = null; 32 var dojoDomain = frag[ltn]["dojoDomain"] || frag[ltn]["dojodomain"]; 33 if(dojoDomain){ 34 domain = dojoDomain[0].value; 35 } 36 if(ns){ 37 ns.load(tagName, domain); 38 } 39 } 40 } 41 22 42 if(djTags[ltn]){ 23 43 built = true; … … 26 46 comps.push(ret); 27 47 }else{ 28 if( (dojo.lang.isString(ltn))&&(ltn.substr(0, 5)=="dojo:")){29 dojo.debug("no tag handler registe d for type: ", ltn);30 }48 if(dojo.lang.isString(ltn) && (ltn.substr(0, 5)=="dojo:")){ 49 dojo.debug("no tag handler registered for type: ", ltn); 50 } //TODO: else? what if it's not dojo:? is it still an error? 31 51 } 32 52 } … … 34 54 }catch(e){ 35 55 dojo.debug("dojo.widget.Parse: error:", e); 36 // throw (e);56 // throw e; 37 57 // IE is such a bitch sometimes 38 58 } … … 199 219 properties is an object of name value pairs 200 220 */ 201 this.createComponentFromScript = function(nodeRef, componentName, properties){ 202 var ltn = "dojo:" + componentName.toLowerCase(); 221 this.createComponentFromScript = function(nodeRef, componentName, properties, namespace){ 222 if(!namespace){ 223 namespace = "dojo"; 224 } 225 var ltn = namespace + ":" + componentName.toLowerCase(); 203 226 if(dojo.widget.tags[ltn]){ 204 227 properties.fastMixIn = true; 205 228 return [dojo.widget.tags[ltn](properties, this, null, null, properties)]; 206 229 }else{ 207 if(ltn.substr(0, 5)=="dojo:"){ 208 dojo.debug("no tag handler registed for type: ", ltn); 209 } 230 dojo.debug("no tag handler registered for type: ", ltn); 210 231 } 211 232 } … … 229 250 * @param refNode If the last argument is specified this node is used as 230 251 * a reference for inserting this node into a DOM tree else 231 * it be omces the domNode252 * it becomes the domNode 232 253 * @param position The position to insert this widget's node relative to the 233 254 * refNode argument 234 255 * @return The new Widget object 235 256 */ 236 237 dojo.widget.createWidget = function(name, props, refNode, position){ 238 var lowerCaseName = name.toLowerCase(); 239 var namespacedName = "dojo:" + lowerCaseName; 240 var isNode = ( dojo.byId(name) && (!dojo.widget.tags[namespacedName]) ); 241 242 // if we got a node or an unambiguious ID, build a widget out of it 243 if( (arguments.length==1) && ((typeof name != "string")||(isNode)) ){ 244 // we got a DOM node 245 var xp = new dojo.xml.Parse(); 246 // FIXME: we should try to find the parent! 247 var tn = (isNode) ? dojo.byId(name) : name; 248 return dojo.widget.getParser().createComponents(xp.parseElement(tn, null, true))[0]; 249 } 250 251 function fromScript (placeKeeperNode, name, props) { 257 258 dojo.widget.createWidget = function(name, props, refNode, position, namespace){ 259 if(!namespace){ 260 namespace = "dojo"; 261 } 262 263 function fromScript(placeKeeperNode, name, props, namespace){ 264 if(!namespace){ 265 namespace="dojo"; 266 } 267 var lowerCaseName = name.toLowerCase(); 268 var namespacedName = namespace+":" + lowerCaseName; 252 269 props[namespacedName] = { 253 270 dojotype: [{value: lowerCaseName}], … … 256 273 }; 257 274 return dojo.widget.getParser().createComponentFromScript( 258 placeKeeperNode, name, props, true);275 placeKeeperNode, name, props, namespace); 259 276 } 260 277 … … 263 280 "argument order is now of the form " + 264 281 "dojo.widget.createWidget(NAME, [PROPERTIES, [REFERENCENODE, [POSITION]]])", "0.4"); 265 return fromScript(name, props, refNode );282 return fromScript(name, props, refNode, namespace); 266 283 } 267 284 … … 284 301 tn = refNode; 285 302 } 286 var widgetArray = fromScript(tn, name, props );303 var widgetArray = fromScript(tn, name, props, namespace); 287 304 if (!widgetArray || !widgetArray[0] || typeof widgetArray[0].widgetType == "undefined") { 288 305 throw new Error("createWidget: Creation of \"" + name + "\" widget failed."); -
trunk/src/widget/Widget.js
r4332 r4420 36 36 widgetType: "Widget", // used for building generic widgets 37 37 38 namespace: "dojo", //defaults to 'dojo' 39 38 40 toString: function() { 39 41 return '[Widget ' + this.widgetType + ', ' + (this.widgetId || 'NO ID') + ']'; … … 80 82 }, 81 83 82 create: function(args, fragment, parentComp){ 84 create: function(args, fragment, parentComp, namespace){ 85 if(namespace){ 86 this.namespace = namespace; 87 } 83 88 // dojo.debug(this.widgetType, "create"); 84 89 this.satisfyPropertySets(args, fragment, parentComp); … … 285 290 // other object types intelligently? 286 291 287 // if we defined a URI, we probabl twant to allow plain strings292 // if we defined a URI, we probably want to allow plain strings 288 293 // to override it 289 294 if (this[x] instanceof dojo.uri.Uri){ … … 496 501 // FIXME: we don't seem to be doing anything with this! 497 502 // var propertySets = parser.getPropertySets(frag); 498 var localProperties = localProps || parser.parseProperties(frag[ "dojo:"+stype]);503 var localProperties = localProps || parser.parseProperties(frag[frag.namespace+":"+stype]); 499 504 // var tic = new Date(); 500 505 var twidget = dojo.widget.manager.getImplementation(stype); … … 505 510 } 506 511 localProperties["dojoinsertionindex"] = insertionIndex; 507 // FIXME: we lo ose no less than 5ms in construction!508 var ret = twidget.create(localProperties, frag, parentComp );512 // FIXME: we lose no less than 5ms in construction! 513 var ret = twidget.create(localProperties, frag, parentComp, frag.namespace); 509 514 // dojo.debug(new Date() - tic); 510 515 return ret; 511 516 } 512 517 518 //TODO: add namespace support to this 513 519 /* 514 520 * Create a widget constructor function (aka widgetClass) -
trunk/src/xml/Parse.js
r3693 r4420 31 31 function getDojoTagName (node) { 32 32 var tagName = node.tagName; 33 if (tagName.substr(0,5).toLowerCase() != "dojo:") { 34 35 if (tagName.substr(0,4).toLowerCase() == "dojo") { 36 // FIXME: this assuumes tag names are always lower case 37 return "dojo:" + tagName.substring(4).toLowerCase(); 33 if(tagName.substr(0,5).toLowerCase() == "dojo:"){ 34 return tagName.toLowerCase(); 35 } 36 37 if(tagName.substr(0,4).toLowerCase() == "dojo"){ 38 // FIXME: this assumes tag names are always lower case 39 return "dojo:" + tagName.substring(4).toLowerCase(); 40 } 41 42 // allow lower-casing 43 var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype"); 44 if(djt){ 45 if(djt.indexOf(":")<0){ 46 djt = "dojo:"+djt; 38 47 } 48 return djt.toLowerCase(); 49 } 39 50 40 // allow lower-casing 41 var djt = node.getAttribute("dojoType") || node.getAttribute("dojotype"); 42 if (djt) { return "dojo:" + djt.toLowerCase(); } 43 44 if (node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml,"type")) { 45 return "dojo:" + node.getAttributeNS(dojo.dom.dojoml,"type").toLowerCase(); 46 } 47 try { 48 // FIXME: IE really really doesn't like this, so we squelch 49 // errors for it 50 djt = node.getAttribute("dojo:type"); 51 } catch (e) { /* FIXME: log? */ } 51 if(node.getAttributeNS && node.getAttributeNS(dojo.dom.dojoml,"type")){ 52 return "dojo:" + node.getAttributeNS(dojo.dom.dojoml,"type").toLowerCase(); 53 } 54 try{ 55 // FIXME: IE really really doesn't like this, so we squelch errors for it 56 djt = node.getAttribute("dojo:type"); 57 }catch(e){ /* FIXME: log? */ } 52 58 53 if (djt) { return "dojo:"+djt.toLowerCase(); } 54 55 if (!dj_global["djConfig"] || !djConfig["ignoreClassNames"]) { 56 // FIXME: should we make this optionally enabled via djConfig? 57 var classes = node.className||node.getAttribute("class"); 58 // FIXME: following line, without check for existence of classes.indexOf 59 // breaks firefox 1.5's svg widgets 60 if (classes && classes.indexOf && classes.indexOf("dojo-") != -1) { 61 var aclasses = classes.split(" "); 62 for(var x=0; x<aclasses.length; x++){ 63 if (aclasses[x].length > 5 && aclasses[x].indexOf("dojo-") >= 0) { 64 return "dojo:"+aclasses[x].substr(5).toLowerCase(); 65 } 59 if(djt){ return "dojo:"+djt.toLowerCase(); } 60 61 if(!dj_global["djConfig"] || !djConfig["ignoreClassNames"]){ 62 // FIXME: should we make this optionally enabled via djConfig? 63 var classes = node.className||node.getAttribute("class"); 64 // FIXME: following line, without check for existence of classes.indexOf 65 // breaks firefox 1.5's svg widgets 66 if(classes && classes.indexOf && classes.indexOf("dojo-") != -1){ 67 var aclasses = classes.split (" "); 68 for(var x=0; x<aclasses.length; x++){ 69 if(aclasses[x].length > 5 && aclasses[x].indexOf("dojo-") >= 0){ 70 return "dojo:"+aclasses[x].substr(5).toLowerCase(); 66 71 } 67 72 } … … 69 74 70 75 } 76 71 77 return tagName.toLowerCase(); 72 78 } … … 74 80 this.parseElement = function(node, hasParentNodeSet, optimizeForDojoML, thisIdx){ 75 81 76 // if parseWidgets="false" don't search inside this node for widgets77 if (node.getAttribute("parseWidgets") == "false") {78 return {};79 }80 81 82 // TODO: make this namespace aware 82 83 var parsedNodeSet = {}; 83 84 85 //There's a weird bug in IE where it counts end tags, e.g. </dojo:button> as nodes that should be parsed. Ignore these 86 if(node.tagName && node.tagName.indexOf("/") == 0){ 87 return null; 88 } 89 84 90 var tagName = getDojoTagName(node); 85 91 parsedNodeSet[tagName] = []; 86 if((!optimizeForDojoML)||(tagName.substr(0,4).toLowerCase()=="dojo")){ 87 var attributeSet = parseAttributes(node); 92 if(tagName.substr(0,4).toLowerCase()=="dojo"){ 93 parsedNodeSet.namespace = "dojo"; 94 }else{ 95 var pos = tagName.indexOf(":"); 96 if(pos > 0){ 97 parsedNodeSet.namespace = tagName.substring(0,pos); 98 } 99 } 100 101 if(!optimizeForDojoML||dojo.getNamespace(parsedNodeSet.namespace)){ 102 var attributeSet = this.parseAttributes(node); 88 103 for(var attr in attributeSet){ 89 104 if((!parsedNodeSet[tagName][attr])||(typeof parsedNodeSet[tagName][attr] != "array")){ … … 99 114 parsedNodeSet.tagName = tagName; 100 115 parsedNodeSet.index = thisIdx||0; 116 117 // dojo.debug("parseElement: set the element tagName = "+parsedNodeSet.tagName+" and namespace to "+parsedNodeSet.namespace); 101 118 } 102 119 103 120 var count = 0; 104 var tcn, i = 0, nodes = node.childNodes;105 while(tcn = nodes[i++]){121 for(var i = 0; i < node.childNodes.length; i++){ 122 var tcn = node.childNodes.item(i); 106 123 switch(tcn.nodeType){ 107 124 case dojo.dom.ELEMENT_NODE: // element nodes, call this function recursively … … 148 165 } 149 166 //return (hasParentNodeSet) ? parsedNodeSet[node.tagName] : parsedNodeSet; 167 //if(parsedNodeSet.tagName)dojo.debug("parseElement: RETURNING NODE WITH TAGNAME "+parsedNodeSet.tagName); 150 168 return parsedNodeSet; 151 169 } 152 170 153 171 /* parses a set of attributes on a node into an object tree */ 154 function parseAttributes(node){172 this.parseAttributes = function(node){ 155 173 // TODO: make this namespace aware 156 174 var parsedAttributeSet = {}; -
trunk/tests/widget/test_Accordion.html
r3407 r4420 10 10 </script> 11 11 <script type="text/javascript" src="../../dojo.js"></script> 12 <script language="JavaScript" type="text/javascript"> 13 dojo.require("dojo.widget.Tree"); 14 dojo.require("dojo.widget.TreeNode"); 15 dojo.require("dojo.widget.AccordionContainer"); 16 dojo.require("dojo.widget.ContentPane"); 12 <script type="text/javascript"> 13 dojo.require("dojo.widget.*"); 17 14 </script> 18 15