Commit Graph
19 Commits
Author SHA1 Message Date
Timo TijhofandSanthosh 6928b7ec8d Merge ext.uls.eventlogger into ext.uls.common
This could've been done longer ago (by defining ext.uls.common
in Hooks.php), but didn't notice it before.

The ext.uls.eventlogger was (if configured) loaded on all page
loads. Same as ext.uls.init (but without config condition).

ext.uls.ext is an empty shim around ext.uls.common, which is thus
also loaded on all pages. Merge this into there given has no
reason for being its own module. They are always loaded together.

Change-Id: Icdda6f27470a1d56a37275164c06541514a488a0
2019-04-17 10:52:04 +00:00
Timo Tijhofandjenkins-bot 49ed2a5ac4 ULSJsonMessageModule: Remove language code validation
The ResourceLoaderContext class already performs a stricter
version of this.

Change-Id: I46b920cbc0f9024e5ed2027ff30c40400a73fef3
2019-04-17 04:37:46 +00:00
Timo Tijhofandjenkins-bot ea671b1f24 ext.uls.eventlogger: Use mw.track() and remove EventLogging dep
Given the code no longer uses any EventLogging methods directly,
but rather mw.track(), this means it also doesn't need to declare
any dependencies, including for older MediaWiki versions this
will work as-is.

Change-Id: I8cdcef54321d0887c509fc3683acf132c113e628
2019-04-17 04:04:01 +00:00
Timo Tijhofandjenkins-bot c578db020d ext.uls.eventlogger: Remove use of mw.eventLog.logEvent() promise
I guess the expectation was that for browsers that don't support
Navigator.sendBeacon, the promise would wait for the 'new Image'
fallback to complete.

However, EventLogging never did that. In browsers where the Beacon API
is not supported, 'new Image' starts asynchronously and either
way the returned promise is immediately resolved.

The only purpose of the returned promise was to detect errors
in the format of the event (e.g. missing properties), which this
code is not concerned with (given that it uses "always",
not "done"). And besides, for that you'd probably want to use
the EventLogging debug mode [1] instead.

This is the last step before ULS can switch to a soft EL dependency
by using mw.track instead, which I'll do in the next commit.

Change-Id: If016b73dcd7320ddf1478c1678d2cc6371fe0fa1
2019-04-17 04:03:47 +00:00
Timo Tijhofandjenkins-bot 232b6a8a58 ext.uls.eventlogger: Remove unused class
* Simplify as pure functions.
* Remove unused 'schema' parameter to log().
* Remove unused 'module.exports'.

Change-Id: I900303f29cc425cc579acc7379a88ef4f0e882af
2019-03-13 18:11:57 +00:00
Timo Tijhofandjenkins-bot 1c99196ef8 ext.uls.eventlogger: Remove unused code
Follows-up e58be7c411, 1ad0c9c819.

* The mw.uls.eventlogger property does not appear to be
  used anywhere indexed by Codesearch. It was also undocumented.
  Removed without deprecation. Kept exposed for debugging purpopses
  via module.exports, which could be retreived in tests via require(),
  or via mw.loader.require() from the browser console.

* Remove redundant $.Deferred wrapper.

Change-Id: Id081038e5d4902c7e38967353c6f551c12517311
2019-02-19 08:44:36 +00:00
Timo Tijhof 30894fb6c1 ext.uls.eventlogger: Avoid deprecated schema module on MW 1.33+
Bug: T209629
Change-Id: Ia77273e0a63dcd31e636ba3a52d188fb743bb2df
2019-02-16 22:59:41 +00:00
Timo Tijhof 1ad0c9c819 ext.uls.eventlogger: Remove use of removed setDefaults() method
Follows-up 2ac8a0a4b6, which removed this method. In checking
Codesearch, I somehow missed this one call among the false positive
results for Datepicker and TMH-related calls to a different method
also called "setDefaults".

Bug: T206588
Bug: T187207
Change-Id: I4f94ce6f8f1b85c192b69c5b50c3f090f7b4bfd2
2018-10-10 02:42:02 +00:00
Timo Tijhofandjenkins-bot fcfa36ac77 compactlinks: Optimise performance of list creation logic
Add potential items directly to a single array with two indexOf
checks.

Previously, potential items were first put in a new temporary array,
then that array was filtered with indexOf checks into another temporary
array, and then the result of that combined with the previous results
into another temporary filtered array, and then the previous results
array replaced with the new one. This eliminates 2*2N filter+concat
calls an their overhead from calling functions, creating arrays,
copying arrays and the memory for those arrays. (Where N is the number
of language-list strategies). It also reduces the total number of
indexOf calls.

Below is a comparison of time spent in createCompactList() during
page load process, compared to master without this and the previous
commit. Measured on localhost with Vector, EventLogging, Interwiki,
and ULS installed; on a page that is a copy of en.wikipedia.org/Messier_87
and its 51 interlanguage links. This page was a featured article
last week. Its count of links seems average compared to other
featured and/or most-viewed articles last week (the other ones
I checked had 23, 43, 52, and 76 langlinks respectively).

|--------------|----------|--------|
|              | Before   | After  |
|--------------|----------|--------|
| Chrome 69    | 77.5ms   | 41.4ms |
| MacBook Pro  | 57.7ms   | 44.4ms |
| CPU 1/6th    | 63.8ms   | 45.3ms |
|--------------|----------|--------|
| Firefox 61   | 12ms     | 10ms   |
|              | 10ms     | 9ms    |
|              | 11ms     | 8ms    |
|--------------|----------|--------|
| Safari 11    | 3.5ms    | 2.7ms  |
|              | 3.3ms    | 2.6ms  |
|              | 3.4ms    | 2.8ms  |
|--------------|----------|--------|

