From 67eb3b1dcf34867275f3c5b6a86c1351ea1e449e Mon Sep 17 00:00:00 2001 From: Sam Smith Date: Wed, 14 Jun 2017 12:00:01 +0100 Subject: [PATCH] i13n: Log EL events with mw.track Currently, the mw.eventLog.Schema class samples per pageview. However, we expect that if a user is bucketed for a session, then all EventLogging events logged during that session are in the sample. Moreover, loading the class in the way that we did - asynchronously, using mw.loader#using - introduced an issue where the eventLogging change listener would subscribe in the next tick of the JavaScript VM's event loop and miss the "pageLoaded" event being queued (see T167273). Changes: * Make the schema module follow the form of the statsvInstrumentation module, i.e. make it expose the #isEnabled method, and add the associated getEventLoggingTracker function. * Update the eventLogging change listener accept the tracker returned by getEventLoggingTracker. * Update/fix related JSDoc documentation. Bug: T167236 Bug: T167273 Change-Id: I4f653bbaf1bbc2c2f70327e338080e17cd3443d4 --- resources/dist/index.js | Bin 35231 -> 35275 bytes resources/dist/index.js.map | Bin 280154 -> 282469 bytes src/changeListeners/eventLogging.js | 14 +-- src/changeListeners/statsv.js | 4 +- src/index.js | 75 +++++++++++---- src/schema.js | 25 ++--- .../changeListeners/eventLogging.test.js | 44 ++++----- tests/node-qunit/schema.test.js | 91 ++++++++++++------ 8 files changed, 162 insertions(+), 91 deletions(-) diff --git a/resources/dist/index.js b/resources/dist/index.js index 95cc2f6fef306ee3efd9a48c44a65505625a34a2..ee3684cb66131eefba23c675f99af34c51c3ef44 100644 GIT binary patch delta 1265 zcmZux&x<2P6sBiZ5!MB9cil;5-5G;~?%}1z5mAWSJBTJTA-(E4%`STyD&3V%C7tR{ zRrMs<%`hNyR8Z>RMUX}R03k>5AmT|pcojV8#s5GA5BfTp48zP`nyT;B_xgK3zcNcd zo274m-*~|;u>&SF`7lYdRFz=*=f;o4n>E5!P0&`%LYsjG;cP3SB@KF2YJRA#m@jL^ zBamlMB9bIMY-b|SJQ3^3oCXp&B%qwf5dve#Gj< zcr1}kC4)^BbXcE~t|~b&cFhN*@I1#DMss9j?(E*MTIT-lEo;wYyP>7bZ@U|-6e6gB z4`b-TzMGLC>8FWe&~=qrYuq~W+|*WxiZ+j&w}l(yP3c6^h&iagZDS7IK7wqNGRgZ` zN##Jzl?Y{uNm!5}%GL6VFbq*bm8dzvHcnPhu)U70{G5`dALq0iUEvkB#^EBPTJFn1zx(zu?x9d6qKe|8RZHY=}JFQ63xi7W4%$2;4$toY{Fv~c~r zX^2haoBz_)8y94qu(k$8jMy8jTzkq3e>xicv~-p`TO$v6s5@1E>g&Irc_|;4lNlLe zRP%Z8r}rLxY?<4~#mhLgkMqgot~M`DU{w-94|tSUzFdA4_fY+0r`XawoUEBoj$f{D hp|s5MZm0RSA!o6-Ss5K3`h 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