EBernhardson has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/311844

Change subject: Take page visibility into account for search checkins
......................................................................

Take page visibility into account for search checkins

The page visibility api should let us get a slightly better look at how
long users are actually looking at the page. caniuse.com reports this
is supported in >90% of browsers wordwide.

Page visibility isn't perfect, for example the browser being a
background window doesn't toggle a visiblity change on all browsers, but
is an improvement from where we are today.

Bug: T145102
Change-Id: Ib093f0cb411a4ef45d4996c966c90bf1691497b3
---
M modules/ext.wikimediaEvents.searchSatisfaction.js
1 file changed, 69 insertions(+), 4 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikimediaEvents 
refs/changes/44/311844/1

diff --git a/modules/ext.wikimediaEvents.searchSatisfaction.js 
b/modules/ext.wikimediaEvents.searchSatisfaction.js
index 12777e2..15233c0 100644
--- a/modules/ext.wikimediaEvents.searchSatisfaction.js
+++ b/modules/ext.wikimediaEvents.searchSatisfaction.js
@@ -213,7 +213,8 @@
        }
 
        /**
-        * Executes an action at the given times.
+        * Executes an action at or after the page has been visible the 
specified
+        * number of seconds.
         *
         * @param {number[]} checkinTimes Times (in seconds from start) when the
         *  action should be executed.
@@ -221,8 +222,72 @@
         * @private
         */
        function interval( checkinTimes, fn ) {
-               var checkin = checkinTimes.shift(),
+               var hidden, visibilityChange,
+                       checkin = checkinTimes.shift(),
                        timeout = checkin;
+
+               if ( document.hidden !== undefined ) {
+                       hidden = "hidden";
+                       visibilityChange = "visibilitychange";
+               } else if ( document.mozHidden !== undefined ) {
+                       hidden = "mozHidden";
+                       visibilityChange = "mozvisibilitychange";
+               } else if ( document.msHidden !== undefined ) {
+                       hidden = "msHidden";
+                       visibilityChange = "msvisibilitychange";
+               } else if ( document.webkitHidden !== undefined ) {
+                       hidden = "webkitHidden";
+                       visibilityChange = "webkitvisibilitychange";
+               }
+
+               /**
+                * Generally similar to setTimeout, but turns itself on/off on 
page
+                * visibility changes.
+                *
+                * @param {Function} fn The action to execute
+                * @param {number} delay The number of ms the page should be 
visible before
+                *  calling fn
+                * @private
+                */
+               function setVisibleTimeout ( fn, delay ) {
+                       var timeoutId = null,
+                               lastStartedAt = 0,
+                               onComplete = function () {
+                                       timeoutId = null;
+                                       if ( document.removeEventListener ) {
+                                               document.removeEventListener( 
visibilityChange, handleVisibilityChange, false );
+                                       }
+                                       fn();
+                               };
+
+                       function handleVisibilityChange () {
+                               var now = new Date().getTime();
+
+                               if ( document[hidden] ) {
+                                       // pause timeout if running
+                                       if ( timeoutId !== null ) {
+                                               // Subtract the amount of time 
we have waited so far.
+                                               delay = Math.max( 0, delay - 
Math.max( 0, now - lastStartedAt ) );
+                                               clearTimeout(timeoutId);
+                                               timeoutId = null;
+                                               if ( delay === 0 ) {
+                                                       onComplete();
+                                               }
+                                       }
+                               } else {
+                                       // resume timeout if not running
+                                       if ( timeoutId === null ) {
+                                               lastStartedAt = now;
+                                               timeoutId = setTimeout( 
onComplete, delay );
+                                       }
+                               }
+                       }
+
+                       if ( hidden !== undefined && document.addEventListener 
) {
+                               document.addEventListener( visibilityChange, 
handleVisibilityChange, false );
+                       }
+                       handleVisibilityChange();
+               }
 
                function action() {
                        var current = checkin;
@@ -231,11 +296,11 @@
                        checkin = checkinTimes.shift();
                        if ( checkin ) {
                                timeout = checkin - current;
-                               setTimeout( action, 1000 * timeout );
+                               setVisibleTimeout( action, 1000 * timeout );
                        }
                }
 
-               setTimeout( action, 1000 * timeout );
+               setVisibleTimeout( action, 1000 * timeout );
        }
 
        /**

-- 
To view, visit https://gerrit.wikimedia.org/r/311844
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib093f0cb411a4ef45d4996c966c90bf1691497b3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikimediaEvents
Gerrit-Branch: master
Gerrit-Owner: EBernhardson <ebernhard...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to