diff options
Diffstat (limited to 'src/js/scriptlets/subscriber.js')
-rw-r--r-- | src/js/scriptlets/subscriber.js | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/js/scriptlets/subscriber.js b/src/js/scriptlets/subscriber.js new file mode 100644 index 0000000..ea7b209 --- /dev/null +++ b/src/js/scriptlets/subscriber.js @@ -0,0 +1,113 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2015-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 +*/ + +/* global HTMLDocument */ + +'use strict'; + +/******************************************************************************/ + +// Injected into specific web pages, those which have been pre-selected +// because they are known to contains `abp:subscribe` links. + +/******************************************************************************/ + +(( ) => { +// >>>>> start of local scope + +/******************************************************************************/ + +// https://github.com/chrisaljoudi/uBlock/issues/464 +if ( document instanceof HTMLDocument === false ) { return; } + +// Maybe uBO has gone away meanwhile. +if ( typeof vAPI !== 'object' || vAPI === null ) { return; } + +const onMaybeSubscriptionLinkClicked = function(target) { + if ( vAPI instanceof Object === false ) { + document.removeEventListener('click', onMaybeSubscriptionLinkClicked); + return; + } + + try { + // https://github.com/uBlockOrigin/uBlock-issues/issues/763#issuecomment-691696716 + // Remove replacement patch if/when filterlists.com fixes encoded '&'. + const subscribeURL = new URL( + target.href.replace('&title=', '&title=') + ); + if ( + /^(abp|ubo):$/.test(subscribeURL.protocol) === false && + subscribeURL.hostname !== 'subscribe.adblockplus.org' + ) { + return; + } + const location = subscribeURL.searchParams.get('location') || ''; + const title = subscribeURL.searchParams.get('title') || ''; + if ( location === '' || title === '' ) { return true; } + // https://github.com/uBlockOrigin/uBlock-issues/issues/1797 + if ( /^(file|https?):\/\//.test(location) === false ) { return true; } + vAPI.messaging.send('scriptlets', { + what: 'subscribeTo', + location, + title, + }); + return true; + } catch (_) { + } +}; + +// https://github.com/easylist/EasyListHebrew/issues/89 +// Ensure trusted events only. + +document.addEventListener('click', ev => { + if ( ev.button !== 0 || ev.isTrusted === false ) { return; } + const target = ev.target.closest('a'); + if ( target instanceof HTMLAnchorElement === false ) { return; } + if ( onMaybeSubscriptionLinkClicked(target) === true ) { + ev.stopPropagation(); + ev.preventDefault(); + } +}); + +/******************************************************************************/ + +// <<<<< end of local scope +})(); + + + + + + + + +/******************************************************************************* + + DO NOT: + - Remove the following code + - Add code beyond the following code + Reason: + - https://github.com/gorhill/uBlock/pull/3721 + - uBO never uses the return value from injected content scripts + +**/ + +void 0; |