summaryrefslogtreecommitdiff
path: root/data/extensions/uBlock0@raymondhill.net/js/static-ext-filtering.js
diff options
context:
space:
mode:
Diffstat (limited to 'data/extensions/uBlock0@raymondhill.net/js/static-ext-filtering.js')
-rw-r--r--data/extensions/uBlock0@raymondhill.net/js/static-ext-filtering.js169
1 files changed, 169 insertions, 0 deletions
diff --git a/data/extensions/uBlock0@raymondhill.net/js/static-ext-filtering.js b/data/extensions/uBlock0@raymondhill.net/js/static-ext-filtering.js
new file mode 100644
index 0000000..8a33093
--- /dev/null
+++ b/data/extensions/uBlock0@raymondhill.net/js/static-ext-filtering.js
@@ -0,0 +1,169 @@
+/*******************************************************************************
+
+ uBlock Origin - a comprehensive, efficient content blocker
+ Copyright (C) 2017-present 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
+*/
+
+import cosmeticFilteringEngine from './cosmetic-filtering.js';
+import htmlFilteringEngine from './html-filtering.js';
+import httpheaderFilteringEngine from './httpheader-filtering.js';
+import logger from './logger.js';
+import scriptletFilteringEngine from './scriptlet-filtering.js';
+
+/*******************************************************************************
+
+ All static extended filters are of the form:
+
+ field 1: one hostname, or a list of comma-separated hostnames
+ field 2: `##` or `#@#`
+ field 3: selector
+
+ The purpose of the static extended filtering engine is to coarse-parse and
+ dispatch to appropriate specialized filtering engines. There are currently
+ three specialized filtering engines:
+
+ - cosmetic filtering (aka "element hiding" in Adblock Plus)
+ - scriptlet injection: selector starts with `script:inject`
+ - New shorter syntax (1.15.12): `example.com##+js(bab-defuser.js)`
+ - html filtering: selector starts with `^`
+
+ Depending on the specialized filtering engine, field 1 may or may not be
+ optional.
+
+ The static extended filtering engine also offers parsing capabilities which
+ are available to all other specialized filtering engines. For example,
+ cosmetic and html filtering can ask the extended filtering engine to
+ compile/validate selectors.
+
+**/
+
+//--------------------------------------------------------------------------
+// Public API
+//--------------------------------------------------------------------------
+
+const staticExtFilteringEngine = {
+ get acceptedCount() {
+ return cosmeticFilteringEngine.acceptedCount +
+ scriptletFilteringEngine.acceptedCount +
+ httpheaderFilteringEngine.acceptedCount +
+ htmlFilteringEngine.acceptedCount;
+ },
+ get discardedCount() {
+ return cosmeticFilteringEngine.discardedCount +
+ scriptletFilteringEngine.discardedCount +
+ httpheaderFilteringEngine.discardedCount +
+ htmlFilteringEngine.discardedCount;
+ },
+};
+
+//--------------------------------------------------------------------------
+// Public methods
+//--------------------------------------------------------------------------
+
+staticExtFilteringEngine.reset = function() {
+ cosmeticFilteringEngine.reset();
+ scriptletFilteringEngine.reset();
+ httpheaderFilteringEngine.reset();
+ htmlFilteringEngine.reset();
+};
+
+staticExtFilteringEngine.freeze = function() {
+ cosmeticFilteringEngine.freeze();
+ scriptletFilteringEngine.freeze();
+ httpheaderFilteringEngine.freeze();
+ htmlFilteringEngine.freeze();
+};
+
+staticExtFilteringEngine.compile = function(parser, writer) {
+ if ( parser.isExtendedFilter() === false ) { return false; }
+
+ if ( parser.hasError() ) {
+ logger.writeOne({
+ realm: 'message',
+ type: 'error',
+ text: `Invalid extended filter in ${writer.properties.get('name') || '?'}: ${parser.raw}`
+ });
+ return true;
+ }
+
+ // Scriptlet injection
+ if ( parser.isScriptletFilter() ) {
+ scriptletFilteringEngine.compile(parser, writer);
+ return true;
+ }
+
+ // Response header filtering
+ if ( parser.isResponseheaderFilter() ) {
+ httpheaderFilteringEngine.compile(parser, writer);
+ return true;
+ }
+
+ // HTML filtering
+ // TODO: evaluate converting Adguard's `$$` syntax into uBO's HTML
+ // filtering syntax.
+ if ( parser.isHtmlFilter() ) {
+ htmlFilteringEngine.compile(parser, writer);
+ return true;
+ }
+
+ // Cosmetic filtering
+ if ( parser.isCosmeticFilter() ) {
+ cosmeticFilteringEngine.compile(parser, writer);
+ return true;
+ }
+
+ logger.writeOne({
+ realm: 'message',
+ type: 'error',
+ text: `Unknown extended filter in ${writer.properties.get('name') || '?'}: ${parser.raw}`
+ });
+ return true;
+};
+
+staticExtFilteringEngine.fromCompiledContent = function(reader, options) {
+ cosmeticFilteringEngine.fromCompiledContent(reader, options);
+ scriptletFilteringEngine.fromCompiledContent(reader, options);
+ httpheaderFilteringEngine.fromCompiledContent(reader, options);
+ htmlFilteringEngine.fromCompiledContent(reader, options);
+};
+
+staticExtFilteringEngine.toSelfie = function() {
+ return {
+ cosmetic: cosmeticFilteringEngine.toSelfie(),
+ scriptlets: scriptletFilteringEngine.toSelfie(),
+ httpHeaders: httpheaderFilteringEngine.toSelfie(),
+ html: htmlFilteringEngine.toSelfie(),
+ };
+};
+
+staticExtFilteringEngine.fromSelfie = async function(selfie) {
+ if ( typeof selfie !== 'object' || selfie === null ) { return false; }
+ cosmeticFilteringEngine.fromSelfie(selfie.cosmetic);
+ httpheaderFilteringEngine.fromSelfie(selfie.httpHeaders);
+ htmlFilteringEngine.fromSelfie(selfie.html);
+ if ( scriptletFilteringEngine.fromSelfie(selfie.scriptlets) === false ) {
+ return false;
+ }
+ return true;
+};
+
+/******************************************************************************/
+
+export default staticExtFilteringEngine;
+
+/******************************************************************************/