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