Commit graph

1441 commits

Author SHA1 Message Date
jenkins-bot
2c0db8f5e8 Merge "OutputPage::getCategories(): Add a possibility to distinguish "normal" and "hidden" categories" 2016-11-25 00:17:04 +00:00
Florian
f4b8549f5f OutputPage::getCategories(): Add a possibility to distinguish "normal" and "hidden" categories
There's currently no way to get, e.g., all categories except the
hidden ones just as text. The OutputPage::getCategories() method
always returns all categories as an array of strings (titles) and
the getCategoryLinks() method returns the result of Linker::link
but with the distinction between "normal" and "hidden" categories.

This change adds a new parameter to OutputPage::getCategories(),
$type, which can be used to define, what categories should be
returned. The default value is "all", which means, that all categories
are returned (the current result of the method). With the value
"normal" and "hidden", the method will return the respective values.

This could be used in I97d7de723fe72da26c7dbde0a559a13704c7099a to
remove the stupid Linker::link() and isset workaround.

Change-Id: Iadda9ae362a21fbee770240234b8f55326219932
2016-11-25 00:02:28 +00:00
Bartosz Dziewoński
0e15a6068a Revert "Move NewPP limit report HTML comments to JS variables" and followups
This change resulted in unreasonable feature loss (human-readable
limit report was gone). Three months and multiple followups later,
the functionality is still not completely restored. Given lack
of response from the original author, I think it is time to revert
and reconsider, especially since the 1.28 release is soon.

A machine-readable limit report would be a very useful feature,
but not at the cost of losing human-readable limit report.

This reverts the following commits:

* Move NewPP limit report HTML comments to JS variables
  b7c4c8717f
* Only pretty-print the parser report JS vars
  28adc4d7ee
* Show wgPageParseReport on page previews too
  1255654ed5
* Re-add human readable parser limit report
  0051f108b9
* Restore hooks.txt for ParserLimitReportFormat
  4663e7a737

Resolved minor merge conflicts in OutputPage (with 80e5b160)
and release notes.

Bug: T110763
Bug: T142210
Change-Id: Id88c8066fae3f369e8977b4b7488f67071bdeeb7
2016-11-08 22:35:15 +01:00
jenkins-bot
69ae945e8d Merge "Update weblinks in comments from HTTP to HTTPS" 2016-11-08 21:32:00 +00:00
jenkins-bot
4ac6d60844 Merge "Fix docs for OutputPage::addLanguageLinks and OutputPage::setLanguageLinks" 2016-11-08 03:36:32 +00:00
Leszek Manicki
287bb1a064 Fix docs for OutputPage::addLanguageLinks and OutputPage::setLanguageLinks
Per what has been described and fixed in
Ie9c42ac2b4ff143e36d07642f57cca769e8c00e7.

Change-Id: I2af28ae97805f3259ca038942a84b43f89b55150
2016-11-07 16:18:37 +01:00
Fomafix
202f695f67 Update weblinks in comments from HTTP to HTTPS
Use HTTPS instead of HTTP where the HTTP link is a redirect to the HTTPS link.

Also update some defect links.

Change-Id: Ic3a5eac910d098ed5c2a21e9f47c9b6ee06b2643
2016-11-07 15:24:46 +01:00
umherirrender
34fe90ac52 Remove empty lines at end of functions
It looks like there is something missing after the last statement
Also remove some other empty lines at begin of functions, ifs or loops
while at these files

Change-Id: Ib00b5cfd31ca4dcd0c32ce33754d3c80bae70641
2016-11-05 11:55:10 +01:00
Aaron Schulz
919992eece Break long lines in OutputPage::sendCacheControl()
Change-Id: I72d494f4c97aef9d500bb5d7b36dad30a44f501a
2016-11-03 13:06:59 -07:00
jenkins-bot
a6c5f1a815 Merge "Use adaptive CDN TTLs for page views" 2016-10-21 21:55:52 +00:00
Aaron Schulz
4a3e3c95b3 Use adaptive CDN TTLs for page views
This makes frequently changed pages be less likely to be
seen in stale forms if purges are delayed or lost. Pages
that have not been edited for somewhat longer than the
nominal CDN cache TTL will retain the nominal TTL.

