Index: lib/ui.js |
=================================================================== |
--- a/lib/ui.js |
+++ b/lib/ui.js |
@@ -895,12 +895,26 @@ |
/** |
* Handles clicks inside the browser's content area, will intercept clicks on |
- * abp: links. This can be called either with an event object or with the link |
- * target (if it is the former then link target will be retrieved from event |
- * target). |
+ * abp: links as well as links to subscribe.adblockplus.org. This can be called |
+ * either with an event object or with the link target (if it is the former then |
+ * link target will be retrieved from event target). |
*/ |
onBrowserClick: function (/**Window*/ window, /**Event*/ event, /**String*/ linkTarget) |
{ |
+ let link = null; |
+ if (linkTarget) |
+ { |
+ try |
+ { |
+ link = new URL(linkTarget); |
+ } |
+ catch(ex) |
+ { |
+ // Don't handle links with invalid URLs |
+ return; |
+ } |
+ } |
+ |
if (event) |
{ |
// Ignore right-clicks |
@@ -908,30 +922,48 @@ |
return; |
// Search the link associated with the click |
- let link = event.target; |
- while (link && !(link instanceof Ci.nsIDOMHTMLAnchorElement)) |
+ link = event.target; |
+ while (!(link instanceof Ci.nsIDOMHTMLAnchorElement)) |
+ { |
link = link.parentNode; |
- if (!link || link.protocol != "abp:") |
- return; |
+ if (!link) |
+ return; |
+ } |
+ } |
+ let queryString = null; |
+ if (link.protocol == "http:" || link.protocol == "https:") |
+ { |
+ if (link.host == "subscribe.adblockplus.org" || link.pathname == "/") |
+ queryString = link.search.substr(1); |
+ } |
+ else if (link.protocol == "abp:") |
Sebastian Noack
2015/04/01 14:41:58
Note that in the Chrome implementation - for simpl
Thomas Greiner
2015/04/01 15:03:36
Done.
|
+ { |
+ // Firefox doesn't populate the "search" property for links with |
+ // non-standard URL schemes so we need to extract the query string |
+ // manually |
+ let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(link.href); |
+ if (match) |
+ queryString = match[1]; |
+ } |
+ |
+ if (!queryString) |
+ return; |
+ |
+ if (event) |
+ { |
// This is our link - make sure the browser doesn't handle it |
event.preventDefault(); |
event.stopPropagation(); |
- |
- linkTarget = link.href; |
} |
- let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(linkTarget); |
- if (!match) |
- return; |
- |
// Decode URL parameters |
let title = null; |
let url = null; |
let mainSubscriptionTitle = null; |
let mainSubscriptionURL = null; |
- for (let param of match[1].split('&')) |
+ for (let param of queryString.split("&")) |
{ |
let parts = param.split("=", 2); |
if (parts.length != 2 || !/\S/.test(parts[1])) |