From 28de3911825bde79ee5a92762940ef310baab737 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 6 Nov 2012 13:21:04 +0100 Subject: [PATCH] Recursively resolve paths of iframe contents; unify contentframe registration and reduce code-duplication --- plugins/help/help.php | 3 +- program/include/rcube_output_html.php | 70 +++++++++++++++++++-------- program/steps/addressbook/func.inc | 7 +-- program/steps/mail/func.inc | 2 +- program/steps/settings/folders.inc | 7 +-- program/steps/settings/func.inc | 7 +-- program/steps/settings/identities.inc | 6 +-- 7 files changed, 55 insertions(+), 47 deletions(-) diff --git a/plugins/help/help.php b/plugins/help/help.php index 1a76cbbda..4b11dceb3 100644 --- a/plugins/help/help.php +++ b/plugins/help/help.php @@ -90,8 +90,7 @@ class help extends rcube_plugin $attrib['name'] = $attrib['id']; - return html::tag('iframe', $attrib, '', array( - 'id', 'class', 'style', 'src', 'width', 'height', 'frameborder')); + return $rcmail->output->frame($attrib); } } diff --git a/program/include/rcube_output_html.php b/program/include/rcube_output_html.php index 71aec7775..a37226475 100644 --- a/program/include/rcube_output_html.php +++ b/program/include/rcube_output_html.php @@ -205,6 +205,31 @@ class rcube_output_html extends rcube_output } + /** + * Find the given file in the current skin path stack + * + * @param string File name/path to resolve (starting with /) + * @param string Reference to the base path of the matching skin + * @param string Additional path to search in + * @return mixed Relative path to the requested file or False if not found + */ + public function get_skin_file($file, &$skin_path, $add_path = null) + { + $skin_paths = $this->skin_paths; + if ($add_path) + array_unshift($skin_paths, $add_path); + + foreach ($skin_paths as $skin_path) { + $path = realpath($skin_path . $file); + if (is_file($path)) { + return $skin_path . $file; + } + } + + return false; + } + + /** * Register a GUI object to the client script * @@ -401,13 +426,13 @@ class rcube_output_html extends rcube_output // apply skin search escalation list to plugin directory $plugin_skin_paths = array(); foreach ($this->skin_paths as $skin_path) { - $plugin_skin_paths[] = $this->app->plugins->dir . $plugin . '/' . $skin_path; + $plugin_skin_paths[] = $this->app->plugins->url . $plugin . '/' . $skin_path; } // add fallback to default skin if (is_dir($this->app->plugins->dir . $plugin . '/skins/default')) { $skin_dir = $plugin . '/skins/default'; - $plugin_skin_paths[] = $this->app->plugins->dir . $skin_dir; + $plugin_skin_paths[] = $this->app->plugins->url . $skin_dir; } // add plugin skin paths to search list @@ -536,12 +561,17 @@ class rcube_output_html extends rcube_output * Make URLs starting with a slash point to skin directory * * @param string Input string + * @param boolean True if URL should be resolved using the current skin path stack * @return string */ - public function abs_url($str) + public function abs_url($str, $search_path = false) { - if ($str[0] == '/') + if ($str[0] == '/') { + if ($search_path && ($file_url = $this->get_skin_file($str, $skin_path))) + return $file_url; + return $this->base_path . $str; + } else return $str; } @@ -825,15 +855,9 @@ class rcube_output_html extends rcube_output // include a file case 'include': $old_base_path = $this->base_path; - $skin_paths = $this->skin_paths; - if ($attrib['skin_path']) - array_unshift($skin_paths, $attrib['skin_path']); - foreach ($skin_paths as $skin_path) { - $path = realpath($skin_path . $attrib['file']); - if (is_file($path)) { - $this->base_path = $skin_path; - break; - } + if ($path = $this->get_skin_file($attrib['file'], $skin_path, $attrib['skin_path'])) { + $this->base_path = $skin_path; + $path = realpath($path); } if (is_readable($path)) { @@ -1350,21 +1374,25 @@ class rcube_output_html extends rcube_output * Returns iframe object, registers some related env variables * * @param array $attrib HTML attributes - * + * @param boolean $is_contentframe Register this iframe as the 'contentframe' gui object * @return string IFRAME element */ - public function frame($attrib) + public function frame($attrib, $is_contentframe = false) { + static $idcount = 0; + if (!$attrib['id']) { - $attrib['id'] = 'rcmframe'; + $attrib['id'] = 'rcmframe' . ++$idcount; } - if (!$attrib['name']) { - $attrib['name'] = $attrib['id']; - } + $attrib['name'] = $attrib['id']; + $attrib['src'] = $attrib['src'] ? $this->abs_url($attrib['src'], true) : 'program/resources/blank.gif'; - $this->set_env('contentframe', $attrib['id']); - $this->set_env('blankpage', $attrib['src'] ? $this->abs_url($attrib['src']) : 'program/resources/blank.gif'); + // register as 'contentframe' object + if ($is_contentframe) + $this->set_env('contentframe', $attrib['name']); + $this->set_env('blankpage', $attrib['src']); + } return html::iframe($attrib); } diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index 3a0508025..cefe49e01 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -367,12 +367,7 @@ function rcmail_contact_frame($attrib) if (!$attrib['id']) $attrib['id'] = 'rcmcontactframe'; - $attrib['name'] = $attrib['id']; - - $OUTPUT->set_env('contentframe', $attrib['name']); - $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/resources/blank.gif'); - - return html::iframe($attrib); + return $OUTPUT->frame($attrib, true); } diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 47d1a484a..9ad3a6e6f 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -471,7 +471,7 @@ function rcmail_messagecontent_frame($attrib) $OUTPUT->set_env('contentframe', $attrib['id']); $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/resources/blank.gif'); - return html::iframe($attrib); + return $OUTPUT->frame($attrib, true); } diff --git a/program/steps/settings/folders.inc b/program/steps/settings/folders.inc index 12e449e80..0c7d9063f 100644 --- a/program/steps/settings/folders.inc +++ b/program/steps/settings/folders.inc @@ -369,12 +369,7 @@ function rcmail_folder_frame($attrib) if (!$attrib['id']) $attrib['id'] = 'rcmfolderframe'; - $attrib['name'] = $attrib['id']; - - $OUTPUT->set_env('contentframe', $attrib['name']); - $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/resources/blank.gif'); - - return html::iframe($attrib); + return $OUTPUT->frame($attrib, true); } function rcmail_rename_folder($oldname, $newname) diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index d5ccbb2d7..8bef2ff51 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -31,12 +31,7 @@ function rcmail_preferences_frame($attrib) if (!$attrib['id']) $attrib['id'] = 'rcmprefsframe'; - $attrib['name'] = $attrib['id']; - - $OUTPUT->set_env('contentframe', $attrib['name']); - $OUTPUT->set_env('blankpage', $attrib['src'] ? $OUTPUT->abs_url($attrib['src']) : 'program/resources/blank.gif'); - - return html::iframe($attrib); + return $OUTPUT->frame($attrib, true); } diff --git a/program/steps/settings/identities.inc b/program/steps/settings/identities.inc index 26bd432c2..82a1841a3 100644 --- a/program/steps/settings/identities.inc +++ b/program/steps/settings/identities.inc @@ -33,11 +33,7 @@ function rcmail_identity_frame($attrib) if (!$attrib['id']) $attrib['id'] = 'rcmIdentityFrame'; - $attrib['name'] = $attrib['id']; - - $OUTPUT->set_env('contentframe', $attrib['name']); - - return html::iframe($attrib); + return $OUTPUT->frame($attrib, true); } $OUTPUT->add_handler('identityframe', 'rcmail_identity_frame');