empty() only makes sense when the expression it checks is possibly
undefined, otherwise it's equivalent to a truthiness check with the
additional downside of suppressing errors when it's not wanted.
Replace it with simple truthiness checks, using strict comparison when
that seems to help with polymorphic variables.
These were caught by a bespoke phan plugin.
Change-Id: I52999e5286a0d9ad70b0da40b41b9f998ecb990e
The collapsing on the enhanced changes list now works without
JavaScript.
Keyboard navigation is still supported but only the space and not the
return toggles the collapsing toggle button.
The <input type="checkbox"> element needs an unique identifier in the
`id` attribute and the same value must be in the `for` attribute of the
<label> element. A simple counter in the class EnhancedChangesList
starts twice from the beginning if the recent changes get included as:
{{Special:RecentChanges|enhanced=1}}
{{Special:RecentChanges|enhanced=1}}
Therefore a random value is used as checkbox identifier.
The module 'jquery.makeCollapsible' and its classes `mw-collapsible`,
`mw-collapsed` and `mw-collapsible-toggle-collapsed` are not needed
anymore.
The icons from module 'mediawiki.icon' are directly included because the
module has fixed selectors which do not fit here.
Bug: T172618
Change-Id: Iafd27e5d760b78ae386d833946005f86cee8dd64
Make this subroutine same as that in ::recentChangesBlockLine.
This solves the illogical issue where diff links would be displayed
only for ungrouped categorization entries, but not within groups
of them, making such entries useless for patrolling.
Bug: T270662
Change-Id: Ib4f02673cb47b42fcb1c2268691ca41cd637b0c5
* Illegal string offset and invalid argument supplied to foreach, due to incorrect type information
* Array internal pointer reset is unnecessary
* $hookData unused since MW 1.35 due to incomplete revert
* array_push() with single element
* Unnecessary sprintf()
* for loop can be replaced with str_repeat()
* preg_replace() can be replaced with rtrim()
* array_values() call is redundant
* Unnecessary cast to string
* Unnecessary ternary. Often the result relies on short-circuit evaluation, but I find it more readable nonetheless.
Change-Id: I4c45bdb59b51b243fa96286bec8b58deb097d707
The code assumed that curid is same for all changes in the block
(more precisely, the first one applies to all others).
This is not true when the block includes categorization changes.
Refactor the code to prefer individual link params instead of
global approach.
Bug: T270774
Change-Id: Id2286392239b67a44fbb2e95346daad9fc2a0e4f
rc_this_oldid and rc_last_oldid of categorization entries
reference revisions of the page that had its categorization
changed rather than the category page itself. These should
not be considered when building the diff link(s).
Introduce new aggregate variable $allCategorization and use
it instead of examining $rcObj (which deals only with the last
change in the block).
Finally, drop the ::userCan check deciding whether the user
can see the diff. It wouldn't work properly either, because
it would check only the last (oldest) entry in the block, not
the first (newest) and the one before the last.
Bug: T261068
Change-Id: I10bdfbad9d8a36f210ffd11a832604104f8ecdc5
It was definitely already wrong when it was added in 2008
(r33013). !$type will return true for RC_EDIT (!0), false for
all other types (RC_NEW, RC_LOG, etc.). The weak equality
comparison then casts RC_LOG to boolean (3 -> true).
So the first condition will pass if and only if $type is
RC_EDIT.
As this piece of code lasted for 15 years and there
seems to be no objection to the behavior, I just
rewrite it to make it more clear and keep the same
behavior.
Cudos to Thiemo Kreuz who disassembled the code.
Change-Id: I93f853b2a191fc3011b47fcd1ac22ac649ce541a
Keep action=history after curid=, like was done in 39783472b.
Follows up I1aa3be64f9b4e9c63cb72037b131361616f76292.
Change-Id: Ie319052754c910857adca370e1d7c8b8ff9d7618
No functional changes, pure refactoring.
- Merge two loops over the same array.
- Move "enhancedrc-since-last-visit" message generation
where it actually is needed. This should save a bit of time.
- Store the title in a variable.
- New-style comments.
Change-Id: I1aa3be64f9b4e9c63cb72037b131361616f76292
I9cae1afa made the order of 'curid=...' and 'action=history' in the
history links for category changes inconsistent with other history links
on the changeslist.
Bug: T264491
Change-Id: I311c375d9250ab8a92bcf8e0b79af9e075487f96
Patch Ifa7a9bc replaced some longer `=== null` constructs with the
new ??= operator we have since PHP 7.4. However, some of these can be
simplified even more with the ?? operator we have since PHP 7.0.
Follow-Up: Ifa7a9bc7b2ec415ad7ecb23f4c1776f51f58fd6b
Change-Id: I7b05e723810558bb5437adc97eab54ca04d38c06
The history page renders an extensible list of tools for each
change list row. I've factored this code out so that it
can also be used on other pages that use the Pager class.
This generalizes the logic for the rollback link and makes sure
the control is standardized across pages. It also allows
the onHistoryTools hook run. I suggest we rename this to something
more generic in a follow up.
Right now usages of onHistoryTools are low but there should be
no issues with running it on more than the history page. One of
the benefits of this is the thanks link will now show on the
contributions page, watchlist and recent changes.
Bug: T51541
Change-Id: Ia03038e86c6a607c8b75eefedbf0285ca1a2f8c8
This covers all occurrences of /onfig->.*get( '/ in includes/.
Undoubtedly there are still plenty more to go.
Change-Id: I33196c4153437778496f40436bcde399638ac361
This is micro-optimization of closure code to avoid binding the closure
to $this where it is not needed.
Created by I25a17fb22b6b669e817317a0f45051ae9c608208
Change-Id: I0ffc6200f6c6693d78a3151cb8cea7dce7c21653
Since it's a link to history, it should always have "action=history"
and "curid=". $query argument is now deprecated.
Bug: T264491
Change-Id: I9cae1afa62a714e4a56a5356ba9d6a955c81a5a9
This includes fixing some mistakes, as well as removing
redundant text that doesn't add new information, either because
it literally repeats what the code already says, or is actually
duplicated.
Change-Id: I3a8dd8ce57192deda8916cc444c87d7ab1a36515
* ProtectedHookAccessorTrait provides protected getHookContainer() and
getHookRunner() methods, getting them from the global service
container. The point of this is to ease migration to DI by ensuring
that call sites ask their local friendly base class rather than
getting a HookRunner from the service container directly.
* Migrate ChangesList and subclasses from Hooks::run() to the new system,
as a pilot for full migration.
Change-Id: Ic2d408fdb108087d81d0981aa670b35e0a6bb0ce
In all these cases, the foreach() loop specifies a variable for the
current value. We don't need two ways to access the same value. This
makes the code harder to read.
Change-Id: I6ed7a518439963b7091057194de993a7e977be32
Also fix bug where the "changes since last visit" counter failed to show for pages
where their entire history is still in recent changes. Although the "new" flag is
set for the RCCacheEntry block, there can still be multiple revisions since the
last one seen by the user. This change accounts for that case.
Bug: T218511
Change-Id: I92060bd26d8642937cad7f8c1ace3c5e066790be
The styles that we are applying on changelist pages should also
apply on diff pages. This generalises the rules into a new
module.
To avoid problems with cached HTML mediawiki.special.changeslist
temporarily loads resources/src/mediawiki.interface.helpers.styles.
This will be removed after the change has been in production for a
week.
Bug: T212613
Change-Id: I6aad563e48f41c783df8b176a4f437e60a1255cc
Now that all our supported PHP versions have array_filter()
with a third parameter, these functions aren't needed anymore.
Depends-On: I3b097a1a048baabcaca15dc214a3a1bb06e746cc
Depends-On: I0187e27ac47cbab099249572201d1a649226a734
Change-Id: I7cabd0252691a083cb749cf9d3a7a23f1d076c39
This fixes 26 of the phan-taint-check warnings on MW core. Some
are outright fixed, others are false positives that were suppressed.
This really only covers some of the easy ones. There are still
314 warnings to go.
Change-Id: I30463bc3a09fd4324d190de8533f51784764dd3a
Construction of the highlight containers was moved to the backend, but
setupHighlightContainers() also aggregates the CSS classes used for
highlights for grouped entries in enhanced mode.
Move that to the backend too, and get rid of setupHighlightContainers().
Also move the namespace classes to getHTMLClassesForFilters() so that
they get picked up too, and pick up classes for tags separately because
the way they're handled is weird.
Bug: T197168
Change-Id: I4c374f82e7d128025f4e2b2f39b0adba14b76ef3
Create the highlight container div in the backend for
both regular and enhanced result view, so we spare
the load in the frontend.
Bug: T197168
Change-Id: I36bd7b7c4c124d305ac7b07e824dc2a58e152be4
Directly use the UTF-8 encoding of the 'NO-BREAK SPACE' (U+00A0) instead of
the HTML/XML entities   or   or .
With the UTF-8 character the generated HTML is shorter and better to read.
Also change the special value for the label in HTMLForm from   to
U+00A0 but also support   for backward compability.
Bug: T154300
Change-Id: I882599ac1120789bb4e524c4394870680caca4f4
Find: /isset\(\s*([^()]+?)\s*\)\s*\?\s*\1\s*:\s*/
Replace with: '\1 ?? '
(Everywhere except includes/PHPVersionCheck.php)
(Then, manually fix some line length and indentation issues)
Then manually reviewed the replacements for cases where confusing
operator precedence would result in incorrect results
(fixing those in I478db046a1cc162c6767003ce45c9b56270f3372).
Change-Id: I33b421c8cb11cdd4ce896488c9ff5313f03a38cf