Merge branch 'master' of github.com:gorhill/uBlock

This commit is contained in:
gorhill 2015-01-25 09:48:05 -05:00
commit 3de448e070
4 changed files with 106 additions and 158 deletions

View File

@ -1,12 +1,12 @@
Эффективный блокировщик: низкая нагрузка на ЦП и оперативную память, однако может загружать и применять на тысячи больше фильтров, чем популярные блокировщики. Эффективный блокировщик: низкая нагрузка на ЦП и оперативную память, однако, может загружать и применять на тысячи больше фильтров, чем популярные блокировщики.
Иллюстрированный обзор его эффективности: https://github.com/gorhill/uBlock/wiki/%C2%B5Block-vs.-ABP:-efficiency-compared Иллюстрированный обзор его эффективности: https://github.com/gorhill/uBlock/wiki/%C2%B5Block-vs.-ABP:-efficiency-compared
Использование: Нажмите большую кнопку включение в выпадающем окне, чтобы постоянно отключить/включить µBlock для текущего сайта. Эта кнопка применяется только на текущий веб-сайт, она не глобальна. Использование: Нажмите большую кнопку «Включение» в выпадающем окне, чтобы включить или отключить µBlock для текущего сайта. Эта кнопка применяется только на текущий веб-сайт, она не глобальна.
*** ***
Будучи гибким, это нечто большее, чем просто "блокировщик рекламы": он также может считывать и создавать фильтры из хост-файлов. Будучи гибким, это нечто большее, чем просто «блокировщик рекламы»: он также может считывать и создавать фильтры из хост-файлов.
По умолчанию следующие списки фильтров будут загружены и применены: По умолчанию следующие списки фильтров будут загружены и применены:
@ -24,20 +24,20 @@
- Рекламные и отслеживающие сервера hpHosts - Рекламные и отслеживающие сервера hpHosts
- MVPS HOSTS - MVPS HOSTS
- Spam404 - Spam404
- И т.д. - И т. д.
Конечно, чем больше фильтров, тем выше использование памяти. Тем не менее даже после добавления трёх дополнительных списков, µBlock всё ещё использует меньше памяти, чем другие популярные блокировщики. Конечно, чем больше фильтров, тем выше использование памяти. Тем не менее, даже после добавления трёх дополнительных списков, µBlock всё ещё использует меньше памяти, чем другие популярные блокировщики.
Также имейте в виду, что некоторые их этих списков имеют высокую вероятность поломать веб-сайт, особенно те, что созданы из хост-файлов. Также имейте в виду, что некоторые их этих списков имеют высокую вероятность поломать веб-сайт, особенно те, что созданы из хост-файлов.
*** ***
Без предустановленных списков фильтров это расширение - ничто. Так что если Вы действительно хотите внести свой вклад, подумайте о людях, усердно поддерживающих списки фильтров, предоставленные Вам для бесплатного использования. Без предустановленных списков фильтров это расширение — ничто. Так что, если вы действительно хотите внести свой вклад, подумайте о людях, усердно поддерживающих списки фильтров, предоставленные Вам для бесплатного использования.
*** ***
Бесплатно. Бесплатно.
Открытый исходный код, публичная лицензия (GPLv3) Открытый исходный код, публичная лицензия (GPLv3).
Для пользователей от пользователей. Для пользователей от пользователей.
Участники на Github: https://github.com/gorhill/uBlock/graphs/contributors Участники на Github: https://github.com/gorhill/uBlock/graphs/contributors
@ -48,4 +48,4 @@
Это ещё очень ранняя версия, имейте это в виду, оценивая программу. Это ещё очень ранняя версия, имейте это в виду, оценивая программу.
Список изменений: Список изменений:
https://github.com/gorhill/uBlock/releases https://github.com/gorhill/uBlock/releases

View File

