Milimetric has submitted this change and it was merged.

Change subject: Reducing polling of report screen when not visible
......................................................................


Reducing polling of report screen when not visible

Polling of report screen is done too frequently,
we take advantage of browsers that support the visibility API
to reduce polling so when we report the number of requests
received by wikimetrics we have as little self inflicted
traffic as possible.

Bug: T94193
Change-Id: I9a9dffccacd1e0a765a8bb234397321413266d70
---
M wikimetrics/static/js/reportList.js
M wikimetrics/static/js/site.js
2 files changed, 76 insertions(+), 29 deletions(-)

Approvals:
  Milimetric: Looks good to me, approved



diff --git a/wikimetrics/static/js/reportList.js 
b/wikimetrics/static/js/reportList.js
index 107524d..8b10771 100644
--- a/wikimetrics/static/js/reportList.js
+++ b/wikimetrics/static/js/reportList.js
@@ -1,12 +1,12 @@
 $(document).ready(function(){
     var viewModel = {
         reports: ko.observableArray([]),
-        
+
         updatePublic: function(report, event) {
             //TODO no csrf token, we need a request engine to wrap our ajax
             // requests
             if (!report.public()) {
-               
+
                 $.post('/reports/set-public/' + report.id)
                     .done(site.handleWith(function(){
                         report.public(true);
@@ -37,10 +37,12 @@
             return moment(report2.created) - moment(report1.created);
         });
     }, viewModel);
-    
+
     // get reports from reports/detail/endpoint
     var getReports = function (once) {
-        site.populateReports(viewModel);
+        if (site.pollingActive) {
+            site.populateReports(viewModel);
+        }
         if (!once) {
             setTimeout(getReports, site.getRefreshRate());
         }
diff --git a/wikimetrics/static/js/site.js b/wikimetrics/static/js/site.js
index a2d8dbf..217db31 100644
--- a/wikimetrics/static/js/site.js
+++ b/wikimetrics/static/js/site.js
@@ -7,7 +7,7 @@
             }
         };
     },
-    
+
     isNormalResponse: function(response){
         if (response.isError){
             site.showError(response.message);
@@ -20,12 +20,12 @@
         site.clearMessages();
         return true;
     },
-    
+
     confirmDanger: function(event, noQuestion){
         var title = $(event.target).attr('title');
         return confirm('Are you sure you want to ' + title + (noQuestion ? '' 
: '?') );
     },
-    
+
     showError: function (message, permanent){
         site.showMessage(message, 'error', permanent);
     },
@@ -40,7 +40,7 @@
     },
     showMessage: function (message, category, permanent){
         site.clearMessages();
-        
+
         if (!site.messageTemplate){
             site.messageTemplate = $('.messageTemplate').html();
         }
@@ -55,20 +55,20 @@
     clearMessages: function (){
         $('.site-messages').children().not('.permanent').remove();
     },
-    
+
     redirect: function (url){
         location.href = url;
     },
-    
+
     failure: function (error){
         site.showError('Wikimetrics is experiencing problems.  Visit the 
Support page for help if this persists.  You can also check the console for 
details.');
         console.log(error);
     },
-    
+
     hasValidationErrors: function(){
         return $('li.text-error').length > 0;
     },
-    
+
     /**
     * Make use of this function to throttle your ajax pulls
     * when tab is not visible to the user
@@ -83,17 +83,20 @@
             }
         }
     },
-    
-    refreshEvery: 5,
+
+    /*
+    * Refresh rate for ajax polling
+    * enter seconds, this will be converted to ms
+    */
+    defaultRefreshRate: 5,
+
+    pollingActive: true,
+
     getRefreshRate: function() {
-        /* if not visible refresh rate is lower */
-        var rate = site.refreshEvery; /* enter seconds, this will be converted 
to ms*/
-        if (!site.isVisible()){
-            rate = rate * 10;
-        }
+        var rate = site.defaultRefreshRate;
         return rate*1000;
     },
-    
+
     // ***********************************************************
     // Data population - usually done with something like Sammy JS
     // ***********************************************************
@@ -104,22 +107,22 @@
             }))
             .fail(site.failure);
     },
