Ticket #6298 (new defect)
[patch][cla]bugs in Editor/RichText widget programmatic creation
| Reported by: | chrism1@… | Owned by: | liucougar |
|---|---|---|---|
| Priority: | normal | Milestone: | 1.4 |
| Component: | Editor | Version: | 1.1b1 |
| Severity: | normal | Keywords: | |
| Cc: |
Description (last modified by peller) (diff)
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 (r13182)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