Index: typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js =================================================================== --- typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js (révision 10634) +++ typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js (copie de travail) @@ -927,7 +927,18 @@ this.getEditor()._doc = this.document; this.getEditor()._iframe = iframe; this.createHead(); - this.getStyleSheets(); + // Style the document body + Ext.get(this.document.body).addClass('htmlarea-content-body'); + // Start listening to things happening in the iframe + // For some unknown reason, this is too early for Opera + if (!Ext.isOpera) { + this.startListening(); + } + // Hide the iframe + this.hide(); + // Set iframe ready + this.ready = true; + this.fireEvent('HTMLAreaEventIframeReady'); } }, /* @@ -980,82 +991,6 @@ } }, /* - * Fire event 'HTMLAreaEventIframeReady' when the iframe style sheets become accessible - * - * @param int count: number of attempts at accessing the stylesheets - * - * @return void - */ - getStyleSheets: function (count) { - if (typeof(count) === 'undefined') { - var count = 0; - } - var stylesAreLoaded = true; - var errorText = ''; - var rules; - if (Ext.isOpera) { - if (this.document.readyState != 'complete') { - stylesAreLoaded = false; - errorText = 'Document.readyState not complete'; - } - } else { - // Test if the styleSheets array is at all accessible - if (Ext.isIE) { - try { - rules = this.document.styleSheets[0].rules; - } catch(e) { - stylesAreLoaded = false; - errorText = e; - } - } else { - try { - this.document.styleSheets && this.document.styleSheets[0] && this.document.styleSheets[0].rules; - } catch(e) { - stylesAreLoaded = false; - errorText = e; - } - } - // Then test if all stylesheets are accessible - if (stylesAreLoaded) { - if (this.document.styleSheets.length) { - Ext.each(this.document.styleSheets, function (styleSheet) { - if (Ext.isIE) { - try { rules = styleSheet.rules; } catch(e) { stylesAreLoaded = false; errorText = e; return false; } - try { rules = styleSheet.imports; } catch(e) { stylesAreLoaded = false; errorText = e; return false; } - } else { - try { rules = styleSheet.cssRules; } catch(e) { stylesAreLoaded = false; errorText = e; return false; } - } - }); - } else { - stylesAreLoaded = false; - errorText = 'Empty stylesheets array'; - } - } - } - if (!stylesAreLoaded) { - if (/Security/i.test(errorText)) { - this.getEditor().appendToLog('HTMLArea.Iframe', 'getStyleSheets', 'A security error occurred. Make sure all stylesheets are accessed from the same domain/subdomain and using the same protocol as the current script.', 'error'); - } else if (count > this.config.styleSheetsMaximumAttempts) { - this.getEditor().appendToLog('HTMLArea.Iframe', 'getStyleSheets', 'Stylesheets not loaded after ' + count + ' attempts. (' + errorText + ').', 'error'); - } else { - this.getStyleSheets.defer(100, this, [count++]); - } - } else { - // Style the document body - Ext.get(this.document.body).addClass('htmlarea-content-body'); - // Start listening to things happening in the iframe - // For some unknown reason, this is too early for Opera - if (!Ext.isOpera) { - this.startListening(); - } - // Hide the iframe - this.hide(); - // Set iframe ready - this.ready = true; - this.fireEvent('HTMLAreaEventIframeReady'); - } - }, - /* * Focus on the iframe */ focus: function () { @@ -3364,7 +3299,7 @@ constructor: function (config) { HTMLArea.CSS.Parser.superclass.constructor.call(this, {}); var configDefaults = { - parseAttemptsMaximumNumber: 17, + parseAttemptsMaximumNumber: 20, prefixLabelWithClassName: false, postfixLabelWithClassName: false, showTagFreeClasses: false, @@ -3372,6 +3307,9 @@ editor: null }; Ext.apply(this, config, configDefaults); + if (this.editor.config.styleSheetsMaximumAttempts) { + this.parseAttemptsMaximumNumber = this.editor.config.styleSheetsMaximumAttempts; + } this.addEvents( /* * @event HTMLAreaEventCssParsingComplete @@ -3444,9 +3382,12 @@ if (this.editor.document) { this.parseStyleSheets(); if (!this.cssLoaded) { - if (this.parseAttemptsCounter < this.parseAttemptsMaximumNumber) { - this.attemptTimeout = this.parse.defer(200, this); + if (/Security/i.test(this.error)) { + this.editor.appendToLog('HTMLArea.CSS.Parser', 'parse', 'A security error occurred. Make sure all stylesheets are accessed from the same domain/subdomain and using the same protocol as the current script.', 'error'); + this.fireEvent('HTMLAreaEventCssParsingComplete'); + } else if (this.parseAttemptsCounter < this.parseAttemptsMaximumNumber) { this.parseAttemptsCounter++; + this.attemptTimeout = this.parse.defer(200, this); } else { this.editor.appendToLog('HTMLArea.CSS.Parser', 'parse', 'The stylesheets could not be parsed. Reported error: ' + this.error, 'error'); this.fireEvent('HTMLAreaEventCssParsingComplete'); @@ -3468,30 +3409,60 @@ parseStyleSheets: function () { this.cssLoaded = true; this.error = null; - for (var i = 0; i < this.editor.document.styleSheets.length; i++) { - if (!Ext.isIE) { - try { - this.parseRules(this.editor.document.styleSheets[i].cssRules); - } catch (e) { - this.error = e; + // Test if the styleSheets array is at all accessible + if (Ext.isOpera) { + if (this.editor.document.readyState !== 'complete') { + this.cssLoaded = false; + this.error = 'Document.readyState not complete'; + } + } else { + if (Ext.isIE) { + try { + var rules = this.editor.document.styleSheets[0].rules; + var imports = this.editor.document.styleSheets[0].imports; + if ((!rules || !rules.length) && (!imports || !imports.length)) { + this.cssLoaded = false; + this.error = 'Empty rules and imports arrays'; + } + } catch(e) { this.cssLoaded = false; - this.parsedClasses = {}; + this.error = e; } } else { - try{ - if (this.editor.document.styleSheets[i].imports) { - this.parseIeRules(this.editor.document.styleSheets[i].imports); - } - if (this.editor.document.styleSheets[i].rules) { - this.parseRules(this.editor.document.styleSheets[i].rules); - } - } catch (e) { - this.error = e; + try { + this.editor.document.styleSheets && this.editor.document.styleSheets[0] && this.editor.document.styleSheets[0].rules; + } catch(e) { this.cssLoaded = false; - this.parsedClasses = {}; + this.error = e; } } } + if (this.cssLoaded) { + if (this.editor.document.styleSheets.length) { + Ext.each(this.editor.document.styleSheets, function (styleSheet) { + try { + if (Ext.isIE) { + if (styleSheet.imports) { + this.parseIeRules(styleSheet.imports); + } + if (styleSheet.rules) { + this.parseRules(styleSheet.rules); + } + } else { + this.parseRules(styleSheet.cssRules); + } + } catch (e) { + this.error = e; + this.cssLoaded = false; + this.parsedClasses = {}; + return false; + } + }, this); + } else { + this.cssLoaded = false; + this.error = 'Empty stylesheets array'; + } + } }, /* * This function parses the set of rules from a standard stylesheet Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/BlockStyle/block-style.js =================================================================== --- typo3/sysext/rtehtmlarea/htmlarea/plugins/BlockStyle/block-style.js (révision 10634) +++ typo3/sysext/rtehtmlarea/htmlarea/plugins/BlockStyle/block-style.js (copie de travail) @@ -216,6 +216,11 @@ tags: this.tags, editor: this.editor }); + // Disable the combo while initialization completes + var dropDown = this.getButton('BlockStyle'); + if (dropDown) { + dropDown.setDisabled(true); + } // Monitor css parsing being completed this.editor.iframe.mon(this.blockStyles, 'HTMLAreaEventCssParsingComplete', this.onCssParsingComplete, this); this.blockStyles.initiateParsing(); @@ -226,16 +231,16 @@ onCssParsingComplete: function () { if (this.blockStyles.isReady) { this.cssArray = this.blockStyles.getClasses(); + if (this.getEditorMode() === 'wysiwyg' && this.editor.isEditable()) { + this.updateValue('BlockStyle'); + } } - if (this.getEditorMode() === 'wysiwyg' && this.editor.isEditable()) { - this.updateValue('BlockStyle'); - } }, /* * This handler gets called when the toolbar is being updated */ onUpdateToolbar: function (button, mode, selectionEmpty, ancestors) { - if (mode === 'wysiwyg' && this.editor.isEditable()) { + if (mode === 'wysiwyg' && this.editor.isEditable() && this.blockStyles.isReady) { this.updateValue(button.itemId); } }, Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/TextStyle/text-style.js =================================================================== --- typo3/sysext/rtehtmlarea/htmlarea/plugins/TextStyle/text-style.js (révision 10634) +++ typo3/sysext/rtehtmlarea/htmlarea/plugins/TextStyle/text-style.js (copie de travail) @@ -222,6 +222,11 @@ tags: this.tags, editor: this.editor }); + // Disable the combo while initialization completes + var dropDown = this.getButton('TextStyle'); + if (dropDown) { + dropDown.setDisabled(true); + } // Monitor css parsing being completed this.editor.iframe.mon(this.textStyles, 'HTMLAreaEventCssParsingComplete', this.onCssParsingComplete, this); this.textStyles.initiateParsing(); @@ -232,16 +237,16 @@ onCssParsingComplete: function () { if (this.textStyles.isReady) { this.cssArray = this.textStyles.getClasses(); + if (this.getEditorMode() === 'wysiwyg' && this.editor.isEditable()) { + this.updateToolbar('TextStyle'); + } } - if (this.getEditorMode() === 'wysiwyg' && this.editor.isEditable()) { - this.updateToolbar('TextStyle'); - } }, /* * This handler gets called when the toolbar is being updated */ onUpdateToolbar: function (button, mode, selectionEmpty, ancestors) { - if (mode === 'wysiwyg' && this.editor.isEditable()) { + if (mode === 'wysiwyg' && this.editor.isEditable() && this.textStyles.isReady) { this.updateToolbar(button.itemId); } },