Category pages will adapt based on page_touched rather
than the last revision, given the possibility of constaintly
changing membership. With their lesser overall usage,
this is less risky than for Article, and also more useful.

Change-Id: If621aca2fb68e9f87a50c891dac8dc6ec7641f5c
2016-10-20 23:22:31 +00:00
jenkins-bot
e097c61475 Merge "OutputPage: Reduce getTitleInfo() calls (improve preloading)" 2016-10-20 22:18:38 +00:00
Timo Tijhof
458d37f205 OutputPage: Reduce getTitleInfo() calls (improve preloading)
* Remove filter between $moduleStyles and preloadTitleInfo().
  Previously, this was filtering out wiki modules created by
  gadgets and extensions. Still causing a couple of direct queries
  from getTitleInfo().

* Store __METHOD__ in $fname outside getWithSetCallback.
  This way queries are logged as either getTitleInfo or preloadTitleInfo.
  This regressed in 0852a000a5, after which the latter was logged
  as "::{closure}".

Change-Id: I454e43f43f8ad3270b86f4cfdbd68192c305cc07
2016-10-20 21:59:23 +00:00
jenkins-bot
6d9704caef Merge "Relax phpdoc of PermissionError to match actual usage" 2016-10-20 21:16:31 +00:00
Gergő Tisza
d452323171 Relax phpdoc of PermissionError to match actual usage
Also fix OutputPage::showPermissionsErrorPage to handle everything
it claims to handle.

Change-Id: I8ed4a6f2f038fe70084ab673300e24af97e935db
2016-10-18 21:08:41 +00:00
Kunal Mehta
0051f108b9 Re-add human readable parser limit report
This mostly reverts commit 1255654ed5.

This re-adds the human readable parser limit report, and makes a few
adjustments necessary for it to work properly.

* In EditPage::getPreviewLimitReport(), only generate the HTML report,
  the JS variable will be added by OutputPage
* If there are multiple calls to OutputPage::addParserOutputMetadata(),
  only use the limit report data from the first one.
* Only add the wgPageParseReport variable if limit report data is
  available.

