Bug #18439 ยป rtehtmlarea_bugfix_7851.patch
typo3/sysext/rtehtmlarea/htmlarea/htmlarea-ie.js (working copy) | ||
---|---|---|
*
|
||
* (c) 2002-2004, interactivetools.com, inc.
|
||
* (c) 2003-2004 dynarch.com
|
||
* (c) 2004-2008 Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca>
|
||
* (c) 2004-2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
|
||
* All rights reserved
|
||
*
|
||
* This script is part of the TYPO3 project. The TYPO3 project is
|
||
... | ... | |
};
|
||
/***************************************************
|
||
* FINAL IE CLEANUP
|
||
***************************************************/
|
||
HTMLArea._cleanup = function (editor) {
|
||
// nullify envent handlers
|
||
for (var handler in editor.eventHandlers) {
|
||
if (editor.eventHandlers.hasOwnProperty(handler)) {
|
||
editor.eventHandlers[handler] = null;
|
||
}
|
||
}
|
||
for (var button in editor.btnList) {
|
||
if (editor.btnList.hasOwnProperty(button)) {
|
||
editor.btnList[button][3] = null;
|
||
}
|
||
}
|
||
for (var dropdown in editor.config.customSelects) {
|
||
if (editor.config.customSelects.hasOwnProperty(dropdown)) {
|
||
editor.config.customSelects[dropdown].action = null;
|
||
editor.config.customSelects[dropdown].refresh = null;
|
||
}
|
||
}
|
||
editor.onGenerate = null;
|
||
HTMLArea._editorEvent = null;
|
||
if(editor._textArea.form) {
|
||
editor._textArea.form.__msh_prevOnReset = null;
|
||
editor._textArea.form._editorNumber = null;
|
||
}
|
||
HTMLArea.onload = null;
|
||
if(HTMLArea._eventCache) {
|
||
HTMLArea._eventCache.listEvents = null;
|
||
HTMLArea._eventCache.add = null;
|
||
HTMLArea._eventCache.flush = null;
|
||
HTMLArea._eventCache = null;
|
||
}
|
||
|
||
// cleaning plugin handlers
|
||
for (var plugin in editor.plugins) {
|
||
if (editor.plugins.hasOwnProperty(plugin)) {
|
||
var pluginInstance = editor.plugins[plugin].instance;
|
||
pluginInstance.onGenerate = null;
|
||
pluginInstance.onMode = null;
|
||
pluginInstance.onKeyPress = null;
|
||
pluginInstance.onSelect = null;
|
||
pluginInstance.onUpdateTolbar = null;
|
||
}
|
||
}
|
||
|
||
// cleaning the toolbar elements
|
||
for (var txt in editor._toolbarObjects) {
|
||
if (editor._toolbarObjects.hasOwnProperty(txt)) {
|
||
var obj = editor._toolbarObjects[txt];
|
||
obj["state"] = null;
|
||
document.getElementById(obj["elementId"])._obj = null;
|
||
}
|
||
}
|
||
// cleaning the statusbar elements
|
||
if(editor._statusBarTree.hasChildNodes()) {
|
||
for (var i = editor._statusBarTree.firstChild; i; i = i.nextSibling) {
|
||
if (i.nodeName.toLowerCase() == "a") {
|
||
HTMLArea._removeEvents(i, ["click", "contextmenu"], HTMLArea.statusBarHandler);
|
||
i.el = null;
|
||
i.editor = null;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
/***************************************************
|
||
* SELECTIONS AND RANGES
|
||
***************************************************/
|
||
/*
|
typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js (working copy) | ||
---|---|---|
*
|
||
* (c) 2002-2004, interactivetools.com, inc.
|
||
* (c) 2003-2004 dynarch.com
|
||
* (c) 2004-2008 Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca>
|
||
* (c) 2004-2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
|
||
* All rights reserved
|
||
*
|
||
* This script is part of the TYPO3 project. The TYPO3 project is
|
||
... | ... | |
* Clean up event handlers and object references, undo/redo snapshots, update the textarea for submission
|
||
*/
|
||
HTMLArea.removeEditorEvents = function(ev) {
|
||
if(!ev) var ev = window.event;
|
||
if (!ev) var ev = window.event;
|
||
HTMLArea._stopEvent(ev);
|
||
for (var ed = RTEarea.length; --ed > 0 ;) {
|
||
var editor = RTEarea[ed]["editor"];
|
||
if(editor) {
|
||
RTEarea[ed]["editor"] = null;
|
||
if (HTMLArea._eventCache) {
|
||
HTMLArea._eventCache.flush();
|
||
}
|
||
for (var editorNumber = RTEarea.length; --editorNumber > 0 ;) {
|
||
var editor = RTEarea[editorNumber].editor;
|
||
if (editor) {
|
||
RTEarea[editorNumber].editor = null;
|
||
// save the HTML content into the original textarea for submit, back/forward, etc.
|
||
editor._textArea.value = editor.getHTML();
|
||
// release undo/redo snapshots
|
||
window.clearInterval(editor._timerUndo);
|
||
editor._undoQueue = null;
|
||
// release events
|
||
if (HTMLArea.is_ie) HTMLArea._cleanup(editor);
|
||
// do final cleanup
|
||
HTMLArea.cleanup(editor);
|
||
}
|
||
}
|
||
if (HTMLArea._eventCache && !HTMLArea.is_opera) HTMLArea._eventCache.flush();
|
||
};
|
||
/*
|
||
* Clean up a bunch of references in order to avoid memory leakages mainly in IE, but also in Firefox and Opera
|
||
*/
|
||
HTMLArea.cleanup = function (editor) {
|
||
// nullify envent handlers
|
||
for (var handler in editor.eventHandlers) {
|
||
if (editor.eventHandlers.hasOwnProperty(handler)) {
|
||
editor.eventHandlers[handler] = null;
|
||
}
|
||
}
|
||
for (var button in editor.btnList) {
|
||
if (editor.btnList.hasOwnProperty(button)) {
|
||
editor.btnList[button][3] = null;
|
||
}
|
||
}
|
||
for (var dropdown in editor.config.customSelects) {
|
||
if (editor.config.customSelects.hasOwnProperty(dropdown)) {
|
||
editor.config.customSelects[dropdown].action = null;
|
||
editor.config.customSelects[dropdown].refresh = null;
|
||
}
|
||
}
|
||
for (var hotKey in editor.config.hotKeyList) {
|
||
if (editor.config.customSelects.hasOwnProperty(hotKey)) {
|
||
editor.config.hotKeyList[hotKey].action = null;
|
||
}
|
||
}
|
||
editor.onGenerate = null;
|
||
HTMLArea._editorEvent = null;
|
||
if(editor._textArea.form) {
|
||
editor._textArea.form.__msh_prevOnReset = null;
|
||
editor._textArea.form._editorNumber = null;
|
||
}
|
||
HTMLArea.onload = null;
|
||
|
||
// cleaning plugin handlers
|
||
for (var plugin in editor.plugins) {
|
||
if (editor.plugins.hasOwnProperty(plugin)) {
|
||
var pluginInstance = editor.plugins[plugin].instance;
|
||
pluginInstance.onChange = null;
|
||
pluginInstance.onButtonPress = null;
|
||
pluginInstance.onGenerate = null;
|
||
pluginInstance.onGenerateOnce = null;
|
||
pluginInstance.onMode = null;
|
||
pluginInstance.onHotKey = null;
|
||
pluginInstance.onKeyPress = null;
|
||
pluginInstance.onSelect = null;
|
||
pluginInstance.onUpdateTolbar = null;
|
||
}
|
||
}
|
||
// cleaning the toolbar elements
|
||
for (var txt in editor._toolbarObjects) {
|
||
if (editor._toolbarObjects.hasOwnProperty(txt)) {
|
||
var obj = editor._toolbarObjects[txt];
|
||
obj.state = null;
|
||
obj.cmd = null;
|
||
document.getElementById(obj.elementId)._obj = null;
|
||
editor._toolbarObjects[txt] = null;
|
||
}
|
||
}
|
||
|
||
// cleaning the statusbar elements
|
||
if (editor._statusBarTree.hasChildNodes()) {
|
||
for (var i = editor._statusBarTree.firstChild; i; i = i.nextSibling) {
|
||
if (i.nodeName.toLowerCase() == "a") {
|
||
HTMLArea._removeEvents(i, ["click", "contextmenu"], HTMLArea.statusBarHandler);
|
||
i.el = null;
|
||
i.editor = null;
|
||
}
|
||
}
|
||
}
|
||
// final cleanup
|
||
editor._toolbar = null;
|
||
editor._statusBar = null;
|
||
editor._statusBarTree = null;
|
||
editor._htmlArea = null;
|
||
editor._iframe = null;
|
||
};
|
||
/*
|
||
* Switch editor mode; parameter can be "textmode" or "wysiwyg".
|
||
* If no parameter was passed, toggle between modes.
|
||
*/
|
||
... | ... | |
item[2] = null;
|
||
} catch(e) { }
|
||
}
|
||
listEvents.length = 0;
|
||
}
|
||
});
|
||
};
|
typo3/sysext/rtehtmlarea/htmlarea/plugins/DefaultClean/default-clean.js (working copy) | ||
---|---|---|
/***************************************************************
|
||
* Copyright notice
|
||
*
|
||
* (c) 2008 Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca>
|
||
* (c) 2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
|
||
* All rights reserved
|
||
*
|
||
* This script is part of the TYPO3 project. The TYPO3 project is
|
||
... | ... | |
configurePlugin : function(editor) {
|
||
|
||
this.pageTSConfiguration = this.editorConfiguration.buttons.cleanword;
|
||
this.cleanLaterFunctRef = this.makeFunctionReference("cleanLater");
|
||
|
||
/*
|
||
* Registering plugin "About" information
|
||
*/
|
||
var pluginInformation = {
|
||
version : "1.0",
|
||
version : "1.1",
|
||
developer : "Stanislas Rolland",
|
||
developerUrl : "http://www.fructifor.ca/",
|
||
developerUrl : "http://www.sjbr.ca/",
|
||
copyrightOwner : "Stanislas Rolland",
|
||
sponsor : "Fructifor Inc.",
|
||
sponsorUrl : "http://www.fructifor.ca/",
|
||
sponsor : "SJBR",
|
||
sponsorUrl : "http://www.sjbr.ca/",
|
||
license : "GPL"
|
||
};
|
||
this.registerPluginInformation(pluginInformation);
|
||
... | ... | |
|
||
onGenerate : function () {
|
||
var doc = this.editor._doc;
|
||
var cleanFunctRef = this.makeFunctionReference("wordCleanHandler");
|
||
HTMLArea._addEvents((HTMLArea.is_ie ? doc.body : doc), ["paste","dragdrop","drop"], cleanFunctRef, true);
|
||
HTMLArea._addEvents((HTMLArea.is_ie ? doc.body : doc), ["paste","dragdrop","drop"], DefaultClean.wordCleanHandler, true);
|
||
},
|
||
|
||
clean : function (html) {
|
||
... | ... | |
return true;
|
||
}
|
||
parseTree(html);
|
||
},
|
||
|
||
cleanLater : function () {
|
||
this.clean(this.editor._doc.body);
|
||
if (this.doUpdateToolbar) {
|
||
this.editor.updateToolbar();
|
||
}
|
||
this.doUpdateToolbar = false;
|
||
},
|
||
|
||
/*
|
||
* Handler for paste, dragdrop and drop events
|
||
*/
|
||
wordCleanHandler : function (ev) {
|
||
if(!ev) var ev = window.event;
|
||
var target = (ev.target) ? ev.target : ev.srcElement;
|
||
var owner = (target.ownerDocument) ? target.ownerDocument : target;
|
||
while (HTMLArea.is_ie && owner.parentElement ) { // IE5.5 does not report any ownerDocument
|
||
owner = owner.parentElement;
|
||
}
|
||
// If we dropped an image dragged from the TYPO3 Image plugin, let's close the dialog window
|
||
if (typeof(HTMLArea.Dialog) != "undefined" && HTMLArea.Dialog.TYPO3Image) {
|
||
HTMLArea.Dialog.TYPO3Image.close();
|
||
} else {
|
||
this.doUpdateToolbar = false;
|
||
window.setTimeout(this.cleanLaterFunctRef, 250);
|
||
}
|
||
}
|
||
});
|
||
/*
|
||
* Closure avoidance for IE
|
||
*/
|
||
DefaultClean.cleanLater = function (editorNumber) {
|
||
var editor = RTEarea[editorNumber].editor;
|
||
editor.plugins.DefaultClean.instance.clean(editor._doc.body);
|
||
};
|
||
/*
|
||
* Handler for paste, dragdrop and drop events
|
||
*/
|
||
DefaultClean.wordCleanHandler = function (ev) {
|
||
if (!ev) var ev = window.event;
|
||
var target = ev.target ? ev.target : ev.srcElement;
|
||
var owner = target.ownerDocument ? target.ownerDocument : target;
|
||
if (HTMLArea.is_ie) { // IE5.5 does not report any ownerDocument
|
||
while (owner.parentElement) { owner = owner.parentElement; }
|
||
}
|
||
var editor = RTEarea[owner._editorNo].editor;
|
||
|
||
// If we dropped an image dragged from the TYPO3 Image plugin, let's close the dialog window
|
||
if (typeof(HTMLArea.Dialog) != "undefined" && HTMLArea.Dialog.TYPO3Image) {
|
||
HTMLArea.Dialog.TYPO3Image.close();
|
||
} else {
|
||
window.setTimeout("DefaultClean.cleanLater(" + editor._editorNumber + ");", 250);
|
||
}
|
||
};
|
||
typo3/sysext/rtehtmlarea/htmlarea/plugins/TYPO3HtmlParser/typo3html-parser.js (working copy) | ||
---|---|---|
/***************************************************************
|
||
* Copyright notice
|
||
*
|
||
* (c) 2005-2008 Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca>
|
||
* (c) 2005-2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
|
||
* All rights reserved
|
||
*
|
||
* This script is part of the TYPO3 project. The TYPO3 project is
|
||
... | ... | |
|
||
this.pageTSConfiguration = this.editorConfiguration.buttons.cleanword;
|
||
this.parseHtmlModulePath = this.pageTSConfiguration.pathParseHtmlModule;
|
||
this.cleanLaterFunctRef = this.makeFunctionReference("cleanLater");
|
||
|
||
/*
|
||
* Registering plugin "About" information
|
||
*/
|
||
var pluginInformation = {
|
||
version : "1.7",
|
||
version : "1.8",
|
||
developer : "Stanislas Rolland",
|
||
developerUrl : "http://www.fructifor.ca/",
|
||
developerUrl : "http://www.sjbr.ca/",
|
||
copyrightOwner : "Stanislas Rolland",
|
||
sponsor : "Fructifor Inc.",
|
||
sponsorUrl : "http://www.fructifor.ca/",
|
||
sponsor : "SJBR",
|
||
sponsorUrl : "http://www.sjbr.ca/",
|
||
license : "GPL"
|
||
};
|
||
this.registerPluginInformation(pluginInformation);
|
||
... | ... | |
onGenerate : function () {
|
||
var doc = this.editor._doc;
|
||
var cleanFunctRef = this.makeFunctionReference("wordCleanHandler");
|
||
HTMLArea._addEvents((HTMLArea.is_ie ? doc.body : doc), ["paste","dragdrop","drop"], cleanFunctRef, true);
|
||
HTMLArea._addEvents((HTMLArea.is_ie ? doc.body : doc), ["paste","dragdrop","drop"], TYPO3HtmlParser.wordCleanHandler, true);
|
||
},
|
||
|
||
clean : function(body, bookmark) {
|
||
... | ... | |
editor.selectRange(editor.moveToBookmark(bookmark));
|
||
}
|
||
);
|
||
},
|
||
|
||
cleanLater : function () {
|
||
var bookmark = this.editor.getBookmark(this.editor._createRange(this.editor._getSelection()));
|
||
this.clean(this.editor._doc.body, bookmark);
|
||
},
|
||
|
||
/*
|
||
* Handler for paste, dragdrop and drop events
|
||
*/
|
||
wordCleanHandler : function (ev) {
|
||
if(!ev) var ev = window.event;
|
||
var target = (ev.target) ? ev.target : ev.srcElement;
|
||
var owner = (target.ownerDocument) ? target.ownerDocument : target;
|
||
while (HTMLArea.is_ie && owner.parentElement ) { // IE5.5 does not report any ownerDocument
|
||
owner = owner.parentElement;
|
||
}
|
||
// If we dropped an image dragged from the TYPO3 Image plugin, let's close the dialog window
|
||
if (typeof(HTMLArea.Dialog) != "undefined" && HTMLArea.Dialog.TYPO3Image) {
|
||
HTMLArea.Dialog.TYPO3Image.close();
|
||
} else {
|
||
window.setTimeout(this.cleanLaterFunctRef, 250);
|
||
}
|
||
}
|
||
});
|
||
/*
|
||
* Closure avoidance for IE
|
||
*/
|
||
TYPO3HtmlParser.cleanLater = function (editorNumber) {
|
||
var editor = RTEarea[editorNumber].editor;
|
||
var bookmark = editor.getBookmark(editor._createRange(editor._getSelection()));
|
||
editor.plugins.TYPO3HtmlParser.instance.clean(editor._doc.body, bookmark);
|
||
};
|
||
/*
|
||
* Handler for paste, dragdrop and drop events
|
||
*/
|
||
TYPO3HtmlParser.wordCleanHandler = function (ev) {
|
||
if (!ev) var ev = window.event;
|
||
var target = ev.target ? ev.target : ev.srcElement;
|
||
var owner = target.ownerDocument ? target.ownerDocument : target;
|
||
if (HTMLArea.is_ie) { // IE5.5 does not report any ownerDocument
|
||
while (owner.parentElement) { owner = owner.parentElement; }
|
||
}
|
||
var editor = RTEarea[owner._editorNo].editor;
|
||
|
||
// If we dropped an image dragged from the TYPO3 Image plugin, let's close the dialog window
|
||
if (typeof(HTMLArea.Dialog) != "undefined" && HTMLArea.Dialog.TYPO3Image) {
|
||
HTMLArea.Dialog.TYPO3Image.close();
|
||
} else {
|
||
window.setTimeout("TYPO3HtmlParser.cleanLater(" + editor._editorNumber + ");", 250);
|
||
}
|
||
};
|
||