/*
* This file is part of Adblock Plus ,
* Copyright (C) 2006-2014 Eyeo GmbH
*
* Adblock Plus is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* Adblock Plus 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 Adblock Plus. If not, see .
*/
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
let subscriptionListLoading = false;
function init()
{
if (window.arguments && window.arguments.length && window.arguments[0])
{
let source = window.arguments[0];
setCustomSubscription(source.title, source.url,
source.mainSubscriptionTitle, source.mainSubscriptionURL);
E("all-subscriptions-container").hidden = true;
E("fromWebText").hidden = false;
}
else
loadSubscriptionList();
}
function updateSubscriptionInfo()
{
let selectedSubscription = E("all-subscriptions").selectedItem;
E("subscriptionInfo").setAttribute("invisible", !selectedSubscription);
if (selectedSubscription)
{
let url = selectedSubscription.getAttribute("_url");
let homePage = selectedSubscription.getAttribute("_homepage")
let viewLink = E("view-list");
viewLink.setAttribute("_url", url);
viewLink.setAttribute("tooltiptext", url);
let homePageLink = E("visit-homepage");
homePageLink.hidden = !homePage;
if (homePage)
{
homePageLink.setAttribute("_url", homePage);
homePageLink.setAttribute("tooltiptext", homePage);
}
}
}
function reloadSubscriptionList()
{
subscriptionListLoading = false;
loadSubscriptionList();
}
function loadSubscriptionList()
{
if (subscriptionListLoading)
return;
E("all-subscriptions-container").selectedIndex = 0;
E("all-subscriptions-loading").hidden = false;
let request = new XMLHttpRequest();
let errorHandler = function()
{
E("all-subscriptions-container").selectedIndex = 2;
E("all-subscriptions-loading").hidden = true;
};
let successHandler = function()
{
if (!request.responseXML || request.responseXML.documentElement.localName != "subscriptions")
{
errorHandler();
return;
}
try
{
processSubscriptionList(request.responseXML);
E("all-subscriptions").selectedIndex = 0;
E("all-subscriptions").focus();
}
catch (e)
{
Cu.reportError(e);
errorHandler();
}
};
request.open("GET", Prefs.subscriptions_listurl);
request.addEventListener("error", errorHandler, false);
request.addEventListener("load", successHandler, false);
request.send(null);
subscriptionListLoading = true;
}
function processSubscriptionList(doc)
{
let list = E("all-subscriptions");
while (list.firstChild)
list.removeChild(list.firstChild);
addSubscriptions(list, doc.documentElement, 0, null, null);
E("all-subscriptions-container").selectedIndex = 1;
E("all-subscriptions-loading").hidden = true;
}
function addSubscriptions(list, parent, level, parentTitle, parentURL)
{
for (let i = 0; i < parent.childNodes.length; i++)
{
let node = parent.childNodes[i];
if (node.nodeType != Node.ELEMENT_NODE || node.localName != "subscription")
continue;
if (node.getAttribute("type") != "ads" || node.getAttribute("deprecated") == "true")
continue;
let variants = node.getElementsByTagName("variants");
if (!variants.length || !variants[0].childNodes.length)
continue;
variants = variants[0].childNodes;
let isFirst = true;
let mainTitle = null;
let mainURL = null;
for (let j = 0; j < variants.length; j++)
{
let variant = variants[j];
if (variant.nodeType != Node.ELEMENT_NODE || variant.localName != "variant")
continue;
let item = document.createElement("richlistitem");
item.setAttribute("_title", variant.getAttribute("title"));
item.setAttribute("_url", variant.getAttribute("url"));
if (parentTitle && parentURL && variant.getAttribute("complete") != "true")
{
item.setAttribute("_supplementForTitle", parentTitle);
item.setAttribute("_supplementForURL", parentURL);
}
item.setAttribute("tooltiptext", variant.getAttribute("url"));
item.setAttribute("_homepage", node.getAttribute("homepage"));
let title = document.createElement("description");
if (isFirst)
{
if (Utils.checkLocalePrefixMatch(node.getAttribute("prefixes")))
title.setAttribute("class", "subscriptionTitle localeMatch");
else
title.setAttribute("class", "subscriptionTitle");
title.textContent = node.getAttribute("title") + " (" + node.getAttribute("specialization") + ")";
mainTitle = variant.getAttribute("title");
mainURL = variant.getAttribute("url");
isFirst = false;
}
title.setAttribute("flex", "1");
title.style.marginLeft = (20 * level) + "px";
item.appendChild(title);
let variantTitle = document.createElement("description");
variantTitle.setAttribute("class", "variant");
variantTitle.textContent = variant.getAttribute("title");
variantTitle.setAttribute("crop", "end");
item.appendChild(variantTitle);
list.appendChild(item);
}
let supplements = node.getElementsByTagName("supplements");
if (supplements.length)
addSubscriptions(list, supplements[0], level + 1, mainTitle, mainURL);
}
}
function onSelectionChange()
{
let selectedItem = E("all-subscriptions").selectedItem;
if (!selectedItem)
return;
setCustomSubscription(selectedItem.getAttribute("_title"), selectedItem.getAttribute("_url"),
selectedItem.getAttribute("_supplementForTitle"), selectedItem.getAttribute("_supplementForURL"));
updateSubscriptionInfo();
}
function setCustomSubscription(title, url, mainSubscriptionTitle, mainSubscriptionURL)
{
E("title").value = title;
E("location").value = url;
let messageElement = E("supplementMessage");
let addMainCheckbox = E("addMainSubscription");
if (mainSubscriptionURL && !hasSubscription(mainSubscriptionURL))
{
messageElement.removeAttribute("invisible");
addMainCheckbox.removeAttribute("invisible");
let [, beforeLink, afterLink] = /(.*)\?1\?(.*)/.exec(messageElement.getAttribute("_textTemplate")) || [null, messageElement.getAttribute("_textTemplate"), ""];
while (messageElement.firstChild)
messageElement.removeChild(messageElement.firstChild);
messageElement.appendChild(document.createTextNode(beforeLink));
let link = document.createElement("label");
link.className = "text-link";
link.setAttribute("tooltiptext", mainSubscriptionURL);
link.addEventListener("click", function() UI.loadInBrowser(mainSubscriptionURL), false);
link.textContent = mainSubscriptionTitle;
messageElement.appendChild(link);
messageElement.appendChild(document.createTextNode(afterLink));
addMainCheckbox.value = mainSubscriptionURL;
addMainCheckbox.setAttribute("_mainSubscriptionTitle", mainSubscriptionTitle)
let [label, accesskey] = Utils.splitLabel(addMainCheckbox.getAttribute("_labelTemplate"));
addMainCheckbox.label = label.replace(/\?1\?/g, mainSubscriptionTitle);
addMainCheckbox.accessKey = accesskey;
}
else
{
messageElement.setAttribute("invisible", "true");
addMainCheckbox.setAttribute("invisible", "true");
}
}
function validateURL(url)
{
if (!url)
return null;
url = url.replace(/^\s+/, "").replace(/\s+$/, "");
// Is this a file path?
try {
let file = new FileUtils.File(url);
return Services.io.newFileURI(file).spec;
} catch (e) {}
// Is this a valid URL?
let uri = Utils.makeURI(url);
if (uri)
return uri.spec;
return null;
}
function addSubscription()
{
let url = E("location").value;
url = validateURL(url);
if (!url)
{
Utils.alert(window, Utils.getString("subscription_invalid_location"));
E("location").focus();
return false;
}
let title = E("title").value.replace(/^\s+/, "").replace(/\s+$/, "");
if (!title)
title = url;
doAddSubscription(url, title);
let addMainCheckbox = E("addMainSubscription")
if (addMainCheckbox.getAttribute("invisible") != "true" && addMainCheckbox.checked)
{
let mainSubscriptionTitle = addMainCheckbox.getAttribute("_mainSubscriptionTitle");
let mainSubscriptionURL = validateURL(addMainCheckbox.value);
if (mainSubscriptionURL)
doAddSubscription(mainSubscriptionURL, mainSubscriptionTitle);
}
return true;
}
/**
* Adds a new subscription to the list.
*/
function doAddSubscription(/**String*/ url, /**String*/ title)
{
let subscription = Subscription.fromURL(url);
if (!subscription)
return;
FilterStorage.addSubscription(subscription);
subscription.disabled = false;
subscription.title = title;
if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
Synchronizer.execute(subscription);
}
function hasSubscription(url)
{
return FilterStorage.subscriptions.some(function(subscription) subscription instanceof DownloadableSubscription && subscription.url == url);
}