Bug: T142210
Change-Id: Iad2646acde79b8a59710bb9fd5fbbfea5a39c341
2016-10-16 03:47:50 +00:00
Florian Schmidt
2d52e36018 Don't use Config as an access method for global objects
The Config interface (and it's implementation(s)) was never thought
to be an access method for objects saved in the global state, even
if it works with the current implementation GlobalVarConfig.

Imagine, that MediaWiki core switches to another file-based configuratiion
storage or a a database based one, we wouldn't be able to provide
access to global objects anymore, without weird hacks in the new
config-backend implementation or serializing objects to store in
the database or something else. This all isn't the idea with the Config
interface, as far as I know, so don't use it at all.

This commit changes the access to wgContLang to use the global keyword,
instead of accessing it through Config.

Follow up: Ice4f40911c3761c2542430935bc1898bc4e7a4d4
Follow up: I46f376a82205a5c99b98c9e971f9e9d7868ce9fb

Change-Id: I7a08b3bb649898abd445317a523051b07420b211
2016-10-04 17:40:35 +02:00
Amir Sarabadani
9850c542c6 Clean up array() syntax in docs, part VII
Last part

Change-Id: I38f015e2122ef4fd2d2141718bd889794c29f06c
2016-09-27 06:53:25 +03:30
Timo Tijhof
1b462e24f6 Clean up misuse of wfTimestampOrNull()
It's primarily meant for nullable timestamps in the database.
And for the mere purpose of an is_null() check, it's more confusion
than useful to cause this function since in these two cases its return
value is not used as-is but further conditionalized.

* Also fix fragile link between getRegistration()'s false return
  value never being passed to wfTimestamp (to mean "now") because
  of the isLoggedIn() guard. The ternary would now make those
  follow the 'else' branch toward null.

Change-Id: I9a1ee2a56e1767bfb750e27b1f37bdaeb5e6378d
2016-09-24 00:09:51 +00:00
Max Semenik
cadd370a4d Remove OutputPage->mDebugtext
Deprecated since 1.20, unused anywhere.

Change-Id: I4316b77c48e65faf788de60be28fc9cf65c785f1
2016-09-20 14:58:04 -07:00
Fomafix
e53ff931ab Apply wfBCP47() to HTTP response header Content-Language
See https://tools.ietf.org/html/rfc7231#section-3.1.3 for Content-Language.
This references https://tools.ietf.org/html/rfc5646 aka BCP 47.

Example:
curl -I https://crh.wikipedia.org/wiki/Ba%C5%9F_Saife | grep -i '^content-language:'
	should contain
Content-language: crh-Latn
	instead of
Content-language: crh-latn

Change-Id: Ice4f40911c3761c2542430935bc1898bc4e7a4d4
2016-09-16 17:43:27 +02:00
Timo Tijhof
dbbc3c2329 OutputPage: Don't set 'user' module state if filtered out
On pages where the 'user' module is filtered out (e.g.
on Special:Preferences) it would export state 'loading' (or state
'ready') eventhough the actual call to makeResourceLoader() later
in getBottomScripts() would be a no-op due to filtering.

This would cause either an indefinite state of "loading" or a
state "ready" that wasn't true.

This restores status quo as it was before 80e5b160 and 3e7a50d5f.

Test plan:
* Logged-in with non-empty user page common.js.
* View Special:Preferences.
* Verify in <head> source code, or via mw.loader.getState('user')
  that it has state "registered" (the default initial state) and
  not state "loading" or "ready".

Change-Id: I9b360d7e12703bddb80793aef47296fd63032c3d
2016-09-14 05:02:22 +00:00
Aaron Schulz
a3dacac90f Support masking the WRITE_SYNC latency from ChronologyProtector
* Use OutputPage::output() as the method to mask latency, since it
  takes a good while to run. By the time it runs, cache replication
  should have caught up, so the reap call will likely not block.
* For redirects emitted after changes in POST, instead of masking
  with OutputPage, add a parameter to the redirect and block on
  the positions appearing. This uses the redirection RTT to mask
  the replication latency.

Change-Id: Ib23690c302e8033610fef9a0ef451dafe8a5803e
2016-09-12 23:58:49 +00:00
Aaron Schulz
6f8dc27ca2 Preload ResourceLoaderWikiModule::getTitleInfo in OutputPage
This avoids a separate query for each module.

Bug: T46362
Change-Id: Ie109a8776cbdcd5928cbb59351f2cf94088c0c95
2016-09-08 14:46:18 -07:00
Aaron Schulz
950cf6016c Rename DB_SLAVE constant to DB_REPLICA
This is more consistent with LoadBalancer, modern, and inclusive
of master/master mysql, NDB cluster, and MariaDB galera cluster.

The old constant is an alias now.

Change-Id: I0b37299ecb439cc446ffbe8c341365d1eef45849
2016-09-05 22:55:53 -07:00
Aaron Schulz
16266edff3 Change "slave" => "replica DB" in /includes
Change-Id: Icb716219c9335ff8fa447b1733d04b71d9712bf9
2016-09-05 21:01:01 +00:00
Timo Tijhof
ee52872baf OutputPage: Ensure setupSkinUserCss() always applies to headElement()
Follows-up 80e5b160e0, which had to move this call out of the
headElement() and buildCssLinks() methods as it was no longer
allowed to modify the module queue after it was created.

It was moved to OutputPage::output(), right before Skin::outputPage()
is called, which ends up calling headElement().

The point in time was effectively unchanged for page views.

However for the caller in ApiParse() this meant setupSkinUserCss()
no longer got called at all as it never calls output(), but instead
calls headElement() directly.

Move it to getRlClient(), which is where we set all other 
OutputPage-specific things relating to module loading already.

* For page views this has no impact.
* For ApiParse it means headElement(), which calls getRlClient(),
  will once again include skin stylesheets.

Bug: T144301
Change-Id: I5fd4a27fb2d70b98ce9161dc050788d8ac364110
2016-09-03 18:38:49 +00:00
jenkins-bot
4b282b3ffa Merge "Floor slave lag before display" 2016-08-29 23:16:54 +00:00
Timo Tijhof
471adc7ef9 resourceloader: Make 'site.styles' actually in group 'site'
Before 93ed259cf and 7bb7315d4, 'site' and 'site.styles' module were one module
loaded in two parts. One part via the general queue (not in a separate request),
and the other part in the stylesheet queue (in a separate request).

This was achieved by hacking the stylesheet queue handler to hardcode the group
to be 'site' for a module named 'site' (later 'site.styles' in c20a76ee)
eventhough the module as a whole was not actually in that group.

Now that these modules are separated, this hack is no longer needed
and the module can be registered as being in group 'site' properly.

Change-Id: If193f556be211749b115f3808ee46536b578fb22
2016-08-25 13:39:01 -07:00
Fomafix
23fccd2708 OutputPage.php: Reuse existing variable $user
Follows-up to 81c291f2

Change-Id: Id32daf74549c8af886a46119b30ff29ab2a6ac94
2016-08-23 07:12:35 +00:00
Timo Tijhof
3955415f20 Remove redundant isLoggedIn() call
Follows-up 3e7a50d5, 81c291f26.

Change-Id: I76f71f92ed8f2f57b871fa359c469f83357d8025
2016-08-22 21:08:23 -07:00
Chad Horohoe
81c291f265 SECURITY: Require login to preview user CSS pages
Anon users have predictable edit tokens, hence someone could
force an anon to execute arbitrary CSS by means of a CSRF.

Bug: T133147
Change-Id: I442b2b46cadb967aaa1f35648eff183fc7eaa475
2016-08-23 03:18:51 +00:00
umherirrender
99cbd7d54b Floor slave lag before display
Seeing slave lags like 15.309758901596 looks scary

Change-Id: Ie564670448311364b8492af6b82943312118dc29
2016-08-21 17:01:04 +02:00
Timo Tijhof
3e7a50d5fd OutputPage: Make ResourceLoader position exemption more generic
Follows-up 80e5b160e which moved queue formatting out of OutputPage into a
a separate ResourceLoaderClientHtml class.

The special handling for 'user' and 'user.styles' modules, and the exempt
module groups was kept in OutputPage. However the handling for it was
hardcoded for the modules in that group by default. It did not account for
modules with a group of 'user' loaded by an extension (e.g. GlobalCssJs).
GlobalCssJs modules were wrongly loaded in the regular style queue
(still in a separate request group, but not in the right cascading order
below the DynamicSyles marker).

This commit generalises the handling previously put in buildExemptModules
and moves it to getRlClient() so that it may apply to all style modules.

This commit should be a no-op besides the moving of any <link rel=stylesheet>
for non-core modules in group 'site' or 'user' now being one line lower
in the <head> HTML (after the DynamicStyles marker).

Bug: T143357
Change-Id: I1d6ea10b42293acfc535578172ad7ab2369f6299
2016-08-18 19:18:29 -07:00
Bartosz Dziewoński
22857ee2fe Revert "Work around T87871 to avoid double-loading OOjs UI PHP styles"
We no longer need this workaround after T87871 was fixed.

This reverts commit e65186c443.

Change-Id: Ieba46fb07e1e92d9a6a86cb84d0ecaf208312baa
2016-08-18 19:01:34 +00:00
Timo Tijhof
4ed96c1dde OutputPage: Apply target and origin filter to exempt modules
Follows-up 80e5b160e, which moved filter logic to getRlClient()
so that ResourceLoaderClientHtml doesn't have to deal with this.

While that worked fine for most modules (including 'site'),
it no longer applied the filter for exempt/hardcoded modules
(such as 'site.styles' and 'startup').

Bug: T143066
Change-Id: Iec924003873bc47484a0dc2f1a215f87aa4afdfb
2016-08-16 15:56:02 -07:00
jenkins-bot
3cfcd55011 Merge "resourceloader: Move queue formatting out of OutputPage" 2016-08-11 14:09:58 +00:00
Timo Tijhof
80e5b160e0 resourceloader: Move queue formatting out of OutputPage
HTML formatting of the queue was distributed over several OutputPage methods.
Each method demanding a snippet of HTML by calling makeResourceLoaderLink()
with a limited amount of information. As such, makeResourceLoaderLink() was
unable to provide the client with the proper state information.

Centralising it also allows it to better reduce duplication in HTML output
and maintain a more accurate state.

Problems fixed by centralising:

1. The 'user' module is special (due to per-user 'version' and 'user' params).
   It is manually requested via script-src. To avoid a separate (and wrong)
   request from something that requires it, we set state=loading directly.
   However, because the module is in the bottom, the old HTML formatter could
   only put state=loading in the bottom also. This sometimes caused a wrong
   request to be fired for modules=user if something in the top queue
   triggered a requirement for it.

2. Since a464d1d4 (T87871) we track states of page-style modules, with purpose
   of allowing dependencies on style modules without risking duplicate loading
   on pages where the styles are loaded already. This didn't work, because the
   state information about page-style modules is output near the stylesheet,
   which is after the script tag with mw.loader.load(). That runs first, and
   mw.loader would still make a duplicate request before it learns the state.

Changes:

* Document reasons for style/script tag order in getHeadHtml (per 09537e83).

* Pass $type from getModuleStyles() to getAllowedModules(). This wasn't needed
  before since a duplicate check in makeResourceLoaderLink() verified the
  origin a second time.

* Declare explicit position 'top' on 'user.options' and 'user.tokens' module.
  Previously, OutputPage hardcoded them in the top. The new formatter doesn't.

* Remove getHeadScripts().
* Remove getInlineHeadScripts().
* Remove getExternalHeadScripts().
* Remove buildCssLinks().
* Remove getScriptsForBottomQueue().

* Change where Skin::setupSkinUserCss() is called. This methods lets the skin
  add modules to the queue. Previously it was called from buildCssLinks(),
  via headElement(), via prepareQuickTemplate(), via OutputPage::output().
  It's now in OutputPage::output() directly (slightly earlier). This is needed
  because prepareQuickTemplate() calls bottomScripts() before headElement().
  And bottomScript() would lazy-initialise the queue and lock it before
  setupSkinUserCss() is called from headElement().
  This makes execution order more predictable instead of being dependent on
  the arbitrary order of data extraction in prepareQuickTemplate (which varies
  from one skin to another).

* Compute isUserModulePreview() and isKnownEmpty() for the 'user' module early
  on so. This avoids wrongful loading and fixes problem 1.

Effective changes in output:

* mw.loader.state() is now before mw.loader.load(). This fixes problem 2.
* mw.loader.state() now sets 'user.options' and 'user.tokens' to "loading".
* mw.loader.state() now sets 'user' (as "loading" or "ready"). Fixes problem 1.

* The <script async src> tag for 'startup' changed position (slightly).
  Previously it was after all inline scripts and stylesheets. It's still after
  all inline scripts and after most stylesheets, but before any user styles.
  Since the queue is now formatted outside OutputPage, it can't inject the
  meta-ResourceLoaderDynamicStyles tag and user-stylesheet hack in the middle
  of existing output. This shouldn't have any noticable impact.

Bug: T87871
Change-Id: I605b8cd1e1fc009b4662a0edbc54d09dd65ee1df
2016-08-08 12:23:09 -07:00
Aaron Schulz
1255654ed5 Show wgPageParseReport on page previews too
Also make EditPage::getPreviewLimitReport return the same
output instead of using copy-pasted code from the old hook.

Bug: T142210
Bug: T142214
Change-Id: I16c3c2da067fd24bf7ae564cb1d61beaa3be58c1
2016-08-05 14:41:47 -07:00
jenkins-bot
5928784f99 Merge "OutputPage: Add addHeadItems() method" 2016-08-04 02:14:01 +00:00
Timo Tijhof
ae762b1157 resourceloader: Separate 'user.styles' module from 'user'
Fixes addModuleStyles() violation from T92459 (a464d1d41).

Similar to 93ed259cf and Id2342454b for the 'site' module.
Doesn't need to be in separate commits since per-user HTML isn't
cached the same way.

Bug: T92459
Bug: T108590
Change-Id: I195f67d061de1306c97413aada7919e9f1b1d12c
2016-08-02 22:07:07 +00:00
Aaron Schulz
28adc4d7ee Only pretty-print the parser report JS vars
Follow-up to b7c4c8717f.

Change-Id: I3030df4ed890d9d20daca31fbd33c6d9db91b94c
2016-07-26 17:16:56 -07:00
Aaron Schulz
b7c4c8717f Move NewPP limit report HTML comments to JS variables
* Instead of having messy code to create a hidden HTML
  comment of English strings at the bottom of the page,
  expose the structured data of the parse information
  to JS so tools can use it.
* Make makeConfigSetScript() use pretty output so these
  variables are also easy to read in "view source".
* Remove ParserLimitReportFormat hook, since the data
  is not formatted to HTML anymore.

Bug: T110763
Change-Id: I2783c46c6d80f828f9ecf5e71fc8f35910454582
2016-07-26 11:31:20 -07:00
Timo Tijhof
3600ad0e5b OutputPage: Add addHeadItems() method
Right now OutputPage requires head items to have a name when using
the addHeadItem() method.

This in contrary to most of the helper methods, which don't require
a name. ParserOutput::addHeadItem() also doesn't require a name.

Since the existing signature isn't easily changed without adding
confusion, add a separate method that allow numerical indexes
to be pushed.

This ability was already exposed via addParserOutputMetadata()
and its array_merge. This method exposes it directly.

Change-Id: I433afd124b57526caa13a540cda48ba2b99a9bde
2016-07-26 00:57:03 +01:00
Timo Tijhof
9093af0a28 Remove modulemessages from ApiParse and Output (deprecated in 1.26)
No uses of 'modulemessages', getModuleMessages() or addModuleMessages()
anywhere in Wikimedia Git.

Change-Id: I59420880f3545d1aabf9bcbea1e34b1475697d26
2016-07-26 00:13:04 +01:00
Timo Tijhof
1b6d9eeaea OutputPage: Remove 'mJQueryDone' property
Left by c27b36277b, unused since 32377424b9.

Change-Id: I475cd40fa83b81b817380e981af0cbdd2e359fd0
2016-07-18 19:28:48 +01:00
jenkins-bot
4d0d2dd136 Merge "Hide marked empty elements by default (stage 1)" 2016-07-14 21:38:56 +00:00
Tim Starling
d3d682fb45 Hide marked empty elements by default (stage 1)
We originally imagined rolling out the display of empty elements
simultaneously with the Html5Depurate, but now we have added support for
marking empty elements to Html5Depurate and plan on having some sort of
longer migration period. So, move the relevant CSS to content.css, and
remove the concept of CSS dependant on tidy driver.

Add a body class which will allow the effect to be toggled in a gadget or
extension. Actual toggling in the CSS will be in the stage 2 patch, to be
deployed after the varnish cache and parser cache have expired.

I originally imagined that there would be a gadget that overrides the
rule with an !important selector, but that method does not allow you to
recover the original display property, which is often overridden by the
style attribute or site CSS to be "inline".

Also, in RaggettWrapper, switch to the new class mw-empty-elt, following
Html5Depurate, instead of mw-empty-li. The old class will be removed in
the stage 2 patch.

Change-Id: Ic0f432c43a006629ca5a1a7c2dda3552ceb4dc4f
2016-07-14 14:24:27 -07:00
Timo Tijhof
a464d1d41d resourceloader: Track state of page-style modules
This allows dynamically loaded modules to depend on page-style modules
without it causing the page-style module to be loaded a second time.

* New method Module::getType() indicates whether a module is
  a page-style module or supposed to be dynamically loaded.

* Emit warning from addModuleStyles() when given a module that is
  not a page-style module (to be enforced later)

Bug: T92459
Bug: T87871
Change-Id: I8b6c6a10d965e73965f877c42e995d04202524f3
2016-07-14 20:28:40 +01:00
Timo Tijhof
7f26cff2cc OutputPage: Make use of WrappedStringList in headElement()
Right now, getInlineHeadScripts(), buildCssLinks() and getExternalHeadScripts()
all return WrappedString::join(). But because they don't know about each other
and because they need to return strings (not arrays), headElement() has no way
of merging them.

WrappedStringList allows this array to be kept, whilst still being backward-compatible
with code that calls these methods and assumig a string (since it will lazy-join
the array if the object is treated like a string).

To be used by I8b6c6a10d965e7396. Output is not changed in this commit.
Merely refactoring.

Change-Id: Iae08345473bd93cc0948d51b62c48aeb1ea460a3
2016-07-12 18:56:48 +00:00