/******************************************************************************* µBlock - a Chromium browser extension to block requests. Copyright (C) 2014 Raymond Hill This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see {http://www.gnu.org/licenses/}. Home: https://github.com/gorhill/uBlock */ /* global chrome, uDom, messaging */ /******************************************************************************/ (function() { /******************************************************************************/ messaging.start('stats.js'); /******************************************************************************/ var logSettingChanged = function() { messaging.tell({ what: 'userSettings', name: 'logBlockedRequests', value: this.checked }); uDom('#blockedRequests').toggleClass('logEnabled', this.checked); renderPageSelector(); }; /******************************************************************************/ var cachedPageSelectors = {}; var cachedPageHash = ''; var toPrettyTypeNames = { 'sub_frame': 'frame', 'object': 'plugin', 'xmlhttprequest': 'XHR' }; /******************************************************************************/ var renderPageDetails = function(tabId) { if ( !cachedPageSelectors[tabId] ) { return; } var onDataReceived = function(details) { if ( details.hash === cachedPageHash ) { return; } blockedRequests = details.requests || []; blockedRequests.sort(function(a, b) { var r = a.domain.localeCompare(b.domain); if ( r === 0 ) { r = a.reason.localeCompare(b.reason); if ( r === 0 ) { r = a.type.localeCompare(b.type); } } return r; }); uDom('#tableHeader ~ tr').remove(); var blockedRequest, requestURL, renderedURL; var html = []; for ( var i = 0; i < blockedRequests.length; i++ ) { blockedRequest = blockedRequests[i]; requestURL = blockedRequest.url; renderedURL = []; while ( requestURL.length ) { renderedURL.push(requestURL.slice(0, 60)); requestURL = requestURL.slice(60); } html.push( '', '', toPrettyTypeNames[blockedRequest.type] || blockedRequest.type, '', blockedRequest.domain, '', renderedURL.join('\n'), '', blockedRequest.reason ); } if ( !html.length ) { html.push( '', chrome.i18n.getMessage('logBlockedRequestsEmpty') ); } uDom('#tableHeader').insertAfter(html.join('')); cachedPageHash = details.hash; }; messaging.ask({ what: 'getPageDetails', tabId: tabId }, onDataReceived); }; /******************************************************************************/ var pageSelectorChanged = function() { renderPageDetails(this.value); }; /******************************************************************************/ var renderPageSelector = function(targetTabId) { if ( uDom('#logBlockedRequests').prop('checked') !== true ) { return; } var selectedTabId = targetTabId || parseInt(uDom('#pageSelector').val(), 10); var onTabReceived = function(tab) { var html = [ '