Timo Tijhof effcd80471 compactlinks: Optimise performance of DOM logic
The createCompactList() function runs synchronously during the
module execution burst. Due to it visually changing the page, I
won't defer it with rIC for the time being, although that should
be considered for the future. For this commit, I'm trying to make
it fit the budget of <50ms because ULS is currently usually taking
80ms-180ms on desktop (MacBook/Chrome CPU/4), and that's during
batch execution with other modules as well, thus freezing the
UI thread for much longer than that.

constructor:
* Remove needless clone of jQuery object.
  Use $foo instead of $( $foo ).
* Remove creation of 'interlanguageList' and 'compactList' objects
  that are immediately removed and re-created by init().

init/getInterlanguageList:
* Use the HTMLElement.lang and HTMLAnchorElement.href properties
  directly instead of the DOM getAttribute().
  This means stores a full url instead of a relative url, which
  should help avoid other bugs in the future.
* Remove needless jQuery() constructor and jQuery.text() call.
  Use Node.textContent directly instead.
* Use HTMLElement#querySelectorAll instead of jQuery#find().

init/getCompactList/../filterByLangsInText:
* Avoid jQuery() constructor and jQuery.attr(),
  use the HTMLElement.lang property directly.
* Avoid jQuery() selector, call querySelectorAll directly.

init/getCompactList/../getCommonLanguages/../getFrequentLanguageList:
* Avoid temporary array copies from concat() and function overhead
  with forEach() and filter().
  Instead, keep only a single array, and iterate it once.

init/getCompactList/../filterByBadges (~10m -> ~0.5ms):
* Use one query via $(), instead of two queries $()+find().
* Use $.map() directly instead of map()+fakejQueryObject+toArray().
* Use querySelector(One) for the child instead of $()+find().
* Use HTMLElement.lang property directly.

init/hideOriginal (~5m -> ~0.8ms):
* Use querySelectorAll() directly instead of jQuery find().
* Set HTMLElement.style directly instead of jQuery() css().

init/render/addTrigger:
* Use createElement() and direct properties instead of $(), addClass(),
  prop() and text().
* The mw.msg() calls use text() and jqueryMsg#parser which is
  expensive.
  Use plain() for 'ext-uls-compact-link-info', which doesn't need parsing.
  Keep text() for the other message, and document why.

init/listen:
* Use async Deferred#then() instead of sometimes-sync Deferred#done().

Bug: T127328
Change-Id: I424c34fb82c8e95407f7b934e6d42019becbf909
2018-09-13 11:11:42 +00:00
2018-08-10 14:42:41 +00:00
2018-09-03 11:13:20 +00:00
2018-09-07 19:23:17 +00:00
2017-09-29 19:38:39 +02:00
2016-10-24 17:04:00 -07:00
2012-07-18 15:29:17 +03:00
2017-12-19 20:16:48 +05:30

== Universal Language Selector ==
The Universal Language Selector extension (ULS) provides a flexible way to
configure and deliver language settings like interface language, fonts, and
input methods (keyboard mappings). This will allow users to type text in
different languages not directly supported by their keyboard, read content in a
script for which fonts are not available locally, or customise the language in
which menus are displayed.

For more information see:
 https://www.mediawiki.org/wiki/Universal_Language_Selector

== Copying ==
You may use any Project Milkshake product, including the Universal Language
Selector, under the terms of either the MIT License or the GNU General Public
License (GPL) Version 2 or later.

See GPL-LICENSE and MIT-LICENSE for details.

== Installation ==
For a very, very quick start add the following lines to LocalSettings.php of
your MediaWiki setup:

wfLoadExtension( 'UniversalLanguageSelector' );

By default, ULS will appear at personal toolbar position. If you want ULS at
interlanguage position, add the following line:

$wgULSPosition = 'interlanguage';

== For Developers ==
The MediaWiki Universal Language Selector project uses jquery.uls:
 https://github.com/wikimedia/jquery.uls

Its development is at Wikimedia Github account. Any fixes to lib/ should happen
at Github. Follow the build instructions of jquery.uls to create jquery.uls.js.

Bugs for the extension are handled in Phabricator:
 https://phabricator.wikimedia.org/tag/mediawiki-extensions-universallanguageselector/
Languages
JavaScript 79.4%
HTML 11.9%
PHP 4.7%
Less 2.5%
CSS 1.4%
Other 0.1%