Opened 12 years ago

Last modified 10 years ago

#6298 closed defect

[patch][cla]bugs in Editor/RichText widget programmatic creation — at Version 1

Reported by: Chris Mitchell Owned by: anonymous
Priority: high Milestone: future
Component: Editor Version: 1.1b1
Keywords: Cc:
Blocked By: Blocking:

Description (last modified by Adam Peller)

When creating Editor instances programmatically (IDE use case), there is a that keeps RichText? from being properly initialized when the widget is not yet attached to DOM.

This problem exists in trunk (1.1rc1)

Here is a summary of the patches necessary to fix the problem:

The first problem is that the the RichText?.open function calls dojo.place(...,"before"), but in our scenario the refNode does not yet have a parent node... so place can default to just appendChild as follows:

(rev 13182) dojo/_base/html.js: (see <<< inline)
	dojo.place = function(/*String|DomNode*/node, /*String|DomNode*/refNode, /*String|Number*/position){
		//	summary:
		//		attempt to insert node in relation to ref based on position
		//	node: 
		//		id or reference to node to place relative to refNode
		//	refNode: 
		//		id or reference of node to use as basis for placement
		//	position:
		//		string noting the position of node relative to refNode or a
		//		number indicating the location in the childNodes collection of
		//		refNode. Accepted string values are:
		//			* before
		//			* after
		//			* first
		//			* last
		//		"first" and "last" indicate positions as children of refNode.

		// FIXME: need to write tests for this!!!!
		if(!node || !refNode || position === undefined){ 
			return false;	//	boolean 
		}
		node = dojo.byId(node);
		refNode = dojo.byId(refNode);
		if(refNode.parentNode){ // <<< Guard against case when node not yet attached to DOM
			if(typeof position == "number"){
				var cn = refNode.childNodes;
				if((position == 0 && cn.length == 0) ||
					cn.length == position){
					refNode.appendChild(node); return true;
				}
				if(position == 0){
					return _insertBefore(node, refNode.firstChild);
				}
				return _insertAfter(node, cn[position-1]);
			}
			switch(position.toLowerCase()){
				case "before":
					return _insertBefore(node, refNode);	//	boolean
				case "after":
					return _insertAfter(node, refNode);		//	boolean
				case "first":
					if(refNode.firstChild){
						return _insertBefore(node, refNode.firstChild);	//	boolean
					}
					// else fallthrough...
				default: // aka: last
					refNode.appendChild(node);
					return true;	//	boolean
			}
		}else{
			refNode.appendChild(node);
			return true;
		}
	}

The other place that needs to be fixed is in (rev 13182)RichText._drawIFrame, need to test contentDoc being null...

...

		var contentDoc = this.iframe.contentDocument;
		if (contentDoc){ // possible if RichText created but not yet attached to DOM
			contentDoc.open();
			if(dojo.isAIR){
				contentDoc.body.innerHTML = html;
			}else{
				contentDoc.write(this._getIframeDocTxt(html));
			}
			contentDoc.close();
		}
...

With these two mods, the Editor now works properly in IDE use case. These patches are submitted under ICLA.

-Chris Mitchell, IBM

Change History (1)

comment:1 Changed 12 years ago by Adam Peller

Description: modified (diff)
Milestone: 1.1
Reporter: changed from guest to Chris Mitchell
Note: See TracTickets for help on using tickets.