aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/adm/style/acp_bbcodes.html2
-rw-r--r--phpBB/adm/style/admin.css3
-rw-r--r--phpBB/adm/style/overall_footer.html2
-rw-r--r--phpBB/adm/style/viewsource.html21
-rw-r--r--phpBB/assets/javascript/core.js9
-rw-r--r--phpBB/docs/events.md26
-rw-r--r--phpBB/includes/acp/acp_extensions.php10
-rw-r--r--phpBB/includes/functions_display.php2
-rw-r--r--phpBB/includes/functions_posting.php19
-rw-r--r--phpBB/language/en/acp/extensions.php1
-rw-r--r--phpBB/language/en/viewtopic.php1
-rw-r--r--phpBB/phpbb/avatar/driver/driver.php11
-rw-r--r--phpBB/phpbb/avatar/driver/gravatar.php8
-rw-r--r--phpBB/phpbb/avatar/driver/local.php8
-rw-r--r--phpBB/phpbb/avatar/driver/remote.php8
-rw-r--r--phpBB/phpbb/avatar/driver/upload.php8
-rw-r--r--phpBB/phpbb/extension/manager.php15
-rw-r--r--phpBB/phpbb/extension/metadata_manager.php14
-rw-r--r--phpBB/styles/prosilver/template/forum_fn.js33
-rw-r--r--phpBB/styles/prosilver/template/index_body.html4
-rw-r--r--phpBB/styles/prosilver/template/overall_footer.html5
-rw-r--r--phpBB/styles/prosilver/template/ucp_profile_reg_details.html2
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_body.html17
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_topic_tools.html39
-rw-r--r--phpBB/styles/prosilver/theme/bidi.css15
-rw-r--r--phpBB/styles/prosilver/theme/buttons.css40
-rw-r--r--phpBB/styles/prosilver/theme/colours.css30
-rw-r--r--phpBB/styles/prosilver/theme/common.css65
-rwxr-xr-x[-rw-r--r--]phpBB/styles/prosilver/theme/images/buttons.pngbin2563 -> 2923 bytes
-rw-r--r--phpBB/styles/prosilver/theme/images/icon_download.gifbin0 -> 198 bytes
-rw-r--r--phpBB/styles/prosilver/theme/responsive.css13
-rw-r--r--phpBB/styles/subsilver2/template/index_body.html4
-rw-r--r--phpBB/styles/subsilver2/template/mcp_topic.html2
-rw-r--r--phpBB/styles/subsilver2/template/ucp_profile_reg_details.html2
-rw-r--r--phpBB/viewtopic.php9
-rw-r--r--tests/avatar/driver/barfoo.php5
-rw-r--r--tests/avatar/driver/foobar.php5
-rw-r--r--tests/extension/ext/barfoo/composer.json22
-rw-r--r--tests/extension/ext/barfoo/ext.php2
-rw-r--r--tests/extension/ext/vendor/moo/composer.json2
-rw-r--r--tests/extension/ext/vendor2/bar/acp/a_info.php (renamed from tests/extension/ext/barfoo/acp/a_info.php)6
-rw-r--r--tests/extension/ext/vendor2/bar/acp/a_module.php (renamed from tests/extension/ext/barfoo/acp/a_module.php)2
-rw-r--r--tests/extension/ext/vendor2/bar/composer.json21
-rw-r--r--tests/extension/ext/vendor2/bar/ext.php (renamed from tests/extension/ext/bar/ext.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/a_class.php (renamed from tests/extension/ext/foo/a_class.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/acp/a_info.php (renamed from tests/extension/ext/foo/acp/a_info.php)4
-rw-r--r--tests/extension/ext/vendor2/foo/acp/a_module.php (renamed from tests/extension/ext/foo/mcp/a_module.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/acp/fail_info.php (renamed from tests/extension/ext/foo/acp/fail_info.php)4
-rw-r--r--tests/extension/ext/vendor2/foo/acp/fail_module.php (renamed from tests/extension/ext/foo/acp/fail_module.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/b_class.php (renamed from tests/extension/ext/foo/b_class.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/composer.json (renamed from tests/extension/ext/foo/composer.json)2
-rw-r--r--tests/extension/ext/vendor2/foo/ext.php (renamed from tests/extension/ext/foo/ext.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/mcp/a_info.php (renamed from tests/extension/ext/foo/mcp/a_info.php)4
-rw-r--r--tests/extension/ext/vendor2/foo/mcp/a_module.php (renamed from tests/extension/ext/foo/acp/a_module.php)2
-rw-r--r--tests/extension/ext/vendor2/foo/sub/type/alternative.php (renamed from tests/extension/ext/foo/sub/type/alternative.php)0
-rw-r--r--tests/extension/ext/vendor2/foo/type/alternative.php (renamed from tests/extension/ext/foo/type/alternative.php)0
-rw-r--r--tests/extension/ext/vendor2/foo/type/dummy/empty.txt (renamed from tests/extension/ext/foo/type/dummy/empty.txt)0
-rw-r--r--tests/extension/ext/vendor2/foo/typewrong/error.php (renamed from tests/extension/ext/foo/typewrong/error.php)0
-rw-r--r--tests/extension/ext/vendor3/bar/ext.php26
-rw-r--r--tests/extension/ext/vendor3/bar/my/hidden_class.php (renamed from tests/extension/ext/bar/my/hidden_class.php)2
-rw-r--r--tests/extension/ext/vendor3/bar/styles/prosilver/template/foobar_body.html (renamed from tests/extension/ext/bar/styles/prosilver/template/foobar_body.html)0
-rw-r--r--tests/extension/finder_test.php44
-rw-r--r--tests/extension/fixtures/extensions.xml2
-rw-r--r--tests/extension/manager_test.php43
-rw-r--r--tests/extension/metadata_manager_test.php6
-rw-r--r--tests/extension/modules_test.php60
-rw-r--r--tests/functional/extension_acp_test.php44
67 files changed, 568 insertions, 200 deletions
diff --git a/phpBB/adm/style/acp_bbcodes.html b/phpBB/adm/style/acp_bbcodes.html
index 4b48b94519..d4ed5cfd10 100644
--- a/phpBB/adm/style/acp_bbcodes.html
+++ b/phpBB/adm/style/acp_bbcodes.html
@@ -73,7 +73,7 @@
</thead>
<tbody>
<!-- BEGIN token -->
- <tr valign="top">
+ <tr style="vertical-align: top;">
<td class="row1">{token.TOKEN}</td>
<td class="row2">{token.EXPLAIN}</td>
</tr>
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index d971c38efb..c4f1caf722 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -2365,11 +2365,14 @@ fieldset.permissions .padding {
.dropdown .dropdown-contents {
z-index: 2;
overflow: hidden;
+ overflow-y: auto;
background: #fff;
border: 1px solid #b9b9b9;
border-radius: 5px;
padding: 5px;
position: relative;
+ min-width: 40px;
+ max-height: 200px;
box-shadow: 1px 3px 5px rgba(0, 0, 0, 0.2);
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
diff --git a/phpBB/adm/style/overall_footer.html b/phpBB/adm/style/overall_footer.html
index 72af9d3388..8810414fc2 100644
--- a/phpBB/adm/style/overall_footer.html
+++ b/phpBB/adm/style/overall_footer.html
@@ -36,9 +36,9 @@
<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS ajax.js -->
<!-- INCLUDEJS admin.js -->
-{$SCRIPTS}
<!-- EVENT acp_overall_footer_after -->
+{$SCRIPTS}
</body>
</html>
diff --git a/phpBB/adm/style/viewsource.html b/phpBB/adm/style/viewsource.html
deleted file mode 100644
index 03e9ff50e5..0000000000
--- a/phpBB/adm/style/viewsource.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!-- INCLUDE simple_header.html -->
-<div id="acp" style="padding: 0;">
-<div class="panel" style="padding: 10px;">
-<div style="overflow: auto;">
- <h1>{FILENAME}</h1>
-
- <table class="type2">
- <tbody>
- <!-- BEGIN source -->
- <tr valign="top">
- <td class="sourcenum">{source.LINENUM}&nbsp;&nbsp;</td>
- <td class="source">{source.LINE}</td>
- </tr>
- <!-- END source -->
- </tbody>
- </table>
-
-</div>
-</div>
-</div>
-<!-- INCLUDE simple_footer.html -->
diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js
index 8d0db5da1a..5b8331bdce 100644
--- a/phpBB/assets/javascript/core.js
+++ b/phpBB/assets/javascript/core.js
@@ -932,6 +932,14 @@ phpbb.toggleDropdown = function() {
};
/**
+* Toggle dropdown submenu
+*/
+phpbb.toggleSubmenu = function(e) {
+ $(this).siblings('.dropdown-submenu').toggle();
+ e.preventDefault();
+}
+
+/**
* Register dropdown menu
* Shows/hides dropdown, decides which side to open to
*
@@ -962,6 +970,7 @@ phpbb.registerDropdown = function(toggle, dropdown, options)
toggle.data('dropdown-options', ops);
toggle.click(phpbb.toggleDropdown);
+ $('.dropdown-toggle-submenu', ops.parent).click(phpbb.toggleSubmenu);
};
/**
diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md
index 9b65566197..f1df662f76 100644
--- a/phpBB/docs/events.md
+++ b/phpBB/docs/events.md
@@ -86,13 +86,21 @@ forumlist_body_last_post_title_prepend
* Since: 3.1.0-a1
* Purpose: Add content before the post title of the latest post in a forum on the forum list.
-index_body_forumlist_before
+index_body_linklist_after
===
* Locations:
+ styles/prosilver/template/index_body.html
+ styles/subsilver2/template/index_body.html
* Since: 3.1.0-a3
-* Purpose: Add content above the forums list (on forum index only)
+* Purpose: Add content after the linklist above the forum list on Board index
+
+index_body_linklist_before
+===
+* Locations:
+ + styles/prosilver/template/index_body.html
+ + styles/subsilver2/template/index_body.html
+* Since: 3.1.0-a3
+* Purpose: Add content before the linklist above the forum list on Board index
index_body_stat_blocks_before
===
@@ -447,3 +455,17 @@ viewtopic_topic_title_prepend
+ styles/subsilver2/template/viewtopic_body.html
* Since: 3.1.0-a1
* Purpose: Add content directly before the topic title link on the View topic screen
+
+viewtopic_topic_tools_after
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_topic_tools.html
+* Since: 3.1.0-a3
+* Purpose: Add a new topic tool after the rest of the existing ones
+
+viewtopic_topic_tools_before
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_topic_tools.html
+* Since: 3.1.0-a3
+* Purpose: Add a new topic tool before the rest of the existing ones
diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php
index c21c9f4e9d..2ff479d824 100644
--- a/phpBB/includes/acp/acp_extensions.php
+++ b/phpBB/includes/acp/acp_extensions.php
@@ -88,6 +88,11 @@ class acp_extensions
break;
case 'enable_pre':
+ if (!$md_manager->validate_dir())
+ {
+ trigger_error($user->lang['EXTENSION_DIR_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
+ }
+
if (!$md_manager->validate_enable())
{
trigger_error($user->lang['EXTENSION_NOT_AVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
@@ -108,6 +113,11 @@ class acp_extensions
break;
case 'enable':
+ if (!$md_manager->validate_dir())
+ {
+ trigger_error($user->lang['EXTENSION_DIR_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
+ }
+
if (!$md_manager->validate_enable())
{
trigger_error($user->lang['EXTENSION_NOT_AVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index 21ac3666e1..e663ac90c5 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -1479,6 +1479,8 @@ function phpbb_gen_download_links($param_key, $param_val, $phpbb_root_path, $php
}
$methods = compress::methods();
+ // Sort by preferred type.
+ $methods = array_intersect(array('.zip', '.tar.bz2', '.tar.gz', '.tar'), $methods);
$links = array();
foreach ($methods as $method)
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index 1bcef7f1f2..172f4403ac 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -1473,7 +1473,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
*/
function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true)
{
- global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container;
+ global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher;
// We do not handle erasing posts here
if ($mode == 'delete')
@@ -2305,6 +2305,23 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$url = (!$params) ? "{$phpbb_root_path}viewforum.$phpEx" : "{$phpbb_root_path}viewtopic.$phpEx";
$url = append_sid($url, 'f=' . $data['forum_id'] . $params) . $add_anchor;
+ /**
+ * This event is used for performing actions directly after a post or topic
+ * has been submitted. When a new topic is posted, the topic ID is
+ * available in the $data array.
+ *
+ * The only action that can be done by altering data made available to this
+ * event is to modify the return URL ($url).
+ *
+ * @event core.submit_post_end
+ * @var string url The "Return to topic" URL
+ * @var array data Array of post data about the
+ * submitted post
+ * @since 3.1-A3
+ */
+ $vars = array('url', 'data');
+ extract($phpbb_dispatcher->trigger_event('core.submit_post_end', compact($vars)));
+
return $url;
}
diff --git a/phpBB/language/en/acp/extensions.php b/phpBB/language/en/acp/extensions.php
index 8279a68022..67b34ff0c7 100644
--- a/phpBB/language/en/acp/extensions.php
+++ b/phpBB/language/en/acp/extensions.php
@@ -41,6 +41,7 @@ $lang = array_merge($lang, array(
'EXTENSIONS_EXPLAIN' => 'The Extensions Manager is a tool in your phpBB Board which allows you to manage all of your extensions statuses and view information about them.',
'EXTENSION_INVALID_LIST' => 'The “%s” extension is not valid.<br />%s<br /><br />',
'EXTENSION_NOT_AVAILABLE' => 'The selected extension is not available for this board, please verify your phpBB and PHP versions are allowed (see the details page).',
+ 'EXTENSION_DIR_INVALID' => 'The selected extension has an invalid directory structure and cannot be enabled.',
'DETAILS' => 'Details',
diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php
index 6f318c39f1..424cb9da3e 100644
--- a/phpBB/language/en/viewtopic.php
+++ b/phpBB/language/en/viewtopic.php
@@ -104,6 +104,7 @@ $lang = array_merge($lang, array(
'SUBMIT_VOTE' => 'Submit vote',
+ 'TOPIC_TOOLS' => 'Topic tools',
'TOTAL_VOTES' => 'Total votes',
'UNLOCK_TOPIC' => 'Unlock topic',
diff --git a/phpBB/phpbb/avatar/driver/driver.php b/phpBB/phpbb/avatar/driver/driver.php
index d360614122..dd55f09119 100644
--- a/phpBB/phpbb/avatar/driver/driver.php
+++ b/phpBB/phpbb/avatar/driver/driver.php
@@ -112,17 +112,6 @@ abstract class driver implements \phpbb\avatar\driver\driver_interface
/**
* @inheritdoc
*/
- public function get_template_name()
- {
- $driver = preg_replace('#^phpbb\\\\avatar\\\\driver\\\\#', '', get_class($this));
- $template = "ucp_avatar_options_$driver.html";
-
- return $template;
- }
-
- /**
- * @inheritdoc
- */
public function get_name()
{
return $this->name;
diff --git a/phpBB/phpbb/avatar/driver/gravatar.php b/phpBB/phpbb/avatar/driver/gravatar.php
index d64f4da734..9f14b7f468 100644
--- a/phpBB/phpbb/avatar/driver/gravatar.php
+++ b/phpBB/phpbb/avatar/driver/gravatar.php
@@ -147,6 +147,14 @@ class gravatar extends \phpbb\avatar\driver\driver
}
/**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_gravatar.html';
+ }
+
+ /**
* Build gravatar URL for output on page
*
* @return string Gravatar URL
diff --git a/phpBB/phpbb/avatar/driver/local.php b/phpBB/phpbb/avatar/driver/local.php
index f6acc6e636..611a44cb3d 100644
--- a/phpBB/phpbb/avatar/driver/local.php
+++ b/phpBB/phpbb/avatar/driver/local.php
@@ -135,6 +135,14 @@ class local extends \phpbb\avatar\driver\driver
}
/**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_local.html';
+ }
+
+ /**
* Get a list of avatars that are locally available
* Results get cached for 24 hours (86400 seconds)
*
diff --git a/phpBB/phpbb/avatar/driver/remote.php b/phpBB/phpbb/avatar/driver/remote.php
index 22d50c703e..36623942df 100644
--- a/phpBB/phpbb/avatar/driver/remote.php
+++ b/phpBB/phpbb/avatar/driver/remote.php
@@ -186,4 +186,12 @@ class remote extends \phpbb\avatar\driver\driver
'avatar_height' => $height,
);
}
+
+ /**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_remote.html';
+ }
}
diff --git a/phpBB/phpbb/avatar/driver/upload.php b/phpBB/phpbb/avatar/driver/upload.php
index 822c40af98..1e50e135e4 100644
--- a/phpBB/phpbb/avatar/driver/upload.php
+++ b/phpBB/phpbb/avatar/driver/upload.php
@@ -168,6 +168,14 @@ class upload extends \phpbb\avatar\driver\driver
}
/**
+ * @inheritdoc
+ */
+ public function get_template_name()
+ {
+ return 'ucp_avatar_options_upload.html';
+ }
+
+ /**
* Check if user is able to upload an avatar
*
* @return bool True if user can upload, false if not
diff --git a/phpBB/phpbb/extension/manager.php b/phpBB/phpbb/extension/manager.php
index 7f009867c9..23b281deaa 100644
--- a/phpBB/phpbb/extension/manager.php
+++ b/phpBB/phpbb/extension/manager.php
@@ -411,9 +411,24 @@ class manager
if ($file_info->isFile() && $file_info->getFilename() == 'ext.' . $this->php_ext)
{
$ext_name = $iterator->getInnerIterator()->getSubPath();
+ $composer_file = $iterator->getPath() . '/composer.json';
+ // Ignore the extension if there is no composer.json.
+ if (!is_readable($composer_file) || !($ext_info = file_get_contents($composer_file)))
+ {
+ continue;
+ }
+
+ $ext_info = json_decode($ext_info, true);
$ext_name = str_replace(DIRECTORY_SEPARATOR, '/', $ext_name);
+ // Ignore the extension if directory depth is not correct or if the directory structure
+ // does not match the name value specified in composer.json.
+ if (substr_count($ext_name, '/') !== 1 || !isset($ext_info['name']) || $ext_name != $ext_info['name'])
+ {
+ continue;
+ }
+
$available[$ext_name] = $this->phpbb_root_path . 'ext/' . $ext_name . '/';
}
}
diff --git a/phpBB/phpbb/extension/metadata_manager.php b/phpBB/phpbb/extension/metadata_manager.php
index d0323120d8..66cdb86513 100644
--- a/phpBB/phpbb/extension/metadata_manager.php
+++ b/phpBB/phpbb/extension/metadata_manager.php
@@ -266,8 +266,8 @@ class metadata_manager
*/
public function validate_enable()
{
- // Check for phpBB, PHP versions
- if (!$this->validate_require_phpbb() || !$this->validate_require_php())
+ // Check for valid directory & phpBB, PHP versions
+ if (!$this->validate_dir() || !$this->validate_require_phpbb() || !$this->validate_require_php())
{
return false;
}
@@ -275,6 +275,16 @@ class metadata_manager
return true;
}
+ /**
+ * Validates the most basic directory structure to ensure it follows <vendor>/<ext> convention.
+ *
+ * @return boolean True when passes validation
+ */
+ public function validate_dir()
+ {
+ return (substr_count($this->ext_name, '/') === 1 && $this->ext_name == $this->get_metadata('name'));
+ }
+
/**
* Validates the contents of the phpbb requirement field
diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js
index 1b2b1954ef..a45f750a63 100644
--- a/phpBB/styles/prosilver/template/forum_fn.js
+++ b/phpBB/styles/prosilver/template/forum_fn.js
@@ -434,6 +434,39 @@ function parse_document(container)
});
/**
+ * Dropdowns
+ */
+ container.find('.dropdown-container').each(function() {
+ var $this = $(this),
+ trigger = $this.find('.dropdown-trigger:first'),
+ contents = $this.find('.dropdown'),
+ options = {
+ direction: 'auto',
+ verticalDirection: 'auto'
+ },
+ data;
+
+ if (!trigger.length) {
+ data = $this.attr('data-dropdown-trigger');
+ trigger = data ? $this.children(data) : $this.children('a:first');
+ }
+
+ if (!contents.length) {
+ data = $this.attr('data-dropdown-contents');
+ contents = data ? $this.children(data) : $this.children('div:first');
+ }
+
+ if (!trigger.length || !contents.length) return;
+
+ if ($this.hasClass('dropdown-up')) options.verticalDirection = 'up';
+ if ($this.hasClass('dropdown-down')) options.verticalDirection = 'down';
+ if ($this.hasClass('dropdown-left')) options.direction = 'left';
+ if ($this.hasClass('dropdown-right')) options.direction = 'right';
+
+ phpbb.registerDropdown(trigger, contents, options);
+ });
+
+ /**
* Adjust HTML code for IE8 and older versions
*/
if (oldBrowser) {
diff --git a/phpBB/styles/prosilver/template/index_body.html b/phpBB/styles/prosilver/template/index_body.html
index bd640fd63f..58a5420db3 100644
--- a/phpBB/styles/prosilver/template/index_body.html
+++ b/phpBB/styles/prosilver/template/index_body.html
@@ -3,6 +3,8 @@
<p class="{S_CONTENT_FLOW_END} responsive-center<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
<!-- IF S_USER_LOGGED_IN --><p class="responsive-center">{CURRENT_TIME}<!-- IF U_MCP or U_ACP --> <br />[&nbsp;<!-- IF U_ACP --><a href="{U_ACP}" title="{L_ACP}" data-responsive-text="{L_ACP_SHORT}">{L_ACP}</a><!-- IF U_MCP -->&nbsp;|&nbsp;<!-- ENDIF --><!-- ENDIF --><!-- IF U_MCP --><a href="{U_MCP}" title="{L_MCP}" data-responsive-text="{L_MCP_SHORT}">{L_MCP}</a><!-- ENDIF -->&nbsp;]<!-- ENDIF --></p><!-- ENDIF -->
+<!-- EVENT index_body_linklist_before -->
+
<!-- IF S_DISPLAY_SEARCH or (S_USER_LOGGED_IN and not S_IS_BOT) -->
<ul class="linklist bulletin">
<!-- IF S_DISPLAY_SEARCH -->
@@ -19,7 +21,7 @@
</ul>
<!-- ENDIF -->
-<!-- EVENT index_body_forumlist_before -->
+<!-- EVENT index_body_linklist_after -->
<!-- INCLUDE forumlist_body.html -->
diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html
index 6f297660a2..f7d0269edb 100644
--- a/phpBB/styles/prosilver/template/overall_footer.html
+++ b/phpBB/styles/prosilver/template/overall_footer.html
@@ -7,14 +7,11 @@
<div class="inner">
<ul class="linklist bulletin">
- <li class="small-icon icon-home breadcrumbs"><!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}">{L_SITE_HOME}</a> <strong>&#8249;</strong></span> <!-- ENDIF --><span class="crumb"><a href="{U_INDEX}" accesskey="h">{L_INDEX}</a></span>
+ <li class="small-icon icon-home breadcrumbs"><!-- IF U_SITE_HOME --><span class="crumb"><a href="{U_SITE_HOME}">{L_SITE_HOME}</a> <strong>&#8249;</strong></span> <!-- ENDIF --><span class="crumb"><a href="{U_INDEX}">{L_INDEX}</a></span>
<!-- EVENT overall_footer_breadcrumb_append -->
</li>
<!-- IF not S_IS_BOT -->
<!-- IF U_WATCH_FORUM_LINK --><li class="small-icon icon-<!-- IF S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->"><a href="{U_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_FORUM -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_FORUM_TOGGLE}" data-toggle-url="{U_WATCH_FORUM_TOGGLE}">{S_WATCH_FORUM_TITLE}</a></li><!-- ENDIF -->
- <!-- IF U_WATCH_TOPIC --><li class="small-icon icon-<!-- IF S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->"><a href="{U_WATCH_TOPIC}" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}">{S_WATCH_TOPIC_TITLE}</a></li><!-- ENDIF -->
- <!-- IF U_BOOKMARK_TOPIC --><li class="small-icon icon-bookmark"><a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}">{S_BOOKMARK_TOPIC}</a></li><!-- ENDIF -->
- <!-- IF U_BUMP_TOPIC --><li class="small-icon icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
<!-- ENDIF -->
<li class="rightside">{S_TIMEZONE}</li>
<!-- IF not S_IS_BOT --><li class="rightside"><a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true">{L_DELETE_COOKIES}</a></li><!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html
index 699be4a27e..4b26bc2e99 100644
--- a/phpBB/styles/prosilver/template/ucp_profile_reg_details.html
+++ b/phpBB/styles/prosilver/template/ucp_profile_reg_details.html
@@ -7,7 +7,7 @@
<div class="inner">
<!-- IF S_FORCE_PASSWORD -->
- <p>{L_FORCE_PASSWORD_EXPLAIN}</p>
+ <p class="error">{L_FORCE_PASSWORD_EXPLAIN}</p>
<!-- ENDIF -->
<fieldset>
diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html
index 46881d3b03..338c67dd33 100644
--- a/phpBB/styles/prosilver/template/viewtopic_body.html
+++ b/phpBB/styles/prosilver/template/viewtopic_body.html
@@ -33,6 +33,8 @@
<!-- ENDIF -->
</div>
+ <!-- INCLUDE viewtopic_topic_tools.html -->
+
<!-- IF S_DISPLAY_SEARCHBOX -->
<div class="search-box">
<form method="get" id="topic-search" action="{S_SEARCHBOX_ACTION}">
@@ -55,9 +57,8 @@
<!-- ENDIF -->
</div>
<!-- ENDIF -->
-
+ <div class="clear"></div>
</div>
-<div class="clear"></div>
<!-- IF S_HAS_POLL -->
<form method="post" action="{S_POLL_ACTION}" data-ajax="vote_poll" class="topic_poll">
@@ -299,16 +300,7 @@
<!-- ENDIF -->
</div>
- <!-- IF S_HAS_ATTACHMENTS -->
- <div class="dl_links">
- <strong>{L_DOWNLOAD_ALL_ATTACHMENTS}{L_COLON}</strong>
- <ul>
- <!-- BEGIN dl_method -->
- <li>[ <a href="{dl_method.LINK}">{dl_method.TYPE}</a> ]</li>
- <!-- END dl_method -->
- </ul>
- </div>
- <!-- ENDIF -->
+ <!-- INCLUDE viewtopic_topic_tools.html -->
<!-- IF .pagination or TOTAL_POSTS -->
<div class="pagination">
@@ -320,6 +312,7 @@
<!-- ENDIF -->
</div>
<!-- ENDIF -->
+ <div class="clear"></div>
</div>
<!-- EVENT viewtopic_body_footer_before -->
diff --git a/phpBB/styles/prosilver/template/viewtopic_topic_tools.html b/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
new file mode 100644
index 0000000000..ec17185bae
--- /dev/null
+++ b/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
@@ -0,0 +1,39 @@
+<!-- IF not S_IS_BOT and (U_WATCH_TOPIC or U_BOOKMARK_TOPIC or U_BUMP_TOPIC or S_HAS_ATTACHMENTS or S_DISPLAY_TOPIC_TOOLS) -->
+ <div class="dropdown-container dropdown-button-control topic-tools">
+ <span title="{L_TOPIC_TOOLS}" class="dropdown-trigger dropdown-select dropdown-select-icon tools-icon"><span></span></span>
+ <div class="dropdown hidden">
+ <div class="pointer"><div class="pointer-inner"></div></div>
+ <ul class="dropdown-contents">
+ <!-- EVENT viewtopic_topic_tools_before -->
+ <!-- IF U_WATCH_TOPIC -->
+ <li class="small-icon icon-<!-- IF S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->">
+ <a href="{U_WATCH_TOPIC}" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="small-icon icon-<!-- IF not S_WATCHING_TOPIC -->unsubscribe<!-- ELSE -->subscribe<!-- ENDIF -->" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}">
+ {S_WATCH_TOPIC_TITLE}
+ </a>
+ </li>
+ <!-- ENDIF -->
+ <!-- IF U_BOOKMARK_TOPIC -->
+ <li class="small-icon icon-bookmark">
+ <a href="{U_BOOKMARK_TOPIC}" title="{L_BOOKMARK_TOPIC}" data-ajax="alt_text" data-alt-text="{S_BOOKMARK_TOGGLE}">
+ {S_BOOKMARK_TOPIC}
+ </a>
+ </li>
+ <!-- ENDIF -->
+ <!-- IF U_BUMP_TOPIC --><li class="small-icon icon-bump"><a href="{U_BUMP_TOPIC}" title="{L_BUMP_TOPIC}" data-ajax="true">{L_BUMP_TOPIC}</a></li><!-- ENDIF -->
+ <!-- IF S_HAS_ATTACHMENTS -->
+ <li class="small-icon icon-download">
+ <a class="dropdown-toggle-submenu" href="{U_DOWNLOAD_ALL_ATTACHMENTS}" title="{L_DOWNLOAD_ALL_ATTACHMENTS}">{L_DOWNLOAD_ALL_ATTACHMENTS}</a>
+ <ul class="dropdown-submenu hidden">
+ <li>
+ <!-- BEGIN dl_method -->
+ <a href="{dl_method.LINK}">{dl_method.TYPE}</a><!-- IF not dl_method.S_LAST_ROW --> &bull; <!-- ENDIF -->
+ <!-- END dl_method -->
+ </li>
+ </ul>
+ </li>
+ <!-- ENDIF -->
+ <!-- EVENT viewtopic_topic_tools_after -->
+ </ul>
+ </div>
+ </div>
+<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/theme/bidi.css b/phpBB/styles/prosilver/theme/bidi.css
index b04e6576d3..d5e98d6197 100644
--- a/phpBB/styles/prosilver/theme/bidi.css
+++ b/phpBB/styles/prosilver/theme/bidi.css
@@ -90,6 +90,21 @@
text-align: left;
}
+/* Dropdown menu
+---------------------------------------- */
+.rtl .dropdown-container.topic-tools {
+ float: right;
+}
+
+.rtl .dropdown li {
+ text-align: right;
+}
+
+.rtl .dropdown li li {
+ padding-left: 0;
+ padding-right: 10px;
+}
+
/* Table styles
----------------------------------------*/
.rtl table.table1 thead th {
diff --git a/phpBB/styles/prosilver/theme/buttons.css b/phpBB/styles/prosilver/theme/buttons.css
index cdd325fb13..89fdcd85a8 100644
--- a/phpBB/styles/prosilver/theme/buttons.css
+++ b/phpBB/styles/prosilver/theme/buttons.css
@@ -11,13 +11,13 @@
}
/* Rollover state */
-.buttons div {
+.buttons div, .dropdown-select {
float: left;
margin: 0 5px 0 0;
}
/* Rolloff state */
-.buttons div a {
+.buttons div a, .dropdown-select {
display: inline-block;
line-height: 17.5px;
height: 18px;
@@ -38,7 +38,7 @@
.buttons div span { display: none; }
-.buttons div a:after {
+.buttons div a:after, .dropdown-select:after {
content: '';
display: block;
position: absolute;
@@ -54,6 +54,35 @@
background-position: 0 -20px;
}
+.dropdown-select {
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: normal;
+}
+
+.dropdown-select:after {
+ background-position: -103px 10px;
+ border-left: 1px solid;
+ margin-top: 0;
+ top: 0;
+ right: 0;
+ height: 21px;
+ width: 15px;
+}
+
+.dropdown-visible .dropdown-select:after, .nojs .dropdown-container:hover .dropdown-select:after {
+ background-position: -103px -10px;
+}
+
+.dropdown-select-icon:before {
+ content: '';
+ display: block;
+ float: left;
+ margin-right: 4px;
+ margin-top: 2px;
+}
+
/* Big button images */
.buttons div.reply-icon a:after, .buttons div.pmreply-icon a:after { background-position: -20px 0; }
.buttons div.reply-icon a:hover:after, .buttons div.pmreply-icon a:hover:after { background-position: -20px -20px; }
@@ -67,6 +96,11 @@
.buttons div.forwardpm-icon a:after { background-position: -40px 0; }
.buttons div.forwardpm-icon a:hover:after { background-position: -40px -20px; }
+.dropdown-select.tools-icon:before { background-position: -80px 0; height: 16px; width: 16px; }
+
+.dropdown-visible .dropdown-select.tools-icon:before,
+.nojs .dropdown-container:hover .dropdown-select.tools-icon:before { background-position: -80px -20px; }
+
/* Sub-header (navigation bar)
--------------------------------------------- */
a.print, a.sendemail {
diff --git a/phpBB/styles/prosilver/theme/colours.css b/phpBB/styles/prosilver/theme/colours.css
index 55b01f1269..68fbcde4f9 100644
--- a/phpBB/styles/prosilver/theme/colours.css
+++ b/phpBB/styles/prosilver/theme/colours.css
@@ -231,7 +231,6 @@ p.post-notice.reported:before, p.post-notice.error:before {
background-image: url("./images/icon_topic_reported.gif");
}
-
/*
--------------------------------------------------------------
Colours and backgrounds for links.css
@@ -655,7 +654,7 @@ a.sendemail {
background-image: url("./images/icon_sendemail.gif");
}
-.buttons div a {
+.buttons div a, .dropdown-select {
border-color: #C7C3BF;
background-color: #FFFFFF;
background-image: -moz-linear-gradient(top, #FFFFFF, #E9E9E9);
@@ -668,7 +667,16 @@ a.sendemail {
color: #BC2A4D !important;
}
-.buttons div a:hover {
+.dropdown-select {
+ color: #5C6482 !important;
+}
+
+.dropdown-select:after {
+ border-color: #DADADA;
+}
+
+.buttons div a:hover, .dropdown-select:hover, .dropdown-visible .dropdown-select,
+.dropdown-visible .dropdown-select:hover, .nojs .dropdown-container:hover .dropdown-select {
border-color: #0a8ed0;
background-image: -moz-linear-gradient(top, #E9E9E9, #FFFFFF);
background-image: -webkit-linear-gradient(top, #E9E9E9, #FFFFFF);
@@ -678,7 +686,16 @@ a.sendemail {
text-shadow: 1px 1px 0 #FFFFFF, -1px -1px 0 #FFFFFF, -1px -1px 0 rgba(188, 42, 77, 0.2);
}
-.buttons div a:after {
+.dropdown-select:hover {
+ border-color: #C7C3BF;
+}
+
+.dropdown-visible .dropdown-select, .dropdown-visible .dropdown-select:hover, .nojs .dropdown-container:hover .dropdown-select {
+ border-color: #A6B2BA;
+ color: #105289 !important;
+}
+
+.buttons div a:after, .dropdown-select-icon:before, .dropdown-select:after {
background-image: url("images/buttons.png");
}
@@ -698,6 +715,7 @@ a.sendemail {
.icon-search, .responsive-search a { background-image: url("./images/icon_search.gif"); }
.icon-notification { background-image: url("./images/icon_notification.gif"); }
.icon-pm { background-image: url("./images/icon_pm.gif"); }
+.icon-download { background-image: url("./images/icon_download.gif"); }
/* Profile & navigation icons */
.email-icon, .email-icon a { background-image: url("./images/icon_contact_email.gif"); }
@@ -1162,6 +1180,10 @@ ul.linklist li.responsive-menu a.responsive-menu-link:hover:before, ul.linklist
box-shadow: 1px 0 5px rgba(0, 0, 0, 0.2);
}
+.dropdown li, .dropdown li li {
+ border-color: #DCDCDC;
+}
+
#minitabs .dropdown-contents {
background-color: #F1F8FF;
}
diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css
index dced25f541..66ee77f60b 100644
--- a/phpBB/styles/prosilver/theme/common.css
+++ b/phpBB/styles/prosilver/theme/common.css
@@ -407,6 +407,14 @@ li.responsive-menu .dropdown .dropdown-contents {
padding: 0 5px;
}
+ul.linklist .dropdown-down .dropdown {
+ top: 22px;
+}
+
+ul.linklist .dropdown-up .dropdown {
+ bottom: 18px;
+}
+
ul.linklist .dropdown li {
clear: both;
}
@@ -437,27 +445,47 @@ ul.linklist.bulletin li.no-bulletin:before {
/* Dropdown menu
----------------------------------------*/
+.dropdown-container {
+ position: relative;
+}
+
+.nojs .dropdown-container:hover .dropdown {
+ display: block !important;
+}
+
.dropdown {
position: absolute;
left: 0;
- top: 22px;
+ top: 1.2em;
z-index: 2;
border: 1px solid transparent;
border-radius: 5px;
padding: 9px 0 0;
}
+.dropdown-container.topic-tools {
+ float: left;
+}
+
.dropdown-up .dropdown {
top: auto;
- bottom: 18px;
+ bottom: 1.2em;
padding: 0 0 9px;
}
-.dropdown-left .dropdown {
+.dropdown-left .dropdown, .nojs .rightside .dropdown {
left: auto;
right: 0;
}
+.dropdown-button-control .dropdown {
+ top: 24px;
+}
+
+.dropdown-button-control.dropdown-up .dropdown {
+ top: auto;
+ bottom: 24px;
+}
.dropdown .pointer, .dropdown .pointer-inner {
position: absolute;
@@ -488,7 +516,7 @@ ul.linklist.bulletin li.no-bulletin:before {
top: auto;
}
-.dropdown-left .dropdown .pointer {
+.dropdown-left .dropdown .pointer, .nojs .rightside .dropdown .pointer {
left: auto;
right: 10px;
}
@@ -507,22 +535,48 @@ ul.linklist.bulletin li.no-bulletin:before {
.dropdown .dropdown-contents {
z-index: 2;
overflow: hidden;
+ overflow-y: auto;
border: 1px solid transparent;
border-radius: 5px;
padding: 5px;
position: relative;
+ min-width: 40px;
+ max-height: 200px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.dropdown li {
- float: none;
+ border-bottom: 1px dotted transparent;
+ float: none !important;
+ line-height: normal !important;
+ font-size: 1em !important;
+ list-style: none;
margin: 0;
+ padding-top: 4px;
+ padding-bottom: 4px;
white-space: nowrap;
text-align: left;
}
+.dropdown li:last-child, .dropdown li li {
+ border-bottom: 0;
+}
+
+.dropdown li li:first-child {
+ margin-top: 4px;
+}
+
+.dropdown li li:last-child {
+ padding-bottom: 0;
+}
+
+.dropdown li li {
+ border-top: 1px dotted transparent;
+ padding-left: 10px;
+}
+
.wrap .dropdown li, .dropdown.wrap li, #notification_list li {
white-space: normal;
}
@@ -968,6 +1022,7 @@ form > p.post-notice strong {
}
#notification_list .dropdown-contents {
+ max-height: none;
padding: 0;
}
diff --git a/phpBB/styles/prosilver/theme/images/buttons.png b/phpBB/styles/prosilver/theme/images/buttons.png
index a19abdc2b8..3a8c2f2f65 100644..100755
--- a/phpBB/styles/prosilver/theme/images/buttons.png
+++ b/phpBB/styles/prosilver/theme/images/buttons.png
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/images/icon_download.gif b/phpBB/styles/prosilver/theme/images/icon_download.gif
new file mode 100644
index 0000000000..70cd61caf2
--- /dev/null
+++ b/phpBB/styles/prosilver/theme/images/icon_download.gif
Binary files differ
diff --git a/phpBB/styles/prosilver/theme/responsive.css b/phpBB/styles/prosilver/theme/responsive.css
index d7af7519b7..397ff12942 100644
--- a/phpBB/styles/prosilver/theme/responsive.css
+++ b/phpBB/styles/prosilver/theme/responsive.css
@@ -468,10 +468,6 @@ p.rightside {
float: none;
}
-.topic-actions {
- overflow: hidden;
-}
-
fieldset.quickmod {
width: auto;
float: none;
@@ -511,17 +507,14 @@ fieldset.display-actions {
margin: 0;
}
- .topic-actions > div {
- float: none;
- overflow: hidden;
- clear: both;
- }
-
.topic-actions > .pagination, fieldset.jumpbox {
text-align: center;
}
.topic-actions > .pagination {
+ float: none;
+ overflow: hidden;
+ clear: both;
padding-bottom: 1px;
}
diff --git a/phpBB/styles/subsilver2/template/index_body.html b/phpBB/styles/subsilver2/template/index_body.html
index 00c328e994..763028966f 100644
--- a/phpBB/styles/subsilver2/template/index_body.html
+++ b/phpBB/styles/subsilver2/template/index_body.html
@@ -1,5 +1,7 @@
<!-- INCLUDE overall_header.html -->
+<!-- EVENT index_body_linklist_before -->
+
<!-- IF U_MCP or U_ACP -->
<div id="pageheader">
<p class="linkmcp">[&nbsp;<!-- IF U_ACP --><a href="{U_ACP}">{L_ACP}</a><!-- IF U_MCP -->&nbsp;|&nbsp;<!-- ENDIF --><!-- ENDIF --><!-- IF U_MCP --><a href="{U_MCP}">{L_MCP}</a><!-- ENDIF -->&nbsp;]</p>
@@ -8,7 +10,7 @@
<br clear="all" /><br />
<!-- ENDIF -->
-<!-- EVENT index_body_forumlist_before -->
+<!-- EVENT index_body_linklist_after -->
<!-- INCLUDE forumlist_body.html -->
diff --git a/phpBB/styles/subsilver2/template/mcp_topic.html b/phpBB/styles/subsilver2/template/mcp_topic.html
index d3b4408243..5bd762ec0b 100644
--- a/phpBB/styles/subsilver2/template/mcp_topic.html
+++ b/phpBB/styles/subsilver2/template/mcp_topic.html
@@ -73,7 +73,7 @@
<td align="center"><b class="postauthor">{postrow.POST_AUTHOR_FULL}</b></td>
<td width="100%">
<table width="100%" cellspacing="0" cellpadding="0" border="0">
- <tr valign="top">
+ <tr style="vertical-align: top;">
<td class="gensmall" nowrap="nowrap">&nbsp;<b>{L_POST_SUBJECT}{L_COLON}</b>&nbsp;</td>
<td class="gensmall" width="100%">{postrow.POST_SUBJECT}</td>
</tr>
diff --git a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
index 6944a62764..d8fe84bf79 100644
--- a/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
+++ b/phpBB/styles/subsilver2/template/ucp_profile_reg_details.html
@@ -6,7 +6,7 @@
</tr>
<!-- IF S_FORCE_PASSWORD -->
<tr>
- <td class="row3" colspan="2" align="center"><span class="gensmall">{L_FORCE_PASSWORD_EXPLAIN}</span></td>
+ <td class="row3" colspan="2" align="center"><span class="gensmall error">{L_FORCE_PASSWORD_EXPLAIN}</span></td>
</tr>
<!-- ENDIF -->
<!-- IF ERROR -->
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index 3735bca83d..dd4f7e1b19 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -1384,16 +1384,17 @@ if (sizeof($attach_list))
}
}
-$template->assign_vars(array(
- 'S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'],
-));
-
$methods = phpbb_gen_download_links('topic_id', $topic_id, $phpbb_root_path, $phpEx);
foreach ($methods as $method)
{
$template->assign_block_vars('dl_method', $method);
}
+$template->assign_vars(array(
+ 'S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'],
+ 'U_DOWNLOAD_ALL_ATTACHMENTS' => $methods[0]['LINK'],
+));
+
// Instantiate BBCode if need be
if ($bbcode_bitfield !== '')
{
diff --git a/tests/avatar/driver/barfoo.php b/tests/avatar/driver/barfoo.php
index 11c100db36..0bf30b8a91 100644
--- a/tests/avatar/driver/barfoo.php
+++ b/tests/avatar/driver/barfoo.php
@@ -18,4 +18,9 @@ class barfoo extends \phpbb\avatar\driver\driver
{
return false;
}
+
+ public function get_template_name()
+ {
+ return 'barfoo.html';
+ }
}
diff --git a/tests/avatar/driver/foobar.php b/tests/avatar/driver/foobar.php
index a1e7bdf7cc..aabdaf5ac4 100644
--- a/tests/avatar/driver/foobar.php
+++ b/tests/avatar/driver/foobar.php
@@ -18,4 +18,9 @@ class foobar extends \phpbb\avatar\driver\driver
{
return false;
}
+
+ public function get_template_name()
+ {
+ return 'foobar.html';
+ }
}
diff --git a/tests/extension/ext/barfoo/composer.json b/tests/extension/ext/barfoo/composer.json
new file mode 100644
index 0000000000..35d5d2a956
--- /dev/null
+++ b/tests/extension/ext/barfoo/composer.json
@@ -0,0 +1,22 @@
+{
+ "name": "vendor/barfoo",
+ "type": "phpbb-extension",
+ "description": "An example/sample extension to be used for testing purposes in phpBB Development.",
+ "version": "1.0.0",
+ "time": "2012-02-15 01:01:01",
+ "licence": "GNU GPL v2",
+ "authors": [{
+ "name": "John Smith",
+ "username": "JohnSmith27",
+ "email": "email@phpbb.com",
+ "homepage": "http://phpbb.com",
+ "role": "N/A"
+ }],
+ "require": {
+ "php": ">=5.3",
+ "phpbb/phpbb": "3.1.*@dev"
+ },
+ "extra": {
+ "display-name": "phpBB BarFoo Extension"
+ }
+}
diff --git a/tests/extension/ext/barfoo/ext.php b/tests/extension/ext/barfoo/ext.php
index 1b7bb7ca5e..0de403424c 100644
--- a/tests/extension/ext/barfoo/ext.php
+++ b/tests/extension/ext/barfoo/ext.php
@@ -1,6 +1,6 @@
<?php
-namespace barfoo;
+namespace vendor\barfoo;
class ext extends \phpbb\extension\base
{
diff --git a/tests/extension/ext/vendor/moo/composer.json b/tests/extension/ext/vendor/moo/composer.json
index 4dc36963b3..901cb7f17a 100644
--- a/tests/extension/ext/vendor/moo/composer.json
+++ b/tests/extension/ext/vendor/moo/composer.json
@@ -1,5 +1,5 @@
{
- "name": "moo/example",
+ "name": "vendor/moo",
"type": "phpbb-extension",
"description": "An example/sample extension to be used for testing purposes in phpBB Development.",
"version": "1.0.0",
diff --git a/tests/extension/ext/barfoo/acp/a_info.php b/tests/extension/ext/vendor2/bar/acp/a_info.php
index ea07189f7a..8132df587f 100644
--- a/tests/extension/ext/barfoo/acp/a_info.php
+++ b/tests/extension/ext/vendor2/bar/acp/a_info.php
@@ -1,14 +1,14 @@
<?php
-namespace barfoo\acp;
+namespace vendor2\bar\acp;
class a_info
{
public function module()
{
return array(
- 'filename' => 'barfoo\\acp\\a_module',
- 'title' => 'Barfoo',
+ 'filename' => 'vendor2\\bar\\acp\\a_module',
+ 'title' => 'Bar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
diff --git a/tests/extension/ext/barfoo/acp/a_module.php b/tests/extension/ext/vendor2/bar/acp/a_module.php
index 0ae8775013..3a3d105790 100644
--- a/tests/extension/ext/barfoo/acp/a_module.php
+++ b/tests/extension/ext/vendor2/bar/acp/a_module.php
@@ -1,6 +1,6 @@
<?php
-namespace barfoo\acp;
+namespace vendor2\bar\acp;
class a_module
{
diff --git a/tests/extension/ext/vendor2/bar/composer.json b/tests/extension/ext/vendor2/bar/composer.json
new file mode 100644
index 0000000000..5d60ec031e
--- /dev/null
+++ b/tests/extension/ext/vendor2/bar/composer.json
@@ -0,0 +1,21 @@
+{
+ "name": "vendor2/bar",
+ "type": "phpbb-extension",
+ "description": "An example/sample extension to be used for testing purposes in phpBB Development.",
+ "version": "1.0.0",
+ "time": "2012-02-15 01:01:01",
+ "licence": "GPL-2.0",
+ "authors": [{
+ "name": "John Smith",
+ "email": "email@phpbb.com",
+ "homepage": "http://phpbb.com",
+ "role": "N/A"
+ }],
+ "require": {
+ "php": ">=5.3",
+ "phpbb/phpbb": "3.1.*@dev"
+ },
+ "extra": {
+ "display-name": "phpBB Bar Extension"
+ }
+}
diff --git a/tests/extension/ext/bar/ext.php b/tests/extension/ext/vendor2/bar/ext.php
index 22ff5e8077..f94ab9ad81 100644
--- a/tests/extension/ext/bar/ext.php
+++ b/tests/extension/ext/vendor2/bar/ext.php
@@ -1,6 +1,6 @@
<?php
-namespace bar;
+namespace vendor2\bar;
class ext extends \phpbb\extension\base
{
diff --git a/tests/extension/ext/foo/a_class.php b/tests/extension/ext/vendor2/foo/a_class.php
index 9db45a697f..06278c0e0c 100644
--- a/tests/extension/ext/foo/a_class.php
+++ b/tests/extension/ext/vendor2/foo/a_class.php
@@ -1,6 +1,6 @@
<?php
-namespace foo;
+namespace vendor2\foo;
class a_class
{
diff --git a/tests/extension/ext/foo/acp/a_info.php b/tests/extension/ext/vendor2/foo/acp/a_info.php
index 3b7d8cdd42..27e67c1556 100644
--- a/tests/extension/ext/foo/acp/a_info.php
+++ b/tests/extension/ext/vendor2/foo/acp/a_info.php
@@ -1,13 +1,13 @@
<?php
-namespace foo\acp;
+namespace vendor2\foo\acp;
class a_info
{
public function module()
{
return array(
- 'filename' => 'foo\\acp\\a_module',
+ 'filename' => 'vendor2\\foo\\acp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
diff --git a/tests/extension/ext/foo/mcp/a_module.php b/tests/extension/ext/vendor2/foo/acp/a_module.php
index ca397e7004..78d91af2fe 100644
--- a/tests/extension/ext/foo/mcp/a_module.php
+++ b/tests/extension/ext/vendor2/foo/acp/a_module.php
@@ -1,6 +1,6 @@
<?php
-namespace foo\mcp;
+namespace vendor2\foo\acp;
class a_module
{
diff --git a/tests/extension/ext/foo/acp/fail_info.php b/tests/extension/ext/vendor2/foo/acp/fail_info.php
index 01d29fc5eb..d9b4353957 100644
--- a/tests/extension/ext/foo/acp/fail_info.php
+++ b/tests/extension/ext/vendor2/foo/acp/fail_info.php
@@ -1,6 +1,6 @@
<?php
-namespace foo\acp;
+namespace vendor2\foo\acp;
/*
* Due to the mismatch between the class name and the file name, this module
@@ -11,7 +11,7 @@ class foo_info
public function module()
{
return array(
- 'filename' => 'foo\acp\fail_module',
+ 'filename' => 'vendor2\foo\acp\fail_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
diff --git a/tests/extension/ext/foo/acp/fail_module.php b/tests/extension/ext/vendor2/foo/acp/fail_module.php
index 8070929d3c..c8a5eae745 100644
--- a/tests/extension/ext/foo/acp/fail_module.php
+++ b/tests/extension/ext/vendor2/foo/acp/fail_module.php
@@ -1,6 +1,6 @@
<?php
-namespace foo\acp;
+namespace vendor2\foo\acp;
/*
* Due to the mismatch between the class name and the file name of the module
diff --git a/tests/extension/ext/foo/b_class.php b/tests/extension/ext/vendor2/foo/b_class.php
index bb2a77c05e..3d0f193908 100644
--- a/tests/extension/ext/foo/b_class.php
+++ b/tests/extension/ext/vendor2/foo/b_class.php
@@ -1,6 +1,6 @@
<?php
-namespace foo;
+namespace vendor2\foo;
class b_class
{
diff --git a/tests/extension/ext/foo/composer.json b/tests/extension/ext/vendor2/foo/composer.json
index 5367eaf593..8821d9d50e 100644
--- a/tests/extension/ext/foo/composer.json
+++ b/tests/extension/ext/vendor2/foo/composer.json
@@ -1,5 +1,5 @@
{
- "name": "foo/example",
+ "name": "vendor2/foo",
"type": "phpbb-extension",
"description": "An example/sample extension to be used for testing purposes in phpBB Development.",
"version": "1.0.0",
diff --git a/tests/extension/ext/foo/ext.php b/tests/extension/ext/vendor2/foo/ext.php
index ac6098f2f1..15480fe92a 100644
--- a/tests/extension/ext/foo/ext.php
+++ b/tests/extension/ext/vendor2/foo/ext.php
@@ -1,6 +1,6 @@
<?php
-namespace foo;
+namespace vendor2\foo;
class ext extends \phpbb\extension\base
{
diff --git a/tests/extension/ext/foo/mcp/a_info.php b/tests/extension/ext/vendor2/foo/mcp/a_info.php
index 9a896ce808..b5599fde65 100644
--- a/tests/extension/ext/foo/mcp/a_info.php
+++ b/tests/extension/ext/vendor2/foo/mcp/a_info.php
@@ -1,13 +1,13 @@
<?php
-namespace foo\mcp;
+namespace vendor2\foo\mcp;
class a_info
{
public function module()
{
return array(
- 'filename' => 'foo\\mcp\\a_module',
+ 'filename' => 'vendor2\\foo\\mcp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
diff --git a/tests/extension/ext/foo/acp/a_module.php b/tests/extension/ext/vendor2/foo/mcp/a_module.php
index 7aa2351ab3..fe29783827 100644
--- a/tests/extension/ext/foo/acp/a_module.php
+++ b/tests/extension/ext/vendor2/foo/mcp/a_module.php
@@ -1,6 +1,6 @@
<?php
-namespace foo\acp;
+namespace vendor2\foo\mcp;
class a_module
{
diff --git a/tests/extension/ext/foo/sub/type/alternative.php b/tests/extension/ext/vendor2/foo/sub/type/alternative.php
index 1eaf794609..1eaf794609 100644
--- a/tests/extension/ext/foo/sub/type/alternative.php
+++ b/tests/extension/ext/vendor2/foo/sub/type/alternative.php
diff --git a/tests/extension/ext/foo/type/alternative.php b/tests/extension/ext/vendor2/foo/type/alternative.php
index 8f753491ef..8f753491ef 100644
--- a/tests/extension/ext/foo/type/alternative.php
+++ b/tests/extension/ext/vendor2/foo/type/alternative.php
diff --git a/tests/extension/ext/foo/type/dummy/empty.txt b/tests/extension/ext/vendor2/foo/type/dummy/empty.txt
index e69de29bb2..e69de29bb2 100644
--- a/tests/extension/ext/foo/type/dummy/empty.txt
+++ b/tests/extension/ext/vendor2/foo/type/dummy/empty.txt
diff --git a/tests/extension/ext/foo/typewrong/error.php b/tests/extension/ext/vendor2/foo/typewrong/error.php
index 5020926043..5020926043 100644
--- a/tests/extension/ext/foo/typewrong/error.php
+++ b/tests/extension/ext/vendor2/foo/typewrong/error.php
diff --git a/tests/extension/ext/vendor3/bar/ext.php b/tests/extension/ext/vendor3/bar/ext.php
new file mode 100644
index 0000000000..37a5e92059
--- /dev/null
+++ b/tests/extension/ext/vendor3/bar/ext.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace vendor3\bar;
+
+class ext extends \phpbb\extension\base
+{
+ static public $state;
+
+ public function enable_step($old_state)
+ {
+ // run 4 steps, then quit
+ if ($old_state === 4)
+ {
+ return false;
+ }
+
+ if ($old_state === false)
+ {
+ $old_state = 0;
+ }
+
+ self::$state = ++$old_state;
+
+ return self::$state;
+ }
+}
diff --git a/tests/extension/ext/bar/my/hidden_class.php b/tests/extension/ext/vendor3/bar/my/hidden_class.php
index 504c1873dc..38eb59aadf 100644
--- a/tests/extension/ext/bar/my/hidden_class.php
+++ b/tests/extension/ext/vendor3/bar/my/hidden_class.php
@@ -1,6 +1,6 @@
<?php
-namespace bar\my;
+namespace vendor3\bar\my;
class hidden_class
{
diff --git a/tests/extension/ext/bar/styles/prosilver/template/foobar_body.html b/tests/extension/ext/vendor3/bar/styles/prosilver/template/foobar_body.html
index 00c2a84a18..00c2a84a18 100644
--- a/tests/extension/ext/bar/styles/prosilver/template/foobar_body.html
+++ b/tests/extension/ext/vendor3/bar/styles/prosilver/template/foobar_body.html
diff --git a/tests/extension/finder_test.php b/tests/extension/finder_test.php
index 8e6e71aaf8..d0ca5956b4 100644
--- a/tests/extension/finder_test.php
+++ b/tests/extension/finder_test.php
@@ -18,15 +18,15 @@ class phpbb_extension_finder_test extends phpbb_test_case
$this->extension_manager = new phpbb_mock_extension_manager(
dirname(__FILE__) . '/',
array(
- 'foo' => array(
- 'ext_name' => 'foo',
+ 'vendor2/foo' => array(
+ 'ext_name' => 'vendor2/foo',
'ext_active' => '1',
- 'ext_path' => 'ext/foo/',
+ 'ext_path' => 'ext/vendor2/foo/',
),
- 'bar' => array(
- 'ext_name' => 'bar',
+ 'vendor3/bar' => array(
+ 'ext_name' => 'vendor3/bar',
'ext_active' => '1',
- 'ext_path' => 'ext/bar/',
+ 'ext_path' => 'ext/vendor3/bar/',
),
));
@@ -43,10 +43,10 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($classes);
$this->assertEquals(
array(
- '\bar\my\hidden_class',
- '\foo\a_class',
- '\foo\b_class',
'\phpbb\default\implementation',
+ '\vendor2\foo\a_class',
+ '\vendor2\foo\b_class',
+ '\vendor3\bar\my\hidden_class',
),
$classes
);
@@ -60,7 +60,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($dirs);
$this->assertEquals(array(
- dirname(__FILE__) . '/ext/foo/type/',
+ dirname(__FILE__) . '/ext/vendor2/foo/type/',
), $dirs);
}
@@ -72,9 +72,9 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($dirs);
$this->assertEquals(array(
- dirname(__FILE__) . '/ext/foo/sub/type/',
- dirname(__FILE__) . '/ext/foo/type/',
- dirname(__FILE__) . '/ext/foo/typewrong/',
+ dirname(__FILE__) . '/ext/vendor2/foo/sub/type/',
+ dirname(__FILE__) . '/ext/vendor2/foo/type/',
+ dirname(__FILE__) . '/ext/vendor2/foo/typewrong/',
), $dirs);
}
@@ -88,8 +88,8 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($classes);
$this->assertEquals(
array(
- '\bar\my\hidden_class',
'\phpbb\default\implementation',
+ '\vendor3\bar\my\hidden_class',
),
$classes
);
@@ -105,9 +105,9 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($classes);
$this->assertEquals(
array(
- '\foo\sub\type\alternative',
- '\foo\type\alternative',
'\phpbb\default\implementation',
+ '\vendor2\foo\sub\type\alternative',
+ '\vendor2\foo\type\alternative',
),
$classes
);
@@ -122,7 +122,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($classes);
$this->assertEquals(
array(
- '\foo\type\alternative',
+ '\vendor2\foo\type\alternative',
),
$classes
);
@@ -137,7 +137,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($classes);
$this->assertEquals(
array(
- '\foo\sub\type\alternative',
+ '\vendor2\foo\sub\type\alternative',
),
$classes
);
@@ -152,7 +152,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
sort($classes);
$this->assertEquals(
array(
- '\foo\sub\type\alternative',
+ '\vendor2\foo\sub\type\alternative',
),
$classes
);
@@ -162,14 +162,14 @@ class phpbb_extension_finder_test extends phpbb_test_case
{
$files = $this->finder
->extension_directory('/type')
- ->find_from_extension('foo', dirname(__FILE__) . '/ext/foo/');
+ ->find_from_extension('vendor2/foo', dirname(__FILE__) . '/ext/vendor2/foo/');
$classes = $this->finder->get_classes_from_files($files);
sort($classes);
$this->assertEquals(
array(
- '\foo\type\alternative',
- '\foo\type\dummy\empty',
+ '\vendor2\foo\type\alternative',
+ '\vendor2\foo\type\dummy\empty',
),
$classes
);
diff --git a/tests/extension/fixtures/extensions.xml b/tests/extension/fixtures/extensions.xml
index 6eb6fd11a5..6846162f0f 100644
--- a/tests/extension/fixtures/extensions.xml
+++ b/tests/extension/fixtures/extensions.xml
@@ -5,7 +5,7 @@
<column>ext_active</column>
<column>ext_state</column>
<row>
- <value>foo</value>
+ <value>vendor2/foo</value>
<value>1</value>
<value></value>
</row>
diff --git a/tests/extension/manager_test.php b/tests/extension/manager_test.php
index b127daf2ed..cc32a6af4e 100644
--- a/tests/extension/manager_test.php
+++ b/tests/extension/manager_test.php
@@ -7,8 +7,8 @@
*
*/
-require_once dirname(__FILE__) . '/ext/bar/ext.php';
-require_once dirname(__FILE__) . '/ext/foo/ext.php';
+require_once dirname(__FILE__) . '/ext/vendor2/bar/ext.php';
+require_once dirname(__FILE__) . '/ext/vendor2/foo/ext.php';
require_once dirname(__FILE__) . '/ext/vendor/moo/ext.php';
class phpbb_extension_manager_test extends phpbb_database_test_case
@@ -30,52 +30,53 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
public function test_available()
{
- $this->assertEquals(array('bar', 'barfoo', 'foo', 'vendor/moo'), array_keys($this->extension_manager->all_available()));
+ // barfoo and vendor3/bar should not listed due to missing composer.json. barfoo also has incorrect dir structure.
+ $this->assertEquals(array('vendor/moo', 'vendor2/bar', 'vendor2/foo'), array_keys($this->extension_manager->all_available()));
}
public function test_enabled()
{
- $this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
+ $this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
}
public function test_configured()
{
- $this->assertEquals(array('foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
+ $this->assertEquals(array('vendor/moo', 'vendor2/foo'), array_keys($this->extension_manager->all_configured()));
}
public function test_enable()
{
- bar\ext::$state = 0;
+ vendor2\bar\ext::$state = 0;
- $this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
- $this->extension_manager->enable('bar');
- $this->assertEquals(array('bar', 'foo'), array_keys($this->extension_manager->all_enabled()));
- $this->assertEquals(array('bar', 'foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
+ $this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
+ $this->extension_manager->enable('vendor2/bar');
+ $this->assertEquals(array('vendor2/bar', 'vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
+ $this->assertEquals(array('vendor/moo', 'vendor2/bar', 'vendor2/foo'), array_keys($this->extension_manager->all_configured()));
- $this->assertEquals(4, bar\ext::$state);
+ $this->assertEquals(4, vendor2\bar\ext::$state);
}
public function test_disable()
{
- foo\ext::$disabled = false;
+ vendor2\foo\ext::$disabled = false;
- $this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
- $this->extension_manager->disable('foo');
+ $this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
+ $this->extension_manager->disable('vendor2/foo');
$this->assertEquals(array(), array_keys($this->extension_manager->all_enabled()));
- $this->assertEquals(array('foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
+ $this->assertEquals(array('vendor/moo', 'vendor2/foo'), array_keys($this->extension_manager->all_configured()));
- $this->assertTrue(foo\ext::$disabled);
+ $this->assertTrue(vendor2\foo\ext::$disabled);
}
public function test_purge()
{
vendor\moo\ext::$purged = false;
- $this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
- $this->assertEquals(array('foo', 'vendor/moo'), array_keys($this->extension_manager->all_configured()));
+ $this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
+ $this->assertEquals(array('vendor/moo', 'vendor2/foo'), array_keys($this->extension_manager->all_configured()));
$this->extension_manager->purge('vendor/moo');
- $this->assertEquals(array('foo'), array_keys($this->extension_manager->all_enabled()));
- $this->assertEquals(array('foo'), array_keys($this->extension_manager->all_configured()));
+ $this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_enabled()));
+ $this->assertEquals(array('vendor2/foo'), array_keys($this->extension_manager->all_configured()));
$this->assertTrue(vendor\moo\ext::$purged);
}
@@ -84,7 +85,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
{
$extension_manager = $this->create_extension_manager(false);
- $this->assertEquals(array('foo'), array_keys($extension_manager->all_enabled()));
+ $this->assertEquals(array('vendor2/foo'), array_keys($extension_manager->all_enabled()));
}
protected function create_extension_manager($with_cache = true)
diff --git a/tests/extension/metadata_manager_test.php b/tests/extension/metadata_manager_test.php
index 09eb83cd86..592421f9e7 100644
--- a/tests/extension/metadata_manager_test.php
+++ b/tests/extension/metadata_manager_test.php
@@ -82,7 +82,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
// Should fail from missing composer.json
public function test_bar()
{
- $ext_name = 'bar';
+ $ext_name = 'vendor3/bar';
$manager = $this->get_metadata_manager($ext_name);
@@ -98,7 +98,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
// Should be the same as a direct json_decode of the composer.json file
public function test_foo()
{
- $ext_name = 'foo';
+ $ext_name = 'vendor2/foo';
$manager = $this->get_metadata_manager($ext_name);
@@ -111,7 +111,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
$this->fail($e);
}
- $json = json_decode(file_get_contents($this->phpbb_root_path . 'ext/foo/composer.json'), true);
+ $json = json_decode(file_get_contents($this->phpbb_root_path . 'ext/vendor2/foo/composer.json'), true);
$this->assertEquals($metadata, $json);
}
diff --git a/tests/extension/modules_test.php b/tests/extension/modules_test.php
index ef21c943c2..5dcb24c691 100644
--- a/tests/extension/modules_test.php
+++ b/tests/extension/modules_test.php
@@ -7,10 +7,10 @@
*
*/
-require_once dirname(__FILE__) . '/ext/foo/acp/a_info.php';
-require_once dirname(__FILE__) . '/ext/foo/mcp/a_info.php';
-require_once dirname(__FILE__) . '/ext/foo/acp/fail_info.php';
-require_once dirname(__FILE__) . '/ext/barfoo/acp/a_info.php';
+require_once dirname(__FILE__) . '/ext/vendor2/foo/acp/a_info.php';
+require_once dirname(__FILE__) . '/ext/vendor2/foo/mcp/a_info.php';
+require_once dirname(__FILE__) . '/ext/vendor2/foo/acp/fail_info.php';
+require_once dirname(__FILE__) . '/ext/vendor2/bar/acp/a_info.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/acp/acp_modules.php';
class phpbb_extension_modules_test extends phpbb_test_case
@@ -25,15 +25,15 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->extension_manager = new phpbb_mock_extension_manager(
dirname(__FILE__) . '/',
array(
- 'foo' => array(
- 'ext_name' => 'foo',
+ 'vendor2/foo' => array(
+ 'ext_name' => 'vendor2/foo',
'ext_active' => '1',
- 'ext_path' => 'ext/foo/',
+ 'ext_path' => 'ext/vendor2/foo/',
),
- 'bar' => array(
- 'ext_name' => 'bar',
+ 'vendor3/bar' => array(
+ 'ext_name' => 'vendor3/bar',
'ext_active' => '1',
- 'ext_path' => 'ext/bar/',
+ 'ext_path' => 'ext/vendor3/bar/',
),
));
$phpbb_extension_manager = $this->extension_manager;
@@ -54,8 +54,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->acp_modules->module_class = 'acp';
$acp_modules = $this->acp_modules->get_module_infos();
$this->assertEquals(array(
- 'foo\\acp\\a_module' => array(
- 'filename' => 'foo\\acp\\a_module',
+ 'vendor2\\foo\\acp\\a_module' => array(
+ 'filename' => 'vendor2\\foo\\acp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
@@ -76,8 +76,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->acp_modules->module_class = 'mcp';
$acp_modules = $this->acp_modules->get_module_infos();
$this->assertEquals(array(
- 'foo\\mcp\\a_module' => array(
- 'filename' => 'foo\\mcp\\a_module',
+ 'vendor2\\foo\\mcp\\a_module' => array(
+ 'filename' => 'vendor2\\foo\\mcp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
@@ -90,8 +90,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->acp_modules->module_class = 'mcp';
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_module');
$this->assertEquals(array(
- 'foo\\mcp\\a_module' => array(
- 'filename' => 'foo\\mcp\\a_module',
+ 'vendor2\\foo\\mcp\\a_module' => array(
+ 'filename' => 'vendor2\\foo\\mcp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
@@ -104,8 +104,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->acp_modules->module_class = '';
$acp_modules = $this->acp_modules->get_module_infos('mcp_a_module', 'mcp');
$this->assertEquals(array(
- 'foo\\mcp\\a_module' => array(
- 'filename' => 'foo\\mcp\\a_module',
+ 'vendor2\\foo\\mcp\\a_module' => array(
+ 'filename' => 'vendor2\\foo\\mcp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
@@ -128,8 +128,8 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->acp_modules->module_class = 'acp';
$acp_modules = $this->acp_modules->get_module_infos('foo_acp_a_module');
$this->assertEquals(array(
- 'foo\\acp\\a_module' => array (
- 'filename' => 'foo\\acp\\a_module',
+ 'vendor2\\foo\\acp\\a_module' => array (
+ 'filename' => 'vendor2\\foo\\acp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array (
@@ -148,12 +148,12 @@ class phpbb_extension_modules_test extends phpbb_test_case
$this->assertEquals(array(), $acp_modules);
// No specific module, module class set to false (will default to the above acp)
- // Setting $use_all_available will cause get_module_infos() to also load not enabled extensions (barfoo)
+ // Setting $use_all_available will cause get_module_infos() to also load not enabled extensions (vendor2/bar)
$this->acp_modules->module_class = 'acp';
$acp_modules = $this->acp_modules->get_module_infos('', false, true);
$this->assertEquals(array(
- 'foo\\acp\\a_module' => array(
- 'filename' => 'foo\\acp\\a_module',
+ 'vendor2\\foo\\acp\\a_module' => array(
+ 'filename' => 'vendor2\\foo\\acp\\a_module',
'title' => 'Foobar',
'version' => '3.1.0-dev',
'modes' => array(
@@ -168,9 +168,9 @@ class phpbb_extension_modules_test extends phpbb_test_case
'test' => array('title' => 'Test', 'auth' => '', 'cat' => array('ACP_GENERAL')),
),
),
- 'barfoo\\acp\\a_module' => array(
- 'filename' => 'barfoo\\acp\\a_module',
- 'title' => 'Barfoo',
+ 'vendor2\\bar\\acp\\a_module' => array(
+ 'filename' => 'vendor2\\bar\\acp\\a_module',
+ 'title' => 'Bar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
@@ -179,11 +179,11 @@ class phpbb_extension_modules_test extends phpbb_test_case
), $acp_modules);
// Specific module set to disabled extension
- $acp_modules = $this->acp_modules->get_module_infos('barfoo_acp_a_module', 'acp', true);
+ $acp_modules = $this->acp_modules->get_module_infos('vendor2_bar_acp_a_module', 'acp', true);
$this->assertEquals(array(
- 'barfoo\\acp\\a_module' => array(
- 'filename' => 'barfoo\\acp\\a_module',
- 'title' => 'Barfoo',
+ 'vendor2\\bar\\acp\\a_module' => array(
+ 'filename' => 'vendor2\\bar\\acp\\a_module',
+ 'title' => 'Bar',
'version' => '3.1.0-dev',
'modes' => array(
'config' => array('title' => 'Config', 'auth' => '', 'cat' => array('ACP_MODS')),
diff --git a/tests/functional/extension_acp_test.php b/tests/functional/extension_acp_test.php
index 5d391e42f7..53f62c4f19 100644
--- a/tests/functional/extension_acp_test.php
+++ b/tests/functional/extension_acp_test.php
@@ -45,7 +45,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
// Insert our base data
$insert_rows = array(
array(
- 'ext_name' => 'foo',
+ 'ext_name' => 'vendor2/foo',
'ext_active' => true,
'ext_state' => 'b:0;',
),
@@ -57,12 +57,12 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
// do not exist
array(
- 'ext_name' => 'test2',
+ 'ext_name' => 'vendor/test2',
'ext_active' => true,
'ext_state' => 'b:0;',
),
array(
- 'ext_name' => 'test3',
+ 'ext_name' => 'vendor/test3',
'ext_active' => false,
'ext_state' => 'b:0;',
),
@@ -80,30 +80,38 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
$crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&sid=' . $this->sid);
$this->assertCount(1, $crawler->filter('.ext_enabled'));
- $this->assertCount(5, $crawler->filter('.ext_disabled'));
+ $this->assertCount(4, $crawler->filter('.ext_disabled'));
$this->assertContains('phpBB Foo Extension', $crawler->filter('.ext_enabled')->eq(0)->text());
$this->assertContainsLang('EXTENSION_DISABLE', $crawler->filter('.ext_enabled')->eq(0)->text());
- $this->assertContains('The “test2” extension is not valid.', $crawler->filter('.ext_disabled')->eq(0)->text());
+ $this->assertContains('phpBB Moo Extension', $crawler->filter('.ext_disabled')->eq(1)->text());
+ $this->assertContainsLang('DETAILS', $crawler->filter('.ext_disabled')->eq(1)->text());
+ $this->assertContainsLang('EXTENSION_ENABLE', $crawler->filter('.ext_disabled')->eq(1)->text());
+ $this->assertContainsLang('EXTENSION_DELETE_DATA', $crawler->filter('.ext_disabled')->eq(1)->text());
- $this->assertContains('The “test3” extension is not valid.', $crawler->filter('.ext_disabled')->eq(1)->text());
+ $this->assertContains('The “vendor/test2” extension is not valid.', $crawler->filter('.ext_disabled')->eq(0)->text());
- $this->assertContains('phpBB Moo Extension', $crawler->filter('.ext_disabled')->eq(2)->text());
- $this->assertContainsLang('DETAILS', $crawler->filter('.ext_disabled')->eq(2)->text());
- $this->assertContainsLang('EXTENSION_ENABLE', $crawler->filter('.ext_disabled')->eq(2)->text());
- $this->assertContainsLang('EXTENSION_DELETE_DATA', $crawler->filter('.ext_disabled')->eq(2)->text());
+ $this->assertContains('The “vendor/test3” extension is not valid.', $crawler->filter('.ext_disabled')->eq(2)->text());
- $this->assertContains('The “bar” extension is not valid.', $crawler->filter('.ext_disabled')->eq(3)->text());
+ $this->assertContains('phpBB Bar Extension', $crawler->filter('.ext_disabled')->eq(3)->text());
+ $this->assertContainsLang('DETAILS', $crawler->filter('.ext_disabled')->eq(3)->text());
+ $this->assertContainsLang('EXTENSION_ENABLE', $crawler->filter('.ext_disabled')->eq(3)->text());
+
+ // Check that invalid extensions are not listed.
+ $this->assertNotContains('phpBB BarFoo Extension', $crawler->filter('.table1')->text());
+ $this->assertNotContains('barfoo', $crawler->filter('.table1')->text());
+
+ $this->assertNotContains('vendor3/bar', $crawler->filter('.table1')->text());
}
public function test_details()
{
- $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=foo&sid=' . $this->sid);
+ $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=details&ext_name=vendor2%2Ffoo&sid=' . $this->sid);
$validation = array(
'DISPLAY_NAME' => 'phpBB Foo Extension',
- 'CLEAN_NAME' => 'foo/example',
+ 'CLEAN_NAME' => 'vendor2/foo',
'TYPE' => 'phpbb-extension',
'DESCRIPTION' => 'An example/sample extension to be used for testing purposes in phpBB Development.',
'VERSION' => '1.0.0',
@@ -143,7 +151,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
public function test_enable_pre()
{
// Foo is already enabled (redirect to list)
- $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=foo&sid=' . $this->sid);
+ $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=vendor2%2Ffoo&sid=' . $this->sid);
$this->assertContainsLang('EXTENSION_NAME', $crawler->filter('div.main thead')->text());
$this->assertContainsLang('EXTENSION_OPTIONS', $crawler->filter('div.main thead')->text());
$this->assertContainsLang('EXTENSION_ACTIONS', $crawler->filter('div.main thead')->text());
@@ -160,7 +168,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
$this->assertContainsLang('EXTENSION_OPTIONS', $crawler->filter('div.main thead')->text());
$this->assertContainsLang('EXTENSION_ACTIONS', $crawler->filter('div.main thead')->text());
- $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable_pre&ext_name=foo&sid=' . $this->sid);
+ $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=disable_pre&ext_name=vendor2%2Ffoo&sid=' . $this->sid);
$this->assertContains($this->lang('EXTENSION_DISABLE_CONFIRM', 'phpBB Foo Extension'), $crawler->filter('.errorbox')->text());
}
@@ -171,7 +179,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
$this->assertContains('The required file does not exist', $crawler->filter('.errorbox')->text());
// foo is not disabled (redirect to list)
- $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=delete_data_pre&ext_name=foo&sid=' . $this->sid);
+ $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=delete_data_pre&ext_name=vendor2%2Ffoo&sid=' . $this->sid);
$this->assertContainsLang('EXTENSION_NAME', $crawler->filter('div.main thead')->text());
$this->assertContainsLang('EXTENSION_OPTIONS', $crawler->filter('div.main thead')->text());
$this->assertContainsLang('EXTENSION_ACTIONS', $crawler->filter('div.main thead')->text());
@@ -211,5 +219,9 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
$form = $crawler->selectButton('delete_data')->form();
$crawler = self::submit($form);
$this->assertContainsLang('EXTENSION_DELETE_DATA_SUCCESS', $crawler->filter('.successbox')->text());
+
+ // Attempt to enable invalid extension
+ $crawler = self::request('GET', 'adm/index.php?i=acp_extensions&mode=main&action=enable_pre&ext_name=barfoo&sid=' . $this->sid);
+ $this->assertContainsLang('EXTENSION_DIR_INVALID', $crawler->filter('.errorbox')->text());
}
}