Bug: T127328
Change-Id: I56052e7c01c6a667500773e12c755a7a5f5d9cd0
2018-09-24 17:19:45 +00:00
Timo Tijhofandjenkins-bot 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
Timo Tijhof 4e067715dc Remove redundant closure aliases
'mw' are '$' are globals, always have been, and aren't going
anywhere. They're every bit as real as their longer versions.
If anything, the longer ones are less "real" or 'stable" because
they're not used internally by RL and easier to accidentally
replace or override. For anecdotes and history, see 91f950d6b0.

Change-Id: I526fb8c961d9477992d88f2780a0ff4cbdc51923
2018-09-07 19:23:17 +00:00
Timo Tijhof e58be7c411 ext.uls.eventlogger: Remove unused $.Callbacks() indirection
It is created, unconditionally fired only once (right after creation),
and then used only with add(), which becomes a synchronous
self-call.

I've searched in Wikimedia Git and Codesearch, and found no uses
of `logEventQueue` or `mw.uls.eventlogger` outside this file.

Change-Id: I3832bcb409fc919c2078e583d50e20413dede163
2018-09-07 19:23:03 +00:00
Timo Tijhof 69138fa694 Remove use of deprecated "json" module
Depends-On: I8280faf1cbcd876ead2dafae4347b7d46e3e2acb
Change-Id: I02242885ef98ad4fb008dac623518b4d4f4b922e
2016-11-22 14:44:26 -08:00
Timo Tijhof 1240a62ca0 geoclient: Update localStorage comment
Follows-up 4cd1def.

localStorage is available by all supported browsers as of MediaWiki 1.25.
As of MediaWiki 1.27, this is also enforced by an explicit feature test
in startup.js.

Change-Id: I12b577919579f498e294376f748715b868f21869
2016-09-15 14:17:20 -07:00
Timo Tijhof 2ab168f113 Use getDefinitionSummary() in ResourceLoaderULSJsonMessageModule
* Fix inaccurate class comment that was copied from an unrelated
  module in MediaWiki core.

* Remove use of deprecated getModifiedTime(). While this implementation was
  straight forward, it is more reliable and deterministic to use a content hash
  because timestamps are not tracked by Git. This currently causes needless
  cache invalidation for all users at Wikimedia every week because git-clone
  starts with fresh timestamps on disk.

  I'm not using enableModuleContentVersion() right now because calling
  getScript() reads all files into memory which is more expensive than
  simply hashing the files. Especially because safeFileHash() is backed
  by an APC cache via FileContentsHasher.

  This matches the implementation in core ResourceLoaderFileModule.

Change-Id: If9aaefa6a3cf047c6c36e1cdd0f350412d59c849
2016-08-23 21:49:26 +00:00
Timo Tijhof f06ac3efca Simplify ResourceLoaderULSModule with content-based versioning
* Remove manual tracking of when a hash is first seen.
  ResourceLoader is no longer time-based, rather it is content based.
  Except where a timestamp is actually wanted as key, a hash is all
  we need. The default implementation of simply calling getScript()
  and hashing its output suffices, and isn't a performance problem
  in this case.

* Also simplify getScript() by passing an object to 'mw.config.set'.
  Instead of multiple calls for each key/value. This is a no-op
  now because there is only one key.

* Fix inaccurate class comment that was copied from an unrelated
  module in MediaWiki core.

Change-Id: I9bb82cadd9caa7e584e20dd49ce30b64218326c4
2016-08-23 14:49:16 -07:00
Timo TijhofandSanthosh Thottingal 862fafb9ab Various performance fixes for CompactInterlanguageList
T122341:
* Move hideOriginal() call to right before render() to reduce repaint flash.
* Use plain css() instead of show() and hide().
* Use native getAttribute() instead of jQuery().attr.

Other minor clean up:
* Fix jsduck syntax.
* Consistently use 'location' instead of 'window.location'
  (mostly the case already except for one).

Bug: T122341
Change-Id: Ief76fe7c0fb2bfca3468361ebab14c1dfb1df4c2
2016-01-04 07:19:38 -08:00
Timo Tijhof d08ebb9e77 gitignore: Add langnames.ser
Change-Id: Iea90a487d6cdef820487f0bed2e67b06328c13b4
2015-12-22 18:35:29 -08:00
Timo Tijhof c6d71015ff Various clean up
Files:
* Consistently have one (1) new line at EOF
  (.gitignore, *.css, *.sh)

JSHint:
* Separate the common (general Wikimedia code conventions) from
  the local more stricter rules (nice work!).

Maintenance:
* Use simplified $IP definition where getenv is only called once.
  Based on http://git.io/ve-mw-36fc3b59-makeStaticLoader

JavaScript:
* Use the same closure in all files:
  - No need for "undefined".
  - One linebreak between license header and start of closure
    (sometimes there were 1 or 2 empty lines).
  - ext.uls.ime.js: No need for "document" (redundant in general,
    but especially as it wasn't used anywhere in this file).
  - Use "$, mw" for all ext.* modules (one of them used "mw, $").

Change-Id: Iba5dab14bbc3fbfc9f8fe96dd2d95529587a69aa
2014-02-08 00:11:50 -08:00