@ -19,9 +19,6 @@
Home: https://github.com/gorhill/uBlock Home: https://github.com/gorhill/uBlock
*/ */
/* global ytspf */
'use strict';
/******************************************************************************/ /******************************************************************************/
// Adding new URL requires to whitelist it in the background script too (addContentScriptFromURL) // Adding new URL requires to whitelist it in the background script too (addContentScriptFromURL)
@ -30,7 +27,7 @@
// from the extension scope won't be accessible in the sitePatch function. // from the extension scope won't be accessible in the sitePatch function.
self.vAPI = self.vAPI || {}; var vAPI = self.vAPI = self.vAPI || {};
if ( /^www\.youtube(-nocookie)?\.com/.test(location.host) ) { if ( /^www\.youtube(-nocookie)?\.com/.test(location.host) ) {
vAPI.sitePatch = function() { vAPI.sitePatch = function() {

View File

@ -29,8 +29,6 @@
'use strict'; 'use strict';
/******************************************************************************/
var vAPI = self.vAPI = self.vAPI || {}; var vAPI = self.vAPI = self.vAPI || {};
vAPI.safari = true; vAPI.safari = true;
@ -590,104 +588,84 @@ vAPI.net = {};
/******************************************************************************/ /******************************************************************************/
// Fast `contains`
Array.prototype.contains = function(a) {
var b = this.length;
while(b --) {
if(this[b] === a) {
return true;
}
}
return false;
};
/******************************************************************************/
vAPI.net.registerListeners = function() { vAPI.net.registerListeners = function() {
var µb = µBlock; var µb = µBlock;
// Since it's not used // Until Safari has more specific events, those are instead handled
this.onBeforeSendHeaders = null; // in the onBeforeRequestAdapter; clean them up so they're garbage-collected
this.onHeadersReceived = null; vAPI.net.onBeforeSendHeaders = null;
vAPI.net.onHeadersReceived = null;
var onBeforeRequest = this.onBeforeRequest; var onBeforeRequest = vAPI.net.onBeforeRequest,
onBeforeRequestClient = onBeforeRequest.callback,
blockableTypes = onBeforeRequest.types;
if ( !Array.isArray(onBeforeRequest.types) ) { var onBeforeRequestAdapter = function(e) {
onBeforeRequest.types = []; if(e.name !== "canLoad") {
} return;
}
onBeforeRequest = onBeforeRequest.callback; e.stopPropagation && e.stopPropagation();
this.onBeforeRequest.callback = function(e) { switch(e.message.type) {
var block; case "isWhiteListed":
e.message = !µb.getNetFilteringSwitch(e.message.url);
if ( e.name !== 'canLoad' ) { break;
return; case "navigatedToNew":
} vAPI.tabs.onNavigation({
url: e.message.url,
// No stopPropagation if it was called from beforeNavigate event frameId: 0,
if ( e.stopPropagation ) { tabId: vAPI.tabs.getTabId(e.target)
e.stopPropagation(); });
} break;
case "popup":
if ( e.message.isURLWhiteListed ) { if(e.message.url === 'about:blank') {
// https://github.com/gorhill/uBlock/issues/595 vAPI.tabs.popupCandidate = vAPI.tabs.getTabId(e.target);
// Do not access µb.netWhitelist directly e.message = true;
e.message = !µb.getNetFilteringSwitch(e.message.isURLWhiteListed); }
return e.message; else {
} e.message = !vAPI.tabs.onPopup({
url: e.message.url,
// When the URL changes, but the document doesn't tabId: 0,
if ( e.message.type === 'popstate' ) { sourceTabId: vAPI.tabs.getTabId(e.target)
vAPI.tabs.onUpdated( });
vAPI.tabs.getTabId(e.target), }
{url: e.message.url}, break;
{url: e.message.url} case "popstate":
); vAPI.tabs.onUpdated(vAPI.tabs.getTabId(e.target),
return; {url: e.message.url},
} else if ( e.message.type === 'popup' ) { {url: e.message.url});
// blocking unwanted pop-ups break;
if ( e.message.url === 'about:blank' ) { default:
vAPI.tabs.popupCandidate = vAPI.tabs.getTabId(e.target); if(!blockableTypes.contains(e.message.type)) {
e.message = true; e.message = true;
} else { return;
e.message = !vAPI.tabs.onPopup({ }
url: e.message.url, e.message.hostname = µb.URI.hostnameFromURI(e.message.url);
tabId: 0, e.message.tabId = vAPI.tabs.getTabId(e.target);
sourceTabId: vAPI.tabs.getTabId(e.target) var blockVerdict = onBeforeRequestClient(e.message);
}); if(blockVerdict && blockVerdict.cancel) {
} e.message = false;
}
return; else {
} e.message = true;
if ( e.message.navigatedToNew ) { }
vAPI.tabs.onNavigation({ }
url: e.message.url, return;
frameId: 0,
tabId: vAPI.tabs.getTabId(e.target)
});
return;
}
block = vAPI.net.onBeforeRequest;
if ( block.types.indexOf(e.message.type) === -1 ) {
return true;
}
e.message.hostname = µb.URI.hostnameFromURI(e.message.url);
e.message.tabId = vAPI.tabs.getTabId(e.target);
block = onBeforeRequest(e.message);
// Truthy return value will allow the request,
// except when redirectUrl is present
if ( block && typeof block === 'object' ) {
if ( block.cancel === true ) {
e.message = false;
} else if ( e.message.type === 'script'
&& typeof block.redirectUrl === 'string' ) {
e.message = block.redirectUrl;
} else {
e.message = true;
}
} else {
e.message = true;
}
return e.message;
}; };
safari.application.addEventListener("message", onBeforeRequestAdapter, true);
safari.application.addEventListener(
'message',
this.onBeforeRequest.callback,
true
);
}; };
/******************************************************************************/ /******************************************************************************/

View File

@ -27,9 +27,7 @@
'use strict'; 'use strict';
/******************************************************************************/ var vAPI = self.vAPI = self.vAPI || {};
self.vAPI = self.vAPI || {};
vAPI.safari = true; vAPI.safari = true;
/******************************************************************************/ /******************************************************************************/
@ -177,7 +175,7 @@ vAPI.messaging = {
/******************************************************************************/ /******************************************************************************/
vAPI.canExecuteContentScript = function() { vAPI.canExecuteContentScript = function() {
return /^https?:/.test(location.protocol); return (/^https?:/.test(location.protocol) && typeof safari === 'object');
}; };
/******************************************************************************/ /******************************************************************************/
@ -185,35 +183,34 @@ vAPI.canExecuteContentScript = function() {
// This file can be included into extensin pages, // This file can be included into extensin pages,
// but the following code should run only in content pages. // but the following code should run only in content pages.
if ( location.protocol === 'safari-extension:' ) { if ( location.protocol === 'safari-extension:' || typeof safari !== 'object' ) {
return; return;
} }
/******************************************************************************/ /******************************************************************************/
var frameId = window === window.top ? 0 : Date.now() % 1E5; var frameId = window === window.top ? 0 : Date.now() % 1E5;
var parentFrameId = frameId ? 0 : -1; var parentFrameId = (frameId ? 0 : -1);
var beforeLoadEvent = new Event('beforeload'); // Helper event to message background var beforeLoadEvent = new Event("beforeload"); // Helper event to message background
// Inform that we've navigated // Inform that we've navigated
if(frameId === 0) { if(frameId === 0) {
safari.self.tab.canLoad(beforeLoadEvent, { safari.self.tab.canLoad(beforeLoadEvent, {
url: location.href, url: location.href,
type: 'main_frame', type: "navigatedToNew"
navigatedToNew: true
}); });
} }
var linkHelper = document.createElement('a'); var linkHelper = document.createElement("a");
var nodeTypes = { var nodeTypes = {
'frame': 'sub_frame', "frame": "sub_frame",
'iframe': 'sub_frame', "iframe": "sub_frame",
'script': 'script', "script": "script",
'img': 'image', "img": "image",
'input': 'image', "input": "image",
'object': 'object', "object": "object",
'embed': 'object', "embed": "object",
'link': 'stylesheet' "link": "stylesheet"
}; };
var shouldBlockDetailedRequest = function(details) { var shouldBlockDetailedRequest = function(details) {
linkHelper.href = details.url; linkHelper.href = details.url;
@ -224,7 +221,7 @@ var shouldBlockDetailedRequest = function(details) {
return !(safari.self.tab.canLoad(beforeLoadEvent, details)); return !(safari.self.tab.canLoad(beforeLoadEvent, details));
} }
var onBeforeLoad = function(e) { var onBeforeLoad = function(e) {
if(e.url.lastIndexOf('data:', 0) === 0) { if(e.url.lastIndexOf("data:", 0) === 0) {
return; return;
} }
linkHelper.href = e.url; linkHelper.href = e.url;
@ -240,28 +237,6 @@ var onBeforeLoad = function(e) {
var response = safari.self.tab.canLoad(e, details); var response = safari.self.tab.canLoad(e, details);
if(!response) { if(!response) {
e.preventDefault(); e.preventDefault();
return false;
}
// Local mirroring, response should be a data: URL here
if(typeof response !== 'string') {
return;
}
// Okay, we're mirroring...
e.preventDefault();
// Content Security Policy with disallowed inline scripts may break things
details = document.createElement('script');
details.textContent = atob(response.slice(response.indexOf(',', 20) + 1));
if ( e.target.hasAttribute('defer') && document.readyState === 'loading' ) {
var jsOnLoad = function(ev) {
this.removeEventListener(ev.type, jsOnLoad, true);
this.body.removeChild(this.body.appendChild(details));
};
document.addEventListener('DOMContentLoaded', jsOnLoad, true);
} else {
e.target.parentNode.insertBefore(details, e.target);
details.parentNode.removeChild(details);
} }
}; };
@ -270,7 +245,7 @@ document.addEventListener('beforeload', onBeforeLoad, true);
/******************************************************************************/ /******************************************************************************/
// block pop-ups, intercept xhr requests, and apply site patches // block pop-ups, intercept xhr requests, and apply site patches
var firstMutation = function() { var firstMutation = function() {
document.removeEventListener('DOMSubtreeModified', firstMutation, true); document.removeEventListener('DOMContentLoaded', firstMutation, true);
firstMutation = false; firstMutation = false;
var randEventName = uniqueId(); var randEventName = uniqueId();
@ -302,7 +277,7 @@ var firstMutation = function() {
'};' '};'
]; ];
if ( frameId === 0 ) { if(frameId === 0) {
tmpScript.push( tmpScript.push(
'var pS = history.pushState, rS = history.replaceState,', 'var pS = history.pushState, rS = history.replaceState,',
'onpopstate = function(e) {', 'onpopstate = function(e) {',
@ -322,22 +297,20 @@ var firstMutation = function() {
); );
} }
var block = safari.self.tab.canLoad(beforeLoadEvent, { var whiteListed = safari.self.tab.canLoad(beforeLoadEvent, {
isURLWhiteListed: location.href type: "isWhiteListed",
url: location.href
}); });
if(vAPI.sitePatch && !whiteListed) {
if ( vAPI.sitePatch && !block ) { tmpScript.push('(' + vAPI.sitePatch + ')();');
tmpScript.push('(' + vAPI.sitePatch + ')();');
} }
tmpScript.push('})();'); tmpScript.push('})();');
tmpJS.textContent = tmpScript.join(''); tmpJS.textContent = tmpScript.join('');
document.documentElement.removeChild( document.documentElement.removeChild(document.documentElement.appendChild(tmpJS));
document.documentElement.appendChild(tmpJS)
);
}; };
document.addEventListener('DOMSubtreeModified', firstMutation, true); document.addEventListener('DOMContentLoaded', firstMutation, true);
/******************************************************************************/ /******************************************************************************/