-    
-    populateMetrics: function(viewModel){ 
+
+    populateMetrics: function(viewModel){
         $.get('/metrics/list/')
             .done(site.handleWith(function(data){
                 viewModel.metrics(data.metrics);
             }))
             .fail(site.failure);
     },
-    
+
     populateReports: function(viewModel){
         $.get('/reports/list/')
             .done(site.handleWith(function(data){
-                //TODO this is a circular dependecy, reports depends on 
+                //TODO this is a circular dependecy, reports depends on
                 // list and list uses reports. this function
                 // should reside on reportList
-                
+
                 var reportsStr = JSON.stringify(data.reports);
                 var change = !viewModel.previousReportData || 
viewModel.previousReportData != reportsStr;
                 if (change){
@@ -137,7 +140,7 @@
             }))
             .fail(site.failure);
     },
-    
+
     // persists the bootstrap tab hash in the url and navigates to it on page 
load
     enableTabNavigation: function(){
         $('ul.nav-tabs li a').on('shown', function (e) {
@@ -151,7 +154,7 @@
             $('ul.nav-tabs li a').first().click();
         }
     },
-    
+
     // ***********************************************************
     // Just some util functions so I don't have to
     // import huge libraries like Underscore
@@ -159,13 +162,13 @@
     keys: function(obj){
         var keys = [];
         var key;
-        
+
         for(key in obj){
             if(obj.hasOwnProperty(key)){
                 keys.push(key);
             }
         }
-        
+
         return keys;
     },
     //Serializes object to json and verifies is an empty string
@@ -175,6 +178,48 @@
     }
 };
 
+/*
+* Deealing with visibility API, looks like it is not available on jquery
+* Enable/disable pooling (global setting) based on visibility
+* From: 
https://developer.mozilla.org/en-US/docs/Web/Guide/User_experience/Using_the_Page_Visibility_API
+*/
+function detectVisibilityApiAndUpdatePollingSettings(obj){
+
+    var hidden, visibilityChange;
+    if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 
18 and later support
+        hidden = "hidden";
+        visibilityChange = "visibilitychange";
+    } else if (typeof document.mozHidden !== "undefined") {
+        hidden = "mozHidden";
+        visibilityChange = "mozvisibilitychange";
+    } else if (typeof document.msHidden !== "undefined") {
+        hidden = "msHidden";
+        visibilityChange = "msvisibilitychange";
+    } else if (typeof document.webkitHidden !== "undefined") {
+        hidden = "webkitHidden";
+        visibilityChange = "webkitvisibilitychange";
+    }
+
+    /*
+    * Disable polling if UI
+    * is not visible
+    */
+    function handleVisibilityChange() {
+        if (document[hidden]) {
+          obj.pollingActive = false;
+       } else {
+          obj.pollingActive = true;
+       }
+    }
+
+    if (typeof document.addEventListener !== "undefined" || hidden !== 
"undefined") {
+            document.addEventListener(visibilityChange, 
handleVisibilityChange, false);
+    }
+}
+
+// detect visibility API and add events upon load
+$(document).ready(function(){detectVisibilityApiAndUpdatePollingSettings(site)})
+
 // moment configuration
 moment.lang('en', { calendar: {
     sameDay  : '[Today at] HH:mm z',

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I9a9dffccacd1e0a765a8bb234397321413266d70
Gerrit-PatchSet: 3
Gerrit-Project: analytics/wikimetrics
Gerrit-Branch: master
Gerrit-Owner: Nuria <nu...@wikimedia.org>
Gerrit-Reviewer: Bmansurov <bmansu...@wikimedia.org>
Gerrit-Reviewer: Mforns <mfo...@wikimedia.org>
Gerrit-Reviewer: Milimetric <dandree...@wikimedia.org>
Gerrit-Reviewer: Nuria <nu...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to