/******************************************************************************* µ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 renderURL = function(url, filter) { var chunkSize = 50; // make a regex out of the filter var reText = filter; var pos = reText.indexOf('$'); if ( pos > 0 ) { reText = reText.slice(0, pos); } reText = reText .replace(/\./g, '\\.') .replace(/\?/g, '\\?') .replace('||', '') .replace(/\^/g, '.') .replace(/\*/g, '.*') ; var re = new RegExp(reText, 'g'); var matches = re.exec(url); if ( !matches || !matches[0].length ) { return url; } var renderedURL = []; while ( url.length ) { renderedURL.push(url.slice(0, chunkSize)); url = url.slice(chunkSize); } var index = (re.lastIndex / chunkSize) | 0; var offset = re.lastIndex % chunkSize; if ( offset === 0 ) { offset = 0; index -= 1; } var segment = renderedURL[index]; renderedURL[index] = segment.slice(0, offset) + '' + segment.slice(offset); index = (matches.index / chunkSize) | 0; offset = matches.index % chunkSize; if ( offset === 0 ) { offset = 0; index -= 1; } segment = renderedURL[index]; renderedURL[index] = segment.slice(0, offset) + '' + segment.slice(offset); return renderedURL.join('\n'); }; /******************************************************************************/ var renderPageDetails = function(tabId) { if ( !cachedPageSelectors[tabId] ) { return; } var onDataReceived = function(details) { if ( details.hash === cachedPageHash ) { return; } var 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; var html = []; for ( var i = 0; i < blockedRequests.length; i++ ) { blockedRequest = blockedRequests[i]; html.push( '', '', toPrettyTypeNames[blockedRequest.type] || blockedRequest.type, '', blockedRequest.domain, '', renderURL(blockedRequest.url, blockedRequest.reason), '', 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 = [ '