resourceloader: Add version to ResourceLoaderImage urls for long-cache
authorTimo Tijhof <krinklemail@gmail.com>
Thu, 26 Sep 2019 16:26:52 +0000 (17:26 +0100)
committerTimo Tijhof <krinklemail@gmail.com>
Sat, 28 Sep 2019 01:06:32 +0000 (02:06 +0100)
commit172de0b957c9ff16e67fa6231e8913506c0d6568
tree77000facc9f5a30fefdeb15d2e9da0f5d5134ed1
parente6ff1ff9153fa218015fbdaa5d5c55b0d57008de
resourceloader: Add version to ResourceLoaderImage urls for long-cache

The code previously here did not work well as it merely forwarded the
hash from the current web request. This had numerous issues:

1. It was often null because requests for stylesheets do not cary
   a version hash.
2. When requested by JavaScript, the version hash would be a
   combination-hash of many unrelated modules, thus when requested as
   part of different batches, it would produce different urls which
   is not ideal.

The impact of this is minimal currently because we basically never use
these urls, as SVGs are almost always embedded instead of ref'ed by url.
PNG urls are only generated for non-JS modules and then only used in older
browsers not supporting SVG. And, even after all that, for the edge case
of an SVG being ref'ed by url, they would be stored in LocalStorage by
mw.loader with the name+version of the module the image belonged to, not
the version hash of the batch request it came with.

Which means that, yes, localstorage key for "somemodule+someversion" would
have different values for different users, based on which batch the value
came with, because the image urls were using the version hash of the batch
request from ResourceLoaderContext. This is weird, but didn't cause bugs
or inefficiencies because the user would never be exposed to the other
possible urls for that image because we always check LocalStorage first.
It did cause fragmentation server-side in Varnish, though.

This is all fixed now by always including a version, and setting it to
the version of the module. This means there is no more Varnish fragmentation
for these. And it means that browsers are now allowed to cache the images
served from these urls for 30+ days (immutable) instead of only 5min,
which is what happened when they didn't have a version parameter (or set to
null).

Bug: T233343
Change-Id: I4af7fda03698ed4c288d154e7787fb2f3cbbe6c5
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
tests/phpunit/unit/includes/resourceloader/ResourceLoaderImageTest.php