Commit graph

37 commits

Author SHA1 Message Date
Ammarpad 5d3a547c8b Restrict ?withgadget query parameter to opt-in gadgets.
?withgadget query parameters allows for ad-hoc loading of gadgets
(after passing all other basic checks). This was recently added in
I5b30d4e.

In T29766#7611796 Gergo raised concerns about how this can be
potentially abused.

This patch aims to restrict the feature by giving gadgets latitude
to either use it or not depending on the nature of the gadget.

The patch does so by adding `supportsUrlLoad` option that gadgets
(maybe those deemed safe) can use it to opt-in to the parameter.
By default gadgets don't support it, so it can be enabled for each
on a case-by-case basis.

Bug: T29766
Change-Id: Ie64174085e650579d76cc862774a4fe1b3d08396
2022-01-24 00:31:19 +00:00
Siddharth VP 7ead5dab61 Allow specifying page actions in definitions
Allow specifying page actions ('view', 'edit', 'history', etc) in
gadget definitions. If specified, the gadget is run only on the given
page action(s).

This is especially useful for default gadgets like RefToolbar[1] and
TextReactions[2] that only need to be loaded while editing.

[1]: https://en.wikipedia.org/wiki/WP:RefToolbar
[2]: https://en.wikipedia.org/wiki/WP:Text_reactions

Bug: T204201
Bug: T63007
Change-Id: Idde71b3f1f6c36cd21539a2312be8f12217a9acc
2022-01-01 00:41:08 +05:30
Siddharth VP 1f7b9d90df Support JSON files in gadgets
The parsed content of JSON files in the gadget is made available from the
gadget's JS files via require(). That is, MediaWiki:Gadget-data.json (or
Gadget:data.json) is available as `require('./data.json')`. This is
supported for both MediaWikiGadgetsDefinitionRepo and
GadgetDefinitionNamespaceRepo. The JSON parsing is done server-side.

JSON can only be used in "package" gadgets - in which the JS files can
also be invoked via require().

Also added a test for GadgetResourceLoaderModule.

Bug: T198758
Depends-On: Ib4556d09c4d393269e32771aab00f59a5f630e1b
Depends-On: Id4589a597ccfc4266b3e63d10f75b146aa7a287a
Change-Id: I21acb46cdd244a39b5cc6963aa763f0113bd1e38
2021-12-27 17:33:21 +00:00
Reedy 32677ff590 Various code cleanup
Change-Id: I59b7ac50b621df1da402752327841743141944e3
2021-10-09 01:34:45 +01:00
Jayprakash12345 1472a2733c Use getText() instead of getNativeData()
Bug: T283673
Bug: T155582
Change-Id: Iaf8a0ded40e3303d6fbcfac022b1461c4d2b1333
2021-08-04 02:43:36 +00:00
Umherirrender 6132dbae64 Remove PHP 5.3 $this closure workaround
Change-Id: Ib1f2808a9e0d9c93b2b598fd07e0f2a61c122f2a
2021-05-15 01:57:51 +02:00
libraryupgrader c3c98c1146 build: Updating composer dependencies
* mediawiki/mediawiki-codesniffer: 35.0.0 → 36.0.0
* php-parallel-lint/php-parallel-lint: 1.2.0 → 1.3.0

Change-Id: I5e0b9e78f0436355cc21dc356fb78e96e59cb536
2021-05-04 18:43:54 +00:00
Umherirrender 4de4305c6c Add missing @var and improve documentation
Change-Id: Ib258665c3fe76eeadd32f949fe01d88e6f2fd70d
2020-12-18 00:21:49 +01:00
zoranzoki21 a66f0f7baa Fix MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate
In ApiQueryGadgetCategories.php for function getList() I've added inline comment for ignoring this rule, because is unclear why it throws this error.

Change-Id: I74c4a6c75f48b8f7a237396666db3b37993c300d
2020-10-12 15:26:23 +00:00
Reedy 3ce0a0fb38 Fix PSR12.Properties.ConstantVisibility.NotFound
Bug: T253169
Change-Id: I17a7f0195dd0a419ae8afe46521dd8f061ba53c6
2020-05-20 00:13:16 +00:00
DannyS712 3f00fbb5aa Remove use of Revision::newFromTitle
Bug: T249183
Change-Id: Ibfcb8d7e56f559f3fb5179bac4dfeade8da22533
2020-04-08 12:44:29 +00:00
Umherirrender 7c13328467 build: Updating mediawiki/mediawiki-phan-config to 0.8.0
Argument 1 ($min) is 7000000.0 but \mt_rand() takes int
Argument 2 ($max) is 15000000.0 but \mt_rand() takes int

