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