Commit graph

876 commits

Author SHA1 Message Date
Amir Sarabadani
d062560f24 Require $key in msg() functions
Note: calling msg() with no parameter was never supported,
doing this on a RequestContext for example would result in:
PHP Warning:  Missing argument 1 for wfMessage() ...followed
by a bunch of fallout.

So this patch only formally declares what was already a
requirement in reality.

Change-Id: I1864afb8bcc641698689828914949a06506d8f3a
2017-06-14 13:26:27 +04:30
Fomafix
4634f2aa9e Document return string as JavaScript code
Change-Id: I47ce855cab444e139898f7269d63437b44825966
2017-06-08 15:11:13 +02:00
Bartosz Dziewoński
51eede0283 Restore the ability to set $wgResourceModuleSkinStyles for 'oojs-ui-core.styles'
In c8ad83310f, 'oojs-ui-core.styles'
was changed to use ResourceLoaderOOUIFileModule instead of plain
ResourceLoaderFileModule. This had the unintended consequence that
ResourceLoader::isFileModule() no longer returned true for it, and
this $wgResourceModuleSkinStyles no longer worked, breaking styling
in Vector.

Additionally, the new ResourceLoaderOOUIFileModule did not respect
the skinScripts/skinStyles options passed in the module definition
(therefore also those from $wgResourceModuleSkinStyles). Merging
them turns out to be a major pain, but it can be done.

Bug: T167042
Change-Id: I7547bbe996467745c1f0b168b40f27eb95c6238d
2017-06-06 00:05:17 +02:00
Bartosz Dziewoński
c8ad83310f Refactor registration of OOjs UI resource modules
includes/resourceloader/ResourceLoaderOOUIModule.php
* New trait centralizing some logic for dealing with OOjs UI themes,
  previously duplicated in OutputPage, ResourcesOOUI.php and
  ResourceLoaderOOUIImageModule.
* Follow-up change I74362f0fc215b26f1f104ce7bdbbac1e106736ad uses this
  as a base to allow skins/extensions to define new OOjs UI themes.

resources/Resources.php
resources/ResourcesOOUI.php
includes/resourceloader/ResourceLoader.php
* OOjs UI resource module definitions are moved back to their rightly
  place in Resources.php. They are again (almost) normal and static.
* Theme-specific logic is now handled by the module code, definitions
  only specify 'themeScripts'/'themeStyles'/'themeImages'.
* ResourcesOOUI.php is deleted and no longer loaded by ResourceLoader.

includes/resourceloader/ResourceLoaderOOUIFileModule.php
includes/resourceloader/ResourceLoaderOOUIImageModule.php
* Glue code previously existing in ResourcesOOUI.php now lives here.
* Use the ResourceLoaderOOUIModule trait to avoid code duplication.

Change-Id: I39cc2a735d9625c87bf4ede6f5fb0ec441d47dcc
2017-06-01 17:04:05 +02:00
James D. Forrester
7668836236 Update OOjs UI to v0.22.1
Release notes:
 https://phabricator.wikimedia.org/diffusion/GOJU/browse/master/History.md;v0.22.1

Depends-On: I4ee36222e67697a7290a1ac94788676e476ca768
Change-Id: I964a298018d837b1a05a1608a81ca0544f34a2c8
2017-05-31 12:27:05 -07:00
daniel
2b3762ecb4 resourceloader: Allow modules to be registered via a factory callback
This should work the same way as registering API modules via a factory callback.
Point in case: Ifb8611473a971 could avoid global state using this mechanism.

Change-Id: Ifbf29006141ce2a2dff42efa352f406502a06bc6
2017-05-21 17:12:37 +00:00
Timo Tijhof
3a748592f8 resourceloader: Add filename to validateScriptFile cache key
* Add fileName to cache key to fix T52919. The cached parsed error
  message contains the filename, this should be part of the cache
  key as otherwise two identical user scripts may report the same
  error message, including " on line X of page Y" where Y is whichever
  of the two pages first created the cache entry.

