| 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])) |