Commit 4f54758f authored by Manish Jethani's avatar Manish Jethani

Fixed #9 - Update adblockpluscore dependency to hg:e64df38221a3

parent bb32a998
Pipeline #61456436 failed with stages
in 5 minutes and 36 seconds
_root = hg:https://hg.adblockplus.org/ git:https://github.com/adblockplus/
_self = buildtools/ensure_dependencies.py
buildtools = buildtools hg:0ebf8cd23b36 git:04d50e0
adblockpluscore = adblockpluscore hg:728da87ae4b0 git:da8c662
adblockplusui = adblockplusui hg:7c7ff4c65b20 git:ec910b0
adblockpluscore = adblockpluscore hg:e64df38221a3 git:52cdc62
adblockplusui = adblockplusui hg:30834262e383 git:8aa1f67
......@@ -17,22 +17,13 @@
"use strict";
let onShutdown = {
done: false,
add() {},
remove() {}
};
//
// XPCOM emulation
//
function nsIHttpChannel() {}
let ComponentsObject = {
interfaces:
{
nsIHttpChannel,
nsITimer: {TYPE_REPEATING_SLACK: 0},
nsIInterfaceRequestor: null
},
......@@ -115,14 +106,3 @@ FakeTimer.prototype =
}, this.delay);
}
};
//
// Add a channel property to XMLHttpRequest, Synchronizer needs it
//
XMLHttpRequest.prototype.channel = {
status: -1,
loadFlags: 0,
INHIBIT_CACHING: 0,
VALIDATE_ALWAYS: 0
};
......@@ -24,7 +24,7 @@ const {ElemHide, createStyleSheet,
rulesFromStyleSheet} = require("../adblockpluscore/lib/elemHide");
const {ElemHideEmulation} = require("../adblockpluscore/lib/elemHideEmulation");
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
const {Snippets, compileScript} = require("../adblockpluscore/lib/snippets");
const {snippets, compileScript} = require("../adblockpluscore/lib/snippets");
const {checkWhitelisted} = require("./whitelisting");
const {extractHostFromFrame} = require("./url");
const {port} = require("./messaging");
......@@ -198,17 +198,16 @@ port.on("content.applyFilters", (message, sender) =>
let trace = HitLogger.hasListener(sender.page.id);
let inline = !userStyleSheetsSupported;
let {elemhide, snippets} = message.filterTypes ||
{elemhide: true, snippets: true};
let filterTypes = message.filterTypes || {elemhide: true, snippets: true};
if (!checkWhitelisted(sender.page, sender.frame, null,
RegExpFilter.typeMap.DOCUMENT))
{
let docDomain = extractHostFromFrame(sender.frame);
if (snippets)
if (filterTypes.snippets)
{
for (let filter of Snippets.getFiltersForDomain(docDomain))
for (let filter of snippets.getFiltersForDomain(docDomain))
{
executeScript(filter.script, sender.page.id, sender.frame.id).then(() =>
{
......@@ -225,8 +224,9 @@ port.on("content.applyFilters", (message, sender) =>
}
}
if (elemhide && !checkWhitelisted(sender.page, sender.frame, null,
RegExpFilter.typeMap.ELEMHIDE))
if (filterTypes.elemhide &&
!checkWhitelisted(sender.page, sender.frame, null,
RegExpFilter.typeMap.ELEMHIDE))
{
let specificOnly = checkWhitelisted(sender.page, sender.frame, null,
RegExpFilter.typeMap.GENERICHIDE);
......
......@@ -20,7 +20,7 @@
const {defaultMatcher} = require("../adblockpluscore/lib/matcher");
const {RegExpFilter, WhitelistFilter} =
require("../adblockpluscore/lib/filterClasses");
const {parseURL, isThirdParty} = require("../adblockpluscore/lib/url");
const {parseURL} = require("../adblockpluscore/lib/url");
const {extractHostFromFrame} = require("./url");
const {checkWhitelisted} = require("./whitelisting");
const {filterNotifier} = require("filterNotifier");
......@@ -33,10 +33,9 @@ browser.webRequest.onHeadersReceived.addListener(details =>
let url = parseURL(details.url);
let parentFrame = ext.getFrame(details.tabId, details.parentFrameId);
let hostname = extractHostFromFrame(parentFrame) || url.hostname;
let thirdParty = isThirdParty(url, hostname);
let cspMatch = defaultMatcher.matchesAny(details.url, typeMap.CSP, hostname,
thirdParty, null, false);
let cspMatch = defaultMatcher.matchesAny(url, typeMap.CSP, hostname, null,
false);
if (cspMatch)
{
let page = new ext.Page({id: details.tabId, url: details.url});
......@@ -53,8 +52,8 @@ browser.webRequest.onHeadersReceived.addListener(details =>
typeMap.GENERICBLOCK);
if (specificOnly && !(cspMatch instanceof WhitelistFilter))
{
cspMatch = defaultMatcher.matchesAny(details.url, typeMap.CSP, hostname,
thirdParty, null, specificOnly);
cspMatch = defaultMatcher.matchesAny(url, typeMap.CSP, hostname, null,
specificOnly);
if (!cspMatch)
return;
}
......@@ -63,20 +62,19 @@ browser.webRequest.onHeadersReceived.addListener(details =>
{
logRequest([details.tabId], {
url: details.url, type: "CSP", docDomain: hostname,
thirdParty, specificOnly
specificOnly
}, cspMatch);
filterNotifier.emit("filter.hitCount", cspMatch, 0, 0, [details.tabId]);
return;
}
let {blocking} = defaultMatcher.search(details.url, typeMap.CSP, hostname,
thirdParty, null, specificOnly,
"blocking");
let {blocking} = defaultMatcher.search(url, typeMap.CSP, hostname, null,
specificOnly, "blocking");
for (cspMatch of blocking)
{
logRequest([details.tabId], {
url: details.url, type: "CSP", docDomain: hostname,
thirdParty, specificOnly
specificOnly
}, cspMatch);
filterNotifier.emit("filter.hitCount", cspMatch, 0, 0, [details.tabId]);
......
......@@ -22,6 +22,7 @@ const {RegExpFilter,
ElemHideFilter} = require("../adblockpluscore/lib/filterClasses");
const {SpecialSubscription} =
require("../adblockpluscore/lib/subscriptionClasses");
const {parseURL} = require("../adblockpluscore/lib/url");
const {filterStorage} = require("../adblockpluscore/lib/filterStorage");
const {defaultMatcher} = require("../adblockpluscore/lib/matcher");
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
......@@ -52,7 +53,7 @@ function getFilterInfo(filter)
let userDefined = false;
let subscriptionTitle = null;
for (let subscription of filter.subscriptions())
for (let subscription of filterStorage.subscriptions(filter.text))
{
if (!subscription.disabled)
{
......@@ -112,10 +113,9 @@ function addRecord(panel, request, filter)
function matchRequest(request)
{
return defaultMatcher.matchesAny(
request.url,
parseURL(request.url),
RegExpFilter.typeMap[request.type],
request.docDomain,
request.thirdParty,
request.sitekey,
request.specificOnly
);
......
......@@ -93,8 +93,7 @@ function composeFilters(details)
{
let urlObj = new URL(url, details.baseURL);
let whitelisted = defaultMatcher.isWhitelisted(
urlObj.href, typeMask, docDomain,
isThirdParty(urlObj, docDomain),
urlObj, typeMask, docDomain,
getKey(page, frame), specificOnly
);
......
/*
* This file is part of Adblock Plus <https://adblockplus.org/>,
* Copyright (C) 2006-present 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 <http://www.gnu.org/licenses/>.
*/
"use strict";
const {Filter, ActiveFilter} = require("../adblockpluscore/lib/filterClasses");
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
const {filterStorage} = require("../adblockpluscore/lib/filterStorage");
const {Prefs} = require("./prefs");
const {SpecialSubscription} =
require("../adblockpluscore/lib/subscriptionClasses");
Promise.all([filterNotifier.once("load"), Prefs.untilLoaded]).then(() =>
{
if (Prefs.data_cleanup_done)
return;
if (filterStorage.firstRun)
{
Prefs.data_cleanup_done = true;
return;
}
let haveHitCounts = [];
for (let key in Filter.knownFilters)
{
let filter = Filter.knownFilters[key];
if (!(filter instanceof ActiveFilter))
continue;
if (filter.disabled)
{
// Enable or replace disabled filters
filter.disabled = false;
for (let subscription of filter.subscriptions())
{
if (subscription instanceof SpecialSubscription)
{
while (true)
{
let position = subscription.searchFilter(filter);
if (position < 0)
break;
let newFilter = Filter.fromText("! " + filter.text);
filterStorage.removeFilter(filter, subscription, position);
filterStorage.addFilter(newFilter, subscription, position);
}
}
}
}
if (filter.hitCount || filter.lastHit)
haveHitCounts.push(filter);
}
// Reset hit statistics on any filters having them
filterStorage.resetHitCounts(haveHitCounts);
// Remove any existing automatic backups
let backups = [];
for (let i = 1; i < 100; i++)
backups.push(`file:patterns-backup${i}.ini`);
browser.storage.local.remove(backups).then(() =>
{
Prefs.data_cleanup_done = true;
});
});
......@@ -22,7 +22,7 @@
const {defaultMatcher} = require("../adblockpluscore/lib/matcher");
const {BlockingFilter,
RegExpFilter} = require("../adblockpluscore/lib/filterClasses");
const {parseURL, isThirdParty} = require("../adblockpluscore/lib/url");
const {parseURL} = require("../adblockpluscore/lib/url");
const {extractHostFromFrame} = require("./url");
const {checkWhitelisted} = require("./whitelisting");
const {logRequest} = require("./hitLogger");
......@@ -46,7 +46,6 @@ function checkPotentialPopup(tabId, popup)
{
let url = popup.url || "about:blank";
let documentHost = extractHostFromFrame(popup.sourceFrame);
let thirdParty = isThirdParty(parseURL(url), documentHost);
let specificOnly = !!checkWhitelisted(
popup.sourcePage, popup.sourceFrame, null,
......@@ -54,8 +53,8 @@ function checkPotentialPopup(tabId, popup)
);
let filter = defaultMatcher.matchesAny(
url, RegExpFilter.typeMap.POPUP,
documentHost, thirdParty, null, specificOnly
parseURL(url), RegExpFilter.typeMap.POPUP,
documentHost, null, specificOnly
);
if (filter instanceof BlockingFilter)
......@@ -63,7 +62,7 @@ function checkPotentialPopup(tabId, popup)
logRequest(
[popup.sourcePage.id],
{url, type: "POPUP", docDomain: documentHost, thirdParty, specificOnly},
{url, type: "POPUP", docDomain: documentHost, specificOnly},
filter
);
}
......
......@@ -79,7 +79,7 @@ defaults.subscriptions_fallbackerrors = 5;
* @see https://adblockplus.org/en/preferences#subscriptions_fallbackurl
* @type {string}
*/
defaults.subscriptions_fallbackurl = "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&channelStatus=%CHANNELSTATUS%&responseStatus=%RESPONSESTATUS%";
defaults.subscriptions_fallbackurl = "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&responseStatus=%RESPONSESTATUS%";
/**
* @see https://adblockplus.org/en/preferences#subscriptions_autoupdate
* @type {boolean}
......@@ -145,12 +145,6 @@ defaults.show_statsinpopup = true;
* @type {boolean}
*/
defaults.shouldShowBlockElementMenu = true;
/**
* Whether to collapse placeholders for blocked elements.
*
* @type {boolean}
*/
defaults.hidePlaceholders = true;
/**
* Whether notification opt-out UI should be shown.
......
......@@ -24,7 +24,7 @@ const {Filter, RegExpFilter, BlockingFilter} =
const {Subscription} = require("../adblockpluscore/lib/subscriptionClasses");
const {defaultMatcher} = require("../adblockpluscore/lib/matcher");
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
const {parseURL, isThirdParty} = require("../adblockpluscore/lib/url");
const {parseURL} = require("../adblockpluscore/lib/url");
const {Prefs} = require("./prefs");
const {checkWhitelisted, getKey} = require("./whitelisting");
const {extractHostFromFrame} = require("./url");
......@@ -33,13 +33,6 @@ const {logRequest: hitLoggerLogRequest} = require("./hitLogger");
const extensionProtocol = new URL(browser.extension.getURL("")).protocol;
// Chrome can't distinguish between OBJECT_SUBREQUEST and OBJECT requests.
if (!browser.webRequest.ResourceType ||
!("OBJECT_SUBREQUEST" in browser.webRequest.ResourceType))
{
RegExpFilter.typeMap.OBJECT_SUBREQUEST = RegExpFilter.typeMap.OBJECT;
}
// Map of content types reported by the browser to the respecitve content types
// used by Adblock Plus. Other content types are simply mapped to OTHER.
let resourceTypes = new Map(function*()
......@@ -55,6 +48,9 @@ let resourceTypes = new Map(function*()
// Treat <img srcset> and <picture> the same as other images.
yield ["imageset", "IMAGE"];
// Treat requests sent by plugins the same as <object> or <embed>.
yield ["object_subrequest", "OBJECT"];
}());
exports.filterTypes = new Set(function*()
......@@ -83,15 +79,6 @@ function getDocumentInfo(page, frame, originUrl)
];
}
function matchRequest(url, type, docDomain, sitekey, specificOnly)
{
let thirdParty = isThirdParty(url, docDomain);
let filter = defaultMatcher.matchesAny(url.href, RegExpFilter.typeMap[type],
docDomain, thirdParty,
sitekey, specificOnly);
return [filter, thirdParty];
}
function getRelatedTabIds(details)
{
// This is the common case, the request is associated with a single tab.
......@@ -179,8 +166,8 @@ browser.webRequest.onBeforeRequest.addListener(details =>
let type = resourceTypes.get(details.type) || "OTHER";
let [docDomain, sitekey, specificOnly] = getDocumentInfo(page, frame,
originUrl);
let [filter, thirdParty] = matchRequest(url, type, docDomain,
sitekey, specificOnly);
let filter = defaultMatcher.matchesAny(url, RegExpFilter.typeMap[type],
docDomain, sitekey, specificOnly);
let result;
let rewrittenUrl;
......@@ -204,7 +191,7 @@ browser.webRequest.onBeforeRequest.addListener(details =>
logRequest(
tabIds,
{
url: details.url, type, docDomain, thirdParty,
url: details.url, type, docDomain,
sitekey, specificOnly, rewrittenUrl
},
filter
......@@ -225,24 +212,21 @@ port.on("filters.collapse", (message, sender) =>
if (checkWhitelisted(page, frame))
return false;
let blocked = false;
let [docDomain, sitekey, specificOnly] = getDocumentInfo(page, frame);
for (let url of message.urls)
{
let [filter] = matchRequest(new URL(url, message.baseURL),
message.mediatype, docDomain,
sitekey, specificOnly);
let filter = defaultMatcher.matchesAny(
new URL(url, message.baseURL),
RegExpFilter.typeMap[message.mediatype],
docDomain, sitekey, specificOnly
);
if (filter instanceof BlockingFilter)
{
if (filter.collapse != null)
return filter.collapse;
blocked = true;
}
return true;
}
return blocked && Prefs.hidePlaceholders;
return false;
});
port.on("request.blockedByRTCWrapper", (msg, sender) =>
......@@ -254,11 +238,12 @@ port.on("request.blockedByRTCWrapper", (msg, sender) =>
let {url} = msg;
let [docDomain, sitekey, specificOnly] = getDocumentInfo(page, frame);
let [filter, thirdParty] = matchRequest(new URL(url), "WEBRTC", docDomain,
sitekey, specificOnly);
let filter = defaultMatcher.matchesAny(new URL(url),
RegExpFilter.typeMap.WEBRTC,
docDomain, sitekey, specificOnly);
logRequest(
[sender.page.id],
{url, type: "WEBRTC", docDomain, thirdParty, sitekey, specificOnly},
{url, type: "WEBRTC", docDomain, sitekey, specificOnly},
filter
);
......@@ -326,7 +311,7 @@ function onFilterChange(arg, isDisabledAction)
filterNotifier.on("subscription.added", onFilterChange);
filterNotifier.on("subscription.removed", arg => onFilterChange(arg, false));
filterNotifier.on("subscription.updated", onFilterChange);
filterNotifier.on("subscription.updated", arg => onFilterChange(arg, false));
filterNotifier.on("subscription.disabled", arg => onFilterChange(arg, true));
filterNotifier.on("filter.added", onFilterChange);
filterNotifier.on("filter.removed", onFilterChange);
......
......@@ -27,7 +27,7 @@ const {filterStorage} = require("../adblockpluscore/lib/filterStorage");
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
const info = require("info");
const {Prefs} = require("./prefs");
const {Synchronizer} = require("../adblockpluscore/lib/synchronizer");
const {synchronizer} = require("../adblockpluscore/lib/synchronizer");
const {Utils} = require("./utils");
const {initNotifications} = require("./notificationHelper");
const {updatesVersion} = require("../adblockplusui/lib/prefs");
......@@ -87,69 +87,67 @@ function shouldAddDefaultSubscriptions()
return true;
}
/**
* @typedef {object} DefaultSubscriptions
* @property {?Element} ads
* @property {?Element} circumvention
*/
/**
* Finds the elements for the default ad blocking filter subscriptions based
* on the user's locale.
*
* @param {HTMLCollection} subscriptions
* @return {DefaultSubscriptions}
* @param {Array.<object>} subscriptions
* @return {Map.<string, object>}
*/
function chooseFilterSubscriptions(subscriptions)
{
let selectedItem = {};
let selectedPrefix = null;
let chosenSubscriptions = new Map();
let selectedLanguage = null;
let matchCount = 0;
for (let subscription of subscriptions)
{
let prefixes = subscription.getAttribute("prefixes");
let prefix = prefixes && prefixes.split(",").find(
let {languages, type} = subscription;
let language = languages && languages.find(
lang => new RegExp("^" + lang + "\\b").test(Utils.appLocale)
);
let subscriptionType = subscription.getAttribute("type");
if ((subscriptionType == "ads" || subscriptionType == "circumvention") &&
!selectedItem[subscriptionType])
selectedItem[subscriptionType] = subscription;
if ((type == "ads" || type == "circumvention") &&
!chosenSubscriptions.has(type))
{
chosenSubscriptions.set(type, subscription);
}
if (prefix)
if (language)
{
// The "ads" subscription is the one driving the selection.
if (subscriptionType == "ads")
if (type == "ads")
{
if (!selectedPrefix || selectedPrefix.length < prefix.length)
if (!selectedLanguage || selectedLanguage.length < language.length)
{
selectedItem[subscriptionType] = subscription;
selectedPrefix = prefix;
chosenSubscriptions.set(type, subscription);
selectedLanguage = language;
matchCount = 1;
}
else if (selectedPrefix && selectedPrefix.length == prefix.length)
else if (selectedLanguage && selectedLanguage.length == language.length)
{
matchCount++;
// If multiple items have a matching prefix of the same length:
// If multiple items have a matching language 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[subscriptionType] = subscription;
selectedPrefix = prefix;
chosenSubscriptions.set(type, subscription);
selectedLanguage = language;
}
}
}
else if (subscriptionType == "circumvention")
else if (type == "circumvention")
{
selectedItem[subscriptionType] = subscription;
chosenSubscriptions.set(type, subscription);
}
}
}
return selectedItem;
return chosenSubscriptions;
}
function supportsNotificationsWithButtons()
......@@ -221,45 +219,28 @@ function getSubscriptions()
let addDefaultSubscription = shouldAddDefaultSubscriptions();
if (addDefaultSubscription || !Prefs.subscriptions_addedanticv)
{
return fetch("subscriptions.xml")
.then(response => response.text())
.then(text =>
{
let doc = new DOMParser().parseFromString(text, "application/xml");
let nodes = doc.getElementsByTagName("subscription");
let defaultSubscriptions = chooseFilterSubscriptions(nodes);
if (defaultSubscriptions)
{
for (let name in defaultSubscriptions)
{
let node = defaultSubscriptions[name];
if (!node)
continue;
let url = node.getAttribute("url");
if (url)
{
// Make sure that we don't add Easylist again if we want
// to just add the Anti-Circumvention subscription.
let type = node.getAttribute("type");
if (!addDefaultSubscription && type != "circumvention")
continue;
let subscription = Subscription.fromURL(url);
subscription.disabled = false;
subscription.title = node.getAttribute("title");
subscription.homepage = node.getAttribute("homepage");
subscription.type = type;
subscriptions.push(subscription);
if (subscription.type == "circumvention")
Prefs.subscriptions_addedanticv = true;
}
}
}
let data = require("../adblockpluscore/data/subscriptions.json");
for (let [, value] of chooseFilterSubscriptions(data))
{
let {url, type, title, homepage} = value;
// Make sure that we don't add Easylist again if we want
// to just add the Anti-Circumvention subscription.
if (!addDefaultSubscription && type != "circumvention")
continue;
let subscription = Subscription.fromURL(url);
subscription.disabled = false;
subscription.title = title;
subscription.homepage = homepage;
subscription.type = type;
subscriptions.push(subscription);
if (subscription.type == "circumvention")
Prefs.subscriptions_addedanticv = true;
}
return subscriptions;
});
return subscriptions;
}
return subscriptions;
......@@ -275,7 +256,7 @@ function addSubscriptionsAndNotifyUser(subscriptions)
filterStorage.addSubscription(subscription);
if (subscription instanceof DownloadableSubscription &&
!subscription.lastDownload)
Synchronizer.execute(subscription);
synchronizer.execute(subscription);
}
// Show first run page or the updates page. The latter is only shown
......
......@@ -19,24 +19,6 @@
let Utils = exports.Utils = {
systemPrincipal: null,
runAsync(callback)
{
if (document.readyState == "loading")
{
// Make sure to not run asynchronous actions before all
// scripts loaded. This caused issues on Opera in the past.
let onDOMContentLoaded = () =>
{
document.removeEventListener("DOMContentLoaded", onDOMContentLoaded);
callback();
};
document.addEventListener("DOMContentLoaded", onDOMContentLoaded);
}
else
{
setTimeout(callback, 0);
}
},
get appLocale()
{
let locale = browser.i18n.getUILanguage();
......
......@@ -23,7 +23,6 @@ const {defaultMatcher} = require("../adblockpluscore/lib/matcher");
const {Filter, RegExpFilter} = require("../adblockpluscore/lib/filterClasses");
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier");
const {filterStorage} = require("../adblockpluscore/lib/filterStorage");
const {isThirdParty} = require("../adblockpluscore/lib/url");
const {extractHostFromFrame} = require("./url");
const {port} = require("./messaging");
const {logWhitelistedDocument} = require("./hitLogger");
......@@ -33,14 +32,10 @@ let sitekeys = new ext.PageMap();
function match(page, url, typeMask, docDomain, sitekey)
{
let thirdParty = !!docDomain && isThirdParty(url, docDomain);
if (!docDomain)
docDomain = url.hostname;
let filter = defaultMatcher.matchesAny(
url.href, typeMask, docDomain, thirdParty, sitekey
);
let filter = defaultMatcher.matchesAny(url, typeMask, docDomain, sitekey);
if (filter && page)
logWhitelistedDocument(page.id, url.href, typeMask, docDomain, filter);
......
......@@ -53,7 +53,8 @@ document_start =
document_end = include.postload.js
[mapping]
subscriptions.xml = adblockpluscore/chrome/content/ui/subscriptions.xml
subscriptions.json = adblockpluscore/data/subscriptions.json
data/languages.json = adblockplusui/data/languages.json
first-run.html = adblockplusui/first-run.html
common.js = adblockplusui/common.js
first-run.js = adblockplusui/first-run.js
......
......@@ -23,8 +23,5 @@ skin/mobile/checkmark.svg = adblockplusui/skin/mobile/checkmark.svg
skin/mobile/toggle.svg = adblockplusui/skin/mobile/toggle.svg
skin/mobile/trash.svg = adblockplusui/skin/mobile/trash.svg
[bundles]
lib/adblockplus.js += lib/firefoxDataCleanup.js
[import_locales]
adblockplusui/locale/*/mobile-options.json = *
[
{
"title": "EasyList",
"url": "https://easylist-downloads.adblockplus.org/easylist.txt",
"homepage": "https://easylist.to/",
"languages": [
"en"
],
"type": "ads"
},
{
"title": "EasyList Czech and Slovak+EasyList",