* Make the cache key global instead of per-wiki. There is no need
  for this to be per-wiki.

Bug: T52919
Change-Id: I6c2718c53be7f6384a6486a4a8718ae7f423d216
2017-05-13 00:24:40 +00:00
Timo Tijhof
702bce40d0 resourceloader: Simplify validateScriptFile() with getWithSetCallback
* Simplify by using early return and getWithSetCallback.
* Add TTL (previously indefinite, now 1 week).

Bug: T52919
Change-Id: Ic95ba392cdb3bcc8081c77d2c2a3240548bed366
2017-05-12 18:13:15 +00:00
Timo Tijhof
976943c991 resourceloader: Bump severity of style queue violation to Warning
Previously it was only in debug logs (which are enabled in Jenkins,
MediaWiki-Vagrant, Beta, and for mwdebug hosts in wmf-production).

Turning it into a warning() will log it for regular requests as well
which is the last step before we can consider hard enforcement.

Bug: T92459
Change-Id: I87c7794c5cfe35521bf76cc42f94907001e9d24b
2017-05-01 17:39:08 -07:00
Aaron Schulz
dd359741cc Move DB errors to Rdbms namespace
Change-Id: I463bd86123501abc68fdb78b4cda6110f7af2549
2017-04-15 10:47:41 -07:00
jenkins-bot
8407bf9243 Merge "resourceloader: Fold legacy modules into base modules request" 2017-04-13 01:45:22 +00:00
jenkins-bot
1ffbcb0b8f Merge "Ensure logo preload transforms urls if needed" 2017-04-12 21:50:07 +00:00
Timo Tijhof
45d8cd2926 Ensure logo preload transforms urls if needed
Follows-up 5f55e9c9c2.

If the logo url is from within /w, then ResourceLoaderSkinModule
will (as it should) apply a file hash query to it.

The preloader didn't do that, so it specified the wrong url.

Refactored SkinModule to make this logic re-usable.

Bug: T100999
Change-Id: I1ba11f7c70d1a725ad72754fee4a3f33c2a4c1be
2017-04-12 21:34:31 +00:00
jenkins-bot
0697e41485 Merge "Move Database and subclasses to Rdbms namespace" 2017-04-12 18:07:43 +00:00
Aaron Schulz
d735dc562d Move Database and subclasses to Rdbms namespace
Change-Id: I52bef87512f9ddd155d1f4cc0052f6b7a0db5b42
2017-04-12 10:43:57 -07:00
Gilles Dubuc
5f55e9c9c2 Preload the logo using link rel="preload" http header
This greatly increases the priority of loading
the logo on browsers that support rel="preload".

Bug: T100999
Change-Id: I0738fcc0a575153dab65016fa87faaa9b8b97a9d
2017-04-11 19:08:53 -07:00
Timo Tijhof
0ac6076b4c resourceloader: Fold legacy modules into base modules request
Follows-up 0ac4f998 (restore "blocking" legacy modules).

After d790562, legacy modules in the top queue were no longer consistently
loaded before the bottom queue due to the top queue being async.

The implied dependency was made explicit by 0ac4f998 by forcing all modules
to wait for legacy modules before executing.

This had the negative side-effect of putting an extra HTTP request between
the startup module request, base modules request, and actual execution
of page modules.

(Indentation aligns with when a request is triggered.)

Before:
 1. Request: Startup module.
   2. Request: Base modules
   3. Request: Legacy modules
     4. Page module request (or local store hit) and execution

After:
 1. Request: Startup module.
   2. Request: Base+legacy modules
     3. Page module request (or local store hit) and execution

This could alternatively be fixed by moving the top queue to be before
the embedded modules and enforcing the embed in a different way.
It could also be fixed by debouncing module load calls so they naturally
end up in the same request as page modules.

However for now I'm addressing this by adding legacy modules to the
list of modules in the initial load request from the startup module.

This was not possible before because the legacy wikibits had dependencies
and base modules cannot have dependencies. Fixed in I7f9f61ea81ad1ef.