Bug: T235049
Change-Id: I2d7d0d6defd312dbed0de833678f3768fa3d7a46
2019-11-03 12:13:20 +01:00
Kunal Mehta b28ad14b8c Upgrade to newer phan
Bug: T216919
Change-Id: I3a403891eafa703215a79526fcf9469b1fd6edc6
2019-03-17 16:39:02 -07:00
Aaron Schulz 1204d238f0 Increase loadGadgets() expiry to 15 seconds to avoid stampedes
Bug: T203786
Change-Id: If45b91987f3f523139e5e66f546be17a455647fe
2018-10-30 15:55:51 +00:00
Aaron Schulz 1acde38a6a Randomized APC gadget definition refreshes to avoid stampedes to memcached
Bug: T203786
Change-Id: If87e752f5cdc6bd216ad96486a86a40b2477b315
2018-10-19 01:57:07 +00:00
Aaron Schulz 93137ec581 Clean up gadget definition key code
Change-Id: Ic3116de9f5b76375c908f540a29945203f14d4c5
2018-10-05 03:29:29 -07:00
libraryupgrader 33ecce01c0 build: Updating mediawiki/mediawiki-codesniffer to 20.0.0
Change-Id: I210883a100f2060e9bff0d5066896ce35b45a788
2018-05-26 03:01:39 +00:00
Kunal Mehta e99e181303 Add phan configuration
Depends-On: I09a0c0a786b687997e61344847f8af08b20cebf2
Change-Id: I9500232fb524e884d6cb15f2bdda10835df35ad4
2018-02-26 12:57:40 -08:00
Kunal Mehta a544c227f2 Avoid hardcoding specific GadgetRepo implementations for cache invalidations
Depending on GadgetRepo::singleton() to return a specific implementation
is fragile. Pass each created/updated/deleted page to
GadgetRepo::handlePageCreation/Update/Deletion() and let each specific
implementation deal with it.

Use LinkTarget to be TitleValue compatible for the future.

Change-Id: Ibe2e26d12369a897c53757adf621926f62af7f7b
2017-11-07 12:13:11 -08:00
jenkins-bot bea78b0726 Merge "Account for DB lag in loadGadgets() caching" 2017-09-01 02:09:40 +00:00
Aaron Schulz 155d108c02 Account for DB lag in loadGadgets() caching
Bug: T157210
Change-Id: I86a32407af4d6ebb4fa2e16005c76081a113e8c8
2017-08-31 15:29:05 -07:00
Umherirrender 88d0b22359 Improve some parameter docs
Change-Id: I268aaa13d07985b0915774e83c487cd22568b161
2017-08-27 16:07:08 +02:00
Thiemo Mättig 6b22f1089e Use …->assertArrayHasKey() instead of isset()
… as well as update a line of documentation I had stashed. I think this
does not need it's own patch, or does it?

Change-Id: I99eee1f7b5ec96c1c75e73d66200bc41807452fa
2017-05-31 07:52:18 +00:00
Aaron Schulz f53828bf57 Avoid wfMessage() call in Gadget cache updates
This avoids purge problems due to layered caching. The message cache
is known to take a while to regenerate and uses lockTSE=300.

Bug: T157210
Change-Id: I418e160ddb61c4d3654780f5d2bbb14bc2827e2a
2017-03-09 06:03:03 +00:00
Aaron Schulz dbccf81ffd Minor code style cleanups
Change-Id: Ia4390dcdba6fc809610b036896223448270641d6
2017-02-27 14:08:51 -08:00
Timo Tijhof dc4ea6cb21 Implement 'peers' feature for loading extra styles-type gadgets
Ref discussion on T42284.

Test plan:
* Create gadget A with a .css file only. (Maybe mark as 'hidden')
* Create gadget B with .js file, and peers=A.
* Verify that enabling B will result in B being loaded as general module,
  and A being loaded as page style module.

Change-Id: Ib6207e72c576ff387ecdba685a063bdfbb828199
2017-01-02 14:45:09 +01:00
Fomafix 1a569b590b Convert PHP syntax from array() to []
Performed using:
find . -name \*.php -exec php ~/convert.php -w "{}" \;

Script from:
https://github.com/thomasbachem/php-short-array-syntax-converter

And convert syntax in comments manually.

Change-Id: I7ea9e57f9ab1250c8687885ad9e010771603bf78
2016-12-28 13:51:30 +01:00
Fomafix 75d7d07f6b Change documentation and comments from HTTP to HTTPS
This change avoids redirects from HTTP to HTTPS.

Change-Id: I2eb3b14e5bc8255f30ae557f842bfc512fc33a79
2016-12-23 18:26:43 +01:00
Timo Tijhof 27a0ca6568 Implement support for 'hidden' feature in MediaWikiGadgetsDefinitionRepo
Follows-up 152484566, which added support for it in Gadgets 2.0, but
it's easy enough to make it work in existing definitions as well.

That way, people can stop using 'rights=hidden' hacks.

Bug: T33150
Change-Id: Idd6944a9ad38279e117c1a02a4b5fd0343455ba0
2016-11-22 23:46:38 +00:00
Timo Tijhof 846b979578 Remove redundant 'position', 'top', and getPosition() code
Unused as of bc374082fa in MediaWiki core (T109837).

