Opened 12 years ago

Last modified 10 years ago

#6298 closed defect

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

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

Description

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 (0)

Note: See TracTickets for help on using tickets.