Bug: T159911
Change-Id: I54f087655e1cde1b8ff1ca5fe56e82f7f7d80965
2017-04-11 22:56:38 +00:00
Tpt
983dad7457 mw.language.specialcharacters: Add Canadian Aboriginal group
Bug: T108626
Change-Id: Ia337d42c6ef7f9645f1dd843ef0e7553857f6aa3
2017-04-05 18:19:40 +00:00
Fomafix
0d247d202a Document return string as JavaScript code for getScript
Change-Id: I01055c2b6a11dbe6284d1aff2352ba428ed9bee2
2017-04-03 10:24:41 +02:00
Timo Tijhof
c505293cfd resourceloader: Improve code coverage for WikiModuleTest
preloadTitleInfo:
* Add missing case for empty $moduleNames.
* Add missing case for invalid page names.

getContent:
* Add missing case for bad title
* Add missing case for dead redirect.
* Add missing case for no content found.

Change-Id: I44dde13cb0db19d91c4ff15a5abefd17353cad90
2017-03-31 18:53:00 -07:00
Roan Kattouw
c03f57bc11 ResourceLoaderImage: Correctly ignore 'deprecated' key
It turns out that 'resources/lib/oojs-ui/themes/mediawiki/Moved since v0.20.1, use from the 'interactions' pack instead.'
is not usually an existing file, and doesn't have the extension '.svg'.
Not sure why this didn't break earlier.

Bonus: Add module name to exceptions to make these errors easier
to track down.

Bonus #2: Use the post-expansion, not pre-expansion, definition everywhere
to avoid confusion when debugging.

Change-Id: I0325d4dab5658fd29c3c33fd3e762834b53d1b5d
2017-03-29 14:44:22 -04:00
jenkins-bot
ea747bb2d4 Merge "Move IDatabase/IMaintainableDatabase to Rdbms namespace" 2017-03-29 00:46:59 +00:00
Aaron Schulz
488a647831 Move IDatabase/IMaintainableDatabase to Rdbms namespace
Change-Id: If7e8a8ff574661fd827de8bcec11d2c39a687300
2017-03-28 15:32:38 -07:00
Timo Tijhof
20b445e22f resourceloader: Avoid deprecated getModifiedHash() in SkinModule
Use getDefinitionSummary instead, which uses a single serialisation
pass instead of requiring every stage to be a string. This way
we don't need to call json_encode and md5() multiple times.

getModifiedHash() was deprecated in MediaWiki 1.26.

Change-Id: If9e9caa3d12976c99543ad53ab280355b70acb17
2017-03-28 22:37:24 +01:00
jenkins-bot
9a6a3044ff Merge "ResourceLoaderImage: Point to the right skin when generating URL" 2017-03-23 18:40:30 +00:00
jenkins-bot
cac0d75f36 Merge "ResourceLoaderOOUIImageModule: Actually load non-default themes' images" 2017-03-23 18:39:52 +00:00
jenkins-bot
97fb2ab408 Merge "Allow extensions to add jQueryMsg magic words" 2017-03-22 21:18:19 +00:00
Matthew Flaschen
7e65b6b3a7 Allow extensions to add jQueryMsg magic words
Change-Id: Ie82a147ff32ccda3f757108474f5cbab71d45ace
2017-03-22 15:09:13 -04:00
jenkins-bot
b3d1931c34 Merge "resourceloader: Follow redirects for JavaScript/CSS in WikiModule" 2017-03-22 03:59:40 +00:00
jenkins-bot
aa5eca02b3 Merge "Replace deprecated Context::getStats() with MWServices::getStatsdDataFactory()" 2017-03-20 09:32:48 +00:00
Timo Tijhof
8a7fb8577f resourceloader: Fix broken 'deprecated' string messages
Some used a string value, others an array with 'message' property.
Standardise on the string value, which seems more intuitive.

