summaryrefslogtreecommitdiff
path: root/extensions/Gadgets/Gadgets_body.php
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/Gadgets/Gadgets_body.php')
-rw-r--r--extensions/Gadgets/Gadgets_body.php264
1 files changed, 32 insertions, 232 deletions
diff --git a/extensions/Gadgets/Gadgets_body.php b/extensions/Gadgets/Gadgets_body.php
index e787062a..1e043a82 100644
--- a/extensions/Gadgets/Gadgets_body.php
+++ b/extensions/Gadgets/Gadgets_body.php
@@ -11,235 +11,6 @@
* @license GNU General Public Licence 2.0 or later
*/
-class GadgetHooks {
- /**
- * ArticleSaveComplete hook handler.
- *
- * @param $article Article
- * @param $user User
- * @param $text String: New page text
- * @return bool
- */
- public static function articleSaveComplete( $article, $user, $text ) {
- // update cache if MediaWiki:Gadgets-definition was edited
- $title = $article->getTitle();
- if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getText() == 'Gadgets-definition' ) {
- Gadget::loadStructuredList( $text );
- }
- return true;
- }
-
- /**
- * UserGetDefaultOptions hook handler
- * @param $defaultOptions Array of default preference keys and values
- * @return bool
- */
- public static function userGetDefaultOptions( &$defaultOptions ) {
- $gadgets = Gadget::loadStructuredList();
- if ( !$gadgets ) {
- return true;
- }
-
- /**
- * @var $gadget Gadget
- */
- foreach ( $gadgets as $thisSection ) {
- foreach ( $thisSection as $gadgetId => $gadget ) {
- if ( $gadget->isOnByDefault() ) {
- $defaultOptions['gadget-' . $gadgetId] = 1;
- }
- }
- }
-
- return true;
- }
-
- /**
- * GetPreferences hook handler.
- * @param $user User
- * @param $preferences Array: Preference descriptions
- * @return bool
- */
- public static function getPreferences( $user, &$preferences ) {
- $gadgets = Gadget::loadStructuredList();
- if ( !$gadgets ) {
- return true;
- }
-
- $options = array();
- $default = array();
- foreach ( $gadgets as $section => $thisSection ) {
- $available = array();
-
- /**
- * @var $gadget Gadget
- */
- foreach ( $thisSection as $gadget ) {
- if ( $gadget->isAllowed( $user ) ) {
- $gname = $gadget->getName();
- # bug 30182: dir="auto" because it's often not translated
- $desc = '<span dir="auto">' . $gadget->getDescription() . '</span>';
- $available[$desc] = $gname;
- if ( $gadget->isEnabled( $user ) ) {
- $default[] = $gname;
- }
- }
- }
-
- if ( $section !== '' ) {
- $section = wfMessage( "gadget-section-$section" )->parse();
-
- if ( count ( $available ) ) {
- $options[$section] = $available;
- }
- } else {
- $options = array_merge( $options, $available );
- }
- }
-
- $preferences['gadgets-intro'] =
- array(
- 'type' => 'info',
- 'label' => '&#160;',
- 'default' => Xml::tags( 'tr', array(),
- Xml::tags( 'td', array( 'colspan' => 2 ),
- wfMessage( 'gadgets-prefstext' )->parseAsBlock() ) ),
- 'section' => 'gadgets',
- 'raw' => 1,
- 'rawrow' => 1,
- );
-
- $preferences['gadgets'] =
- array(
- 'type' => 'multiselect',
- 'options' => $options,
- 'section' => 'gadgets',
- 'label' => '&#160;',
- 'prefix' => 'gadget-',
- 'default' => $default,
- );
-
- return true;
- }
-
- /**
- * ResourceLoaderRegisterModules hook handler.
- * @param $resourceLoader ResourceLoader
- * @return bool
- */
- public static function registerModules( &$resourceLoader ) {
- $gadgets = Gadget::loadList();
- if ( !$gadgets ) {
- return true;
- }
-
- /**
- * @var $g Gadget
- */
- foreach ( $gadgets as $g ) {
- $module = $g->getModule();
- if ( $module ) {
- $resourceLoader->register( $g->getModuleName(), $module );
- }
- }
- return true;
-
- }
-
- /**
- * BeforePageDisplay hook handler.
- * @param $out OutputPage
- * @return bool
- */
- public static function beforePageDisplay( $out ) {
- wfProfileIn( __METHOD__ );
-
- $gadgets = Gadget::loadList();
- if ( !$gadgets ) {
- wfProfileOut( __METHOD__ );
- return true;
- }
-
- $lb = new LinkBatch();
- $lb->setCaller( __METHOD__ );
- $pages = array();
-
- /**
- * @var $gadget Gadget
- */
- $user = $out->getUser();
- foreach ( $gadgets as $gadget ) {
- if ( $gadget->isEnabled( $user ) && $gadget->isAllowed( $user ) ) {
- if ( $gadget->hasModule() ) {
- $out->addModuleStyles( $gadget->getModuleName() );
- $out->addModules( $gadget->getModuleName() );
- }
-
- foreach ( $gadget->getLegacyScripts() as $page ) {
- $lb->add( NS_MEDIAWIKI, $page );
- $pages[] = $page;
- }
- }
- }
-
-
- // Allow other extensions, e.g. MobileFrontend, to disallow legacy gadgets
- if ( wfRunHooks( 'Gadgets::allowLegacy', array( $out->getContext() ) ) ) {
- $lb->execute( __METHOD__ );
-
- $done = array();
-
- foreach ( $pages as $page ) {
- if ( isset( $done[$page] ) ) {
- continue;
- }
-
- $done[$page] = true;
- self::applyScript( $page, $out );
- }
- }
- wfProfileOut( __METHOD__ );
-
- return true;
- }
-
- /**
- * Adds one legacy script to output.
- *
- * @param string $page Unprefixed page title
- * @param OutputPage $out
- */
- private static function applyScript( $page, $out ) {
- global $wgJsMimeType;
-
- # bug 22929: disable gadgets on sensitive pages. Scripts loaded through the
- # ResourceLoader handle this in OutputPage::getModules()
- # TODO: make this extension load everything via RL, then we don't need to worry
- # about any of this.
- if ( $out->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) < ResourceLoaderModule::ORIGIN_USER_SITEWIDE ) {
- return;
- }
-
- $t = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
- if ( !$t ) {
- return;
- }
-
- $u = $t->getLocalURL( 'action=raw&ctype=' . $wgJsMimeType );
- $out->addScriptFile( $u, $t->getLatestRevID() );
- }
-
- /**
- * UnitTestsList hook handler
- * @param array $files
- * @return bool
- */
- public static function onUnitTestsList( array &$files ) {
- $testDir = __DIR__ . '/tests/';
- $files = array_merge( $files, glob( "$testDir/*Test.php" ) );
- return true;
- }
-}
/**
* Wrapper for one gadget.
@@ -248,7 +19,7 @@ class Gadget {
/**
* Increment this when changing class structure
*/
- const GADGET_CLASS_VERSION = 6;
+ const GADGET_CLASS_VERSION = 7;
private $version = self::GADGET_CLASS_VERSION,
$scripts = array(),
@@ -261,6 +32,7 @@ class Gadget {
$requiredSkins = array(),
$targets = array( 'desktop' ),
$onByDefault = false,
+ $position = 'bottom',
$category;
/**
@@ -310,6 +82,9 @@ class Gadget {
case 'targets':
$gadget->targets = $params;
break;
+ case 'top':
+ $gadget->position = 'top';
+ break;
}
}
@@ -463,7 +238,7 @@ class Gadget {
return null;
}
- return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets );
+ return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets, $this->position );
}
/**
@@ -502,6 +277,14 @@ class Gadget {
}
/**
+ * Returns the position of this Gadget's ResourceLoader module
+ * @return String: 'bottom' or 'top'
+ */
+ public function getPosition() {
+ return $this->position;
+ }
+
+ /**
* Loads and returns a list of all gadgets
* @return Mixed: Array of gadgets or false
*/
@@ -614,6 +397,13 @@ class Gadget {
}
}
+ if ( !count( $gadgets ) ) {
+ // Don't cache in case we couldn't find any gadgets. Bug 37228
+ $gadgets = false;
+ wfProfileOut( __METHOD__ );
+ return $gadgets;
+ }
+
// cache for a while. gets purged automatically when MediaWiki:Gadgets-definition is edited
$wgMemc->set( $key, $gadgets, 60 * 60 * 24 );
$source = $forceNewText !== null ? 'input text' : 'MediaWiki:Gadgets-definition';
@@ -641,11 +431,13 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
* )
* @param $dependencies Array: Names of resources this module depends on
* @param $targets Array: List of targets this module support
+ * @param $position String: 'bottom' or 'top'
*/
- public function __construct( $pages, $dependencies, $targets ) {
+ public function __construct( $pages, $dependencies, $targets, $position ) {
$this->pages = $pages;
$this->dependencies = $dependencies;
$this->targets = $targets;
+ $this->position = $position;
}
/**
@@ -664,4 +456,12 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
public function getDependencies() {
return $this->dependencies;
}
+
+ /**
+ * Overrides ResourceLoaderModule::getPosition()
+ * @return String: 'bottom' or 'top'
+ */
+ public function getPosition() {
+ return $this->position;
+ }
}