/*
* This file is part of Adblock Plus ,
* Copyright (C) 2006-2015 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 .
*/
(function(global)
{
if (!global.ext)
global.ext = require("ext_background");
var Utils = require("utils").Utils;
var FilterStorage = require("filterStorage").FilterStorage;
var FilterNotifier = require("filterNotifier").FilterNotifier;
var defaultMatcher = require("matcher").defaultMatcher;
var BlockingFilter = require("filterClasses").BlockingFilter;
var Synchronizer = require("synchronizer").Synchronizer;
var subscriptionClasses = require("subscriptionClasses");
var Subscription = subscriptionClasses.Subscription;
var DownloadableSubscription = subscriptionClasses.DownloadableSubscription;
var SpecialSubscription = subscriptionClasses.SpecialSubscription;
var subscriptionKeys = ["disabled", "homepage", "lastSuccess", "title", "url", "downloadStatus"];
function convertSubscription(subscription)
{
var result = {};
for (var i = 0; i < subscriptionKeys.length; i++)
result[subscriptionKeys[i]] = subscription[subscriptionKeys[i]]
return result;
}
var changeListeners = null;
var messageTypes = {
"app": "app.listen",
"filter": "filters.listen",
"subscription": "subscriptions.listen"
};
function onFilterChange(action)
{
var parts = action.split(".", 2);
var type;
if (parts.length == 1)
{
type = "app";
action = parts[0];
}
else
{
type = parts[0];
action = parts[1];
}
if (!messageTypes.hasOwnProperty(type))
return;
var args = Array.prototype.slice.call(arguments, 1).map(function(arg)
{
if (arg instanceof Subscription)
return convertSubscription(arg);
else
return arg;
});
var pages = changeListeners.keys();
for (var i = 0; i < pages.length; i++)
{
var filters = changeListeners.get(pages[i]);
if (filters[type] && filters[type].indexOf(action) >= 0)
{
pages[i].sendMessage({
type: messageTypes[type],
action: action,
args: args
});
}
}
};
global.ext.onMessage.addListener(function(message, sender, callback)
{
switch (message.type)
{
case "app.get":
if (message.what == "issues")
{
var info = require("info");
callback({
seenDataCorruption: "seenDataCorruption" in global ? global.seenDataCorruption : false,
filterlistsReinitialized: "filterlistsReinitialized" in global ? global.filterlistsReinitialized : false,
legacySafariVersion: (info.platform == "safari" && (
Services.vc.compare(info.platformVersion, "6.0") < 0 || // beforeload breaks websites in Safari 5
Services.vc.compare(info.platformVersion, "6.1") == 0 || // extensions are broken in 6.1 and 7.0
Services.vc.compare(info.platformVersion, "7.0") == 0))
});
}
else if (message.what == "doclink")
callback(Utils.getDocLink(message.link));
else if (message.what == "localeInfo")
{
var bidiDir;
if ("chromeRegistry" in Utils)
bidiDir = Utils.chromeRegistry.isLocaleRTL("adblockplus") ? "rtl" : "ltr";
else
bidiDir = ext.i18n.getMessage("@@bidi_dir");
callback({locale: Utils.appLocale, bidiDir: bidiDir});
}
else
callback(null);
break;
case "app.open":
if (message.what == "options")
ext.showOptions();
break;
case "subscriptions.get":
var subscriptions = FilterStorage.subscriptions.filter(function(s)
{
if (message.ignoreDisabled && s.disabled)
return false;
if (s instanceof DownloadableSubscription && message.downloadable)
return true;
if (s instanceof SpecialSubscription && message.special)
return true;
return false;
});
callback(subscriptions.map(convertSubscription));
break;
case "filters.blocked":
var filter = defaultMatcher.matchesAny(message.url, message.requestType, message.docDomain, message.thirdParty);
callback(filter instanceof BlockingFilter);
break;
case "subscriptions.toggle":
var subscription = Subscription.fromURL(message.url);
if (subscription.url in FilterStorage.knownSubscriptions && !subscription.disabled)
FilterStorage.removeSubscription(subscription);
else
{
subscription.disabled = false;
subscription.title = message.title;
subscription.homepage = message.homepage;
FilterStorage.addSubscription(subscription);
if (!subscription.lastDownload)
Synchronizer.execute(subscription);
}
break;
case "subscriptions.listen":
if (!changeListeners)
{
changeListeners = new global.ext.PageMap();
FilterNotifier.addListener(onFilterChange);
}
var filters = changeListeners.get(sender.page);
if (!filters)
{
filters = Object.create(null);
changeListeners.set(sender.page, filters);
}
if (message.filter)
filters.subscription = message.filter;
else
delete filters.subscription;
break;
}
});
})(this);