Change-Id: I5caead7b7017d2bad660db02fb45a54a26bf3728
2017-03-17 17:23:34 -07:00
jenkins-bot
e2b2ffac90 Merge "ResourceLoaderOOUIModule: Minor code quality fixes, and more comments" 2017-03-17 20:21:42 +00:00
WMDE-Fisch
7b5f08e703 Replace deprecated Context::getStats() with MWServices::getStatsdDataFactory()
Change-Id: I1756f69ca2ebd301a5049bf758d1a87c37771fe6
2017-03-17 12:07:03 +01:00
Bartosz Dziewoński
37c5a5a1ae ResourceLoaderImage: Point to the right skin when generating URL
Previously, in skins using non-default OOUI theme (for example,
in MonoBook skin which uses Apex theme), when using a browser that
we don't serve SVG images to (for example, Internet Explorer 8),
the user would see the default theme's icons. This is noticeable
e.g. with the search box's icon on Special:Search.

Change-Id: I5a563c59efb267d8080161271513c0cc7d90d610
2017-03-17 03:30:23 +01:00
Bartosz Dziewoński
5af0c8f2be ResourceLoaderOOUIImageModule: Actually load non-default themes' images
Values in SkinOOUIThemes are TitleCase, but these filenames are
lowercase. And we silently ignore missing files. This only worked for
the default theme, which is hardcoded to lowercase 'mediawiki' above.

Change-Id: I5b14d65a8f7d5219acfa2a40eabbb13617833b26
2017-03-17 03:30:22 +01:00
Bartosz Dziewoński
519d578697 ResourceLoaderOOUIModule: Minor code quality fixes, and more comments
Change-Id: Ibc7195cc68e1a46062612635988bd16d8145ab63
2017-03-17 03:29:29 +01:00
WMDE-Fisch
f4329ddbc8 resourceloader: Use SVG url when ResourceLoaderImageModule can't embed
When the SVG is too big to be embeded it is now included via URL.
Previously it would produce an empty/broken 'url()' value.

Bug: T160532
Change-Id: I158781f9430cfa35737397ac7537a471634c4480
2017-03-16 22:11:11 +00:00
Kaldari
771e85be6c resourceloader: Follow redirects for JavaScript/CSS in WikiModule
Bug: T108653
Change-Id: I9a321fc5728f3bf9df950c060c92e4148cf3ef93
2017-03-14 19:03:26 -07:00
Timo Tijhof
0c5b6ecc8f Clean up get_class() in /includes/filerepo and /includes/resourceloader
* get_class()        -> __CLASS__ (same as self::class)
* get_called_class() -> static::class
* get_class($this)   -> static::class

Change-Id: Ic4f9b150ddc35e25f51297de7fc12410d421be4d
2017-03-07 21:30:29 +00:00
jenkins-bot
17eda64357 Merge "includes: Replace implicit Bugzilla bug numbers with Phab ones" 2017-02-28 00:51:57 +00:00
jenkins-bot
6ad363a177 Merge "Log a backtrace from the culprit location if headers were already sent" 2017-02-24 22:41:45 +00:00
Tim Starling
f193271cff Log a backtrace from the culprit location if headers were already sent
Install the backtrace collector very early, so that we can get the
backtrace even if headers were sent from LocalSettings.php.

Bug: T157392
Change-Id: I9bc732b34481c95afb5362e135a87bd4302498e2
2017-02-23 14:10:12 +11:00
Timo Tijhof
e2c4c40c96 resourceloader: Avoid endless module_deps write for the same value
Follows-up 047b60b96d (ref T111481).

The if-condition compared the expanded paths, not the relative paths.
This meant there were two conditions under which the code will perform
a useless write that inserts *literally* the exact same JSON value.

1. The base directory ($IP) changes after a branch upgrade.
2. Paths contain '../', '//' or other unnormalized paths.

The latter caused various Echo and ULS methods to keep writing the
same value because one of their images is referenced in CSS using
'../'. When inserted in the database as relative path and then
expanded again at run-time and compared to the input value, they
don't match ("$IP/foo/../bar.png" != "$IP/bar.png") and cause a write.

