| Index: options.js | 
| =================================================================== | 
| --- a/options.js | 
| +++ b/options.js | 
| @@ -197,68 +197,75 @@ | 
|  | 
| function loadRecommendations() | 
| { | 
| -  var request = new XMLHttpRequest(); | 
| -  request.open("GET", "subscriptions.xml"); | 
| -  request.onload = function() | 
| -  { | 
| -    var selectedIndex = 0; | 
| -    var selectedPrefix = null; | 
| -    var matchCount = 0; | 
| +  fetch("subscriptions.xml") | 
| +    .then(function(response) | 
| +    { | 
| +      return response.text(); | 
| +    }) | 
| +    .then(function(text) | 
| +    { | 
| +      var selectedIndex = 0; | 
| +      var selectedPrefix = null; | 
| +      var matchCount = 0; | 
|  | 
| -    var list = document.getElementById("subscriptionSelector"); | 
| -    var elements = request.responseXML.documentElement.getElementsByTagName("subscription"); | 
| -    for (var i = 0; i < elements.length; i++) | 
| -    { | 
| -      var element = elements[i]; | 
| -      var option = new Option(); | 
| -      option.text = element.getAttribute("title") + " (" + element.getAttribute("specialization") + ")"; | 
| -      option._data = { | 
| -        title: element.getAttribute("title"), | 
| -        url: element.getAttribute("url"), | 
| -        homepage: element.getAttribute("homepage") | 
| -      }; | 
| +      var list = document.getElementById("subscriptionSelector"); | 
| +      var doc = new DOMParser().parseFromString(text, "application/xml"); | 
| +      var elements = doc.documentElement.getElementsByTagName("subscription"); | 
|  | 
| -      var prefix = Utils.checkLocalePrefixMatch(element.getAttribute("prefixes")); | 
| -      if (prefix) | 
| +      for (var i = 0; i < elements.length; i++) | 
| { | 
| -        option.style.fontWeight = "bold"; | 
| -        option.style.backgroundColor = "#E0FFE0"; | 
| -        option.style.color = "#000000"; | 
| -        if (!selectedPrefix || selectedPrefix.length < prefix.length) | 
| +        var element = elements[i]; | 
| +        var option = new Option(); | 
| +        option.text = element.getAttribute("title") + " (" + | 
| +                      element.getAttribute("specialization") + ")"; | 
| +        option._data = { | 
| +          title: element.getAttribute("title"), | 
| +          url: element.getAttribute("url"), | 
| +          homepage: element.getAttribute("homepage") | 
| +        }; | 
| + | 
| +        var prefixes = element.getAttribute("prefixes"); | 
| +        var prefix = Utils.checkLocalePrefixMatch(prefixes); | 
| +        if (prefix) | 
| { | 
| -          selectedIndex = i; | 
| -          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) | 
| +          option.style.fontWeight = "bold"; | 
| +          option.style.backgroundColor = "#E0FFE0"; | 
| +          option.style.color = "#000000"; | 
| +          if (!selectedPrefix || selectedPrefix.length < prefix.length) | 
| { | 
| selectedIndex = i; | 
| 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) | 
| +            { | 
| +              selectedIndex = i; | 
| +              selectedPrefix = prefix; | 
| +            } | 
| } | 
| } | 
| +        list.appendChild(option); | 
| } | 
| + | 
| +      var option = new Option(); | 
| +      var label = i18n.getMessage("filters_addSubscriptionOther_label"); | 
| +      option.text = label + "\u2026"; | 
| +      option._data = null; | 
| list.appendChild(option); | 
| -    } | 
|  | 
| -    var option = new Option(); | 
| -    option.text = i18n.getMessage("filters_addSubscriptionOther_label") + "\u2026"; | 
| -    option._data = null; | 
| -    list.appendChild(option); | 
| +      list.selectedIndex = selectedIndex; | 
|  | 
| -    list.selectedIndex = selectedIndex; | 
| - | 
| -    if (delayedSubscriptionSelection) | 
| -      startSubscriptionSelection.apply(null, delayedSubscriptionSelection); | 
| -  }; | 
| -  request.send(null); | 
| +      if (delayedSubscriptionSelection) | 
| +        startSubscriptionSelection.apply(null, delayedSubscriptionSelection); | 
| +    }); | 
| } | 
|  | 
| function startSubscriptionSelection(title, url) | 
|  |