Fixed issue #9235: Enable synchronous load of some htmlArea RTE plugins
authorStanislas Rolland <typo3@sjbr.ca>
Wed, 27 Aug 2008 01:56:04 +0000 (01:56 +0000)
committerStanislas Rolland <typo3@sjbr.ca>
Wed, 27 Aug 2008 01:56:04 +0000 (01:56 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@4021 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
typo3/sysext/rtehtmlarea/ChangeLog
typo3/sysext/rtehtmlarea/class.tx_rtehtmlarea_base.php
typo3/sysext/rtehtmlarea/class.tx_rtehtmlareaapi.php
typo3/sysext/rtehtmlarea/extensions/DefinitionList/class.tx_rtehtmlarea_definitionlist.php
typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js

index 86b7dec..d73f900 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-08-26  Stanislas Rolland  <typo3@sjbr.ca>
+
+       * Fixed issue #9235: Enable synchronous load of some htmlArea RTE plugins
+
 2008-08-25  Stanislas Rolland  <typo3@sjbr.ca>
 
        * Fixed issue #9196: In htmlArea RTE, unable to create an external URL containing german umlauts
index 2a8ef1d..fb51d94 100644 (file)
@@ -1,3 +1,7 @@
+2008-08-26  Stanislas Rolland  <typo3@sjbr.ca>
+
+       * Fixed issue #9235: Enable synchronous load of some htmlArea RTE plugins
+
 2008-08-25  Stanislas Rolland  <typo3@sjbr.ca>
 
        * Fixed issue #9196: In htmlArea RTE, unable to create an external URL containing german umlauts
index 5ac1727..eb1efa0 100644 (file)
@@ -137,7 +137,7 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
        var $toolbarOrderArray = array();
        protected $pluginEnabledArray = array();                // Array of plugin id's enabled in the current RTE editing area
        protected $pluginEnabledCumulativeArray = array();      // Cumulative array of plugin id's enabled so far in any of the RTE editing areas of the form
-       protected $registeredPlugins = array();                 // Array of registered plugins indexd by their plugin Id's
+       public $registeredPlugins = array();                    // Array of registered plugins indexd by their plugin Id's
        
        /**
         * Returns true if the RTE is available. Here you check if the browser requirements are met.
@@ -773,7 +773,7 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                foreach ($this->pluginEnabledCumulativeArray[$RTEcounter] as $pluginId) {
                        $extensionKey = is_object($this->registeredPlugins[$pluginId]) ? $this->registeredPlugins[$pluginId]->getExtensionKey() : $this->ID;
                        $loadPluginCode .= '
-                       HTMLArea.loadPlugin("' . $pluginId . '", true, "' . $this->writeTemporaryFile('EXT:' . $extensionKey . '/htmlarea/plugins/' . $pluginId . '/' . strtolower(preg_replace('/([a-z])([A-Z])([a-z])/', "$1".'-'."$2"."$3", $pluginId)) . '.js', $pluginId) . '");';
+                       HTMLArea.loadPlugin("' . $pluginId . '", "' . $this->writeTemporaryFile('EXT:' . $extensionKey . '/htmlarea/plugins/' . $pluginId . '/' . strtolower(preg_replace('/([a-z])([A-Z])([a-z])/', "$1".'-'."$2"."$3", $pluginId)) . '.js', $pluginId) . '", '. ($this->registeredPlugins[$pluginId]->requiresSynchronousLoad()?'true':'false'). ');';
                }
                return (!$this->is_FE() ? '' : '
                ' . '/*<![CDATA[*/') . ($this->is_FE() ? '' : '
index 6378fae..d1614d0 100644 (file)
@@ -49,6 +49,7 @@ abstract class tx_rtehtmlareaapi {
        protected $pluginAddsButtons = true;                    // Boolean indicating whether the plugin is adding buttons or not
        protected $convertToolbarForHtmlAreaArray = array();    // The name-converting array, converting the button names used in the RTE PageTSConfing to the button id's used by the JS scripts
        protected $requiresClassesConfiguration = false;        // True if the registered plugin requires the PageTSConfig Classes configuration
+       protected $requiresSynchronousLoad = false;             // True if the plugin must be loaded synchronously
 
        /**
         * Returns true if the plugin is available and correctly initialized
@@ -199,6 +200,26 @@ abstract class tx_rtehtmlareaapi {
                return $this->requiresClassesConfiguration;
        }
 
+       /**
+        * Returns true if the plugin requires synchronous load
+        *
+        * @return      boolean         true if the plugin requires synchronous load
+        */
+       public function requiresSynchronousLoad() {
+               return $this->requiresSynchronousLoad;
+       }
+
+       /**
+        * Sets the plugin to require synchronous load or not
+        *
+        * @param       boolean         $value: the boolean value to set
+        *
+        * @return      void
+        */
+       public function setSynchronousLoad($value = true) {
+               $this->requiresSynchronousLoad = $value;
+       }
+
 } // end of class
 
 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlareaapi.php']) {
index 0f8cae2..b57d518 100644 (file)
@@ -51,9 +51,11 @@ class tx_rtehtmlarea_definitionlist extends tx_rtehtmlareaapi {
                );\r
        \r
        public function main($parentObject) {\r
-               global $TYPO3_CONF_VARS;\r
-               \r
-               return parent::main($parentObject) && $this->htmlAreaRTE->isPluginEnabled('BlockElements');\r
+               $enabled = parent::main($parentObject) && $this->htmlAreaRTE->isPluginEnabled('BlockElements');\r
+               if ($enabled && is_object($this->htmlAreaRTE->registeredPlugins['BlockElements'])) {\r
+                       $this->htmlAreaRTE->registeredPlugins['BlockElements']->setSynchronousLoad();\r
+               }\r
+               return $enabled;\r
        }\r
        \r
        /**\r
index fa6f5b1..a99ee41 100644 (file)
@@ -123,11 +123,21 @@ HTMLArea.loadTimer;
 HTMLArea._scripts = [];
 HTMLArea._scriptLoaded = [];
 HTMLArea._request = [];
-HTMLArea.loadScript = function(url, plugin) {
-       if (plugin) url = _editor_url + "/plugins/" + plugin + '/' + url;
+HTMLArea.loadScript = function(url, pluginName, asynchronous) {
+       if (typeof(pluginName) == "undefined") {
+               var pluginName = "";
+       }
+       if (typeof(asynchronous) == "undefined") {
+               var asynchronous = true;
+       }
        if (HTMLArea.is_opera) url = _typo3_host_url + url;
        if (HTMLArea._compressedScripts && url.indexOf("compressed") == -1) url = url.replace(/\.js$/gi, "_compressed.js");
-       HTMLArea._scripts.push(url);
+       var scriptInfo = {
+               pluginName      : pluginName,
+               url             : url,
+               asynchronous    : asynchronous
+       };
+       HTMLArea._scripts.push(scriptInfo);
 };
 if(HTMLArea.is_gecko) HTMLArea.loadScript(RTEarea[0]["htmlarea-gecko"] ? RTEarea[0]["htmlarea-gecko"] : _editor_url + "htmlarea-gecko.js");
 if(HTMLArea.is_ie) HTMLArea.loadScript(RTEarea[0]["htmlarea-ie"] ? RTEarea[0]["htmlarea-ie"] : _editor_url + "htmlarea-ie.js");
@@ -138,7 +148,7 @@ if(HTMLArea.is_ie) HTMLArea.loadScript(RTEarea[0]["htmlarea-ie"] ? RTEarea[0]["h
 HTMLArea.MSXML_XMLHTTP_PROGIDS = new Array("Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP");
 HTMLArea.XMLHTTPResponseHandler = function (i) {
        return (function() {
-               var url = HTMLArea._scripts[i];
+               var url = HTMLArea._scripts[i].url;
                if (HTMLArea._request[i].readyState != 4) return;
                if (HTMLArea._request[i].status == 200) {
                        try {
@@ -154,8 +164,8 @@ HTMLArea.XMLHTTPResponseHandler = function (i) {
        });
 };
 HTMLArea._getScript = function (i,asynchronous,url) {
-       if (typeof(url) == "undefined") var url = HTMLArea._scripts[i];
-       if (typeof(asynchronous) == "undefined") var asynchronous = true;
+       if (typeof(url) == "undefined") var url = HTMLArea._scripts[i].url;
+       if (typeof(asynchronous) == "undefined") var asynchronous = HTMLArea._scripts[i].asynchronous;
        if (window.XMLHttpRequest) HTMLArea._request[i] = new XMLHttpRequest();
                else if (window.ActiveXObject) {
                        var success = false;
@@ -219,7 +229,16 @@ HTMLArea.init = function() {
                try {
                        var success = true;
                        for (var i = 0, n = HTMLArea._scripts.length; i < n && success; i++) {
-                               success = success && HTMLArea._getScript(i);
+                               if (HTMLArea._scripts[i].asynchronous) {
+                                       success = success && HTMLArea._getScript(i);
+                               } else {
+                                       try {
+                                               eval(HTMLArea._getScript(i));
+                                               HTMLArea._scriptLoaded[i] = true;
+                                       } catch (e) {
+                                               HTMLArea._appendToLog("ERROR [HTMLArea::getScript]: Unable to get script " + url + ": " + e);
+                                       }
+                               }
                        }
                } catch (e) {
                        HTMLArea._appendToLog("ERROR [HTMLArea::init]: Unable to use XMLHttpRequest: "+ e);
@@ -1402,21 +1421,13 @@ HTMLArea.prototype.registerPlugin = function(plugin) {
 };
 
 /*
- * Load the required plugin script and, unless not requested, the language file
+ * Load the required plugin script
  */
-HTMLArea.loadPlugin = function(pluginName,noLangFile,url) {
-       if (typeof(url) == "undefined") {
-               var dir = _editor_url + "plugins/" + pluginName;
-               var plugin = pluginName.replace(/([a-z])([A-Z])([a-z])/g, "$1" + "-" + "$2" + "$3").toLowerCase() + ".js";
-               var plugin_file = dir + "/" + plugin;
-               HTMLArea.loadScript(plugin_file);
-               if (typeof(noLangFile) == "undefined" || !noLangFile) {
-                       var plugin_lang = dir + "/lang/" + _editor_lang + ".js";
-                       HTMLArea._scripts.push(plugin_lang);
-               }
-       } else {
-               HTMLArea.loadScript(url);
+HTMLArea.loadPlugin = function (pluginName, url, asynchronous) {
+       if (typeof(asynchronous) == "undefined") {
+               var asynchronous = true;
        }
+       HTMLArea.loadScript(url, pluginName, asynchronous);
 };
 
 /*