Bug: T158813
Change-Id: I223c232d3a8c4337d09ecf7ec6e5cd7cf7effbff
2017-02-22 22:32:45 +00:00
Timo Tijhof
49948457ec resourceloader: Optimize WikiModule preload for reqs without wiki modules
Currently it was still going through fetchTitleInfo() with an empty array on
the majority of requests without wiki modules, e.g. load.php?modules=jquery.

Bug: T158813
Change-Id: Ie33a2b4da572bb30b2e7a69db07790724ec2f03f
2017-02-22 21:42:16 +00:00
James D. Forrester
9635dda73a includes: Replace implicit Bugzilla bug numbers with Phab ones
It's unreasonable to expect newbies to know that "bug 12345" means "Task T14345"
except where it doesn't, so let's just standardise on the real numbers.

Change-Id: I6f59febaf8fc96e80f8cfc11f4356283f461142a
2017-02-21 18:13:24 +00:00
Timo Tijhof
44f3f068df resourceloader: Consistent stylesheet order for debug and non-debug
Previously, style modules were only in a predictable order for production mode.
In debug mode, the order was determined by order in which modules were added
to queue at run time. This made it sometimes hard to debug, especially when
dealing with gadgets that apply in a different order among each other.

Change-Id: I4bff0c91d127e4ad8015cd8c1775220fe460cbc3
2017-02-17 15:21:59 -08:00
Timo Tijhof
68c0eefc85 resourceloader: Limit module_deps write lock to unique index
Follows-up 1d15085bb3.

The column has a unique index for module name and skin/language pair.
Previously the write lock was on module name, which meant that
shortly after deployment, the following happens:

* Files change on disk.
* (1-5min pass)
* First startup module request after 5min http-cache expires. Detects
  one or more changes and updates the version hash of that module.
* Web client subsequently requests this module (if used on that page).
  The first time that request comes in, it's a varnish cache miss
  and will make RL load all files from disk related to that module
  and update the cache index in the module_deps table. At this point
  most popular skin/lang pairs fail, except one. As a result, the
  other rows remain stale.
* (7-30 days varnish expiry pass OR another change to the module deploys)
* Web client requests this module and tries to update its skin/lang pair
  for that module.

One simple change in January 2016 changes jquery.tablesorter to load
a PNG file instead of a GIF file. Now, over a year later, there are
still a dozen skin/lang pairs in enwiki.module_deps with stale data,
which is causing various suble bugs, as well as filesystem calls for
files that don't exist.

Ref T113916 (refactor module_deps).
Ref T158105 (stale cache bug).

Bug: T158105
Change-Id: Ib6c024bfa8d35ce2d622ba4242291daedb507d5e
2017-02-15 20:52:28 +00:00
Timo Tijhof
e7b57d881a resourceloader: Use upsert() instead of replace() for module_deps write
This should perform better and reduce internal lock contention on the
database server.

Bug: T158105
Change-Id: I1acfb0630946283b317cb929e8d7c3b2af757ecf
2017-02-15 20:52:19 +00:00
Brad Jorsch
fb3ae6fbe3 Replace use of &$this
Use of &$this doesn't work in PHP 7.1. For callbacks to methods like
array_map() it's completely unnecessary, while for hooks we still need
to pass a reference and so we need to copy $this into a local variable.

Bug: T153505
Change-Id: I8bbb26e248cd6f213fd0e7460d6d6935a3f9e468
2017-01-31 23:01:54 -05:00
Timo Tijhof
f8ceb5c237 resourceloader: Include backtrace in formatted errors (if enabled)
Make ResourceLoader error formatting the same as everywhere else.
Which means if wgShowExceptionDetails is enabled locally, the
trace will be included as well.

This matches logic in MWExceptionRenderer.

Also move the typical error handling used by respond() to a
utility method to reduce duplication of code and avoid mistakes.

Change-Id: If04ae99618e4a758ed0f9dd2b555496b76da29de
2016-12-16 02:32:24 +00:00