From 19138ef7a9687ab45cdb495ac7c7668d571ff939 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 09 Jun 2014 04:35:32 -0400
Subject: [PATCH] Make sure set_env and add_label commands are always sent first - other commands might depend on them. Fixes loading message in managesieve filters frame.

---
 program/include/rcmail_output_html.php |   44 ++++++++++++++++++++++++--------------------
 1 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php
index 6594209..f5430d9 100644
--- a/program/include/rcmail_output_html.php
+++ b/program/include/rcmail_output_html.php
@@ -419,15 +419,6 @@
      */
     public function write($template = '')
     {
-        // unlock interface after iframe load
-        $unlock = preg_replace('/[^a-z0-9]/i', '', $_REQUEST['_unlock']);
-        if ($this->framed) {
-            array_unshift($this->js_commands, array('iframe_loaded', $unlock));
-        }
-        else if ($unlock) {
-            array_unshift($this->js_commands, array('hide_message', $unlock));
-        }
-
         if (!empty($this->script_files)) {
             $this->set_env('request_token', $this->app->get_request_token());
         }
@@ -572,18 +563,31 @@
      */
     protected function get_js_commands(&$framed = null)
     {
-        if (!$this->framed && !empty($this->js_env)) {
-            $this->command('set_env', $this->js_env);
-        }
-
-        if (!empty($this->js_labels)) {
-            $this->command('add_label', $this->js_labels);
-        }
-
-        $out = '';
+        $out             = '';
         $parent_commands = 0;
+        $top_commands    = array();
 
-        foreach ($this->js_commands as $i => $args) {
+        // these should be always on top,
+        // e.g. hide_message() below depends on env.framed
+        if (!$this->framed && !empty($this->js_env)) {
+            $top_commands[] = array('set_env', $this->js_env);
+        }
+        if (!empty($this->js_labels)) {
+            $top_commands[] = array('add_label', $this->js_labels);
+        }
+
+        // unlock interface after iframe load
+        $unlock = preg_replace('/[^a-z0-9]/i', '', $_REQUEST['_unlock']);
+        if ($this->framed) {
+            $top_commands[] = array('iframe_loaded', $unlock);
+        }
+        else if ($unlock) {
+            $top_commands[] = array('hide_message', $unlock);
+        }
+
+        $commands = array_merge($top_commands, $this->js_commands);
+
+        foreach ($commands as $i => $args) {
             $method = array_shift($args);
             $parent = $this->framed || preg_match('/^parent\./', $method);
 
@@ -604,7 +608,7 @@
             $out .= sprintf("%s(%s);\n", $method, implode(',', $args));
         }
 
-        $framed = $parent_prefix && $parent_commands == count($this->js_commands);
+        $framed = $parent_prefix && $parent_commands == count($commands);
 
         // make the output more compact if all commands go to parent window
         if ($framed) {

--
Gitblit v1.9.1