| Index: lib/subscriptionInit.js |
| diff --git a/lib/subscriptionInit.js b/lib/subscriptionInit.js |
| index 9cd17b48988b41eb21d071d7efcd7506557f0375..c14c4b3c971763c8c2ccd78d20576fd9091d5f14 100644 |
| --- a/lib/subscriptionInit.js |
| +++ b/lib/subscriptionInit.js |
| @@ -81,6 +81,57 @@ function shouldAddDefaultSubscription() |
| } |
| /** |
| + * Finds the element for the default ad blocking filter subscription based |
| + * on the user's locale. |
| + * |
| + * @param {HTMLCollection} subscriptions |
| + * @return {Element} |
| + */ |
| +function chooseFilterSubscription(subscriptions) |
| +{ |
| + let selectedItem = null; |
| + let selectedPrefix = null; |
| + let matchCount = 0; |
| + for (let subscription of subscriptions) |
| + { |
| + if (!selectedItem) |
| + selectedItem = subscription; |
| + |
| + let prefixes = subscription.getAttribute("prefixes"); |
| + let prefix = prefixes && prefixes.split(",").find( |
| + lang => new RegExp("^" + lang + "\\b").test(Utils.appLocale) |
| + ); |
| + |
| + let subscriptionType = subscription.getAttribute("type"); |
| + |
| + if (prefix && subscriptionType == "ads") |
| + { |
| + if (!selectedPrefix || selectedPrefix.length < prefix.length) |
| + { |
| + selectedItem = subscription; |
| + selectedPrefix = prefix; |
| + matchCount = 1; |
| + } |
| + else if (selectedPrefix && selectedPrefix.length == prefix.length) |
| + { |
| + matchCount++; |
| + |
| + // If multiple items have a matching prefix of the same length: |
| + // Select one of the items randomly, probability should be the same |
| + // for all items. So we replace the previous match here with |
| + // probability 1/N (N being the number of matches). |
| + if (Math.random() * matchCount < 1) |
| + { |
| + selectedItem = subscription; |
| + selectedPrefix = prefix; |
| + } |
| + } |
| + } |
| + } |
| + return selectedItem; |
| +} |
| + |
| +/** |
| * Gets the filter subscriptions to be added when the extnesion is loaded. |
| * |
| * @return {Promise|Subscription[]} |
| @@ -119,7 +170,7 @@ function getSubscriptions() |
| let doc = new DOMParser().parseFromString(text, "application/xml"); |
| let nodes = doc.getElementsByTagName("subscription"); |
| - let node = Utils.chooseFilterSubscription(nodes); |
| + let node = chooseFilterSubscription(nodes); |
| if (node) |
| { |
| let url = node.getAttribute("url"); |