Change-Id: Idcec3c4fa2bc3bc05ac417062139794880040a6d
2016-11-18 13:55:30 -08:00
Aaron Schulz 23c0b1c14e Clean up ObjectCache calls
Change-Id: I6b741a82dca2fead8b1392208bec4303cc064d87
2016-10-11 14:20:29 -07:00
Timo Tijhof dc834f3933 Implement support for specifying type=styles
T87871 formally introduced the concept of a styles module,
which sets mw.loader.state to "ready" when loaded through addModuleStyles().

Previously, addModuleStyles couldn't safely do that because a module may
contain scripts also, in which case mw.loader must still load the (rest)
of the module (causes styles to load twice).

In MediaWiki core or extensions this is easily avoided by calling not
calling both addModules() and addModuleStyles().

For Gadgets we call both as a workaround to allow users to provide styles
(without a FOUC), but also to provide scripts+styles. Since we don't declare
which one is intended (and some gadgets do both), we loaded them both ways.
This will no longer be allowed in the future (see T92459).

The new 'type=styles' Gadget attribute promises to ResourceLoader that a
gadget only contains styles.

Impact:

* [Bug fix] When mw.loader requires a styles module that already loaded,
            it will not load again.

* [Feature] It is possible for a general scripts+styles gadget to depend on
            a styles gadget. Previously this caused the styles to load twice.

* Specifying type=styles will load the module through addModuleStyles() only.

  Use this for modules that contain styles that relate to elements already
  on the page (e.g. when customising the skin, layout, or article content).

* Specifying type=general will load the module through addModules() only.

  Use this if your module contains both scripts and styles and the styles
  only relate to elements created by the script. This means the styles do not
  need to be loaded separately through addModuleStyles() and will not apply
  to noscript mode.

Effective difference:

* Gadgets with only styles: We assume type=styles.

  This fixes the main bug (styles loading twice) and requires no migration!

* Gadgets with only scripts: We assume type=general.

  This requires no migration! (And: No more empty stylesheet request)

* Gadgets with scripts (with or without styles): We assume type=general, but
  unless type=general was explicitly set we'll still load it both ways so
  that the styles apply directly on page load.

  If this is not needed, set type=general.

  If this is needed, it should become two separate modules. We do not support
  a single module having two purposes (1: apply styles to the page,
  2: provide scripts+styles). The styles module should be separate.
  It can be made hidden, and listed as dependency of the other module.

The latter case is detected on page load and results in a console warning
with a link to T42284.

Bug: T42284
Bug: T92459
Change-Id: Ia3c9ddee243f710022144fc2884434350695699a
2016-09-30 10:43:29 +00:00
Kunal Mehta 3b9c177400 Bump MediaWikiGadgetsDefinitionRepo cache version
Needed by 519f30355e

Change-Id: Ic67893500f2865a46b67b701a3b418631ded5137
2015-12-08 16:21:34 -08:00
Kunal Mehta 519f30355e Implement Gadgets definition namespace repo
Implements:
* Gadget definition content and content handler
* Basic validation for gadget definition content
* GadgetDefinitionNamespace implementation of GadgetRepo
* DataUpdates upon editing/deletion of Gadget definition pages
* EditFilterMerged hook for improved error messages
* 'GadgetsRepoClass' option to switch GadgetRepo implementation used
* Lazy-load the GadgetResourceLoaderModule class so we don't need to
load each individual gadget object unless its needed

Note that Special:Gadgets's export feature intentionally doesn't work
yet, and will be fixed in a follow up patch.

Bug: T106177
Change-Id: Ib11db5fb0f7b46793bfa956cf1367f1dc1059b1c
2015-11-20 12:01:21 -06:00
Fomafix a6418d2749 Remove double whitespaces
Change-Id: Ic6c095c25b0ba80f9340254c36fc5fec911ce87d
2015-10-23 21:11:01 +00:00
Aaron Schulz 4e7612bca1 Update getWithSetCallback() callers to the newer signature
Change-Id: I4207b1acfd2e831ec13998f784833ffc413cb690
2015-10-07 19:14:56 -07:00
Kunal Mehta e858bda308 Add abstract GadgetRepo and MediaWikiGadgetsDefinition implementation
GadgetRepo is an abstract class based off of the implementation in the
RL2 branch.

It is a singleton that provides basic methods to construct and interact
with Gadget objects.

The MediaWikiGadgetsDefinition class is an implementation of GadgetsRepo
that parses the "MediaWiki:Gadgets-definition" page for gadget
definitions.

Tests were left in place to demonstrate that no functional changes have
been made aside from relocation of code. Some tests should be moved to
separate files in the future.

Bug: T106176
Change-Id: I3e802889f6f495783f4dbac65c2a8cefa824a778
2015-08-01 15:10:07 -07:00