[Pkg-mozext-commits] [adblock-plus] 01/06: Imported Upstream version 2.6+dfsg
David Prévot
taffit at moszumanska.debian.org
Wed Apr 23 16:15:15 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository adblock-plus.
commit 36626283e4fc7b9c7ed6fd0737d9e7d51421d92a
Author: David Prévot <taffit at debian.org>
Date: Wed Apr 23 10:00:46 2014 -0400
Imported Upstream version 2.6+dfsg
---
.hg_archival.txt | 4 +-
.hgsubstate | 2 +-
addChecksum.py | 2 +-
buildtools/.hgsubstate | 2 +-
buildtools/Info.plist.tmpl | 4 +-
buildtools/LocaleTester.pm | 2 +-
buildtools/bootstrap.js.tmpl | 4 +-
buildtools/build.py | 2 +-
buildtools/chainedconfigparser.py | 2 +-
buildtools/chromeDevenvPoller__.js.tmpl | 2 +-
buildtools/chromeInfo.js.tmpl | 2 +-
buildtools/imageConversion.py | 2 +-
buildtools/install.rdf.tmpl | 2 +-
buildtools/jshydra/autotest/abprewrite_source.js | 10 +-
.../jshydra/autotest/test_abprewrite.js.expected | 2 +-
.../autotest/test_abprewrite_module.js.expected | 2 +-
buildtools/jshydra/jshydra.js | 2 +-
buildtools/jshydra/scripts/abprewrite.js | 64 +++--
buildtools/jshydra/scripts/astDecompile.js | 11 +
buildtools/jshydra/utils.py | 2 +-
buildtools/lib/hooks.js | 2 +-
buildtools/lib/keySelector.js | 2 +-
buildtools/lib/prefs.js | 2 +-
buildtools/lib/windowObserver.js | 2 +-
buildtools/localeTools.py | 2 +-
buildtools/manifest.json.tmpl | 2 +-
buildtools/packager.py | 2 +-
buildtools/packagerChrome.py | 90 ++++---
buildtools/packagerGecko.py | 2 +-
buildtools/packagerSafari.py | 3 +-
buildtools/publicSuffixListUpdater.py | 2 +-
buildtools/releaseAutomation.py | 21 +-
buildtools/safariInfo.js.tmpl | 2 +-
chrome/content/objtabs.css | 2 +-
chrome/content/ui/composer.js | 2 +-
chrome/content/ui/composer.xul | 2 +-
chrome/content/ui/fennecSettings.xul | 2 +-
chrome/content/ui/filters-backup.js | 6 +-
chrome/content/ui/filters-filteractions.js | 2 +-
chrome/content/ui/filters-filterview.js | 2 +-
chrome/content/ui/filters-search.js | 89 ++++++-
chrome/content/ui/filters-subscriptionactions.js | 2 +-
chrome/content/ui/filters-subscriptionview.js | 2 +-
chrome/content/ui/filters.js | 9 +-
chrome/content/ui/filters.xul | 2 +-
chrome/content/ui/firstRun.html | 2 +-
chrome/content/ui/firstRun.js | 2 +-
chrome/content/ui/flasher.js | 2 +-
chrome/content/ui/i18n.js | 2 +-
chrome/content/ui/overlay.xul | 2 +-
chrome/content/ui/progressBar.js | 2 +-
chrome/content/ui/progressBar.xul | 2 +-
chrome/content/ui/sendReport.js | 6 +-
chrome/content/ui/sendReport.xul | 2 +-
chrome/content/ui/settings.xul | 2 +-
chrome/content/ui/sidebar.js | 2 +-
chrome/content/ui/sidebar.xul | 2 +-
chrome/content/ui/sidebarDetached.xul | 2 +-
chrome/content/ui/subscriptionSelection.js | 2 +-
chrome/content/ui/subscriptionSelection.xul | 2 +-
chrome/content/ui/subscriptions.xml | 10 +-
chrome/content/ui/utils.js | 2 +-
chrome/locale/ar/overlay.dtd | 2 +-
chrome/locale/{eu => ast}/.incomplete | 0
chrome/locale/ast/firstRun.properties | 6 +
chrome/locale/bs/firstRun.properties | 17 ++
chrome/locale/bs/meta.properties | 4 +
chrome/locale/bs/overlay.dtd | 2 +
chrome/locale/ca/global.properties | 2 +
chrome/locale/ca/overlay.dtd | 3 +
chrome/locale/cs/meta.properties | 2 +-
chrome/locale/de/composer.dtd | 6 +-
chrome/locale/de/filters.dtd | 2 +-
chrome/locale/de/sendReport.dtd | 2 +-
chrome/locale/eo/composer.dtd | 24 +-
chrome/locale/eo/meta.properties | 4 +-
chrome/locale/es-CL/composer.dtd | 16 +-
chrome/locale/es-CL/filters.dtd | 72 +++++
chrome/locale/es-CL/firstRun.properties | 19 ++
chrome/locale/fa/composer.dtd | 6 +-
chrome/locale/hi-IN/filters.dtd | 3 +-
chrome/locale/id/composer.dtd | 4 +-
chrome/locale/id/meta.properties | 3 +-
chrome/locale/id/subscriptionSelection.dtd | 2 +-
chrome/locale/it/composer.dtd | 2 +-
chrome/locale/lt/global.properties | 2 +
chrome/locale/mk/composer.dtd | 4 +-
chrome/locale/mk/filters.dtd | 70 ++++-
chrome/locale/mk/firstRun.properties | 4 +
chrome/locale/{nb-NO => ml}/.incomplete | 0
chrome/locale/ml/composer.dtd | 4 +
chrome/locale/{eu => mn}/.incomplete | 0
chrome/locale/ms/composer.dtd | 6 +-
chrome/locale/ms/global.properties | 2 +
chrome/locale/ms/meta.properties | 2 +-
chrome/locale/ms/overlay.dtd | 3 +
chrome/locale/ms/sendReport.dtd | 6 +-
chrome/locale/nb-NO/sendReport.dtd | 4 +-
chrome/locale/nl/global.properties | 4 +-
chrome/locale/pl/global.properties | 2 +
chrome/locale/ru/global.properties | 2 +
chrome/locale/ru/overlay.dtd | 3 +
chrome/locale/sl/global.properties | 2 +
chrome/locale/sl/overlay.dtd | 2 +-
chrome/locale/sl/subscriptionSelection.dtd | 2 +-
chrome/locale/tr/overlay.dtd | 3 +
chrome/locale/uk/composer.dtd | 2 +-
chrome/locale/vi/filters.dtd | 48 ++--
chrome/locale/vi/firstRun.properties | 19 +-
chrome/locale/vi/global.properties | 34 +--
chrome/locale/vi/meta.properties | 4 +-
chrome/locale/vi/overlay.dtd | 7 +-
chrome/locale/vi/sendReport.dtd | 8 +-
chrome/locale/vi/sidebar.dtd | 4 +-
chrome/locale/vi/subscriptionSelection.dtd | 2 +-
chrome/locale/zh-TW/global.properties | 2 +
chrome/skin/composer.css | 2 +-
chrome/skin/filters.css | 2 +-
chrome/skin/firstRun.css | 2 +-
chrome/skin/overlay.css | 2 +-
chrome/skin/sendReport.css | 2 +-
chrome/skin/sidebar.css | 2 +-
chrome/skin/subscriptionSelection.css | 2 +-
defaults/patterns.ini | 2 -
lib/Public.jsm | 8 +-
lib/antiadblockInit.js | 78 ++++++
lib/appSupport.js | 2 +-
lib/contentPolicy.js | 26 +-
lib/customizableUI.js | 2 +-
lib/downloader.js | 4 +-
lib/elemHide.js | 19 +-
lib/elemHideHitRegistration.js | 2 +-
lib/filterClasses.js | 29 +-
lib/filterListener.js | 4 +-
lib/filterNotifier.js | 5 +-
lib/filterStorage.js | 53 ++--
lib/io.js | 291 +++++++++++----------
lib/main.js | 2 +-
lib/matcher.js | 2 +-
lib/notification.js | 15 +-
lib/objectTabs.js | 4 +-
lib/requestNotifier.js | 67 ++---
lib/subscriptionClasses.js | 6 +-
lib/sync.js | 26 +-
lib/synchronizer.js | 6 +-
lib/timeline.js | 2 +-
lib/ui.js | 107 ++------
lib/utils.js | 17 +-
metadata.gecko | 12 +-
normalizeLocales.pl | 2 +-
search_and_replace.pl | 2 +-
test_locales.pl | 2 +-
update_locales.py | 2 +-
validateChecksum.py | 2 +-
154 files changed, 1074 insertions(+), 628 deletions(-)
diff --git a/.hg_archival.txt b/.hg_archival.txt
index b3e188c..030995e 100644
--- a/.hg_archival.txt
+++ b/.hg_archival.txt
@@ -1,5 +1,5 @@
repo: 6b6e266a6c16e1151bb6a16b35651ef3a1bddf1c
-node: 58809a0d632f95ff4ae8dab28a6b7ecdc0e23e31
+node: fc821f254bf72b5cac4db8003d46217448dc42a2
branch: default
-latesttag: 2.5.1
+latesttag: 2.6
latesttagdistance: 1
diff --git a/.hgsubstate b/.hgsubstate
index 0dea247..7b39d65 100644
--- a/.hgsubstate
+++ b/.hgsubstate
@@ -1 +1 @@
-d2f6dda08e423d1cf3112098c266a7a9066fe39f buildtools
+f58d40e12e413e92bb7fea66c3f88b5f28e82a2e buildtools
diff --git a/addChecksum.py b/addChecksum.py
index 0c36e22..f67d214 100755
--- a/addChecksum.py
+++ b/addChecksum.py
@@ -2,7 +2,7 @@
# coding: utf-8
# This file is part of Adblock Plus <http://adblockplus.org/>,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/.hgsubstate b/buildtools/.hgsubstate
index 6ecb639..e77c91d 100644
--- a/buildtools/.hgsubstate
+++ b/buildtools/.hgsubstate
@@ -1 +1 @@
-6737deead473f5b2290c3e039e935669d732ded1 jshydra
+77e57ef745092d07ae5d2d05d61f964790332252 jshydra
diff --git a/buildtools/Info.plist.tmpl b/buildtools/Info.plist.tmpl
index d3308fb..67042f1 100644
--- a/buildtools/Info.plist.tmpl
+++ b/buildtools/Info.plist.tmpl
@@ -17,7 +17,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleShortVersionString</key>
- <string>{{ shortVersion }}</string>
+ <string>{{ version }}</string>
<key>CFBundleVersion</key>
<string>{{ version }}</string>
<key>Chrome</key>
@@ -72,6 +72,8 @@
<dict>
<key>Identifier</key>
<string>{{ identifier }}</string>
+ <key>Label</key>
+ <string>{{ name }}</string>
{%- for key, value in props.iteritems() %}
<key>{{ key }}</key>
{{ str_or_real(value) }}
diff --git a/buildtools/LocaleTester.pm b/buildtools/LocaleTester.pm
index ae7079c..9c00941 100644
--- a/buildtools/LocaleTester.pm
+++ b/buildtools/LocaleTester.pm
@@ -1,5 +1,5 @@
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/bootstrap.js.tmpl b/buildtools/bootstrap.js.tmpl
index 2284641..08878e1 100644
--- a/buildtools/bootstrap.js.tmpl
+++ b/buildtools/bootstrap.js.tmpl
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -20,7 +20,7 @@ const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
-let {Services, atob, btoa, File} = Cu.import("resource://gre/modules/Services.jsm", null);
+let {Services, atob, btoa, File, TextDecoder, TextEncoder} = Cu.import("resource://gre/modules/Services.jsm", null);
{%- if hasXMLHttpRequest %}
let XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1", "nsIXMLHttpRequest");
diff --git a/buildtools/build.py b/buildtools/build.py
index d87b4ad..40e6abf 100644
--- a/buildtools/build.py
+++ b/buildtools/build.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/chainedconfigparser.py b/buildtools/chainedconfigparser.py
index fe795d5..bfe30c3 100644
--- a/buildtools/chainedconfigparser.py
+++ b/buildtools/chainedconfigparser.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/chromeDevenvPoller__.js.tmpl b/buildtools/chromeDevenvPoller__.js.tmpl
index 902a7af..11c2c71 100644
--- a/buildtools/chromeDevenvPoller__.js.tmpl
+++ b/buildtools/chromeDevenvPoller__.js.tmpl
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/chromeInfo.js.tmpl b/buildtools/chromeInfo.js.tmpl
index 64f1731..8d5687f 100644
--- a/buildtools/chromeInfo.js.tmpl
+++ b/buildtools/chromeInfo.js.tmpl
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/imageConversion.py b/buildtools/imageConversion.py
index 51e632b..1ac6ee2 100644
--- a/buildtools/imageConversion.py
+++ b/buildtools/imageConversion.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/install.rdf.tmpl b/buildtools/install.rdf.tmpl
index bfc643b..900a4ef 100644
--- a/buildtools/install.rdf.tmpl
+++ b/buildtools/install.rdf.tmpl
@@ -2,7 +2,7 @@
<!--
- This file is part of the Adblock Plus build tools,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/buildtools/jshydra/autotest/abprewrite_source.js b/buildtools/jshydra/autotest/abprewrite_source.js
index dec712d..14bb25d 100644
--- a/buildtools/jshydra/autotest/abprewrite_source.js
+++ b/buildtools/jshydra/autotest/abprewrite_source.js
@@ -20,20 +20,22 @@ let [a, b] = foo();
let {x: y} = foo();
let {k1: v1, k2: v2} = foo();
-for each (let v in fooList)
+
+for (let v of fooList)
alert(v);
-for each (let [a, b] in fooList)
+for (let [a, b] of fooList)
{
a += b;
b -= a;
}
-for each (let [a, b] in fooList);
+for (let [a, b] of fooList);
-for each (k in fooList)
+for (k of fooList)
alert(k);
+
let a = function() 1;
let b = {
get foo() 1
diff --git a/buildtools/jshydra/autotest/test_abprewrite.js.expected b/buildtools/jshydra/autotest/test_abprewrite.js.expected
index 9642305..3b7f582 100644
--- a/buildtools/jshydra/autotest/test_abprewrite.js.expected
+++ b/buildtools/jshydra/autotest/test_abprewrite.js.expected
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/jshydra/autotest/test_abprewrite_module.js.expected b/buildtools/jshydra/autotest/test_abprewrite_module.js.expected
index eef2e5e..8debcdd 100644
--- a/buildtools/jshydra/autotest/test_abprewrite_module.js.expected
+++ b/buildtools/jshydra/autotest/test_abprewrite_module.js.expected
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/jshydra/jshydra.js b/buildtools/jshydra/jshydra.js
index 046bb65..588d472 100644
--- a/buildtools/jshydra/jshydra.js
+++ b/buildtools/jshydra/jshydra.js
@@ -40,4 +40,4 @@ var _print = print;
for (var i = 1; i < scriptArgs.length; i++)
process_js(Reflect.parse(read(scriptArgs[i])), scriptArgs[i], scriptArg);
-})(arguments);
+})(this.arguments || this.scriptArgs);
diff --git a/buildtools/jshydra/scripts/abprewrite.js b/buildtools/jshydra/scripts/abprewrite.js
index a4aaf52..8ca06ba 100644
--- a/buildtools/jshydra/scripts/abprewrite.js
+++ b/buildtools/jshydra/scripts/abprewrite.js
@@ -320,33 +320,8 @@ function modifyForInStatement(ast)
{
if (ast.each)
{
- // Convert "for each" loops:
- // for each (var foo in fooList)
- // {
- // ...
- // }
- //
- // Change into:
- // for (var _loopIndex44 = 0; _loopIndex44 < fooList.length; ++_loopIndex44)
- // {
- // var foo = fooList[_loopIndex44];
- // ...
- // }
- let loopIndex = Identifier("_loopIndex" + options.varIndex++);
-
- let block = ensureBlock(ast.body);
- if (ast.left.type == "VariableDeclaration")
- block.body.unshift(VariableDeclaration(ast.left.declarations[0].id, Member(ast.right, loopIndex, true)));
- else
- block.body.unshift(Assignment(ast.left, Member(ast.right, loopIndex, true)));
-
- return {
- type: "ForStatement",
- init: VariableDeclaration(loopIndex, 0),
- test: LogicalExpression(loopIndex, "<", Member(ast.right, "length", false)),
- update: IncExpression(loopIndex),
- body: block
- };
+ print("Use for (.. of ..) instead of for each (..)!\n");
+ throw new Error("Use for (.. of ..) instead of for each (..)!");
}
// Make sure that the loop body is always wrapped in a block
@@ -355,6 +330,37 @@ function modifyForInStatement(ast)
return ast;
}
+function modifyForOfStatement(ast)
+{
+ // Convert "for of" loops:
+ // for (var foo of fooList)
+ // {
+ // ...
+ // }
+ //
+ // Change into:
+ // for (var _loopIndex44 = 0; _loopIndex44 < fooList.length; ++_loopIndex44)
+ // {
+ // var foo = fooList[_loopIndex44];
+ // ...
+ // }
+ let loopIndex = Identifier("_loopIndex" + options.varIndex++);
+
+ let block = ensureBlock(ast.body);
+ if (ast.left.type == "VariableDeclaration")
+ block.body.unshift(VariableDeclaration(ast.left.declarations[0].id, Member(ast.right, loopIndex, true)));
+ else
+ block.body.unshift(Assignment(ast.left, Member(ast.right, loopIndex, true)));
+
+ return {
+ type: "ForStatement",
+ init: VariableDeclaration(loopIndex, 0),
+ test: LogicalExpression(loopIndex, "<", Member(ast.right, "length", false)),
+ update: IncExpression(loopIndex),
+ body: block
+ };
+}
+
function modifyLetStatement(ast)
{
if (ast.body.type == "ForStatement" && ast.body.init == null)
@@ -475,7 +481,7 @@ function modifyYieldExpression(ast)
process_js = function(ast, filename, args)
{
- for each (let arg in args.split(/\s+/))
+ for (let arg of args.split(/\s+/))
{
let match = /^(\w+)\s*=\s*(.*)/.exec(arg);
if (match && typeof options[match[1]] == "boolean")
@@ -490,7 +496,7 @@ process_js = function(ast, filename, args)
// is being processed.
_print('/*');
_print(' * This file is part of Adblock Plus <http://adblockplus.org/>,');
- _print(' * Copyright (C) 2006-2013 Eyeo GmbH');
+ _print(' * Copyright (C) 2006-2014 Eyeo GmbH');
_print(' *');
_print(' * Adblock Plus is free software: you can redistribute it and/or modify');
_print(' * it under the terms of the GNU General Public License version 3 as');
diff --git a/buildtools/jshydra/scripts/astDecompile.js b/buildtools/jshydra/scripts/astDecompile.js
index 2a7b18d..dc68d21 100644
--- a/buildtools/jshydra/scripts/astDecompile.js
+++ b/buildtools/jshydra/scripts/astDecompile.js
@@ -134,6 +134,17 @@ function decompileForInStatement(ast) {
return str;
}
+function decompileForOfStatement(ast) {
+ let str = "for (";
+ if (ast.left.type == "VariableDeclaration")
+ str += decompileVariableDeclaration(ast.left, true);
+ else
+ str += decompileAST(ast.left);
+ str += " of " + decompileExpr(ast.right, ast) + ") ";
+ str += decompileAST(ast.body);
+ return str;
+}
+
function decompileLetStatement(ast) {
let str = "let (";
str += [d ? decompileAST(d) : ' ' for each (d in ast.head)].join(', ');
diff --git a/buildtools/jshydra/utils.py b/buildtools/jshydra/utils.py
index 2fb0ece..809c7f0 100644
--- a/buildtools/jshydra/utils.py
+++ b/buildtools/jshydra/utils.py
@@ -27,7 +27,7 @@ def ensureJSShell():
if sys.platform not in platform_map:
raise Exception('Unknown platform, is there a JS shell version for it?')
- download_url = 'https://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/20.0-candidates/build1/jsshell-%s.zip' % platform_map[sys.platform]
+ download_url = 'https://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/2013/01/2013-01-01-03-45-03-mozilla-esr17/jsshell-%s.zip' % platform_map[sys.platform]
data = StringIO(urllib.urlopen(download_url).read())
zip = zipfile.ZipFile(data)
zip.extractall(shell_dir)
diff --git a/buildtools/lib/hooks.js b/buildtools/lib/hooks.js
index cbfc0cf..8645a8b 100644
--- a/buildtools/lib/hooks.js
+++ b/buildtools/lib/hooks.js
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/lib/keySelector.js b/buildtools/lib/keySelector.js
index 8303961..20847d9 100644
--- a/buildtools/lib/keySelector.js
+++ b/buildtools/lib/keySelector.js
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/lib/prefs.js b/buildtools/lib/prefs.js
index bd124b7..e1b6ae0 100644
--- a/buildtools/lib/prefs.js
+++ b/buildtools/lib/prefs.js
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/lib/windowObserver.js b/buildtools/lib/windowObserver.js
index 277c6c6..eb0b13a 100644
--- a/buildtools/lib/windowObserver.js
+++ b/buildtools/lib/windowObserver.js
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/localeTools.py b/buildtools/localeTools.py
index 7938159..f0dd721 100644
--- a/buildtools/localeTools.py
+++ b/buildtools/localeTools.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/manifest.json.tmpl b/buildtools/manifest.json.tmpl
index bfb8d0a..0655f68 100644
--- a/buildtools/manifest.json.tmpl
+++ b/buildtools/manifest.json.tmpl
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/buildtools/packager.py b/buildtools/packager.py
index 2840935..86fca1f 100644
--- a/buildtools/packager.py
+++ b/buildtools/packager.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/packagerChrome.py b/buildtools/packagerChrome.py
index 6e4f827..923a8ec 100644
--- a/buildtools/packagerChrome.py
+++ b/buildtools/packagerChrome.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
@@ -50,42 +50,46 @@ def processFile(path, data, params):
# that it can be overridden if necessary.
return data
-def createManifest(params):
+def makeIcons(files, filenames):
+ from PIL import Image
+ icons = {}
+ for filename in filenames:
+ width, height = Image.open(StringIO(files[filename])).size
+ if(width != height):
+ print >>sys.stderr, 'Warning: %s size is %ix%i, icon should be square' % (filename, width, height)
+ icons[width] = filename
+ return icons
+
+def createManifest(params, files):
template = getTemplate('manifest.json.tmpl')
templateData = dict(params)
baseDir = templateData['baseDir']
metadata = templateData['metadata']
- if metadata.has_option('general', 'pageAction') and metadata.get('general', 'pageAction') != '':
- if re.search(r'\s+', metadata.get('general', 'pageAction')):
- icon, popup = re.split(r'\s+', metadata.get('general', 'pageAction'), 1)
- else:
- icon, popup = (metadata.get('general', 'pageAction'), None)
- templateData['pageAction'] = {'icon': icon, 'popup': popup}
+ for opt in ('browserAction', 'pageAction'):
+ if not metadata.has_option('general', opt):
+ continue
- if metadata.has_option('general', 'browserAction') and metadata.get('general', 'browserAction') != '':
- if re.search(r'\s+', metadata.get('general', 'browserAction')):
- icon, popup = re.split(r'\s+', metadata.get('general', 'browserAction'), 1)
- else:
- icon, popup = (metadata.get('general', 'browserAction'), None)
- templateData['browserAction'] = {'icon': icon, 'popup': popup}
+ icons = metadata.get('general', opt).split()
+ if not icons:
+ continue
- if metadata.has_option('general', 'icons'):
- icons = {}
- iconsDir = baseDir
- for dir in metadata.get('general', 'icons').split('/')[0:-1]:
- iconsDir = os.path.join(iconsDir, dir)
+ if len(icons) == 1:
+ # ... = icon.png
+ icon, popup = icons[0], None
+ elif len(icons) == 2:
+ # ... = icon.png popup.html
+ icon, popup = icons
+ else:
+ # ... = icon-19.png icon-38.png popup.html
+ popup = icons.pop()
+ icon = makeIcons(files, icons)
- prefix, suffix = metadata.get('general', 'icons').split('/')[-1].split('?', 1)
- for file in os.listdir(iconsDir):
- path = os.path.join(iconsDir, file)
- if os.path.isfile(path) and file.startswith(prefix) and file.endswith(suffix):
- size = file[len(prefix):-len(suffix)]
- if not re.search(r'\D', size):
- icons[size] = os.path.relpath(path, baseDir).replace('\\', '/')
+ templateData[opt] = {'icon': icon, 'popup': popup}
- templateData['icons'] = icons
+ if metadata.has_option('general', 'icons'):
+ templateData['icons'] = makeIcons(files, metadata.get('general', 'icons').split())
if metadata.has_option('general', 'permissions'):
templateData['permissions'] = re.split(r'\s+', metadata.get('general', 'permissions'))
@@ -160,6 +164,12 @@ def convertJS(params, files):
sourceFiles = map(lambda f: os.path.abspath(os.path.join(baseDir, f)), sourceFiles)
files[file] = doRewrite(sourceFiles, args)
+def toJson(data):
+ return json.dumps(
+ data, ensure_ascii=False, sort_keys=True,
+ indent=2, separators=(',', ': ')
+ ).encode('utf-8') + '\n'
+
def importGeckoLocales(params, files):
import localeTools
@@ -261,8 +271,7 @@ def importGeckoLocales(params, files):
except Exception, e:
print 'Warning: error importing locale data from %s: %s' % (sourceFile, e)
- files[targetFile] = json.dumps(data, ensure_ascii=False, sort_keys=True,
- indent=2, separators=(',', ': ')).encode('utf-8') + '\n'
+ files[targetFile] = toJson(data)
if params['type'] == 'opera':
# Opera has a slightly different locale mapping
@@ -279,6 +288,24 @@ def importGeckoLocales(params, files):
files[operaFile] = files[chromeFile]
del files[chromeFile]
+def fixMissingTranslations(files):
+ # Chrome requires messages used in manifest.json to be given in all languages
+ defaults = {}
+ data = json.loads(files['_locales/%s/messages.json' % defaultLocale])
+ for match in re.finditer(r'__MSG_(\S+)__', files['manifest.json']):
+ name = match.group(1)
+ defaults[name] = data[name]
+
+ for filename in files:
+ if not filename.startswith('_locales/') or not filename.endswith('/messages.json'):
+ continue
+
+ data = json.loads(files[filename])
+ for name, info in defaults.iteritems():
+ data.setdefault(name, info)
+
+ files[filename] = toJson(data)
+
def signBinary(zipdata, keyFile):
import M2Crypto
if not os.path.exists(keyFile):
@@ -322,7 +349,7 @@ def createBuild(baseDir, type='chrome', outFile=None, buildNum=None, releaseBuil
files = Files(getPackageFiles(params), getIgnoredFiles(params),
process=lambda path, data: processFile(path, data, params))
- files['manifest.json'] = createManifest(params)
+
if metadata.has_section('mapping'):
files.readMappedFiles(metadata.items('mapping'))
files.read(baseDir)
@@ -342,6 +369,9 @@ def createBuild(baseDir, type='chrome', outFile=None, buildNum=None, releaseBuil
if metadata.has_section('import_locales'):
importGeckoLocales(params, files)
+
+ files['manifest.json'] = createManifest(params, files)
+ fixMissingTranslations(files)
if devenv:
files['devenvPoller__.js'] = createPoller(params)
diff --git a/buildtools/packagerGecko.py b/buildtools/packagerGecko.py
index f4a9407..ab73145 100644
--- a/buildtools/packagerGecko.py
+++ b/buildtools/packagerGecko.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/packagerSafari.py b/buildtools/packagerSafari.py
index b2838e2..6374f3f 100644
--- a/buildtools/packagerSafari.py
+++ b/buildtools/packagerSafari.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
@@ -87,7 +87,6 @@ def createManifest(params, files):
return template.render(
basename=metadata.get('general', 'basename'),
version=params['version'],
- shortVersion=metadata.get('general', 'version'),
releaseBuild=params['releaseBuild'],
name=catalog['name']['message'],
description=catalog['description_safari']['message'],
diff --git a/buildtools/publicSuffixListUpdater.py b/buildtools/publicSuffixListUpdater.py
index 471c54c..c581cbf 100644
--- a/buildtools/publicSuffixListUpdater.py
+++ b/buildtools/publicSuffixListUpdater.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/buildtools/releaseAutomation.py b/buildtools/releaseAutomation.py
index 87d92b8..6eaae73 100644
--- a/buildtools/releaseAutomation.py
+++ b/buildtools/releaseAutomation.py
@@ -1,7 +1,7 @@
# coding: utf-8
# This file is part of the Adblock Plus build tools,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
@@ -26,14 +26,17 @@ def run(baseDir, type, version, keyFile, downloadsRepo):
# Replace version number in metadata file "manually", ConfigParser will mess
# up the order of lines.
- handle = open(packager.getMetadataPath(baseDir, type), 'rb')
- rawMetadata = handle.read()
- handle.close()
- versionRegExp = re.compile(r'^(\s*version\s*=\s*).*', re.I | re.M)
- rawMetadata = re.sub(versionRegExp, r'\g<1>%s' % version, rawMetadata)
- handle = open(packager.getMetadataPath(baseDir, type), 'wb')
- handle.write(rawMetadata)
- handle.close()
+ metadata = packager.readMetadata(baseDir, type)
+ with open(metadata.option_source("general", "version"), 'r+b') as file:
+ rawMetadata = file.read()
+ rawMetadata = re.sub(
+ r'^(\s*version\s*=\s*).*', r'\g<1>%s' % version,
+ rawMetadata, flags=re.I | re.M
+ )
+
+ file.seek(0)
+ file.write(rawMetadata)
+ file.truncate()
# Read extension name from locale data
import buildtools.packagerGecko as packagerGecko
diff --git a/buildtools/safariInfo.js.tmpl b/buildtools/safariInfo.js.tmpl
index 638a6f2..2ff4dd7 100644
--- a/buildtools/safariInfo.js.tmpl
+++ b/buildtools/safariInfo.js.tmpl
@@ -1,6 +1,6 @@
/*
* This file is part of the Adblock Plus build tools,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/objtabs.css b/chrome/content/objtabs.css
index df4b66f..ce3a830 100644
--- a/chrome/content/objtabs.css
+++ b/chrome/content/objtabs.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/composer.js b/chrome/content/ui/composer.js
index b37d6a4..9ee0618 100644
--- a/chrome/content/ui/composer.js
+++ b/chrome/content/ui/composer.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/composer.xul b/chrome/content/ui/composer.xul
index 8a42ab0..8931e16 100644
--- a/chrome/content/ui/composer.xul
+++ b/chrome/content/ui/composer.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/fennecSettings.xul b/chrome/content/ui/fennecSettings.xul
index 19111b0..9063ba3 100644
--- a/chrome/content/ui/fennecSettings.xul
+++ b/chrome/content/ui/fennecSettings.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/filters-backup.js b/chrome/content/ui/filters-backup.js
index a407c30..3ef38c6 100644
--- a/chrome/content/ui/filters-backup.js
+++ b/chrome/content/ui/filters-backup.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -174,7 +174,7 @@ var Backup =
*/
restoreCustomFilters: function(/**nsIFile*/ file)
{
- IO.readFromFile(file, true, {
+ IO.readFromFile(file, {
seenHeader: false,
subscription: null,
process: function(line)
@@ -331,7 +331,7 @@ var Backup =
yield list[i];
}
- IO.writeToFile(file, true, generator(), function(e)
+ IO.writeToFile(file, generator(), function(e)
{
if (e)
{
diff --git a/chrome/content/ui/filters-filteractions.js b/chrome/content/ui/filters-filteractions.js
index a04fd57..2a1427f 100644
--- a/chrome/content/ui/filters-filteractions.js
+++ b/chrome/content/ui/filters-filteractions.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/filters-filterview.js b/chrome/content/ui/filters-filterview.js
index af30a59..cf51539 100644
--- a/chrome/content/ui/filters-filterview.js
+++ b/chrome/content/ui/filters-filterview.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/filters-search.js b/chrome/content/ui/filters-search.js
index b7a1943..4e817ac 100644
--- a/chrome/content/ui/filters-search.js
+++ b/chrome/content/ui/filters-search.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -134,23 +134,100 @@ var FilterSearch =
*/
FilterSearch.fakeBrowser =
{
- fastFind:
+ finder:
{
+ _resultListeners: [],
searchString: null,
+ caseSensitive: false,
+ lastResult: null,
+
+ _notifyResultListeners: function(result, findBackwards)
+ {
+ this.lastResult = result;
+ for each (let listener in this._resultListeners)
+ listener.onFindResult(result, findBackwards);
+ },
+
+ fastFind: function(searchString, linksOnly, drawOutline)
+ {
+ this.searchString = searchString;
+ let result = FilterSearch.search(this.searchString, 0,
+ this.caseSensitive);
+ this._notifyResultListeners(result, false);
+ },
+
+ findAgain: function(findBackwards, linksOnly, drawOutline)
+ {
+ let result = FilterSearch.search(this.searchString,
+ findBackwards ? -1 : 1,
+ this.caseSensitive);
+ this._notifyResultListeners(result, findBackwards);
+ },
+
+ addResultListener: function(listener)
+ {
+ if (this._resultListeners.indexOf(listener) === -1)
+ this._resultListeners.push(listener);
+ },
+
+ removeResultListener: function(listener)
+ {
+ let index = this._resultListeners.indexOf(listener);
+ if (index !== -1)
+ this._resultListeners.splice(index, 1);
+ },
+
+ // Irrelevant for us
+ highlight: function(highlight, word) {},
+ enableSelection: function() {},
+ removeSelection: function() {},
+ focusContent: function() {},
+ keyPress: function() {}
+ },
+
+ get _lastSearchString()
+ {
+ return this.finder.searchString;
+ },
+
+ // This was used before Firefox 27 instead of the "finder" property.
+ fastFind:
+ {
+ get searchString()
+ {
+ return FilterSearch.fakeBrowser.finder.searchString;
+ },
+
+ set searchString(searchString)
+ {
+ FilterSearch.fakeBrowser.finder.searchString = searchString;
+ },
+
foundLink: null,
foundEditable: null,
- caseSensitive: false,
+
+ get caseSensitive()
+ {
+ return FilterSearch.fakeBrowser.finder.caseSensitive;
+ },
+
+ set caseSensitive(caseSensitive)
+ {
+ FilterSearch.fakeBrowser.finder.caseSensitive = caseSensitive;
+ },
+
get currentWindow() FilterSearch.fakeBrowser.contentWindow,
find: function(searchString, linksOnly)
{
- this.searchString = searchString;
- return FilterSearch.search(this.searchString, 0, this.caseSensitive);
+ FilterSearch.fakeBrowser.finder.fastFind(searchString, linksOnly);
+ return FilterSearch.fakeBrowser.finder.lastResult;
},
findAgain: function(findBackwards, linksOnly)
{
- return FilterSearch.search(this.searchString, findBackwards ? -1 : 1, this.caseSensitive);
+ FilterSearch.fakeBrowser.finder.findAgain(findBackwards, linksOnly);
+ return FilterSearch.fakeBrowser.finder.lastResult;
},
// Irrelevant for us
diff --git a/chrome/content/ui/filters-subscriptionactions.js b/chrome/content/ui/filters-subscriptionactions.js
index 4858500..222a4a6 100644
--- a/chrome/content/ui/filters-subscriptionactions.js
+++ b/chrome/content/ui/filters-subscriptionactions.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/filters-subscriptionview.js b/chrome/content/ui/filters-subscriptionview.js
index b565a52..a1673e4 100644
--- a/chrome/content/ui/filters-subscriptionview.js
+++ b/chrome/content/ui/filters-subscriptionview.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/filters.js b/chrome/content/ui/filters.js
index 5b3ae3b..8830fdb 100644
--- a/chrome/content/ui/filters.js
+++ b/chrome/content/ui/filters.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -136,7 +136,12 @@ var Templater =
let attribute = node.attributes[i];
let len = attribute.value.length;
if (len >= 2 && attribute.value[0] == "{" && attribute.value[len - 1] == "}")
- attribute.value = Cu.evalInSandbox(attribute.value.substr(1, len - 2), sandbox);
+ {
+ let value = Cu.evalInSandbox(attribute.value.substr(1, len - 2), sandbox);
+ if (attribute.name == "condition")
+ value = value ? "true" : "false";
+ attribute.value = value;
+ }
}
}
diff --git a/chrome/content/ui/filters.xul b/chrome/content/ui/filters.xul
index 841540c..b16d986 100644
--- a/chrome/content/ui/filters.xul
+++ b/chrome/content/ui/filters.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/firstRun.html b/chrome/content/ui/firstRun.html
index 0bd5285..a61a01c 100644
--- a/chrome/content/ui/firstRun.html
+++ b/chrome/content/ui/firstRun.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/firstRun.js b/chrome/content/ui/firstRun.js
index bd19283..c19fa09 100644
--- a/chrome/content/ui/firstRun.js
+++ b/chrome/content/ui/firstRun.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/flasher.js b/chrome/content/ui/flasher.js
index 0f43413..ddb4131 100644
--- a/chrome/content/ui/flasher.js
+++ b/chrome/content/ui/flasher.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/i18n.js b/chrome/content/ui/i18n.js
index 6bcfc22..8366268 100644
--- a/chrome/content/ui/i18n.js
+++ b/chrome/content/ui/i18n.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/overlay.xul b/chrome/content/ui/overlay.xul
index 418ca8b..c604428 100644
--- a/chrome/content/ui/overlay.xul
+++ b/chrome/content/ui/overlay.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/progressBar.js b/chrome/content/ui/progressBar.js
index f342342..659acdd 100644
--- a/chrome/content/ui/progressBar.js
+++ b/chrome/content/ui/progressBar.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/progressBar.xul b/chrome/content/ui/progressBar.xul
index 5611816..d940e61 100644
--- a/chrome/content/ui/progressBar.xul
+++ b/chrome/content/ui/progressBar.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/sendReport.js b/chrome/content/ui/sendReport.js
index 4c4a110..3ccc0e6 100644
--- a/chrome/content/ui/sendReport.js
+++ b/chrome/content/ui/sendReport.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -381,7 +381,7 @@ let screenshotDataSource =
this._canvas.height - this.imageOffset * 2);
this._max = this._pixelData.width * this._pixelData.height * 4;
this._i = 0;
- Utils.threadManager.currentThread.dispatch(this, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ Utils.runAsync(this.run.bind(this));
},
run: function()
@@ -401,7 +401,7 @@ let screenshotDataSource =
else
{
this._i = i;
- Utils.threadManager.currentThread.dispatch(this, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ Utils.runAsync(this.run.bind(this));
}
},
diff --git a/chrome/content/ui/sendReport.xul b/chrome/content/ui/sendReport.xul
index 8dfa630..54e0726 100644
--- a/chrome/content/ui/sendReport.xul
+++ b/chrome/content/ui/sendReport.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/settings.xul b/chrome/content/ui/settings.xul
index ffef40c..8e79441 100644
--- a/chrome/content/ui/settings.xul
+++ b/chrome/content/ui/settings.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/sidebar.js b/chrome/content/ui/sidebar.js
index 642fec8..358aebe 100644
--- a/chrome/content/ui/sidebar.js
+++ b/chrome/content/ui/sidebar.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/sidebar.xul b/chrome/content/ui/sidebar.xul
index 96fa591..180b3ec 100644
--- a/chrome/content/ui/sidebar.xul
+++ b/chrome/content/ui/sidebar.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/sidebarDetached.xul b/chrome/content/ui/sidebarDetached.xul
index 655c65b..b7e117b 100644
--- a/chrome/content/ui/sidebarDetached.xul
+++ b/chrome/content/ui/sidebarDetached.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/subscriptionSelection.js b/chrome/content/ui/subscriptionSelection.js
index 0f6bd80..3fdcc18 100644
--- a/chrome/content/ui/subscriptionSelection.js
+++ b/chrome/content/ui/subscriptionSelection.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/content/ui/subscriptionSelection.xul b/chrome/content/ui/subscriptionSelection.xul
index 957ef6c..17f1854 100644
--- a/chrome/content/ui/subscriptionSelection.xul
+++ b/chrome/content/ui/subscriptionSelection.xul
@@ -2,7 +2,7 @@
<!--
- This file is part of Adblock Plus <http://adblockplus.org/>,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
diff --git a/chrome/content/ui/subscriptions.xml b/chrome/content/ui/subscriptions.xml
index 7d80090..9514aa8 100644
--- a/chrome/content/ui/subscriptions.xml
+++ b/chrome/content/ui/subscriptions.xml
@@ -2,7 +2,7 @@
<!--
- This file is part of the Adblock Plus web scripts,
- - Copyright (C) 2006-2013 Eyeo GmbH
+ - 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
@@ -36,12 +36,12 @@
homepage="http://stanev.org/abp/"
prefixes="bg"
author="Александър Станев"/>
- <subscription title="ChinaList+EasyList"
+ <subscription title="EasyList China+EasyList"
specialization="中文"
- url="https://easylist-downloads.adblockplus.org/chinalist+easylist.txt"
- homepage="http://chinalist.github.io/"
+ url="https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt"
+ homepage="http://abpchina.org/forum/"
prefixes="zh"
- author="Gythialy"/>
+ author="John, Li, Jiefei"/>
<subscription title="EasyList Czech and Slovak+EasyList"
specialization="čeština, slovenčina"
url="https://easylist-downloads.adblockplus.org/easylistczechslovak+easylist.txt"
diff --git a/chrome/content/ui/utils.js b/chrome/content/ui/utils.js
index 0ff61b0..49f6e7f 100644
--- a/chrome/content/ui/utils.js
+++ b/chrome/content/ui/utils.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/locale/ar/overlay.dtd b/chrome/locale/ar/overlay.dtd
index 3d7e93b..9140f1a 100644
--- a/chrome/locale/ar/overlay.dtd
+++ b/chrome/locale/ar/overlay.dtd
@@ -1,7 +1,7 @@
<!ENTITY notification.button.yes "&نعم">
<!ENTITY notification.button.no "&لا">
<!ENTITY sync.label "م&زامنة إعدادات آدبلوك بلس">
-<!ENTITY whitelist.site.label "تعطيل في ؟1؟">
+<!ENTITY whitelist.site.label "تعطيل في ?1?">
<!ENTITY filters.label "ت&فضيلات الفلتر">
<!ENTITY disable.label "تعطيل في جميع الأماكن">
<!ENTITY objecttab.title "أحجب">
diff --git a/chrome/locale/eu/.incomplete b/chrome/locale/ast/.incomplete
similarity index 100%
copy from chrome/locale/eu/.incomplete
copy to chrome/locale/ast/.incomplete
diff --git a/chrome/locale/ast/firstRun.properties b/chrome/locale/ast/firstRun.properties
new file mode 100644
index 0000000..cbf9162
--- /dev/null
+++ b/chrome/locale/ast/firstRun.properties
@@ -0,0 +1,6 @@
+firstRun_toggle_off=DESACTIVÁU
+firstRun_title=Instalóse Adblock Plus
+firstRun_acceptableAdsExplanation=Queremos afalar que les páxines web usen una publicidá más direuta y qu'estorbe menos. Poro, establecimos unes <a>regles estrictes</a> col envís d'identificar los anuncios aceptables, que s'amuesen nes opciones predeterminaes. Si inda quier bloquiar tola publicidá, pue <a>desactivar</a> esto nunos segundos.
+firstRun_toggle_on=ACTIVÁU
+firstRun_dataCorruptionWarning=¿Sigue apaeciendo esta páxina? <a>¡Calque equí!</a>
+firstRun_acceptableAdsHeadline=Los anuncios cafiantes bloquiaránse darréu
diff --git a/chrome/locale/bs/firstRun.properties b/chrome/locale/bs/firstRun.properties
new file mode 100644
index 0000000..72cd2d6
--- /dev/null
+++ b/chrome/locale/bs/firstRun.properties
@@ -0,0 +1,17 @@
+firstRun_feature_tracking_description=Surfajte privatno tako što ćete onemogućiti praćenje - skrivanjem vaših tragova od reklamnih kompanija koje bi vas pratile još više.
+firstRun_toggle_off=ISKLJUČENO
+firstRun_feature_tracking=Onemogući praćenje
+firstRun_feature_social=Ukloni dugmad za socijalne mreže
+firstRun_title=Adblock Plus je instaliran
+firstRun_feature_malware=Blokiranje Malwarea
+firstRun_toggle_on=UKLJUČENO
+firstRun_contributor_credits=Lista saradnika
+firstRun_dataCorruptionWarning=Da li se ova stranica stalno pojavljuje? <a>Kliknite ovdje!</a>
+firstRun_acceptableAdsHeadline=Dosadne reklame će sada biti blokirane
+firstRun_share=Preporučite nas prijateljima
+firstRun_share_headline=<a>Pomozite nam</a> da web učinimo boljim
+firstRun_features=Adblock Plus može uraditi mnogo više od samog bokiranja reklama
+firstRun_feature_malware_description=Učinite vaše surfanje sigurnijim blokiranjem poznatih malware domena.
+firstRun_feature_social_description=Automatski uklonite dugmad socijalnih mreža, kao što je Facebook Like, koja se prikazuju na web stranicama i prate vaše navike.
+firstRun_donate=doniraj
+firstRun_donate_label=Podržite naš projekat
diff --git a/chrome/locale/bs/meta.properties b/chrome/locale/bs/meta.properties
new file mode 100644
index 0000000..49f6032
--- /dev/null
+++ b/chrome/locale/bs/meta.properties
@@ -0,0 +1,4 @@
+translator=Wladimir Palant
+description.short=Blokirajte dosadne video reklame na Youtubeu i Facebooku, banere i još mnogo toga.\n\nAdblock Plus blokira dosadne reklame i podržava web stranice tako što ne blokirane neupdaljive reklame (prilagodljivo).
+name=Adblock Plus
+description=Reklame su prošlost!
diff --git a/chrome/locale/bs/overlay.dtd b/chrome/locale/bs/overlay.dtd
new file mode 100644
index 0000000..50ae52b
--- /dev/null
+++ b/chrome/locale/bs/overlay.dtd
@@ -0,0 +1,2 @@
+<!ENTITY status.tooltip "Status:">
+<!ENTITY options.label "&Opcije">
diff --git a/chrome/locale/ca/global.properties b/chrome/locale/ca/global.properties
index 8badf78..1145e04 100644
--- a/chrome/locale/ca/global.properties
+++ b/chrome/locale/ca/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=La pàgina actual no conté elements bloquejables
action3_tooltip=Clica per activar/desactivar Adblock Plus
+notification_antiadblock_title=Amagar missatges dirigits?
type_label_script=script
filter_elemhide_nocriteria=Cap criteri especificat per reconeixes l'element a amagar
blockingGroup_title=Regles de blocatge d'anuncis
@@ -24,6 +25,7 @@ type_label_object=objecte
action2_tooltip=Clica per obrir les preferències, clica amb el botó del mig per activar/desactivar.
type_label_subdocument=marc
clearStats_warning=Això reiniciarà totes les estadístiques d'ús del filtre.Vols procedir?
+notification_antiadblock_message=Aquesta web ha sigut coneguda per mostrar missatges dirigits a usuaris de Adblock Plus. Vols que Adblock Plus amague els missatges dirigits?
blocked_count_addendum=(també a la llista blanca: ?1?, amagats: ?2?)
subscription_invalid_location=La llista de filtres no és una URL vàlida ni un nom de fitxer vàlid.
type_label_image=imatge
diff --git a/chrome/locale/ca/overlay.dtd b/chrome/locale/ca/overlay.dtd
index 544a5e1..1f35a36 100644
--- a/chrome/locale/ca/overlay.dtd
+++ b/chrome/locale/ca/overlay.dtd
@@ -1,3 +1,5 @@
+<!ENTITY notification.button.yes "&Si">
+<!ENTITY notification.button.no "&No">
<!ENTITY sync.label "&Sincronitza la configuració de l'AdBlock Plus">
<!ENTITY whitelist.site.label "Inhabilita l'Adblock Plus a ?1?">
<!ENTITY filters.label "Pre&ferències del filtre">
@@ -11,6 +13,7 @@
<!ENTITY context.image.label "Adblock Plus: bloca la imatge">
<!ENTITY counthits.label "Compta els cops que &funciona el filtre">
<!ENTITY opensidebar.label "O&bre elements blocables">
+<!ENTITY notification.button.close "&Tancar">
<!ENTITY contribute.label "Contribueix a l'Adblock Plus">
<!ENTITY toolbarbutton.label "Adblock Plus">
<!ENTITY context.frame.label "Adblock Plus: bloca el marc">
diff --git a/chrome/locale/cs/meta.properties b/chrome/locale/cs/meta.properties
index 9eee11e..926238b 100644
--- a/chrome/locale/cs/meta.properties
+++ b/chrome/locale/cs/meta.properties
@@ -1,6 +1,6 @@
description.short=Jste otráveni reklamami? Znepokojuje Vás být sledováni? Obtěžují Vás bannery? Nainstalujte si Adblock Plus a získejte zpět kontrolu nad internetem a změňte tak Váš dosavadní pohled na web.
name=Adblock Plus
description.long.addition1=Počínaje Adblockem Plus 2.0 je v Předvolbách filtrů volba povolující některé z neobtěžujících reklam. Cílem je podpořit webové stránky používající neobtěžující způsoby reklamy a podnítit více webových stránek ke stejnému chování. <a href="http://adblockplus.org/en/acceptable-ads">Zjistit více</a>(anglicky)
-translator=Wladimir Palant
+translator=Jakub Tománek
description.long=Adblock Plus Vám umožňuje získat zpět kontrolu nad internetem a prohlížet web tak, jak chcete Vy. Tento doplněk je podpořen více než čtyřiceti příspěvky sad filtrů v mnohých jazycích, které ho automaticky nastaví za účely od odstranění internetové reklamy až po blokování všech známých malwarových domén. Adblock Plus Vám také umožňuje upravovat Vaše filtry s pomocí různých užitečných funkcí včetně kontextové nabídky u obrázků, blokovacích oušek u Flash a Java objektů a se [...]
description=A reklamy jsou minulostí!
diff --git a/chrome/locale/de/composer.dtd b/chrome/locale/de/composer.dtd
index 3eb6ea6..4f58c81 100644
--- a/chrome/locale/de/composer.dtd
+++ b/chrome/locale/de/composer.dtd
@@ -2,11 +2,11 @@
<!ENTITY domainRestriction.label "Auf Do&main beschränken:">
<!ENTITY collapse.default.no.label "Standardeinstellung (nein)">
<!ENTITY firstParty.label "Nur für Elemente der Ursprungsseite">
-<!ENTITY preferences.label "Existierende Filter an&zeigen...">
+<!ENTITY preferences.label "Existierende Filter an&zeigen ...">
<!ENTITY pattern.label "Muster suchen">
<!ENTITY thirdParty.label "Nur für Elemen&te von Drittseiten">
<!ENTITY filter.label "Neue &Filter:">
-<!ENTITY collapse.label "Fall blockieren:">
+<!ENTITY collapse.label "Platz frei&geben:">
<!ENTITY match.warning "Das Muster, das Sie eingegeben haben, passt nicht mehr zu der Adresse, für die der Filter erstellt werden soll. Es wird keinen Einfluss mehr auf diese Adresse haben.">
<!ENTITY anchor.start.label "am Anfang der Adresse">
<!ENTITY matchCase.label "Groß-/&Kleinschreibung beachten">
@@ -16,7 +16,7 @@
<!ENTITY regexp.warning "Das Muster, das Sie eingegeben haben, wird als regulärer Ausdruck interpretiert. Zu viele reguläre Ausdrücke könnten Ihren Browser verlangsamen. Falls Sie nicht beabsichtigt haben, reguläre Ausdrücke zu verwenden, fügen Sie einfach das Symbol '*' am Ende des Musters an.">
<!ENTITY dialog.title "Neuen Filter hinzufügen">
<!ENTITY basic.label "Standardansicht">
-<!ENTITY type.filter.label "&Blockierfilter">
+<!ENTITY type.filter.label "&Blockierregel">
<!ENTITY types.label "Auf Elementtypen anwenden:">
<!ENTITY shortpattern.warning "Das Muster, das Sie eingegeben haben, ist zu kurz zum Optimieren. Zu viele solche Muster könnten Ihren Browser verlangsamen. Es ist deshalb empfehlenswert, nach Möglichkeit ein längeres Muster für diesen Filter zu verwenden.">
<!ENTITY collapse.yes.label "Ja">
diff --git a/chrome/locale/de/filters.dtd b/chrome/locale/de/filters.dtd
index 479e92c..42b5d4c 100644
--- a/chrome/locale/de/filters.dtd
+++ b/chrome/locale/de/filters.dtd
@@ -19,7 +19,7 @@
<!ENTITY noGroupSelected.text "Sie müssen eine Filtergruppe auswählen, um deren Inhalt anzuzeigen.">
<!ENTITY filter.cut.label "Ausschneiden">
<!ENTITY restore.default.label "Sicherung von ?1? wiederherstellen">
-<!ENTITY subscription.lastDownload.inProgress "Wird heruntergeladen...">
+<!ENTITY subscription.lastDownload.inProgress "Wird heruntergeladen ...">
<!ENTITY subscriptions.tab.label "Filterabonnements">
<!ENTITY sort.descending.label "A&bsteigend">
<!ENTITY filters.remove.warning "Wollen Sie wirklich alle ausgewählten Filter löschen?">
diff --git a/chrome/locale/de/sendReport.dtd b/chrome/locale/de/sendReport.dtd
index 9ebd0d2..5dfc848 100644
--- a/chrome/locale/de/sendReport.dtd
+++ b/chrome/locale/de/sendReport.dtd
@@ -31,7 +31,7 @@
<!ENTITY issues.ownfilters.description "Einige der Filter, die auf dieser Seite angewandt wurden, sind benutzerdefiniert.
Bitte deaktivieren Sie Filter, die das Problem verursacht haben könnten:">
<!ENTITY update.inProgress.description "Adblock Plus muss Ihre Filterabonnements aktualisieren, um sicherzustellen,
- dass das Problem nicht bereits gelöst ist. Bitte warten Sie...">
+ dass das Problem nicht bereits gelöst ist. Bitte warten Sie ...">
<!ENTITY sendPage.retry.label "Noch einmal senden">
<!ENTITY data.label "Bericht&daten:">
<!ENTITY recentReports.label "Ihre zuletzt gesendeten Fehlerberichte">
diff --git a/chrome/locale/eo/composer.dtd b/chrome/locale/eo/composer.dtd
index 2be250e..20fc48a 100644
--- a/chrome/locale/eo/composer.dtd
+++ b/chrome/locale/eo/composer.dtd
@@ -1,32 +1,32 @@
-<!ENTITY anchor.end.label "en la &fino de la adreso">
+<!ENTITY anchor.end.label "en la fi&no de la adreso">
<!ENTITY domainRestriction.label "&Limigi al retregiono:">
-<!ENTITY collapse.default.no.label "Uzi defaŭlton (ne)">
-<!ENTITY firstParty.label "N&ur de unua liveranto">
-<!ENTITY preferences.label "Montri &ekzistantajn filtrilojn…">
+<!ENTITY collapse.default.no.label "Uzi apriorojn (ne)">
+<!ENTITY firstParty.label "Nu&r de unua liveranto">
+<!ENTITY preferences.label "Montri &ekzistantajn filtrilojn...">
<!ENTITY pattern.label "Serĉi modelon">
<!ENTITY thirdParty.label "Nur de &tria liveranto">
-<!ENTITY filter.label "No&va filtrilo:">
-<!ENTITY collapse.label "&Maletendi blokitajn:">
+<!ENTITY filter.label "Nova &filtrilo:">
+<!ENTITY collapse.label "Ma&letendi blokitajn:">
<!ENTITY match.warning "La modelo, kiun vi enigis, ne plu konformas kun la adreso, kiu estu blokata/transprenata en la blankan liston kaj ne havos efikon al ĝi.">
<!ENTITY anchor.start.label "en la &komenco de la adreso">
<!ENTITY matchCase.label "&Atenti usklecon">
<!ENTITY custom.pattern.label "&Propraj:">
-<!ENTITY unselectAllTypes.label "Elekti neniun">
+<!ENTITY unselectAllTypes.label "Elekti nenion">
<!ENTITY type.whitelist.label "Es&ceptoregulo">
<!ENTITY regexp.warning "La modelo, kiun vi enigis, estos interpretata kiel regula esprimo, kiu ne povas esti traktata oer Adblock Plus kaj povas malrapidigi vian retumadon. Se vi ne intencas uzi regulan esprimon, aldonu asteriskon (*) al la fino de la modelo.">
<!ENTITY dialog.title "Aldoni filtrilregulon al Adblock Plus">
<!ENTITY basic.label "Baza vido">
<!ENTITY type.filter.label "&Blokanta filtrilo">
-<!ENTITY types.label "Apliki al tipoj:">
+<!ENTITY types.label "Apliki al specoj:">
<!ENTITY shortpattern.warning "La modelo, kiun vi enigis, estas tro mallonga por optimigo kaj povas malrapidigi vian retumadon. Rekomendiĝas, ke vi elektas pli longan signoĉenon por ĉi tiu filtrilo por permesi Adblock Plus trakti la filtrilon pli efike.">
<!ENTITY collapse.yes.label "Jes">
<!ENTITY anchors.label "Akcepti modelon nur:">
-<!ENTITY collapse.default.yes.label "Uzi defaŭlton (jes)">
-<!ENTITY domainRestriction.help "Uzu ĉi tiun opcion por specifi unu retregionon aŭ plurajn retregionojn, separitajn per strekosignon (|). La filtrilo estos nur aplikata al elektitaj retregionoj. Tildo (~) antaŭ retregiona nomo indikas, ke la filtrilo ne estos aplikata al tiu retregiono.">
+<!ENTITY collapse.default.yes.label "Uzi apriorojn (jes)">
+<!ENTITY domainRestriction.help "Uzu ĉi tiun opcion por specifi unu retregionon aŭ plurajn retregionojn, separitajn per strekosigno (|). La filtrilo estos nur aplikata al elektita(j) retregiono(j). Tildo (~) antaŭ retregiona nomo indikas, ke la filtrilo ne estos aplikata al tiu retregiono.">
<!ENTITY accept.label "Aldoni filtrilon">
<!ENTITY options.label "Opcioj">
-<!ENTITY disabled.warning "Addblock Plus estas nun malŝaltita. Vi povas ankoraŭ aldoni filtrilojn, sed ili ne estos aplikataj, ĝis vi [link]ŝaltas Adblock Plus[/link].">
-<!ENTITY anchor.start.flexible.label "en la &komenco de la retregiona nomo">
+<!ENTITY disabled.warning "Addblock Plus estas nun malŝaltita. Vi povas ankoraŭ aldoni filtrilojn sed ili ne estos aplikataj, ĝis vi [link]enŝaltas Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "en la komenco de la retre&giona nomo">
<!ENTITY collapse.no.label "Ne">
<!ENTITY selectAllTypes.label "Elekti ĉion">
<!ENTITY advanced.label "Detala vido">
diff --git a/chrome/locale/eo/meta.properties b/chrome/locale/eo/meta.properties
index d758d2b..6ed62b2 100644
--- a/chrome/locale/eo/meta.properties
+++ b/chrome/locale/eo/meta.properties
@@ -1,6 +1,6 @@
description.short=Ĉu vi ĉagrenas pri anoncoj, kolektantoj de datumoj kaj reklamrubandoj? Instalu Adblock Plus por regajni la kontrolon pri la interreto kaj ŝanĝu la manieron kiel rigardi la reton.\n\nMallonga video estas ĉe http://www.youtube.com/watch?v=oNvb2SjVjjI
name=Adblock Plus
description.long.addition1=Ekde Adblock Plus 2.0 estas opcio en la filtrilaj agordoj, kiu permesas nealtrudiĝantan reklamon. La celo estas, subteni retejojn, kiuj uzas nealtrudiĝantajn manierojn por reklami kaj kuraĝigi pliajn retejojn fari tion. <a href="http://adblockplus.org/en/acceptable-ads">Legu pli</a>
-translator=Milupo
+translator=Wladimir PALANT
description.long=Adblock Plus ebligas al vi regajni la kontrolon pri la interreto kaj rigardi la reton tiel, kiel vi volas tion. La aldonaĵo estas kompletigata per pli ol kvardek filtrilabonoj en dekduoj da lingvoj, kiuj aŭtomate konfiguras ĝin por celoj, komencante kun forigo de reta reklamo ĝis blokado de ĉiuj retregionoj de fiprogramaro. Adblock Plus ankaŭ ebligas al vi adapti viajn filtrilojn helpe de multnombraj utilaj funkcioj, inter ili kunteksta opcio por bildoj, langeto por blok [...]
-description=Anoncoj estis hieraŭ!
+description=Reklamoj estis hieraŭ!
diff --git a/chrome/locale/es-CL/composer.dtd b/chrome/locale/es-CL/composer.dtd
index b71d43f..fa3ff63 100644
--- a/chrome/locale/es-CL/composer.dtd
+++ b/chrome/locale/es-CL/composer.dtd
@@ -1,23 +1,33 @@
+<!ENTITY anchor.end.label "ir al &final de la dirección">
+<!ENTITY domainRestriction.label "&Restringir al dominio:">
<!ENTITY collapse.default.no.label "Usar predeterminado (no)">
+<!ENTITY firstParty.label "So&lo propietarios">
<!ENTITY preferences.label "&Mostrar filtros existentes…">
<!ENTITY pattern.label "Buscar patrón">
+<!ENTITY thirdParty.label "&Solo terceros">
<!ENTITY filter.label "&Nuevo filtro:">
-<!ENTITY types.label "aplicar a">
+<!ENTITY collapse.label "Co&lapso bloqueado:">
+<!ENTITY match.warning "El patrón que ha ingresado ya no concuerda con la dirección a ser Bloqueada/Permitida y no tendrá efecto en la misma.">
+<!ENTITY anchor.start.label "&ir al principio de la dirección">
+<!ENTITY matchCase.label "&Coincidir Mayus/Minus">
<!ENTITY custom.pattern.label "Personalizar:">
<!ENTITY unselectAllTypes.label "No seleccionar ninguno">
<!ENTITY type.whitelist.label "regla de excepción">
<!ENTITY regexp.warning "el patrón que ha introducido puede interpretarse como espresion regular que no puede ser procesada eficientemente por adblock plus y puede ralentizar su navegador. si no quieres usar una ezpresion regular, añade un asterisco (*) al final del patrón.">
-<!ENTITY collapse.yes.label "Sí">
+<!ENTITY dialog.title "Añadir regla de filtrado de Adblock Plus">
<!ENTITY basic.label "Vista básica">
<!ENTITY type.filter.label "filtro de bloqueo">
+<!ENTITY types.label "aplicar a">
<!ENTITY shortpattern.warning "El patrón ingresado es demasiado corto para ser optimizado y puede ralentizar su experiencia de navegación. Se recomienda que elija una cadena más larga de este filtro permitir Adblock Plus procesar el filtro más eficientemente.">
-<!ENTITY dialog.title "Añadir regla de filtrado de Adblock Plus">
+<!ENTITY collapse.yes.label "Sí">
<!ENTITY anchors.label "Sólo aceptar patrones:">
<!ENTITY collapse.default.yes.label "Usar predeterminado (sí)">
<!ENTITY domainRestriction.help "usa esta opcion para especificar un o varios dominios separados por ''|''. el filtro sólo se aplicara a los dominios seleccionados. el simbolo ''~'' antes de un dominio indica que no se le aplicara el filtro">
<!ENTITY accept.label "Añadir filtro">
<!ENTITY options.label "Opciones">
<!ENTITY disabled.warning "Adblock Plus está desactivado. Puede añadir filtros, pero no se aplicarán a menos que [link]active Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&ir al principio del nombre de dominio">
<!ENTITY collapse.no.label "No">
<!ENTITY selectAllTypes.label "Seleccionar todos">
<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de una dirección; asteriscos(*) actuan como comodines. El filtro solo se aplicara a direcciones que igualen el patrón proporcionado.">
diff --git a/chrome/locale/es-CL/filters.dtd b/chrome/locale/es-CL/filters.dtd
new file mode 100644
index 0000000..c6a42a9
--- /dev/null
+++ b/chrome/locale/es-CL/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todas sus filtros personalizados se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?">
+<!ENTITY slow.column "Filtros lentos">
+<!ENTITY enabled.column "Activado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fallido, desajuste de suma de comprobación">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado está vacío.">
+<!ENTITY subscription.actions.label "Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar todos">
+<!ENTITY backupButton.label "&Copias de seguridad y restauración">
+<!ENTITY restore.minVersion.warning "Atención: el archivo se creó con una versión más reciente de Adblock Plus. Debería actualizar a la última versión de Adblock Plus antes de hacer una restauración desde este archivo.">
+<!ENTITY restore.error "No se pudieron procesar los datos del archivo. ¿Es posible que no sea un archivo de copia de seguridad de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordenar A-Z">
+<!ENTITY sort.label "& Ordenar por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&Contador">
+<!ENTITY noFilters.text "Aún no tiene filtros personalizados.">
+<!ENTITY backup.custom.title "Sólo los filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otra extensión">
+<!ENTITY subscription.delete.label "Borrar">
+<!ENTITY noGroupSelected.text "Tiene que seleccionar un grupo de filtros para que se muestren sus filtros.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar copia de seguridad de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando...">
+<!ENTITY subscriptions.tab.label "Filtrar subscripciones">
+<!ENTITY sort.descending.label "Ordenar &Z > A">
+<!ENTITY filters.remove.warning "¿Está seguro de querer eliminar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Borrar">
+<!ENTITY addSubscriptionAdd.label "Agregar">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activado">
+<!ENTITY noSubscriptions.text "Aún no ha añadido nigun filtro de subscripcion. Adblock Plus no bloquea si no hay filtros, por favor usa la opcion "Agregar filtro de subscripcion" para agregar unos.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Filtrar preferencia para Adblock Plus">
+<!ENTITY addFilter.label "A&ñadir filtro">
+<!ENTITY subscription.minVersion.warning "Este filtro de suscripcion requiere una version más reciente de AdBlock Plus, deberías actualizarla a la última version.">
+<!ENTITY subscription.lastDownload.invalidURL "Fallo, direccion inválida">
+<!ENTITY backup.error "Se produjo un error al escribir filtros en el archivo. Asegúrese que el archivo no está protegido contra escritura o siendo utilizado por otra aplicación.">
+<!ENTITY filter.moveUp.label "Mueva hacia arriba">
+<!ENTITY addGroup.label "Agregar filtro y grupo">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir cierta publicidad no intrusiva">
+<!ENTITY addSubscriptionOther.label "Añadir otra suscripcion">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "&Sin ordenar">
+<!ENTITY filter.actions.label "Filtrar acciones">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover hacia abajo">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estadísticas de uso">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Mueva hacia arriba">
+<!ENTITY addSubscription.label "Agregar y filtrar subscripcion">
+<!ENTITY subscription.homepage.label "Página de inicio">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar copia de seguridad propia">
+<!ENTITY restore.complete.warning "Todas sus preferencias de filtros se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nueva copia de seguridad">
+<!ENTITY find.label "&Buscar">
+<!ENTITY subscription.moveDown.label "Mover hacia abajo">
+<!ENTITY subscription.lastDownload.connectionError "Falló, descarga fracaso">
+<!ENTITY subscription.lastDownload.success "Suceso">
+<!ENTITY subscription.lastDownload.invalidData "Falló, no es válida la lista de filtros">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar filltros deesactivados">
+<!ENTITY lasthit.column "&últimouso">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Algúnos filtros en esta suscripcion esta desabilitados.">
+<!ENTITY filter.column "Filtrar regla">
+<!ENTITY subscription.lastDownload.label "Última descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/chrome/locale/es-CL/firstRun.properties b/chrome/locale/es-CL/firstRun.properties
new file mode 100644
index 0000000..80700fa
--- /dev/null
+++ b/chrome/locale/es-CL/firstRun.properties
@@ -0,0 +1,19 @@
+firstRun_feature_tracking_description=Navegue con intimidad desactivando el rastreo - ocultando su rastro a las empresas de publicidad que espían cada uno de sus movimientos.
+firstRun_toggle_off=DESACTIVAR
+firstRun_feature_tracking=Desactivar el rastreo
+firstRun_feature_malware=Bloqueo de malware
+firstRun_title=Adblock Plus ha sido instalado
+firstRun_acceptableAdsExplanation=Nos gustaría fomentar el uso de una publicidad más directa y menos agresiva en los sitios web. Por eso hemos establecido unas <a>directrices estrictas</a> para identificar la publicidad aceptable, que se muestra en modo predeterminado. Si sigue queriendo bloquear toda la publicidad puede <a>desactivar</a> este modo en unos pocos segundos.
+firstRun_toggle_on=ACTIVAR
+firstRun_contributor_credits=Colaboradores
+firstRun_dataCorruptionWarning=¿Esta página sigue apareciendo? <a>Haga clic aquí!</a>
+firstRun_acceptableAdsHeadline=Los anuncios molestos ahora serán bloqueados
+firstRun_share=Dile a tus amigos
+firstRun_share_headline=Danos una mano para hacer de esta web un mejor lugar
+firstRun_features=Adblock Plus no sólo bloquea anuncios, puede hacer más cosas
+firstRun_feature_malware_description=Navegue con más seguridad bloqueando dominios identificados como malware.
+firstRun_feature_social_description=Elimine automáticamente de su navegación los botones de redes sociales, como los "Me gusta" de Facebook, incluidos en las paginas web y que rastrean sus hábitos.
+firstRun_donate=Donar
+firstRun_donate_label=Apoye nuestro proyecto
+firstRun_feature_social=Eliminar botones de redes sociales
+firstRun_legacySafariWarning=Está utilizando una versión antigua de Safari no soportada por Adblock Plus, por lo que podría funcionar incorrectamente o afectar a su experiencia de usuario en algunos sitios web. Le recomendamos actualizar a Safari 6.1.1 o posterior (para Mac OS X 10.8 Mountain Lion), o a Safari 7.0.1 o superior (para Mac OS X 10.9 Mavericks), o usar la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/chrome/locale/fa/composer.dtd b/chrome/locale/fa/composer.dtd
index 10d63b3..6db36c0 100644
--- a/chrome/locale/fa/composer.dtd
+++ b/chrome/locale/fa/composer.dtd
@@ -16,16 +16,16 @@
<!ENTITY regexp.warning "الگویی که شما وارد کرده اید یک نویسه مرتب تفسیر می شود که نمی تواند به صورت بهینه توسط فوق تبلیغ شکن پردازش شود و ممکن است مرور صفحات شمار را کند کند. اگر شما قصد استفاده کردن از یک نویسه مرتب را نداشته اید، یک ستار (*) به انتهای الگوی خود اضافه کنید.">
<!ENTITY dialog.title "اضافه کردن قاعد فیلتر ادبلاک پلاس">
<!ENTITY basic.label "نمایش پایه">
-<!ENTITY type.filter.label "فیلتر م&سدود کننده">
+<!ENTITY type.filter.label "پالایه م&سدود کننده">
<!ENTITY types.label "اعمال به انواع:">
<!ENTITY shortpattern.warning "الگویی که وارد کردید بسیار کوتاه تر از آن است که بهینه باشد و ممکن است سرعت مرور صفحات شما را کند کند. توصیه می شود که جمله طویل تری را وارد کنید که فوق تبلیغ شکن بهتر بتواند آن را پردازش کند.">
<!ENTITY collapse.yes.label "بله">
<!ENTITY anchors.label "پذیرش الگوی تنها:">
<!ENTITY collapse.default.yes.label "استفاده پیشفرض (بله)">
<!ENTITY domainRestriction.help "از این گزینه برای مشخص کردن یک یا چند دامنه از هم جدا شده توسط نوار خط (|) استفاده کنید. پالایه تنها برای دامنه(ها)ی انتخاب شده اعمال می شود. علامت مد (~) قبل از نام دامنه نشاندهنده آن است که پالایه در آن دامنه اعمال نشود.">
-<!ENTITY accept.label "افزودن پالایه">
+<!ENTITY accept.label "افزودن فیلتر">
<!ENTITY options.label "گزینه ها">
-<!ENTITY disabled.warning "اد بلاک پلاس هم اکنون غیر فعال می یاشد. شما هنوز می توانید پالایه اضافه کنید، اما آنها اعمال نمی شوند مگر [link]فوق تبلیغ شکن را فعال کنید[/link].">
+<!ENTITY disabled.warning "فوق تبلیغ شکن هم اکنون غیر فعال می یاشد. شما هنوز می توانید پالایه اضافه کنید، اما آنها اعمال نمی شوند مگر [link]فوق تبلیغ شکن را فعال کنید[/link].">
<!ENTITY anchor.start.flexible.label "در آ&غاز نام دامنه">
<!ENTITY collapse.no.label "خیر">
<!ENTITY selectAllTypes.label "انتخاب همه">
diff --git a/chrome/locale/hi-IN/filters.dtd b/chrome/locale/hi-IN/filters.dtd
index 957a50e..87d68a7 100644
--- a/chrome/locale/hi-IN/filters.dtd
+++ b/chrome/locale/hi-IN/filters.dtd
@@ -1,3 +1,4 @@
+<!ENTITY subscription.lastDownload.invalidURL "विफल रहा, एक मान्य पता नहीं ">
<!ENTITY addSubscriptionOther.label "भिन्न सदस्यता जोड़ें">
<!ENTITY subscription.source.label "फ़िल्टर सूची">
<!ENTITY subscription.lastDownload.connectionError "विफल रहा, डाउनलोड विफलता">
@@ -7,6 +8,6 @@
<!ENTITY subscription.homepage.label "मुखपृष्ठ">
<!ENTITY subscription.external.label "एक अन्य एक्सटेंशन द्वारा अद्यतन किया">
<!ENTITY dialog.title "Adblock प्लस फ़िल्टर वरीयताएँ">
-<!ENTITY subscription.lastDownload.invalidURL "विफल रहा, एक मान्य पता नहीं ">
+<!ENTITY filters.tab.label "nbjh">
<!ENTITY subscription.lastDownload.label "पिछले डाउनलोड:">
<!ENTITY subscriptions.tab.label "फ़िल्टर सदस्यताएँ">
diff --git a/chrome/locale/id/composer.dtd b/chrome/locale/id/composer.dtd
index 746a9c3..867e6ca 100644
--- a/chrome/locale/id/composer.dtd
+++ b/chrome/locale/id/composer.dtd
@@ -1,7 +1,7 @@
<!ENTITY anchor.end.label "&pada akhir dari alamat">
<!ENTITY domainRestriction.label "Membatasi pada & domain:">
<!ENTITY collapse.default.no.label "Gunakan default (tidak)">
-<!ENTITY firstParty.label "Hanya pihak pe&rtama">
+<!ENTITY firstParty.label "&Hanya untuk pihak pertama">
<!ENTITY preferences.label "&Tampilkan filter yang ada...">
<!ENTITY pattern.label "Mencari pola">
<!ENTITY thirdParty.label "Hanya pihak ke&tiga">
@@ -22,7 +22,7 @@
<!ENTITY collapse.yes.label "Ya">
<!ENTITY anchors.label "Hanya menerima pola:">
<!ENTITY collapse.default.yes.label "Gunakan default (Ya)">
-<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk menentukan satu atau lebih ranah yang dipisahkan oleh sebuah garis batang (|). Filter hanya akan diterapkan pada ranah yang dipilih. Sebuah tanda lekuk (~) sebelum nama ranah menunjukkan bahwa tapis tidak akan diterapkan pada ranah tersebut.">
+<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk menentukan satu atau lebih domain yang dipisahkan oleh sebuah garis bar(|). Filter hanya akan diterapkan pada domain yang dipilih. Sebuah tilde (~) sebelum nama domain menunjukkan bahwa filter tidak akan diterapkan pada domain tersebut.">
<!ENTITY accept.label "Tambahkan filter">
<!ENTITY options.label "Pilihan">
<!ENTITY disabled.warning "Adblock Plus sedang dimatikan. Anda masih dapat menambahkan filter tetapi mereka tidak akan diterapkan kecuali Anda [link] mengaktifkan Adblock Plus [/link].">
diff --git a/chrome/locale/id/meta.properties b/chrome/locale/id/meta.properties
index 91fd7cd..c00bd68 100644
--- a/chrome/locale/id/meta.properties
+++ b/chrome/locale/id/meta.properties
@@ -1,6 +1,5 @@
+description.long.addition1=Dimulai dengan Adblock Plus 2.0 terdapat pilihan dalam Preferensi Penyaring untuk memungkinkan beberapa iklan yg tidak menggangu. Tujuannya untuk mendukung situs web dengan menggunakan cara-cara yang tidak mengganguf untuk beriklan dan mendorong lebih banyak website melakukan hal yang sama. <a href="http://adblockplus.org/en/acceptable-ads"> Baca lebih lanjut</a>
description.short=Terganggu oleh iklan? Terganggu oleh pelacakan? Terganggu oleh banner? Pasang Adblock Plus sekarang untuk mendapatkan kembali kendali atas internet dan mengubah cara Anda melihat web. Ringkasan video pendek tentang Adblock Plus tersedia di http://www.youtube.com/watch?v=oNvb2SjVjjI
name=Adblock Plus
-description.long.addition1=Dimulai dengan Adblock Plus 2.0 terdapat pilihan dalam Preferensi Penyaring untuk memungkinkan beberapa iklan yg tidak menggangu. Tujuannya untuk mendukung situs web dengan menggunakan cara-cara yang tidak mengganguf untuk beriklan dan mendorong lebih banyak website melakukan hal yang sama. <a href="http://adblockplus.org/en/acceptable-ads"> Baca lebih lanjut</a>
-translator=Wladimir Palant
description.long=Adblock Plus memungkinkan Anda untuk mendapatkan kembali kendali atas internet dan melihat web seperti yang Anda inginkan. Add-on ini didukung oleh lebih dari empat puluh filter berlangganan dalam puluhan bahasa yang secara otomatis dikonfigurasi untuk keperluan mulai dari menghapus iklan online dan memblokir semua domain malware yang diketahui. Adblock Plus juga memungkinkan Anda untuk menyesuaikan filter Anda dengan bantuan berbagai fitur berguna, termasuk pilihan kont [...]
description=Iklan sudah menjadi masa lalu!
diff --git a/chrome/locale/id/subscriptionSelection.dtd b/chrome/locale/id/subscriptionSelection.dtd
index 5103b02..4092dd2 100644
--- a/chrome/locale/id/subscriptionSelection.dtd
+++ b/chrome/locale/id/subscriptionSelection.dtd
@@ -1,4 +1,4 @@
-<!ENTITY addMain.label "Tambahkan filter &langganan "?" juga">
+<!ENTITY addMain.label "Tambahkan filter &langganan "?1?" juga">
<!ENTITY list.download.failed "Adblock Plus gagal untuk mengambil daftar langganan.">
<!ENTITY list.download.retry "Coba lagi">
<!ENTITY title.label "&Judul langganan:">
diff --git a/chrome/locale/it/composer.dtd b/chrome/locale/it/composer.dtd
index 3e1d15f..ad05b55 100644
--- a/chrome/locale/it/composer.dtd
+++ b/chrome/locale/it/composer.dtd
@@ -12,7 +12,7 @@
<!ENTITY matchCase.label "Mai&uscole/minuscole">
<!ENTITY custom.pattern.label "&Personalizza:">
<!ENTITY unselectAllTypes.label "Deseleziona">
-<!ENTITY type.whitelist.label "E&ccezione">
+<!ENTITY type.whitelist.label "Eccezione">
<!ENTITY regexp.warning "Il modello inserito verrà interpretato come espressione regolare. Un numero eccessivo di tali modelli potrebbe rallentare la navigazione. Se non si intende utilizzare le espressioni regolari aggiungere il carattere * alla fine del modello">
<!ENTITY dialog.title "Nuovo filtro di Adblock Plus">
<!ENTITY basic.label "<< Generali">
diff --git a/chrome/locale/lt/global.properties b/chrome/locale/lt/global.properties
index 095874f..9c89398 100644
--- a/chrome/locale/lt/global.properties
+++ b/chrome/locale/lt/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=Šiame puslapyje nėra jokių blokuojamų elementų
action3_tooltip=Spragtelėkite, norėdami įjungti/išjungti „Adblock Plus“.
+notification_antiadblock_title=paslėpti tikslinius pranešimus?
type_label_script=scenarijus
filter_elemhide_nocriteria=Nėra kriterijaus pagal kurį galima būtų nuspręsti kurį elementą paslėpti
blockingGroup_title=Reklamų blokavimo taisyklės
@@ -24,6 +25,7 @@ type_label_object=objektas
action2_tooltip=Spragtelėkite, norėdami atverti nustatymus; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
type_label_subdocument=kadras
clearStats_warning=Bus atstatyta visų filtrų blokavimų statistika ir išjungtas blokavimų skaičiavimas. Ar norite tęsti?
+notification_antiadblock_message=Ši svetainė buvo žinoma, kad parodyti tikslines pranešimus Adblock Plus vartotojams. Ar norite Adblock Plus paslėpti tikslinių pranešimus?
blocked_count_addendum=(baltajame sąraše: ?1?, paslėpta: ?2?)
subscription_invalid_location=Filtrų sąrašo adresas nėra taisyklingas URL ar failo vardas.
type_label_image=paveikslėlis
diff --git a/chrome/locale/mk/composer.dtd b/chrome/locale/mk/composer.dtd
index 290e569..4703609 100644
--- a/chrome/locale/mk/composer.dtd
+++ b/chrome/locale/mk/composer.dtd
@@ -1,12 +1,12 @@
<!ENTITY anchor.end.label "&на крајот од адресата">
-<!ENTITY domainRestriction.label "Попречи &до домен:">
+<!ENTITY domainRestriction.label "Забрани &до домен:">
<!ENTITY collapse.default.no.label "Користи стандардно (не)">
<!ENTITY firstParty.label "Само од п&рва партија">
<!ENTITY preferences.label "Прикажи по&стоечки филтери...">
<!ENTITY pattern.label "Барај шема">
<!ENTITY thirdParty.label "Само од &трета партија">
<!ENTITY filter.label "Нов &филтер:">
-<!ENTITY collapse.label "Намали блокирано: (&|)">
+<!ENTITY collapse.label "Скриј блокирано: (&|)">
<!ENTITY match.warning "Шемата која ја внесивте повеќе не се совпаѓа со адресата што ја одбравте и повеќе нема да функционира.">
<!ENTITY anchor.start.label "на почетокот на адреса (&г)">
<!ENTITY matchCase.label "Совпадни со букви (&М)">
diff --git a/chrome/locale/mk/filters.dtd b/chrome/locale/mk/filters.dtd
index e37ae40..0cc3ab0 100644
--- a/chrome/locale/mk/filters.dtd
+++ b/chrome/locale/mk/filters.dtd
@@ -1,12 +1,72 @@
-<!ENTITY addSubscriptionOther.label "Додади друга претплата">
+<!ENTITY restore.custom.warning "Сите ваши сопствени филтери ќе бидат заменети со содржината на одбраната датотека. Дали сакате да продолжите?">
+<!ENTITY slow.column "Спори филтери">
+<!ENTITY enabled.column "Вклучено">
+<!ENTITY subscription.lastDownload.checksumMismatch "Неуспешно, кодовите за проверка не се совпаѓаат">
+<!ENTITY noFiltersInGroup.text "Одбраната група е празна.">
+<!ENTITY subscription.actions.label "Дејства">
+<!ENTITY filter.selectAll.label "Одбери сите">
+<!ENTITY backupButton.label "Резервна копија">
+<!ENTITY restore.minVersion.warning "Внимание: датотеката е од понова верзија на апликацијата. Надградете ја сегашната верзија пред да ја вратите копијата.">
+<!ENTITY restore.error "Не можеше да се одреди содржината на фајлот, можеби не е резервна копија?">
+<!ENTITY sort.ascending.label "Абецеден ред">
+<!ENTITY sort.label "Сортирај по">
<!ENTITY subscription.source.label "Листа на филтери">
+<!ENTITY hitcount.column "Погодоци">
+<!ENTITY noFilters.text "Сеуште немате свои филтери.">
+<!ENTITY backup.custom.title "Прикажи само свои филтери">
+<!ENTITY subscription.external.label "Ажурирано од друга екстензија">
+<!ENTITY subscription.delete.label "Избриши">
+<!ENTITY noGroupSelected.text "Морате да изберете група на филтери за да се покажат нејзините филтери.">
+<!ENTITY filter.cut.label "Сечи">
+<!ENTITY restore.default.label "Врати резервна копија направена на ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Се презема…">
+<!ENTITY subscriptions.tab.label "Филтерски претплати">
+<!ENTITY sort.descending.label "Обратен абецеден ред">
+<!ENTITY filters.remove.warning "Дали сакате да ги избришите одбраните филтери?">
+<!ENTITY filter.delete.label "Избриши">
<!ENTITY addSubscriptionAdd.label "Додади">
+<!ENTITY viewMenu.label "Види">
+<!ENTITY subscription.lastDownload.unknown "Ништо">
<!ENTITY addSubscriptionCancel.label "Откажи">
<!ENTITY subscription.enabled.label "Вклучено">
-<!ENTITY subscription.homepage.label "Почетна Страница">
<!ENTITY noSubscriptions.text "Немате додадено филтери. AdBlock неможе да блокира реклами без филтери, ве молиме притиснете “Додади Филтери“ да додадете филтери.">
-<!ENTITY subscription.external.label "Ажурирано од друга екстензија">
-<!ENTITY addSubscription.label "Додади претплата на филтер">
+<!ENTITY subscription.update.label "Надгради филтери">
<!ENTITY dialog.title "Филтерски Подесувања">
+<!ENTITY addFilter.label "Додај филтер">
+<!ENTITY subscription.minVersion.warning "За овој филтер е потребна понова верзија на AdBlock Plus. Треба да го надградите софтверот на најновата верзија.">
+<!ENTITY subscription.lastDownload.invalidURL "Неуспешно, адресата не е валидна">
+<!ENTITY backup.error "Имаше грешка кога се запишуваа филтрите. Осигурајте се дека датотеката не е во употреба од друга апликација.">
+<!ENTITY filter.moveUp.label "Помести нагоре">
+<!ENTITY addGroup.label "Додај група на филтери">
+<!ENTITY filter.edit.label "Промени">
+<!ENTITY subscription.showHideFilters.label "Покажи/скриј ги филтерите">
+<!ENTITY acceptableAds2.label "Дозволи неинтрузивни (несметачки) реклами">
+<!ENTITY addSubscriptionOther.label "Додади друга претплата">
+<!ENTITY close.label "Затвори">
+<!ENTITY sort.none.label "Несортирано">
+<!ENTITY filter.actions.label "Филтрирај дејства">
+<!ENTITY filter.copy.label "Копирај">
+<!ENTITY filter.moveDown.label "Помести надолу">
+<!ENTITY filter.resetHitCounts.label "Ресетирај статистики">
+<!ENTITY readMore.label "Прочитај повеќе">
+<!ENTITY subscription.moveUp.label "Оди нагоре">
+<!ENTITY addSubscription.label "Додади претплата на филтер">
+<!ENTITY subscription.homepage.label "Почетна Страница">
+<!ENTITY backup.complete.title "Сите филтри и претплати">
+<!ENTITY restore.own.label "Врати своја резервна копија">
+<!ENTITY restore.complete.warning "Сите филтерски нагодувања ќе се заменат со оние од копијата. Дали сакате да продолжите?">
<!ENTITY filters.tab.label "Твои филтери">
-<!ENTITY subscriptions.tab.label "Филтерски претплати">
+<!ENTITY backup.label "Направи нова резервна копија">
+<!ENTITY find.label "Пронајди">
+<!ENTITY subscription.moveDown.label "Оди надолу">
+<!ENTITY subscription.lastDownload.connectionError "Неуспешно преземање">
+<!ENTITY subscription.lastDownload.success "Успешно">
+<!ENTITY subscription.lastDownload.invalidData "Неуспешно, не е валидна листа на филтери">
+<!ENTITY filter.paste.label "Залепи">
+<!ENTITY subscription.disabledFilters.enable "Вклучи изклучени филтери">
+<!ENTITY lasthit.column "Последен погодок">
+<!ENTITY subscription.editTitle.label "Модифицирај наслов">
+<!ENTITY subscription.disabledFilters.warning "Некои филтери во оваа претплата се исклучени.">
+<!ENTITY filter.column "Филтрирај правило">
+<!ENTITY subscription.lastDownload.label "Последно преземање:">
+<!ENTITY viewList.label "Покажи листа">
diff --git a/chrome/locale/mk/firstRun.properties b/chrome/locale/mk/firstRun.properties
new file mode 100644
index 0000000..437ffc6
--- /dev/null
+++ b/chrome/locale/mk/firstRun.properties
@@ -0,0 +1,4 @@
+firstRun_acceptableAdsHeadline=Досадните реклами отсега ќе бидат блокирани
+firstRun_dataCorruptionWarning=Дали оваа страна постојано се појавува? <a>Притиснете овде!</a>
+firstRun_title=AdBlock Plus е успешно инсталиран
+firstRun_acceptableAdsExplanation=Би сакале да ги поттикниме веб-страните да користат помалку збунувачки и помалку интрузивни реклами. Затоа направивме <a>збир строги правила</a> за да препознаеме прифатливи реклами, кои се прикажани по прв пат. Ќе можете да го <a>исклучите</a> тоа за неколку секунди.
diff --git a/chrome/locale/nb-NO/.incomplete b/chrome/locale/ml/.incomplete
similarity index 100%
rename from chrome/locale/nb-NO/.incomplete
rename to chrome/locale/ml/.incomplete
diff --git a/chrome/locale/ml/composer.dtd b/chrome/locale/ml/composer.dtd
new file mode 100644
index 0000000..35d89ef
--- /dev/null
+++ b/chrome/locale/ml/composer.dtd
@@ -0,0 +1,4 @@
+<!ENTITY dialog.title "ആഡ് ആട്ബ്ലോക്ക് പ്ലസ് ഫിൽറ്റർ റൂൾ">
+<!ENTITY collapse.yes.label "ഉവ്">
+<!ENTITY accept.label "ആഡ് ഫിൽറ്റർ">
+<!ENTITY collapse.no.label "ഇല്ല">
diff --git a/chrome/locale/eu/.incomplete b/chrome/locale/mn/.incomplete
similarity index 100%
rename from chrome/locale/eu/.incomplete
rename to chrome/locale/mn/.incomplete
diff --git a/chrome/locale/ms/composer.dtd b/chrome/locale/ms/composer.dtd
index 1ffb752..5b2264c 100644
--- a/chrome/locale/ms/composer.dtd
+++ b/chrome/locale/ms/composer.dtd
@@ -7,7 +7,7 @@
<!ENTITY thirdParty.label "Pihak keti&ga sahaja">
<!ENTITY filter.label "Penapis &baru:">
<!ENTITY collapse.label "&Jatuhkan yang disekat:">
-<!ENTITY match.warning "Pola yang anda masukkan tidak lagi memadani alamat yang ditapis/dikecualikan dan tidak akan berkesan padanya.">
+<!ENTITY match.warning "Pola yang anda masukkan tidak lagi memadani alamat yang akan disekat/dikecualikan dan tidak akan berkesan kepadanya.">
<!ENTITY anchor.start.label "pada per&mulaan alamat">
<!ENTITY matchCase.label "&Kes sepadan">
<!ENTITY custom.pattern.label "&Ubah suai:">
@@ -18,11 +18,11 @@
<!ENTITY basic.label "Paparan biasa">
<!ENTITY type.filter.label "&Penapis penyekat">
<!ENTITY types.label "Gunakan pada jenis:">
-<!ENTITY shortpattern.warning "Pola yang anda masukkan terlalu pendek untuk dioptimumkan dan kemungkinan boleh melambatkan penjelajahan web. Anda digalakkan memilih masukan yang lebih panjang untuk penapis ini.">
+<!ENTITY shortpattern.warning "Pola yang anda masukkan terlalu pendek untuk dioptimumkan dan kemungkinan boleh melambatkan penjelajahan web. Anda digalakkan memilih masukan yang lebih panjang untuk penapis ini supaya Adbolck Plus dapat memproses penapis ini dengan lebih berkesan.">
<!ENTITY collapse.yes.label "Ya">
<!ENTITY anchors.label "Terima pola sahaja:">
<!ENTITY collapse.default.yes.label "Gunakan default (ya)">
-<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk tentukan satu atau lebih domain secara berasingan dengan simbol "|". Penapis hanya akan digunakan pada domain tersebut sahaja. Simbol "~" sebelum domain bermaksud penapis tidak akan digunakan pada domain tersebut.">
+<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk tentukan satu atau lebih domain secara berasingan dengan simbol "|". Penapis hanya akan digunakan pada domain terpilih sahaja. Simbol "~" sebelum domain bermaksud penapis tidak akan digunakan pada domain tersebut.">
<!ENTITY accept.label "Tambah penapis">
<!ENTITY options.label "Pilihan">
<!ENTITY disabled.warning "Adblock Plus telah dinyahaktifkan. Anda masih boleh menambah penapis tetapi ia tidak akan aktif sehingga anda [link]aktifkan Adblock Plus[/link].">
diff --git a/chrome/locale/ms/global.properties b/chrome/locale/ms/global.properties
index 4bf62c8..54428fe 100644
--- a/chrome/locale/ms/global.properties
+++ b/chrome/locale/ms/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=Tiada item yang boleh disekat pada laman semasa
action3_tooltip=Klik untuk aktifkan/nyahaktifkan Adblock Plus.
+notification_antiadblock_title=Sembunyi Mesej-mesej yang disasarkan?
type_label_script=skrip
filter_elemhide_nocriteria=Tiada kriteria yang dinyatakan untuk mengenal pasti elemen untuk disembunyikan
blockingGroup_title=Peraturan Penapisan Iklan
@@ -24,6 +25,7 @@ type_label_object=objek
action2_tooltip=Klik untuk buka tatarajah, klik tengah untuk aktifkan/nyahaktifkan.
type_label_subdocument=bingkai
clearStats_warning=Ini akan mengreset semua statistik dan menyahaktifkan kiraan penapis. Teruskan?
+notification_antiadblock_message=Laman web ini telah dikenali untuk menunjukkan mesej yang disasarkan kepada pengguna Adblock Plus. Adakah anda mahu Adblock Plus untuk menyembunyikan mesej yang disasarkan?
blocked_count_addendum=(juga dikecualikan: ?1?, disembunyikan: ?2?
subscription_invalid_location=Lokasi senarai penapis sama ada URL atau nama fail adalah tidak sah.
type_label_image=imej
diff --git a/chrome/locale/ms/meta.properties b/chrome/locale/ms/meta.properties
index 29deb98..8c8714b 100644
--- a/chrome/locale/ms/meta.properties
+++ b/chrome/locale/ms/meta.properties
@@ -1,6 +1,6 @@
description.short=Menyampah dengan iklan? Risau mengenai tracking? Diganggu sepanduk? Pasanglah Adblock Plus untuk mendapatkan kembali kawalan ke atas internet and ubah cara anda melihat laman web.
name=Adblock Plus
description.long.addition1=Bermula dengan Adblock Plus 2.0 terdapat pilihan dalam Tatarajah Penapis untuk membenarkan sesetengah iklan. Matlamatnya adalah untuk menyokong laman web yang menggunakan iklan yang tidak menganggu dan untuk menggalakkan lebih banyak laman web untuk berbuat demikian.
-translator=Wladimir Palant
+translator=temperror
description.long=Adblock Plus membolehkan anda mendapatkan kembali kawalan ke atas internet dan cara anda melihat laman web. Add-on ini disokong oleh lebih empat puluh langganan dalam berbagai bahasa yang dapat menyediakannya untuk tujuan dari membuang iklan online hinggalah menyekat domain malware.
description=Iklan hanyalah pada masa dulu!
diff --git a/chrome/locale/ms/overlay.dtd b/chrome/locale/ms/overlay.dtd
index b42b6bf..3eabcdb 100644
--- a/chrome/locale/ms/overlay.dtd
+++ b/chrome/locale/ms/overlay.dtd
@@ -1,3 +1,5 @@
+<!ENTITY notification.button.yes "&Ya">
+<!ENTITY notification.button.no "&Tiada">
<!ENTITY sync.label "Syn&c tatacara Adblock Plus">
<!ENTITY whitelist.site.label "Nyahaktifkan pada ?1?">
<!ENTITY filters.label "&Tatarajah penapis">
@@ -11,6 +13,7 @@
<!ENTITY context.image.label "Adblock Plus: Sekat imej">
<!ENTITY counthits.label "&Kira kiraan penapis">
<!ENTITY opensidebar.label "Buka &item yang boleh disekat">
+<!ENTITY notification.button.close "&Tutup">
<!ENTITY contribute.label "Sumbang kepada Adblock Plus">
<!ENTITY toolbarbutton.label "Adblock Plus">
<!ENTITY context.frame.label "Adblock Plus: Sekat bingkai">
diff --git a/chrome/locale/ms/sendReport.dtd b/chrome/locale/ms/sendReport.dtd
index 9726684..ae861c6 100644
--- a/chrome/locale/ms/sendReport.dtd
+++ b/chrome/locale/ms/sendReport.dtd
@@ -17,7 +17,7 @@
<!ENTITY anonymous.label "Penyerahan &tanpa nama">
<!ENTITY reloadButton.label "Reload laman (&t)">
<!ENTITY recentReports.clear.label "&Padam semua laporan">
-<!ENTITY typeSelector.description "Tingkap ini akan membantu anda dengan langkah-langkah yang diperlukan untuk mengemukakan repot isu Adblock Plus. Pertama sekali, sila pilih jenis isu yang dialami pada laman ini:">
+<!ENTITY typeSelector.description "Tingkap ini akan membimbing anda dengan langkah-langkah yang diperlukan untuk mengemukakan laporan isu Adblock Plus. Pertama sekali, sila pilih jenis isu yang dialami pada laman ini:">
<!ENTITY screenshot.remove.label "Pa&dam data sensitif">
<!ENTITY issues.ownfilters.description "Sebahagian penapis yang digunakan pada laman ini ditentukan pengguna. Sila nyahaktifkan penapis tersebut yang mungkin menyebabkan isu itu.">
<!ENTITY update.inProgress.description "Adblock Plus perlu mengemaskini langganan penapis anda untuk memastikan isu tersebut belum diselesaikan. Sila tunggu"..."">
@@ -31,7 +31,7 @@
<!ENTITY issues.disabledfilters.enable.label "Aktifkan penapis">
<!ENTITY issues.override.label "&Konfigurasi adalah betul, sila teruskan dengan laporan">
<!ENTITY issues.nosubscriptions.description "Anda didapati tidak melanggan mana-mana penapis yang direka khas untuk membuang isi yang tidak diperlukan pada laman web secara automatik.">
-<!ENTITY typeSelector.falsePositive.description "Pilih pilihan ini jika laman tersebut kekurangan isi penting, pemaparan isi yang kurang tepat atau gagal berfungsi dengan betul. Anda boleh menentukan samada Adblock Plus adalah penyebab masalah tersebut dengan menyahaktifkannya untuk sementara.">
+<!ENTITY typeSelector.falsePositive.description "Pilih pilihan ini jika laman tersebut kekurangan isi penting, salah paparannya atau gagal berfungsi dengan betul. Anda boleh menentukan sama ada Adblock Plus ialah penyebab masalah tersebut dengan menyahaktifkannya buat sementara waktu.">
<!ENTITY typeSelector.other.label "&Isu lain">
<!ENTITY emailComment.label "Kami menggalakkan anda memasukkan alamat email yang sah supaya kami boleh menghubungi anda jika ada pertanyaan tentang laporan anda. Ia juga akan membolehkan kita untuk mengiktiraf sumbangan anda dan memberi keutamaan kepada mereka dengan lebih tinggi.">
<!ENTITY issues.whitelist.remove.label "Aktifkan kembali Adblock Plus pada laman ini">
@@ -61,5 +61,5 @@
<!ENTITY sendPage.heading "Hantar laporan">
<!ENTITY issues.subscriptionCount.description "Didapati anda melanggan terlalu banyak langganan penapis. Ini tidak disyorkan kerana ia mungkin akan mewujudkan masalah. Kami juga tidak dapat menerima laporan anda kerana ia kurang jelas penulis langganan penapis mana yang perlu mengambil tindakan. Sila buang semua langganan penapis kecuali yang diperlukan dan uji samada masalah masih berterusan.">
<!ENTITY screenshot.mark.label "&Tanda masalah tersebut">
-<!ENTITY privacyPolicy.label "Polisi maklumat peribadi">
+<!ENTITY privacyPolicy.label "Polisi privasi">
<!ENTITY issues.description "Adblock Plus telah mengesan isu pada konfigurasi anda yang mungkin penyebab isu ini atau akan menyukarkan penyiasatan laporan.">
diff --git a/chrome/locale/nb-NO/sendReport.dtd b/chrome/locale/nb-NO/sendReport.dtd
index 3e77007..1cc95f1 100644
--- a/chrome/locale/nb-NO/sendReport.dtd
+++ b/chrome/locale/nb-NO/sendReport.dtd
@@ -24,7 +24,7 @@
<!ENTITY sendPage.retry.label "Send på nytt">
<!ENTITY data.label "Ra&pportdata:">
<!ENTITY recentReports.label "Dine nylig innsendte rapporter">
-<!ENTITY typeWarning.description "Du har angitt at du vil rapportere inn et generelt problem vedrørende Adblock Plus, istedenfor et problem vedrørende filtrene. Vennligst legg merke til at slike problemer helst bør rapporteres inn på. Du burde kun bruke rapportingsfunksjonen til å supplementere til en eksisterende diskusjon, siden ingen vil legge merke til din rapport såfremt du ikke legger ved en link. En automatisk generert link vil bli gitt deg etter at du har sendt inn en rapport.">
+<!ENTITY typeWarning.description "Du har angitt at du vil rapportere inn et generelt problem vedrørende Adblock Plus, istedenfor et problem vedrørende filtrene. Vennligst legg merke til at slike problemer helst bør rapporteres inn på [link]Adblock Plus forum[/link]. Du burde kun bruke rapportingsfunksjonen til å supplementere til en eksisterende diskusjon, siden ingen vil legge merke til din rapport såfremt du ikke legger ved en link. En automatisk generert link vil bli gitt deg etter at [...]
<!ENTITY issues.disabled.description "Adblock Plus er deaktivert, og vil ikke blokkere noenting i denne tilstanden.">
<!ENTITY attachExtensions.label "Legg ved en liste over aktive tillegg til rapporten, i tilfelle det er en "add-on" som er grunnen til problemet">
<!ENTITY issues.nosubscriptions.add.label "Legg til filterabonnement">
@@ -39,7 +39,7 @@
<!ENTITY dataCollector.description "Vennligst vent på at Adblock Plus samler inn de nødvendige data.">
<!ENTITY sendButton.label "Se&nd rapport">
<!ENTITY comment.label "Kommentar (valgfritt): (&C)">
-<!ENTITY sendPage.errorMessage "Et forsøk på å sende inn rapporten feilet, med feilkoden "?1?". Vennligst kontrollér at du har internettilgang, og prøv på nytt. Hvis problemet vedvarer kan du be om hjelp i .">
+<!ENTITY sendPage.errorMessage "Et forsøk på å sende inn rapporten feilet, med feilkoden "?1?". Vennligst kontrollér at du har internettilgang, og prøv på nytt. Hvis problemet vedvarer kan du be om hjelp i [link]Adblock Plus forum[/link].">
<!ENTITY showRecentReports.label "Vis nylig innsendte rapporter">
<!ENTITY commentPage.heading "Skriv inn kommentar">
<!ENTITY update.start.label "Start oppdatering nå">
diff --git a/chrome/locale/nl/global.properties b/chrome/locale/nl/global.properties
index 3605ef3..5616bbf 100644
--- a/chrome/locale/nl/global.properties
+++ b/chrome/locale/nl/global.properties
@@ -1,6 +1,6 @@
no_blocking_suggestions=Geen blokkeerbare onderdelen op deze pagina
action3_tooltip=Klik om Adblock Plus in/uit te schakelen.
-notification_antiadblock_title=Verberg specifieke reclames?
+notification_antiadblock_title=Gerichte berichten verbergen?
type_label_script=script
filter_elemhide_nocriteria=Geen criteria opgegeven om het te verbergen element te herkennen
blockingGroup_title=Advertentieblokkaderegels
@@ -25,7 +25,7 @@ type_label_object=object
action2_tooltip=Klik om voorkeuren te openen, middelklik om in/uit te schakelen.
type_label_subdocument=frame
clearStats_warning=Dit stelt alle filtertrefferstatistieken opnieuw in en schakelt het tellen van filtertreffers uit. Wilt u doorgaan?
-notification_antiadblock_message=Deze pagina staat er bekend om dat ze specifieke reclame voor Adblock Plus users laat zien. Wil je dat Addblock Plus deze verbergt?
+notification_antiadblock_message=Deze website staat er bekend om dat ze op Adblock Plus-gebruikers gerichte berichten laat zien. Wilt u dat Adblock Plus deze verbergt?
blocked_count_addendum=(ook op witte lijst: ?1?, verborgen: ?2?)
subscription_invalid_location=Deze filterlijstlocatie is geen geldige URL en ook geen geldige bestandsnaam.
type_label_image=afbeelding
diff --git a/chrome/locale/pl/global.properties b/chrome/locale/pl/global.properties
index 4188a09..36c805e 100644
--- a/chrome/locale/pl/global.properties
+++ b/chrome/locale/pl/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=Nieblokowalne elementy na aktywnej stronie
action3_tooltip=Kliknij l.p.m., aby włączyć/wyłączyć Adblock Plus
+notification_antiadblock_title=Ukrywanie ukierunkowanych informacji
type_label_script=skrypt
filter_elemhide_nocriteria=Nie określono kryteriów rozpoznania elementu do ukrycia
blockingGroup_title=Reguły blokowania reklam
@@ -24,6 +25,7 @@ type_label_object=obiekt
action2_tooltip=Kliknij l.p.m., aby otworzyć opcje, ś.p.m., aby włączyć/wyłączyć
type_label_subdocument=ramka
clearStats_warning=Spowoduje to zresetowanie wszystkich statystyk użycia filtra i wyłączenie zliczania kolejnych użyć. Czy chcesz kontynuować?
+notification_antiadblock_message=Ta witryna wyświetla użytkownikom Adblock Plusa ukierunkowane dla nich informacje. Czy chcesz, by Adblock Plus ukrywał tego typu informacje?
blocked_count_addendum=(dozwolone:?1?, ukryte:?2?)
subscription_invalid_location=Lokalizacja zestawu filtrów ma niewłaściwą nazwę pliku, albo adres URL
type_label_image=obrazek
diff --git a/chrome/locale/ru/global.properties b/chrome/locale/ru/global.properties
index 64b8d3c..c279c00 100644
--- a/chrome/locale/ru/global.properties
+++ b/chrome/locale/ru/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=На открытой странице нет элементов, которые можно было бы заблокировать
action3_tooltip=Щелкните здесь, чтобы включить или отключить Adblock Plus.
+notification_antiadblock_title=скрыть целевых сообщений?
type_label_script=Скрипт
filter_elemhide_nocriteria=Не указано никаких признаков, чтобы опознать элемент, который нужно скрыть
blockingGroup_title=Правила блокирования
@@ -24,6 +25,7 @@ type_label_object=Объект
action2_tooltip=Щелкните здесь, чтобы открыть окно установок. Нажмите среднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
type_label_subdocument=Фрейм
clearStats_warning=Статистика попаданий будет обнулена для всех фильтров и в дальнейшем больше не будет записываться. Продолжать?
+notification_antiadblock_message=Этот сайт, как известно, показывают целевые сообщения пользователям Adblock Plus. Хотите Adblock Plus, чтобы скрыть целевых сообщений?
blocked_count_addendum=(также исключений: ?1?, спрятано: ?2?)
subscription_invalid_location=Не удалось распознать введенный адрес ни как адрес в интернете, ни как путь файлу.
type_label_image=Изображение
diff --git a/chrome/locale/ru/overlay.dtd b/chrome/locale/ru/overlay.dtd
index ac5a1ea..6ff4851 100644
--- a/chrome/locale/ru/overlay.dtd
+++ b/chrome/locale/ru/overlay.dtd
@@ -1,3 +1,5 @@
+<!ENTITY notification.button.yes "&да">
+<!ENTITY notification.button.no "&нет">
<!ENTITY sync.label "Син&хронизировать настройки Adblock Plus">
<!ENTITY whitelist.site.label "Отключить на ?1?">
<!ENTITY filters.label "Настройки &фильтров">
@@ -11,6 +13,7 @@
<!ENTITY context.image.label "Adblock Plus: заблокировать изображение">
<!ENTITY counthits.label "С&читать срабатывания фильтров">
<!ENTITY opensidebar.label "Открыть с&писок элементов">
+<!ENTITY notification.button.close "&близко">
<!ENTITY contribute.label "Помочь проекту Adblock Plus">
<!ENTITY toolbarbutton.label "Adblock Plus">
<!ENTITY context.frame.label "Adblock Plus: заблокировать фрейм">
diff --git a/chrome/locale/sl/global.properties b/chrome/locale/sl/global.properties
index 08480a2..e612a82 100644
--- a/chrome/locale/sl/global.properties
+++ b/chrome/locale/sl/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=Na trenutni strani ni elementov blokad
action3_tooltip=Kliknite za vključitev/izključitev Adblock Plus.
+notification_antiadblock_title=Skrijem ciljana sporočila?
type_label_script=skript
filter_elemhide_nocriteria=Za razpoznavo elementa, ki naj bo skrit, ni navedenih pogojev
blockingGroup_title=Pravila blokiranja oglasov
@@ -24,6 +25,7 @@ type_label_object=predmet
action2_tooltip=Kliknite za nastavitve, s srednjim klikom vključite/izključite.
type_label_subdocument=okvir
clearStats_warning=S tem boste ponastavili vso statistiko zadetkov filtra in onemogočili štetje zadetkov filtra. Želite nadaljevati?
+notification_antiadblock_message=Ta stran uporabnikom prikazuje ciljana sporočila. Želite, da Adblock Plus skrije ta sporočila?
blocked_count_addendum=(prav tako prikriti: ?1?, skriti: ?2?)
subscription_invalid_location=Mesto seznama filtrov ni niti veljaven URL niti veljavno ime datoteke.
type_label_image=sliko
diff --git a/chrome/locale/sl/overlay.dtd b/chrome/locale/sl/overlay.dtd
index b26e614..f0320d2 100644
--- a/chrome/locale/sl/overlay.dtd
+++ b/chrome/locale/sl/overlay.dtd
@@ -14,7 +14,7 @@
<!ENTITY counthits.label "Štej za&detke filtra">
<!ENTITY opensidebar.label "Odpri &elemente blokad">
<!ENTITY notification.button.close "&Zapri">
-<!ENTITY contribute.label "Prispevajte k Adblock Plus">
+<!ENTITY contribute.label "Sodelujte v Adblock Plus">
<!ENTITY toolbarbutton.label "Adblock Plus">
<!ENTITY context.frame.label "Adblock - okviri">
<!ENTITY blocked.tooltip "Blokirani elementi na tej strani:">
diff --git a/chrome/locale/sl/subscriptionSelection.dtd b/chrome/locale/sl/subscriptionSelection.dtd
index 2b80836..d8c15f3 100644
--- a/chrome/locale/sl/subscriptionSelection.dtd
+++ b/chrome/locale/sl/subscriptionSelection.dtd
@@ -7,6 +7,6 @@
<!ENTITY viewList.label "Pokaži filtre">
<!ENTITY visitHomepage.label "Obišči domačo stran">
<!ENTITY addSubscription.label "Dodaj naročnino">
-<!ENTITY dialog.title "Naroči filtre za Adblock Plus">
+<!ENTITY dialog.title "Dodaj naročnino na filtre Adblock Plus">
<!ENTITY location.label "&Mesto seznama filtriranja:">
<!ENTITY fromWeb.description "Potrdite, da želite dodati to naročnino na filter. Naslov ali kraj naročnine lahko spremenite še pred dodajanjem.">
diff --git a/chrome/locale/tr/overlay.dtd b/chrome/locale/tr/overlay.dtd
index 0875952..f6fcaf2 100644
--- a/chrome/locale/tr/overlay.dtd
+++ b/chrome/locale/tr/overlay.dtd
@@ -1,3 +1,5 @@
+<!ENTITY notification.button.yes "&Evet">
+<!ENTITY notification.button.no "&Hayır">
<!ENTITY sync.label "Adblock Plus ayarlarını &eşitle">
<!ENTITY whitelist.site.label "?1? sitesinde devre dışı kal">
<!ENTITY filters.label "&Süzgeç tercihleri">
@@ -11,6 +13,7 @@
<!ENTITY context.image.label "Adblock Plus: Resmi engelle">
<!ENTITY counthits.label "Süzgeç isa&betini say">
<!ENTITY opensidebar.label "E&ngellenebilecek öğeleri göster">
+<!ENTITY notification.button.close "&Kapat">
<!ENTITY contribute.label "Adblock Plus'a katkıda bulun">
<!ENTITY toolbarbutton.label "Adblock Plus">
<!ENTITY context.frame.label "Adblock Plus: Çerçeveyi engelle">
diff --git a/chrome/locale/uk/composer.dtd b/chrome/locale/uk/composer.dtd
index 565b21f..a6fc1ec 100644
--- a/chrome/locale/uk/composer.dtd
+++ b/chrome/locale/uk/composer.dtd
@@ -25,7 +25,7 @@
<!ENTITY domainRestriction.help "Вкажіть один чи більше доменів, розділених символом „|“, фільтр буде застосовано лише на них. Символ „~“ перед іменем домена вказує що фільтр на цей домен не розповсюджується.">
<!ENTITY accept.label "Додати фільтр">
<!ENTITY options.label "Налаштування">
-<!ENTITY disabled.warning "Adblock Plus наразі вимкнений. Ви все одно можете додавати фільтри, але вони не застосуються, доки ви [link] не увімкнете Adblock Plus[/link].">
+<!ENTITY disabled.warning "Adblock Plus наразі вимкнений. Ви все одно можете додавати фільтри, але вони не застосуються, доки ви не [link]увімкнете[/link] Adblock Plus.">
<!ENTITY anchor.start.flexible.label "на &початку імені домена">
<!ENTITY collapse.no.label "Ні">
<!ENTITY selectAllTypes.label "Вибрати все">
diff --git a/chrome/locale/vi/filters.dtd b/chrome/locale/vi/filters.dtd
index a600366..409f4a2 100644
--- a/chrome/locale/vi/filters.dtd
+++ b/chrome/locale/vi/filters.dtd
@@ -1,19 +1,19 @@
-<!ENTITY restore.custom.warning "Tất cả bộ lọc cá nhân của bạn sẽ được thay thế . Bạn có muốn tiếp tục ?">
+<!ENTITY restore.custom.warning "Tất cả bộ lọc tùy biến của bạn sẽ được thay thế bởi nội dung của tập tin được chọn. Bạn có muốn thực hiện?">
<!ENTITY slow.column "&Bộ lọc chậm">
<!ENTITY enabled.column "&Bật">
-<!ENTITY subscription.lastDownload.checksumMismatch "Thất bại, checksum không đúng">
-<!ENTITY noFiltersInGroup.text "Nhóm được chọn không chứa nội dung .">
+<!ENTITY subscription.lastDownload.checksumMismatch "Thất bại, mã băm không phù hợp">
+<!ENTITY noFiltersInGroup.text "Nhóm được chọn trống.">
<!ENTITY subscription.actions.label "Hành động">
-<!ENTITY filter.selectAll.label "Chọn hết">
+<!ENTITY filter.selectAll.label "Chọn tất cả">
<!ENTITY backupButton.label "&Sao lưu và phục hồi">
-<!ENTITY restore.minVersion.warning "Cảnh báo : Tập tin được tạo bởi phiên bản Adblock Plus mới hơn . Bạn cần cập nhập phiên bản mới nhất của Adblock Plus trước khi có thể khôi phục từ tập tin này .">
-<!ENTITY restore.error "Dữ liệu không thể được phục hồi ! Có thể file này không phải file phục hồi của AdBlock Plus ?">
-<!ENTITY sort.ascending.label "Hiển thị theo thứ tự A > Z">
+<!ENTITY restore.minVersion.warning "Cảnh báo: tập tin đã được tạo bởi phiên bản Adblock Plus mới hơn. Bạn cần cập nhập lên phiên bản mới nhất của Adblock Plus trước khi có thể khôi phục từ tập tin này.">
+<!ENTITY restore.error "Dữ liệu của tập tin có thể không được xử lý, có lẽ đây không phải là một tập tin sao lưu của Adblock Plus?">
+<!ENTITY sort.ascending.label "Sắp xếp theo thứ tự &A > Z">
<!ENTITY sort.label "Sắp &xếp theo">
<!ENTITY subscription.source.label "Danh sách bộ lọc">
-<!ENTITY hitcount.column "&Số lần hit">
-<!ENTITY noFilters.text "Bạn chưa có bộ lọc cá nhân nào .">
-<!ENTITY backup.custom.title "Chỉ hiển thị bộ lọc cá nhân">
+<!ENTITY hitcount.column "&Số lần bấm">
+<!ENTITY noFilters.text "Bạn chưa có bộ lọc tùy biến nào.">
+<!ENTITY backup.custom.title "Chỉ bộ lọc tùy biến">
<!ENTITY subscription.external.label "Được cập nhập bởi ứng dụng khác">
<!ENTITY subscription.delete.label "Xóa">
<!ENTITY noGroupSelected.text "Bạn cần chọn nhóm cho bộ lọc trước khi nó được hiển thị">
@@ -21,8 +21,8 @@
<!ENTITY restore.default.label "Khôi phục từ ?1?">
<!ENTITY subscription.lastDownload.inProgress "Đang tải...">
<!ENTITY subscriptions.tab.label "Đăng ký bộ lọc">
-<!ENTITY sort.descending.label "Hiển thị theo thứ tự Z > A">
-<!ENTITY filters.remove.warning "Bạn có thực sự muốn xóa tất cả những bộ lọc được chọn ?">
+<!ENTITY sort.descending.label "Sắp xếp theo thứ tự &Z > A">
+<!ENTITY filters.remove.warning "Bạn có thực sự muốn loại bỏ tất cả những bộ lọc được chọn?">
<!ENTITY filter.delete.label "Xóa">
<!ENTITY addSubscriptionAdd.label "Thêm">
<!ENTITY viewMenu.label "Hiển thị">
@@ -32,14 +32,14 @@
<!ENTITY noSubscriptions.text "Bạn chưa chọn bất kì bộ lọc nào ! AdBlock Plus không thể hoạt động nếu không có một bộ lọc, xin hãy sử dụng "Đăng ký bộ lọc" để thêm bộ lọc cho mình .">
<!ENTITY subscription.update.label "Cập nhập bộ lọc">
<!ENTITY dialog.title "Tùy chọn bộ lọc AdBlock Plus">
-<!ENTITY addFilter.label "Thêm bộ lọc">
+<!ENTITY addFilter.label "&Thêm bộ lọc">
<!ENTITY subscription.minVersion.warning "Bộ lọc này cần có phiên bản Adblock Plus mới hơn, bạn cần phải cập nhập lên phiên bản mới nhất của AdBlock Plus .">
<!ENTITY subscription.lastDownload.invalidURL "Thất bại, không phải là địa chỉ hợp lệ">
-<!ENTITY backup.error "Có vấn đề khi ghi phần tử lọc lên file . Hãy chắc chắn rằng file không bị Write-Protected hoặc được sử dụng bởi một ứng dụng khác.">
+<!ENTITY backup.error "Có vấn đề khi ghi bộ lọc vào tập tin. Hãy chắc chắn rằng tập tin không bị bảo vệ ghi hoặc bị sử dụng bởi một ứng dụng khác.">
<!ENTITY filter.moveUp.label "Di chuyển lên">
-<!ENTITY addGroup.label "Thêm bộ lọc và nhóm">
+<!ENTITY addGroup.label "Thêm &nhóm bộ lọc">
<!ENTITY filter.edit.label "Chỉnh sửa">
-<!ENTITY subscription.showHideFilters.label "Hiện/Ẩn bộ lọc">
+<!ENTITY subscription.showHideFilters.label "Hiện/ẩn bộ lọc">
<!ENTITY acceptableAds2.label "Cho phép một số quảng cáo không gây hại">
<!ENTITY addSubscriptionOther.label "Thêm bộ lọc khác">
<!ENTITY close.label "Đóng">
@@ -47,24 +47,24 @@
<!ENTITY filter.actions.label "Hành động cho bộ lọc">
<!ENTITY filter.copy.label "Chép">
<!ENTITY filter.moveDown.label "Di chuyển xuống">
-<!ENTITY filter.resetHitCounts.label "Reset số lần hit">
+<!ENTITY filter.resetHitCounts.label "Cài lại thống kê lượt bấm">
<!ENTITY readMore.label "Đọc thêm">
<!ENTITY subscription.moveUp.label "Chuyển lên trên">
<!ENTITY addSubscription.label "Thêm bộ lọc">
<!ENTITY subscription.homepage.label "Trang chủ">
-<!ENTITY backup.complete.title "Tất cả phần tử lọc và bộ lọc">
-<!ENTITY restore.own.label "Khôi phục bằng file khác">
-<!ENTITY restore.complete.warning "Tất cả tùy chỉnh bộ lọc của bạn sẽ được thay thế bởi tập tin được chọn. Bạn có muốn tiếp tục ?">
-<!ENTITY filters.tab.label "Bộ lọc cá nhân">
-<!ENTITY backup.label "Tạo điểm phục hồi mới">
-<!ENTITY find.label "Tìm">
+<!ENTITY backup.complete.title "Tất cả các bộ lọc và mục đăng ký">
+<!ENTITY restore.own.label "Khôi phục riêng">
+<!ENTITY restore.complete.warning "Tất cả tùy chỉnh bộ lọc của bạn sẽ được thay thế bởi nội dung của tập tin được chọn. Bạn có muốn thực hiện?">
+<!ENTITY filters.tab.label "Bộ lọc tùy biến">
+<!ENTITY backup.label "Tạo sao lưu mới">
+<!ENTITY find.label "&Tìm">
<!ENTITY subscription.moveDown.label "Chuyển xuống dưới">
<!ENTITY subscription.lastDownload.connectionError "Thất bại, tải xuống thất bại">
<!ENTITY subscription.lastDownload.success "Hoàn thành">
<!ENTITY subscription.lastDownload.invalidData "Thất bại, đây không phải là danh sách bộ lọc hợp lệ">
<!ENTITY filter.paste.label "Dán">
<!ENTITY subscription.disabledFilters.enable "Bật bộ lọc đã bị vô hiệu hóa">
-<!ENTITY lasthit.column "Lần hit cuối">
+<!ENTITY lasthit.column "Lần bấm cuối">
<!ENTITY subscription.editTitle.label "Sửa tiêu đề">
<!ENTITY subscription.disabledFilters.warning "Một vài phần tử trong bộ lọc này đã bị vô hiệu hóa .">
<!ENTITY filter.column "&Quy luật lọc">
diff --git a/chrome/locale/vi/firstRun.properties b/chrome/locale/vi/firstRun.properties
index 8128d45..8bfd8ef 100644
--- a/chrome/locale/vi/firstRun.properties
+++ b/chrome/locale/vi/firstRun.properties
@@ -1,14 +1,19 @@
+firstRun_feature_tracking_description=Duyệt riêng tư bằng cách vô hiệu theo dõi - ẩn theo dõi của bạn từ các công ty quảng cáo theo dõi từng bước của bạn.
firstRun_toggle_off=TẮT
firstRun_feature_tracking=Vô hiệu hóa theo dõi
-firstRun_feature_social=Loại bỏ các nút bấm của mạng xã hội
-firstRun_title=Adblock Plus đã được cài đặt
firstRun_feature_malware=Chặn phần mềm độc hại
+firstRun_title=Adblock Plus đã được cài đặt
+firstRun_acceptableAdsExplanation=Chúng tôi khuyến khích các trang mạng dùng những quảng cáo minh bạch, không phiền nhiễu. Đó là lí do tại sao chúng tôi gây dựng <a>hướng dẫn chặt chẽ</a> để xác định các quảng cáo được chấp nhận, hiện dưới mức thiết lập mặc định. Nếu bạn vẫn muốn chặn mọi quảng cáo, bạn có thể <a>vô hiệu</a> điều này trong một vài giây.
firstRun_toggle_on=BẬT
firstRun_contributor_credits=Đóng góp các khoản tín dụng
-firstRun_dataCorruptionWarning=Trang này cứ hiển thị mãi ? <a>Bấm vào đây</a>
+firstRun_dataCorruptionWarning=Có phải trang này luôn hiển thị? <a>Bấm vào đây</a>
firstRun_acceptableAdsHeadline=Những quảng cáo phiền phức sẽ bị chặn
-firstRun_share=Chia sẻ với bạn bè của bạn
-firstRun_share_headline=<a>Giúp chúng tôi một tay</a> trong việc làm trang web trở nên tốt hơn
-firstRun_features=Adblock Plus không chỉ có thể chặn quảng cáo
-firstRun_donate=quyên góp
+firstRun_share=Nói với bạn bè của bạn
+firstRun_share_headline=<a>Giúp chúng tôi một tay</a> trong việc làm trang mạng trở nên tốt hơn
+firstRun_features=Adblock Plus có thể làm nhiều hơn là chặn quảng cáo
+firstRun_feature_malware_description=Làm cho trình duyệt an toàn hơn bằng cách chặn các tên miền chứa phần mềm độc hại.
+firstRun_feature_social_description=Tự động loại bỏ lịch duyệt của các nút truyền thông mạng xã hội, như là nút Thích Facebook, xuất hiện trên trang mạng và theo dõi hành vi của bạn.
+firstRun_donate=ủng hộ
firstRun_donate_label=Hỗ trợ dự án của chúng tôi
+firstRun_feature_social=Loại bỏ các nút bấm Phương tiện Mạng xã hội
+firstRun_legacySafariWarning=Bạn đang dùng một phiên bản cũ của Safari không được hỗ trợ bởi Adblock Plus. Nó có thể không hoạt động chính xác hoặc làm giảm trải nghiệm của người dùng trên một số trang mạng. Chúng tôi rất khuyến khích cập nhật lên Safari 6.1.1 hoặc cao hơn (trên OS X 10.8 Mountain Lion), hoặc Safari 7.0.1 hoặc cao hơn (trên OS X 10.9 Mavericks), hoặc dùng phiên bản mới nhất của Mozilla Firefox, Google Chrome hoặc Opera.
diff --git a/chrome/locale/vi/global.properties b/chrome/locale/vi/global.properties
index 43c864a..39cabf8 100644
--- a/chrome/locale/vi/global.properties
+++ b/chrome/locale/vi/global.properties
@@ -1,39 +1,41 @@
no_blocking_suggestions=Không có mục nào trong trang hiện tại có thể chặn được
action3_tooltip=Nhấn để bật/tắt Adblock Plus.
-type_label_script=Mã
+notification_antiadblock_title=Ẩn tin nhắn mục tiêu?
+type_label_script=văn lệnh
filter_elemhide_nocriteria=Không có chuẩn để nhận diện các phần tử bị ẩn
blockingGroup_title=Quy tắc chặn quảng cáo
-whitelisted_tooltip=Adblock Plus đang hoạt động nhưng bị vô hiệu hóa trên trang hiện tại.
+whitelisted_tooltip=Adblock Plus bị vô hiệu ở trang hiện tại.
type_label_stylesheet=stylesheet
blocked_count_tooltip=?1? trong ?2?
type_label_font=phông
-type_label_popup=Quảng cáo popup
-filter_regexp_tooltip=Bộ lọc này là một biểu thức quy tắc hoặc là do quá ngắn nên không tối ưu hóa được. Quá nhiều bộ lọc như thế này có thể làm chậm việc duyệt web của bạn.
+type_label_popup=cửa sổ bật lên
+filter_regexp_tooltip=Bộ lọc này là một biểu thức chính quy hoặc là do quá ngắn nên không tối ưu hóa được. Quá nhiều bộ lọc như thế này có thể làm chậm việc duyệt của bạn.
action0_tooltip=Nhấn chuột trái để hiển thị trình đơn ngữ cảnh, nhấn chuột giữa để bật/tắt.
whitelisted_page=Adblock Plus đã bị vô hiệu hóa cho trang hiện tại
-remove_group_warning=Bạn có thật sự muốn xóa bỏ nhóm này ?
+remove_group_warning=Bạn có thật sự muốn loại bỏ nhóm này?
action1_tooltip=Nhấn chuột trái để mở/đóng các mục có thể chặn được, nhấn chuột giữa để bật/tắt.
type_label_xmlhttprequest=yêu cầu XML
-active_tooltip=Adblock Plus đang hoạt động, ?1? bộ lọc trọn gói và ?2? bộ lọc tùy biến đang được dùng.
+active_tooltip=Adblock Plus đã kích hoạt, ?1? bộ lọc trọn gói và ?2? bộ lọc tùy biến đang được dùng.
type_label_document=tài liệu
-type_label_object_subrequest=subrequest đối tượng
-whitelistGroup_title=Ngoại lệ
-disabled_tooltip=Adblock Plus đang tắt.
+type_label_object_subrequest=yêu cầu con đối tượng
+whitelistGroup_title=Quy tắc ngoại lệ
+disabled_tooltip=Adblock Plus đã bị vô hiệu.
filter_elemhide_duplicate_id=Chỉ có thể xác định một ID của phần tử bị ẩn
type_label_object=đối tượng
action2_tooltip=Nhấn chuột trái để mở tùy chọn, nhấn chuột giữa để bật/tắt.
type_label_subdocument=khung
-clearStats_warning=Điều này sẽ thiết lập lại toàn bộ thông số hit và sẽ tắt đếm thông số hits . Bạn có muốn tiếp tục ?
+clearStats_warning=Điều này sẽ thiết lập lại toàn bộ thông số lượt bấm và vô hiệu đếm lượt bấm. Bạn có muốn thực hiện?
+notification_antiadblock_message=Trang này đã được biết là hiện tin nhắn mục tiêu cho người dùng Adblock Plus. Bạn có muốn Adblock Plus ẩn tin nhắn mục tiêu?
blocked_count_addendum=(trong danh sách trắng: ?1?, bị ẩn: ?2?)
subscription_invalid_location=Địa chỉ để tải bộ lọc không phải là một URL hay tên tập tin hợp lệ.
type_label_image=ảnh
remove_subscription_warning=Bạn có thật sự muốn xóa bộ trọn gói này không?
type_label_other=khác
-mobile_menu_enable=ABP : Bật
+mobile_menu_enable=ABP: Bật
type_label_media=tiếng/phim
-mobile_menu_disable_site=ABP : Tắt trên ?1?
-elemhideGroup_title=Quy tắc ẩn yếu tố
-mobile_menu_enable_site=ABP : Bật trên ?1?
+mobile_menu_disable_site=ABP: Vô hiệu trên ?1?
+elemhideGroup_title=Quy tắc ẩn phần tử
+mobile_menu_enable_site=ABP: Kích hoạt trên ?1?
type_label_elemhide=ẩn
-newGroup_title=Nhóm cho bộ lọc mới
-default_dialog_title=Adblock Cộng
+newGroup_title=Nhóm lọc mới
+default_dialog_title=Adblock Plus
diff --git a/chrome/locale/vi/meta.properties b/chrome/locale/vi/meta.properties
index 5736871..e0259cd 100644
--- a/chrome/locale/vi/meta.properties
+++ b/chrome/locale/vi/meta.properties
@@ -1,6 +1,6 @@
description.short=Bực bội vì quảng cáo? Khó chịu vì bị theo dõi? Phiền vì biểu ngữ (banner)? Cài đặt Adblock Plus ngay để giành lại quyền kiểm soát internet và thay đổi cách thức mà bạn xem web.\n\nXem đoạn phim giới thiệu ở http://www.youtube.com/watch?v=oNvb2SjVjjI
-name=Adblock Cộng
+name=Adblock Plus
description.long.addition1=Bắt đầu từ Adblock Cộng phiên bản 2.0 sẽ có tùy chọn cho Bộ Lọc để cho phép một số quảng cáo không gây phiền phức . Mục đích chính là hỗ trợ cho những trang web sử dụng loại quảng cáo này và để khuyến khích nhiều websites khác làm điều tương tự. <a href="http://adblockplus.org/en/acceptable-ads">Đọc thêm</a>
-translator=Knight Vegor
+translator=Nguyễn Mạnh Hùng, Knight Vegor, SITUVN
description.long=Adblock Plus cho phép bạn giành lại quyền kiểm soát internet và xem web theo cách bạn muốn. Tiện ích này được hỗ trợ bởi hơn bốn mươi bộ lọc trọn gói với hàng chục ngôn ngữ, sẽ tự động cấu hình cho các mục đích từ gỡ bỏ quảng cáo trực tuyến cho đến việc chặn các tên miền chứa phần mềm độc hại. Adblock Plus cũng cho phép bạn tùy biến bộ lọc với sự hỗ trợ của nhiều tính năng hữu ích khác nhau, bao gồm tùy chọn ngữ cảnh cho hình ảnh, thẻ chặn đối với các đối tượng Flash và [...]
description=Quảng cáo đã là dĩ vãng!
diff --git a/chrome/locale/vi/overlay.dtd b/chrome/locale/vi/overlay.dtd
index 7e8001a..ccd608c 100644
--- a/chrome/locale/vi/overlay.dtd
+++ b/chrome/locale/vi/overlay.dtd
@@ -1,3 +1,5 @@
+<!ENTITY notification.button.yes "&Có">
+<!ENTITY notification.button.no "&Không">
<!ENTITY sync.label "Đồng bộ thiết lập Adbl&ock Plus">
<!ENTITY whitelist.site.label "Vô hiệu hóa trên ?1?">
<!ENTITY filters.label "&Tùy chỉnh bộ lọc">
@@ -9,10 +11,11 @@
<!ENTITY sendReport.label "&Báo cáo vấn đề trên trang này">
<!ENTITY whitelist.page.label "Chỉ vô hiệu hóa trên trang này">
<!ENTITY context.image.label "Adblock Plus: Chặn Ảnh">
-<!ENTITY counthits.label "Đếm số lần &hit của bộ lọc">
+<!ENTITY counthits.label "Đếm lượt &bấm bộ lọc">
<!ENTITY opensidebar.label "&Mở các mục có thể chặn được">
+<!ENTITY notification.button.close "Đó&ng">
<!ENTITY contribute.label "Đóng góp cho Adblock Plus">
-<!ENTITY toolbarbutton.label "Adblock cộng">
+<!ENTITY toolbarbutton.label "Adblock Plus">
<!ENTITY context.frame.label "Adblock Plus: Chặn Khung">
<!ENTITY blocked.tooltip "Các mục bị chặn trong trang này:">
<!ENTITY hideplaceholders.label "Ẩn &chỗ giữ các yếu tố bị chặn">
diff --git a/chrome/locale/vi/sendReport.dtd b/chrome/locale/vi/sendReport.dtd
index 29fc107..d6b50b7 100644
--- a/chrome/locale/vi/sendReport.dtd
+++ b/chrome/locale/vi/sendReport.dtd
@@ -12,7 +12,7 @@
<!ENTITY typeSelector.other.description "Chọn tùy chọn này nếu bạn nghi ngờ một vấn đề với bản thân Adblock Plus hơn là do bộ lọc của nó.">
<!ENTITY issues.disabledgroups.enable.label "Kích hoạt bộ lọc trọn gói/nhóm bộ lọc">
<!ENTITY typeWarning.override.label "Tôi hiể&u và vẫn muốn gửi báo cáo">
-<!ENTITY issues.disabled.enable.label "Bật Adblock Plus">
+<!ENTITY issues.disabled.enable.label "Kích hoạt Adblock Plus">
<!ENTITY update.fixed.description "Bản cập nhập đến bộ lọc của bạn có vẻ như đã sửa được lỗi mà bạn đang thông báo. Vui lòng tải lại trang và thử lại, nhấn Báo cáo lỗi lần nữa nếu vấn đề vẫn còn tiếp diễn.">
<!ENTITY anonymous.label "&Gửi thông tin ẩn danh">
<!ENTITY reloadButton.label "Tải lại tr&ang">
@@ -20,7 +20,7 @@
<!ENTITY typeSelector.description "Cửa sổ này sẽ hướng dẫn bạn qua các bước cần thiết cho việc gửi lên một báo cáo vấn đề của Adblock Plus. Trước tiên, hãy chọn kiểu vấn đề mà bạn đang gặp trên trang này:">
<!ENTITY screenshot.remove.label "Xóa dữ liệu nhạ&y cảm">
<!ENTITY issues.ownfilters.description "Một số bộ lọc áp dụng trên trang này do người dùng tự tạo ra. Vui lòng vô hiệu hóa các bộ lọc có thể đã gây ra vấn đề này:">
-<!ENTITY update.inProgress.description "Adblock Plus cần phải cập nhập bộ lọc quảng cáo để chắc chắn rằng vấn đề chưa được giải quyết. Xin hãy đợi ...">
+<!ENTITY update.inProgress.description "Adblock Plus cần phải cập nhập bộ lọc quảng cáo để chắc chắn rằng vấn đề chưa được giải quyết. Xin chờ...">
<!ENTITY sendPage.retry.label "Gửi lại">
<!ENTITY data.label "&Dữ liệu báo cáo:">
<!ENTITY recentReports.label "Các báo cáo được gửi lên gần đây của bạn">
@@ -35,14 +35,14 @@
<!ENTITY typeSelector.other.label "&Vấn đề khác">
<!ENTITY emailComment.label "Chúng tôi khuyến khích bạn nhập địa chỉ email hợp lệ để chúng tôi tiện liên lạc nếu chúng tôi cần gì từ thông báo của bạn. Đồng thời, nó cũng giúp chúng tôi có thể ghi nhận công lao đóng góp của bạn .">
<!ENTITY issues.whitelist.remove.label "Bật lại Adblock Plus trên trang này">
-<!ENTITY outdatedSubscriptions.description "Bộ lọc sau đã không được cập nhập từ 2 tuần trước . Vui lòng cập nhập bộ lọc trước khi gửi thông báo lỗi, có thể vấn đề đã được giải quyết từ trước .">
+<!ENTITY outdatedSubscriptions.description "Bộ lọc sau đã không được cập nhập từ hai tuần trước. Vui lòng cập nhập bộ lọc trước khi gửi thông báo lỗi, có thể vấn đề đã được giải quyết từ trước.">
<!ENTITY dataCollector.description "Vui lòng đợi một lát trong khi Adblock Plus thu thập dữ liệu cần thiết.">
<!ENTITY sendButton.label "&Gửi báo cáo">
<!ENTITY comment.label "&Bình luận (phụ):">
<!ENTITY sendPage.errorMessage "Một nỗ lực gửi báo cáo bị thất bại với mã lỗi "?1?". Vui lòng chắc chắn rằng bạn đã được kết nối Internet rồi thử lại. Nếu vấn đề vẫn còn, vui lòng yêu cầu trợ giúp trên [link]diễn đàn Adblock Plus[/link].">
<!ENTITY showRecentReports.label "Hiện các báo cáo được gửi lên gần đây">
<!ENTITY commentPage.heading "Điền bình luận">
-<!ENTITY update.start.label "Bắt đầu cập nhập">
+<!ENTITY update.start.label "Bắt đầu cập nhập ngay">
<!ENTITY issues.disabledfilters.description "Các bộ lọc sau đã bị vô hiệu hóa, song chúng có thể vẫn gây ảnh hưởng tới trang này:">
<!ENTITY screenshot.description "Cùng một trang có thể trông khác đối với nhiều người khác nhau. Chúng tôi có thể hiểu vấn đề hơn nếu bạn đính kèm một ảnh chụp màn hình vào báo cáo. Bạn có thể xóa các phần chứa thông tin nhạy cảm cũng như đánh dấu các vùng dễ nhận thấy vấn đề. Để làm việc đó, nhấn chuột vào nút liên quan và chọn vùng hình ảnh bằng chuột của bạn.">
<!ENTITY screenshot.attach.label "Đính &kèm ảnh chụp trang vào báo cáo">
diff --git a/chrome/locale/vi/sidebar.dtd b/chrome/locale/vi/sidebar.dtd
index 26f7f41..02208a2 100644
--- a/chrome/locale/vi/sidebar.dtd
+++ b/chrome/locale/vi/sidebar.dtd
@@ -23,9 +23,9 @@
<!ENTITY detached.title "Adblock Plus: các mục có thể chặn (tách rời)">
<!ENTITY docDomain.firstParty "(bên thứ nhất)">
<!ENTITY tooltip.type.whitelisted "(sổ trắng)">
-<!ENTITY tooltip.filter.label "Bộ lọc đang chặn:">
+<!ENTITY tooltip.filter.label "Bộ lọc đang có hiệu lực:">
<!ENTITY tooltip.filter.disabled "(bị vô hiệu hóa)">
-<!ENTITY context.editfilter.label "Chỉnh sửa bộ lọc đang chặn">
+<!ENTITY context.editfilter.label "Chỉnh sửa bộ lọc đang có hiệu lực">
<!ENTITY tooltip.type.blocked "(đã chặn)">
<!ENTITY size.label "Kích thước">
<!ENTITY context.whitelist.label "Thêm quy luật ngoại lệ cho mục">
diff --git a/chrome/locale/vi/subscriptionSelection.dtd b/chrome/locale/vi/subscriptionSelection.dtd
index 1582e35..804c14b 100644
--- a/chrome/locale/vi/subscriptionSelection.dtd
+++ b/chrome/locale/vi/subscriptionSelection.dtd
@@ -2,7 +2,7 @@
<!ENTITY list.download.failed "Adblock Plus không thể lấy danh sách bộ lọc trọn gói.">
<!ENTITY list.download.retry "Thử lại">
<!ENTITY title.label "&Tiêu đề của bộ trọn gói:">
-<!ENTITY list.download.website "Xem trang web">
+<!ENTITY list.download.website "Xem trang mạng">
<!ENTITY supplementMessage "Bộ lọc trọn gói này chỉ nên dùng kèm với bộ lọc trọn gói "?1?" - cái mà bạn chưa sử dụng.">
<!ENTITY viewList.label "Xem bộ lọc">
<!ENTITY visitHomepage.label "Vào trang chủ">
diff --git a/chrome/locale/zh-TW/global.properties b/chrome/locale/zh-TW/global.properties
index b19dd34..aa2de1d 100644
--- a/chrome/locale/zh-TW/global.properties
+++ b/chrome/locale/zh-TW/global.properties
@@ -1,5 +1,6 @@
no_blocking_suggestions=此頁面沒有可阻擋的項目
action3_tooltip=點擊啟用或停用 Adblock Plus。
+notification_antiadblock_title=隱藏針對性的訊息?
type_label_script=程式碼
filter_elemhide_nocriteria=沒有指定欲隱藏元素的辨識名稱
blockingGroup_title=廣告阻擋規則
@@ -24,6 +25,7 @@ type_label_object=物件
action2_tooltip=點擊開啟偏好設定視窗,按中鍵則可啟用或停用 Adblock Plus。
type_label_subdocument=頁框
clearStats_warning=這會重設所有的條件命中統計並停用命中計數器。您確定要這麼做?
+notification_antiadblock_message=已知此網站會對 Adblock Plus 用戶顯示針對性的訊息。您希望 Adblock Plus 隱藏它們嗎?
blocked_count_addendum=(以及白名單: ?1?, 已隱藏: ?2?)
subscription_invalid_location=條件集網址或檔案名稱無效。
type_label_image=圖片
diff --git a/chrome/skin/composer.css b/chrome/skin/composer.css
index 6f447ab..da75ba4 100644
--- a/chrome/skin/composer.css
+++ b/chrome/skin/composer.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/skin/filters.css b/chrome/skin/filters.css
index 337a9e7..a4ea586 100644
--- a/chrome/skin/filters.css
+++ b/chrome/skin/filters.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/skin/firstRun.css b/chrome/skin/firstRun.css
index a9e4acf..e1491c4 100644
--- a/chrome/skin/firstRun.css
+++ b/chrome/skin/firstRun.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/skin/overlay.css b/chrome/skin/overlay.css
index af846a7..0f58a15 100644
--- a/chrome/skin/overlay.css
+++ b/chrome/skin/overlay.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/skin/sendReport.css b/chrome/skin/sendReport.css
index bb2246e..53768f9 100644
--- a/chrome/skin/sendReport.css
+++ b/chrome/skin/sendReport.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/skin/sidebar.css b/chrome/skin/sidebar.css
index fa23623..abad956 100644
--- a/chrome/skin/sidebar.css
+++ b/chrome/skin/sidebar.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/chrome/skin/subscriptionSelection.css b/chrome/skin/subscriptionSelection.css
index d6ce88e..8ed7c24 100644
--- a/chrome/skin/subscriptionSelection.css
+++ b/chrome/skin/subscriptionSelection.css
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/defaults/patterns.ini b/defaults/patterns.ini
deleted file mode 100644
index afb6774..0000000
--- a/defaults/patterns.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-# Adblock Plus preferences
-version=4
diff --git a/lib/Public.jsm b/lib/Public.jsm
index 55800e1..0f96bcb 100644
--- a/lib/Public.jsm
+++ b/lib/Public.jsm
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -93,7 +93,7 @@ var AdblockPlus =
subscription.lastDownload = parseInt(new Date().getTime() / 1000);
let newFilters = [];
- for each (let filter in filters)
+ for (let filter of filters)
{
filter = Filter.fromText(Filter.normalize(filter));
if (filter)
@@ -130,7 +130,7 @@ var AdblockPlus =
*/
addPatterns: function(/**Array of String*/ filters)
{
- for each (let filter in filters)
+ for (let filter of filters)
{
filter = Filter.fromText(Filter.normalize(filter));
if (filter)
@@ -146,7 +146,7 @@ var AdblockPlus =
*/
removePatterns: function(/**Array of String*/ filters)
{
- for each (let filter in filters)
+ for (let filter of filters)
{
filter = Filter.fromText(Filter.normalize(filter));
if (filter)
diff --git a/lib/antiadblockInit.js b/lib/antiadblockInit.js
new file mode 100644
index 0000000..d8b29ca
--- /dev/null
+++ b/lib/antiadblockInit.js
@@ -0,0 +1,78 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {ActiveFilter} = require("filterClasses");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Subscription} = require("subscriptionClasses");
+let {Notification} = require("notification");
+
+exports.initAntiAdblockNotification = function initAntiAdblockNotification()
+{
+ let notification = {
+ id: "antiadblock",
+ type: "question",
+ title: Utils.getString("notification_antiadblock_title"),
+ message: Utils.getString("notification_antiadblock_message"),
+ urlFilters: []
+ };
+
+ function notificationListener(approved)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ subscription.disabled = !approved;
+ }
+
+ function addAntiAdblockNotification(subscription)
+ {
+ let urlFilters = [];
+ for (let filter of subscription.filters)
+ if (filter instanceof ActiveFilter)
+ for (let domain in filter.domains)
+ if (domain && urlFilters.indexOf(domain) == -1)
+ urlFilters.push(domain);
+ notification.urlFilters = urlFilters;
+ Notification.addNotification(notification);
+ Notification.addQuestionListener(notification.id, notificationListener);
+ }
+
+ function removeAntiAdblockNotification()
+ {
+ Notification.removeNotification(notification);
+ Notification.removeQuestionListener(notification.id, notificationListener);
+ }
+
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription.lastDownload && subscription.disabled)
+ addAntiAdblockNotification(subscription);
+
+ FilterNotifier.addListener(function(action, value, newItem, oldItem)
+ {
+ if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl)
+ return;
+
+ if (action == "subscription.updated")
+ addAntiAdblockNotification(value);
+ else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled))
+ removeAntiAdblockNotification();
+ });
+}
diff --git a/lib/appSupport.js b/lib/appSupport.js
index e0dd46a..f2a6c9b 100644
--- a/lib/appSupport.js
+++ b/lib/appSupport.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/lib/contentPolicy.js b/lib/contentPolicy.js
index 440aae5..a06e6de 100644
--- a/lib/contentPolicy.js
+++ b/lib/contentPolicy.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -94,7 +94,7 @@ let Policy = exports.Policy =
// type constant by type description and type description by type constant
let iface = Ci.nsIContentPolicy;
- for each (let typeName in contentTypes)
+ for (let typeName of contentTypes)
{
if ("TYPE_" + typeName in iface)
{
@@ -113,11 +113,11 @@ let Policy = exports.Policy =
this.typeDescr[0xFFFE] = "POPUP";
this.localizedDescr[0xFFFE] = Utils.getString("type_label_popup");
- for each (let type in nonVisualTypes)
+ for (let type of nonVisualTypes)
this.nonVisual[this.type[type]] = true;
// whitelisted URL schemes
- for each (let scheme in Prefs.whitelistschemes.toLowerCase().split(" "))
+ for (let scheme of Prefs.whitelistschemes.toLowerCase().split(" "))
this.whitelistSchemes[scheme] = true;
TimeLine.log("done initializing types");
@@ -342,7 +342,7 @@ let Policy = exports.Policy =
if (entry.filter && !(entry.filter instanceof WhitelistFilter))
return;
- for each (let node in nodes)
+ for (let node of nodes)
Utils.runAsync(refilterNode, this, node, entry);
}
};
@@ -378,7 +378,7 @@ let PolicyImplementation =
}
let catMan = Utils.categoryManager;
- for each (let category in this.xpcom_categories)
+ for (let category of this.xpcom_categories)
catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
// http-on-opening-request is new in Gecko 18, http-on-modify-request can
@@ -401,7 +401,7 @@ let PolicyImplementation =
Services.obs.removeObserver(this, "xpcom-category-entry-removed");
Services.obs.removeObserver(this, "xpcom-category-cleared");
- for each (let category in this.xpcom_categories)
+ for (let category of this.xpcom_categories)
catMan.deleteCategoryEntry(category, this.contractID, false);
// This needs to run asynchronously, see bug 753687
@@ -514,7 +514,11 @@ let PolicyImplementation =
{
let wnd = Utils.getRequestWindow(subject);
if (wnd && wnd.opener && wnd.location.href == "about:blank")
+ {
this.observe(wnd, "content-document-global-created", null, subject.URI);
+ if (subject instanceof Ci.nsIWritablePropertyBag)
+ subject.setProperty("abpRequestType", Policy.type.POPUP);
+ }
}
break;
@@ -584,6 +588,12 @@ let PolicyImplementation =
wnd = wnd.opener;
}
+ if (contentType == Policy.type.POPUP && wnd.opener)
+ {
+ // Popups are initiated by their opener, not their own window.
+ wnd = wnd.opener;
+ }
+
if (!Policy.processNode(wnd, wnd.document, contentType, newLocation, false))
result = Cr.NS_BINDING_ABORTED;
}
@@ -639,7 +649,7 @@ function postProcessNodes()
let nodes = scheduledNodes;
scheduledNodes = null;
- for each (let node in nodes)
+ for (let node of nodes)
{
// adjust frameset's cols/rows for frames
let parentNode = node.parentNode;
diff --git a/lib/customizableUI.js b/lib/customizableUI.js
index 4033b03..3a86aab 100644
--- a/lib/customizableUI.js
+++ b/lib/customizableUI.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/lib/downloader.js b/lib/downloader.js
index 9a89c70..d1ef209 100644
--- a/lib/downloader.js
+++ b/lib/downloader.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -120,7 +120,7 @@ Downloader.prototype =
_doCheck: function()
{
let now = Date.now();
- for each (let downloadable in this.dataSource())
+ for (let downloadable of this.dataSource())
{
if (downloadable.lastCheck && now - downloadable.lastCheck > this.maxAbsenceInterval)
{
diff --git a/lib/elemHide.js b/lib/elemHide.js
index 8f60a9c..6281101 100644
--- a/lib/elemHide.js
+++ b/lib/elemHide.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -248,13 +248,20 @@ let ElemHide = exports.ElemHide =
return;
}
- IO.writeToFile(styleURL.file, false, this._generateCSSContent(), function(e)
+ IO.writeToFile(styleURL.file, this._generateCSSContent(), function(e)
{
TimeLine.enter("ElemHide.apply() write callback");
this._applying = false;
- if (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE)
- IO.removeFile(styleURL.file, function(e2) {});
+ // _generateCSSContent is throwing NS_ERROR_NOT_AVAILABLE to indicate that
+ // there are no filters. If that exception is passed through XPCOM we will
+ // see a proper exception here, otherwise a number.
+ let noFilters = (e == Cr.NS_ERROR_NOT_AVAILABLE || (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE));
+ if (noFilters)
+ {
+ e = null;
+ IO.removeFile(styleURL.file, function(e) {});
+ }
else if (e)
Cu.reportError(e);
@@ -263,14 +270,14 @@ let ElemHide = exports.ElemHide =
this._needsApply = false;
this.apply();
}
- else if (!e || e.result == Cr.NS_ERROR_NOT_AVAILABLE)
+ else if (!e)
{
ElemHide.isDirty = false;
ElemHide.unapply();
TimeLine.log("ElemHide.unapply() finished");
- if (!e)
+ if (!noFilters)
{
try
{
diff --git a/lib/elemHideHitRegistration.js b/lib/elemHideHitRegistration.js
index 759b575..a05f6df 100644
--- a/lib/elemHideHitRegistration.js
+++ b/lib/elemHideHitRegistration.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/lib/filterClasses.js b/lib/filterClasses.js
index 5ddf975..601d2c2 100644
--- a/lib/filterClasses.js
+++ b/lib/filterClasses.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -303,6 +303,13 @@ ActiveFilter.prototype =
ignoreTrailingDot: true,
/**
+ * Determines whether domainSource is already upper-case,
+ * can be overridden by subclasses.
+ * @type Boolean
+ */
+ domainSourceIsUpperCase: false,
+
+ /**
* Map containing domains that this filter should match on/not match on or null if the filter should match on all domains
* @type Object
*/
@@ -312,7 +319,12 @@ ActiveFilter.prototype =
if (this.domainSource)
{
- let list = this.domainSource.split(this.domainSeparator);
+ let source = this.domainSource;
+ if (!this.domainSourceIsUpperCase) {
+ // RegExpFilter already have uppercase domains
+ source = source.toUpperCase();
+ }
+ let list = source.split(this.domainSeparator);
if (list.length == 1 && list[0][0] != "~")
{
// Fast track for the common one-domain scenario
@@ -352,7 +364,7 @@ ActiveFilter.prototype =
domains[""] = !hasIncludes;
}
- delete this.domainSource;
+ this.domainSource = null;
}
this.__defineGetter__("domains", function() domains);
@@ -467,6 +479,11 @@ RegExpFilter.prototype =
__proto__: ActiveFilter.prototype,
/**
+ * @see ActiveFilter.domainSourceIsUpperCase
+ */
+ domainSourceIsUpperCase: true,
+
+ /**
* Number of filters contained, will always be 1 (required to optimize Matcher).
* @type Integer
*/
@@ -577,7 +594,7 @@ RegExpFilter.fromText = function(text)
{
options = match[1].toUpperCase().split(",");
text = match.input.substr(0, match.index);
- for each (let option in options)
+ for (let option of options)
{
let value = null;
let separatorIndex = option.indexOf("=");
@@ -745,7 +762,7 @@ WhitelistFilter.prototype =
*/
function ElemHideBase(text, domains, selector)
{
- ActiveFilter.call(this, text, domains ? domains.toUpperCase() : null);
+ ActiveFilter.call(this, text, domains || null);
if (domains)
this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase();
@@ -800,7 +817,7 @@ ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules,
let additional = "";
if (attrRules) {
attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g);
- for each (let rule in attrRules) {
+ for (let rule of attrRules) {
rule = rule.substr(1, rule.length - 2);
let separatorPos = rule.indexOf("=");
if (separatorPos > 0) {
diff --git a/lib/filterListener.js b/lib/filterListener.js
index 4c4bc63..3b5a209 100644
--- a/lib/filterListener.js
+++ b/lib/filterListener.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -267,7 +267,7 @@ function onGenericChange(action)
defaultMatcher.clear();
ElemHide.clear();
- for each (let subscription in FilterStorage.subscriptions)
+ for (let subscription of FilterStorage.subscriptions)
if (!subscription.disabled)
subscription.filters.forEach(addFilter);
flushElemHide();
diff --git a/lib/filterNotifier.js b/lib/filterNotifier.js
index 2a601aa..010081e 100644
--- a/lib/filterNotifier.js
+++ b/lib/filterNotifier.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -66,7 +66,8 @@ let FilterNotifier = exports.FilterNotifier =
*/
triggerListeners: function(action, item, param1, param2, param3)
{
- for each (let listener in listeners)
+ let list = listeners.slice();
+ for (let listener of list)
listener(action, item, param1, param2, param3);
}
};
diff --git a/lib/filterStorage.js b/lib/filterStorage.js
index 89378ec..01b7328 100644
--- a/lib/filterStorage.js
+++ b/lib/filterStorage.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -28,6 +28,7 @@ let {Prefs} = require("prefs");
let {Filter, ActiveFilter} = require("filterClasses");
let {Subscription, SpecialSubscription, ExternalSubscription} = require("subscriptionClasses");
let {FilterNotifier} = require("filterNotifier");
+let {Utils} = require("utils");
let {TimeLine} = require("timeline");
/**
@@ -86,6 +87,12 @@ let FilterStorage = exports.FilterStorage =
},
/**
+ * Will be set to true if no patterns.ini file exists.
+ * @type Boolean
+ */
+ firstRun: false,
+
+ /**
* Map of properties listed in the filter storage file before the sections
* start. Right now this should be only the format version.
*/
@@ -110,7 +117,7 @@ let FilterStorage = exports.FilterStorage =
getGroupForFilter: function(/**Filter*/ filter) /**SpecialSubscription*/
{
let generalSubscription = null;
- for each (let subscription in FilterStorage.subscriptions)
+ for (let subscription of FilterStorage.subscriptions)
{
if (subscription instanceof SpecialSubscription && !subscription.disabled)
{
@@ -340,7 +347,7 @@ let FilterStorage = exports.FilterStorage =
for (let text in Filter.knownFilters)
filters.push(Filter.knownFilters[text]);
}
- for each (let filter in filters)
+ for (let filter of filters)
{
filter.hitCount = 0;
filter.lastHit = 0;
@@ -359,13 +366,14 @@ let FilterStorage = exports.FilterStorage =
return;
TimeLine.enter("Entered FilterStorage.loadFromDisk()");
+ this._loading = true;
let readFile = function(sourceFile, backupIndex)
{
TimeLine.enter("FilterStorage.loadFromDisk() -> readFile()");
let parser = new INIParser();
- IO.readFromFile(sourceFile, true, parser, function(e)
+ IO.readFromFile(sourceFile, parser, function(e)
{
TimeLine.enter("FilterStorage.loadFromDisk() read callback");
if (!e && parser.subscriptions.length == 0)
@@ -444,17 +452,11 @@ let FilterStorage = exports.FilterStorage =
TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
}.bind(this);
- let startRead = function(file)
- {
- this._loading = true;
- readFile(file, 0);
- }.bind(this);
-
let explicitFile;
if (sourceFile)
{
explicitFile = true;
- startRead(sourceFile);
+ readFile(sourceFile, 0);
}
else
{
@@ -465,11 +467,15 @@ let FilterStorage = exports.FilterStorage =
{
if (e || !statData.exists)
{
- let {addonRoot} = require("info");
- sourceFile = Services.io.newURI(addonRoot + "defaults/patterns.ini", null, null);
+ this.firstRun = true;
+ this._loading = false;
+ FilterNotifier.triggerListeners("load");
+
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
}
- startRead(sourceFile);
- }
+ else
+ readFile(sourceFile, 0);
+ }.bind(this);
if (sourceFile)
IO.statFile(sourceFile, callback);
@@ -569,7 +575,7 @@ let FilterStorage = exports.FilterStorage =
let writeFilters = function()
{
TimeLine.enter("FilterStorage.saveToDisk() -> writeFilters()");
- IO.writeToFile(targetFile, true, this._generateFilterData(subscriptions), function(e)
+ IO.writeToFile(targetFile, this._generateFilterData(subscriptions), function(e)
{
TimeLine.enter("FilterStorage.saveToDisk() write callback");
if (!explicitFile)
@@ -689,7 +695,7 @@ function addSubscriptionFilters(subscription)
if (!(subscription.url in FilterStorage.knownSubscriptions))
return;
- for each (let filter in subscription.filters)
+ for (let filter of subscription.filters)
filter.subscriptions.push(subscription);
}
@@ -702,7 +708,7 @@ function removeSubscriptionFilters(subscription)
if (!(subscription.url in FilterStorage.knownSubscriptions))
return;
- for each (let filter in subscription.filters)
+ for (let filter of subscription.filters)
{
let i = filter.subscriptions.indexOf(subscription);
if (i >= 0)
@@ -790,9 +796,10 @@ function INIParser()
}
INIParser.prototype =
{
+ linesProcessed: 0,
subscriptions: null,
knownFilters: null,
- knownSubscrptions : null,
+ knownSubscriptions : null,
wantObj: true,
fileProperties: null,
curObj: null,
@@ -832,7 +839,7 @@ INIParser.prototype =
if (this.subscriptions.length)
{
let subscription = this.subscriptions[this.subscriptions.length - 1];
- for each (let text in this.curObj)
+ for (let text of this.curObj)
{
let filter = Filter.fromText(text);
subscription.filters.push(filter);
@@ -877,5 +884,11 @@ INIParser.prototype =
Filter.knownFilters = origKnownFilters;
Subscription.knownSubscriptions = origKnownSubscriptions;
}
+
+ // Allow events to be processed every now and then.
+ // Note: IO.readFromFile() will deal with the potential reentrance here.
+ this.linesProcessed++;
+ if (this.linesProcessed % 1000 == 0)
+ Utils.yield();
}
};
diff --git a/lib/io.js b/lib/io.js
index 84ea31b..aa2effc 100644
--- a/lib/io.js
+++ b/lib/io.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -19,12 +19,15 @@
* @fileOverview Module containing file I/O helpers.
*/
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/FileUtils.jsm");
-Cu.import("resource://gre/modules/NetUtil.jsm");
+let {Services} = Cu.import("resource://gre/modules/Services.jsm", null);
+let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null);
+let {OS} = Cu.import("resource://gre/modules/osfile.jsm", null);
+let {Task} = Cu.import("resource://gre/modules/Task.jsm", null);
let {TimeLine} = require("timeline");
+let {Utils} = require("utils");
+
+const BUFFER_SIZE = 0x8000; // 32kB
let IO = exports.IO =
{
@@ -66,37 +69,58 @@ let IO = exports.IO =
* each line read and with a null parameter once the read operation is done.
* The callback will be called when the operation is done.
*/
- readFromFile: function(/**nsIFile|nsIURI*/ file, /**Boolean*/ decode, /**Object*/ listener, /**Function*/ callback, /**String*/ timeLineID)
+ readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/ callback, /**String*/ timeLineID)
{
try
{
+ let processing = false;
let buffer = "";
- let uri = file instanceof Ci.nsIFile ? Services.io.newFileURI(file) : file;
- let request = new XMLHttpRequest();
- request.mozBackgroundRequest = true;
- request.open("GET", uri.spec);
- request.responseType = "moz-chunked-text";
- request.overrideMimeType("text/plain" + (decode ? "? charset=utf-8" : ""));
-
- request.addEventListener("progress", function(event)
+ let loaded = false;
+ let error = null;
+
+ let onProgress = function(data)
{
if (timeLineID)
{
TimeLine.asyncStart(timeLineID);
}
- let data = event.target.response;
- let index = Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r"));
+ let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r")));
if (index >= 0)
{
- let oldBuffer = buffer;
- buffer = data.substr(index + 1);
- data = data.substr(0, index + 1);
- let lines = data.split(/[\r\n]+/);
- lines.pop();
- lines[0] = oldBuffer + lines[0];
- for (let i = 0; i < lines.length; i++)
- listener.process(lines[i]);
+ // Protect against reentrance in case the listener processes events.
+ processing = true;
+ try
+ {
+ let oldBuffer = buffer;
+ buffer = data.substr(index + 1);
+ data = data.substr(0, index + 1);
+ let lines = data.split(/[\r\n]+/);
+ lines.pop();
+ lines[0] = oldBuffer + lines[0];
+ for (let i = 0; i < lines.length; i++)
+ listener.process(lines[i]);
+ }
+ finally
+ {
+ processing = false;
+ data = buffer;
+ buffer = "";
+ onProgress(data);
+
+ if (loaded)
+ {
+ loaded = false;
+ onSuccess();
+ }
+
+ if (error)
+ {
+ let param = error;
+ error = null;
+ onError(param);
+ }
+ }
}
else
buffer += data;
@@ -105,10 +129,17 @@ let IO = exports.IO =
{
TimeLine.asyncEnd(timeLineID);
}
- }, false);
+ };
- request.addEventListener("load", function(event)
+ let onSuccess = function()
{
+ if (processing)
+ {
+ // Still processing data, delay processing this event.
+ loaded = true;
+ return;
+ }
+
if (timeLineID)
{
TimeLine.asyncStart(timeLineID);
@@ -125,127 +156,97 @@ let IO = exports.IO =
}
callback(null);
- }, false);
+ };
- request.addEventListener("error", function()
+ let onError = function(e)
{
- let e = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException);
- e.initialize("File read operation failed", result, null, Components.stack, file, null);
+ if (processing)
+ {
+ // Still processing data, delay processing this event.
+ error = e;
+ return;
+ }
+
callback(e);
if (timeLineID)
{
TimeLine.asyncDone(timeLineID);
}
- }, false);
+ };
+
+ let decoder = new TextDecoder();
+ let array = new Uint8Array(BUFFER_SIZE);
+ Task.spawn(function()
+ {
+ let f = yield OS.File.open(file.path, {read: true});
+ let numBytes;
+ do
+ {
+ numBytes = yield f.readTo(array);
+ if (numBytes)
+ {
+ let data = decoder.decode(numBytes == BUFFER_SIZE ?
+ array :
+ array.subarray(0, numBytes), {stream: true});
+ onProgress(data);
+ }
+ } while (numBytes);
- request.send(null);
+ yield f.close();
+ }.bind(this)).then(onSuccess, onError);
}
catch (e)
{
callback(e);
}
},
+
/**
- * Writes string data to a file asynchronously, optionally encodes it into
- * UTF-8 first. The callback will be called when the write operation is done.
+ * Writes string data to a file in UTF-8 format asynchronously. The callback
+ * will be called when the write operation is done.
*/
- writeToFile: function(/**nsIFile*/ file, /**Boolean*/ encode, /**Iterator*/ data, /**Function*/ callback, /**String*/ timeLineID)
+ writeToFile: function(/**nsIFile*/ file, /**Iterator*/ data, /**Function*/ callback, /**String*/ timeLineID)
{
try
{
- let fileStream = FileUtils.openSafeFileOutputStream(file, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE);
-
- let pipe = Cc["@mozilla.org/pipe;1"].createInstance(Ci.nsIPipe);
- pipe.init(true, true, 0, 0x8000, null);
+ let encoder = new TextEncoder();
- let outStream = pipe.outputStream;
- if (encode)
+ Task.spawn(function()
{
- outStream = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream);
- outStream.init(pipe.outputStream, "UTF-8", 0, Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
- }
-
- let copier = Cc["@mozilla.org/network/async-stream-copier;1"].createInstance(Ci.nsIAsyncStreamCopier);
- copier.init(pipe.inputStream, fileStream, null, true, false, 0x8000, true, true);
- copier.asyncCopy({
- onStartRequest: function(request, context) {},
- onStopRequest: function(request, context, result)
- {
- if (timeLineID)
- {
- TimeLine.asyncDone(timeLineID);
- }
-
- if (!Components.isSuccessCode(result))
- {
- let e = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException);
- e.initialize("File write operation failed", result, null, Components.stack, file, null);
- callback(e);
- }
- else
- callback(null);
- }
- }, null);
+ // This mimics OS.File.writeAtomic() but writes in chunks.
+ let tmpPath = file.path + ".tmp";
+ let f = yield OS.File.open(tmpPath, {write: true, truncate: true});
- let lineBreak = this.lineBreak;
- let writeNextChunk = function()
- {
let buf = [];
let bufLen = 0;
- while (bufLen < 0x4000)
+ let lineBreak = this.lineBreak;
+
+ function writeChunk()
{
- try
- {
- let str = data.next();
- buf.push(str);
- bufLen += str.length;
- }
- catch (e)
- {
- if (e instanceof StopIteration)
- break;
- else if (typeof e == "number")
- pipe.outputStream.closeWithStatus(e);
- else if (e instanceof Ci.nsIException)
- pipe.outputStream.closeWithStatus(e.result);
- else
- {
- Cu.reportError(e);
- pipe.outputStream.closeWithStatus(Cr.NS_ERROR_FAILURE);
- }
- return;
- }
+ let array = encoder.encode(buf.join(lineBreak) + lineBreak);
+ buf = [];
+ bufLen = 0;
+ return f.write(array);
}
- pipe.outputStream.asyncWait({
- onOutputStreamReady: function()
- {
- if (timeLineID)
- {
- TimeLine.asyncStart(timeLineID);
- }
+ for (let line in data)
+ {
+ buf.push(line);
+ bufLen += line.length;
+ if (bufLen >= BUFFER_SIZE)
+ yield writeChunk();
+ }
- if (buf.length)
- {
- let str = buf.join(lineBreak) + lineBreak;
- if (encode)
- outStream.writeString(str);
- else
- outStream.write(str, str.length);
- writeNextChunk();
- }
- else
- outStream.close();
+ if (bufLen)
+ yield writeChunk();
- if (timeLineID)
- {
- TimeLine.asyncEnd(timeLineID);
- }
- }
- }, 0, 0, Services.tm.currentThread);
- };
- writeNextChunk();
+ // OS.File.flush() isn't exposed prior to Gecko 27, see bug 912457.
+ if (typeof f.flush == "function")
+ yield f.flush();
+ yield f.close();
+ yield OS.File.move(tmpPath, file.path, {noCopy: true});
+ }.bind(this)).then(callback.bind(null, null), callback);
}
catch (e)
{
@@ -261,22 +262,8 @@ let IO = exports.IO =
{
try
{
- let inStream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
- inStream.init(fromFile, FileUtils.MODE_RDONLY, 0, Ci.nsIFileInputStream.DEFER_OPEN);
-
- let outStream = FileUtils.openFileOutputStream(toFile, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE);
-
- NetUtil.asyncCopy(inStream, outStream, function(result)
- {
- if (!Components.isSuccessCode(result))
- {
- let e = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException);
- e.initialize("File write operation failed", result, null, Components.stack, file, null);
- callback(e);
- }
- else
- callback(null);
- });
+ let promise = OS.File.copy(fromFile.path, toFile.path);
+ promise.then(callback.bind(null, null), callback);
}
catch (e)
{
@@ -291,8 +278,10 @@ let IO = exports.IO =
{
try
{
- fromFile.moveTo(null, newName);
- callback(null);
+ toFile = fromFile.clone();
+ toFile.leafName = newName;
+ let promise = OS.File.move(fromFile.path, toFile.path);
+ promise.then(callback.bind(null, null), callback);
}
catch(e)
{
@@ -307,8 +296,8 @@ let IO = exports.IO =
{
try
{
- file.remove(false);
- callback(null);
+ let promise = OS.File.remove(file.path);
+ promise.then(callback.bind(null, null), callback);
}
catch(e)
{
@@ -323,12 +312,28 @@ let IO = exports.IO =
{
try
{
- let exists = file.exists();
- callback(null, {
- exists: exists,
- isDirectory: exists && file.isDirectory(),
- isFile: exists && file.isFile(),
- lastModified: exists ? file.lastModifiedTime : 0
+ let promise = OS.File.stat(file.path);
+ promise.then(function onSuccess(info)
+ {
+ callback(null, {
+ exists: true,
+ isDirectory: info.isDir,
+ isFile: !info.isDir,
+ lastModified: info.lastModificationDate.getTime()
+ });
+ }, function onError(e)
+ {
+ if (e.becauseNoSuchFile)
+ {
+ callback(null, {
+ exists: false,
+ isDirectory: false,
+ isFile: false,
+ lastModified: 0
+ });
+ }
+ else
+ callback(e);
});
}
catch(e)
diff --git a/lib/main.js b/lib/main.js
index 72f3838..f18cc05 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/lib/matcher.js b/lib/matcher.js
index 6244609..80b2380 100644
--- a/lib/matcher.js
+++ b/lib/matcher.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/lib/notification.js b/lib/notification.js
index 9254c50..06e949e 100644
--- a/lib/notification.js
+++ b/lib/notification.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -128,7 +128,7 @@ let Notification = exports.Notification =
try
{
let data = JSON.parse(responseText);
- for each (let notification in data.notifications)
+ for (let notification of data.notifications)
{
if ("severity" in notification)
{
@@ -191,7 +191,7 @@ let Notification = exports.Notification =
let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info");
let notificationToShow = null;
- for each (let notification in notifications)
+ for (let notification of notifications)
{
if ((typeof notification.type === "undefined" || notification.type !== "critical")
&& Prefs.notificationdata.shown.indexOf(notification.id) !== -1)
@@ -202,7 +202,7 @@ let Notification = exports.Notification =
if (typeof url === "string" && notification.urlFilters instanceof Array)
{
let matcher = new Matcher();
- for each (let urlFilter in notification.urlFilters)
+ for (let urlFilter of notification.urlFilters)
matcher.add(Filter.fromText(urlFilter));
if (!matcher.matchesAny(url, "DOCUMENT", url))
continue;
@@ -214,7 +214,7 @@ let Notification = exports.Notification =
if (notification.targets instanceof Array)
{
let match = false;
- for each (let target in notification.targets)
+ for (let target of notification.targets)
{
if (checkTarget(target, "extension", addonName, addonVersion) &&
checkTarget(target, "application", application, applicationVersion) &&
@@ -263,7 +263,7 @@ let Notification = exports.Notification =
locale = locale || Utils.appLocale;
let textKeys = ["title", "message"];
let localizedTexts = [];
- for each (let key in textKeys)
+ for (let key of textKeys)
{
if (key in notification)
{
@@ -331,7 +331,8 @@ let Notification = exports.Notification =
{
if (!(id in listeners))
return;
- for each (let listener in listeners[id])
+ let questionListeners = listeners[id];
+ for (let listener of questionListeners)
listener(approved);
}
};
diff --git a/lib/objectTabs.js b/lib/objectTabs.js
index 395c735..1227490 100644
--- a/lib/objectTabs.js
+++ b/lib/objectTabs.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -303,7 +303,7 @@ var objTabs =
objtab.removeEventListener("mouseout", objectTabEventHander, false);
objtab.nodeData = null;
- for each (let wnd in this.windowListeners)
+ for (let wnd of this.windowListeners)
wnd.removeEventListener("MozAfterPaint", objectWindowEventHandler, false);
this.windowListeners = null;
}
diff --git a/lib/requestNotifier.js b/lib/requestNotifier.js
index 098d748..9a77df5 100644
--- a/lib/requestNotifier.js
+++ b/lib/requestNotifier.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -31,8 +31,8 @@ let windowSelection = new WeakMap();
let setEntry, hasEntry, getEntry;
if (false)
{
- // This branch can be enabled again once both bug 673468 and bug 819131 are
- // fixed and we can use weak maps
+ // This branch can be enabled again once all of bug 673468, bug 819131 and
+ // bug 982561 are fixed and we can use weak maps.
setEntry = function(map, key, value) map.set(key, value);
hasEntry = function(map, key) map.has(key);
getEntry = function(map, key) map.get(key);
@@ -153,51 +153,40 @@ RequestNotifier.prototype =
*/
startScan: function(wnd)
{
- let currentThread = Utils.threadManager.currentThread;
-
let doc = wnd.document;
let walker = doc.createTreeWalker(doc, Ci.nsIDOMNodeFilter.SHOW_ELEMENT, null, false);
- let runnable =
+ let process = function()
{
- notifier: null,
-
- run: function()
+ if (!this.listener)
+ return;
+
+ let node = walker.currentNode;
+ let data = getEntry(nodeData, node);
+ if (typeof data != "undefined")
+ for (let k in data)
+ this.notifyListener(wnd, node, data[k]);
+
+ if (walker.nextNode())
+ Utils.runAsync(process);
+ else
{
- if (!this.notifier.listener)
- return;
-
- let node = walker.currentNode;
- let data = getEntry(nodeData, node);
- if (typeof data != "undefined")
- for (let k in data)
- this.notifier.notifyListener(wnd, node, data[k]);
-
- if (walker.nextNode())
- currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
- else
+ // Done with the current window, start the scan for its frames
+ for (let i = 0; i < wnd.frames.length; i++)
+ this.startScan(wnd.frames[i]);
+
+ this.eventsPosted--;
+ if (!this.eventsPosted)
{
- // Done with the current window, start the scan for its frames
- for (let i = 0; i < wnd.frames.length; i++)
- this.notifier.startScan(wnd.frames[i]);
-
- this.notifier.eventsPosted--;
- if (!this.notifier.eventsPosted)
- {
- this.notifier.scanComplete = true;
- this.notifier.notifyListener(wnd, null, null);
- }
-
- this.notifier = null;
+ this.scanComplete = true;
+ this.notifyListener(wnd, null, null);
}
}
- };
- runnable.notifier = this;
+ }.bind(this);
- // Process each node in a separate event on current thread to allow other
- // events to process
+ // Process each node in a separate event to allow other events to process
this.eventsPosted++;
- currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ Utils.runAsync(process);
}
};
@@ -324,7 +313,7 @@ function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location
}
// Notify listeners
- for each (let notifier in activeNotifiers)
+ for (let notifier of activeNotifiers)
if (!notifier.window || notifier.window == topWnd)
notifier.notifyListener(topWnd, node, this);
}
diff --git a/lib/subscriptionClasses.js b/lib/subscriptionClasses.js
index d032688..58b028b 100644
--- a/lib/subscriptionClasses.js
+++ b/lib/subscriptionClasses.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -129,7 +129,7 @@ Subscription.prototype =
serializeFilters: function(buffer)
{
- for each (let filter in this.filters)
+ for (let filter of this.filters)
buffer.push(filter.text.replace(/\[/g, "\\["));
},
@@ -274,7 +274,7 @@ SpecialSubscription.prototype =
{
if (this.defaults && this.defaults.length)
{
- for each (let type in this.defaults)
+ for (let type of this.defaults)
{
if (filter instanceof SpecialSubscription.defaultsMap[type])
return true;
diff --git a/lib/sync.js b/lib/sync.js
index d0a4dda..fe0a4ab 100644
--- a/lib/sync.js
+++ b/lib/sync.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -198,7 +198,7 @@ ABPStore.prototype =
id: id,
subscriptions: [],
};
- for each (let subscription in FilterStorage.subscriptions)
+ for (let subscription of FilterStorage.subscriptions)
{
if (subscription instanceof ExternalSubscription)
continue;
@@ -211,7 +211,7 @@ ABPStore.prototype =
if (subscription instanceof SpecialSubscription)
{
subscriptionEntry.filters = [];
- for each (let filter in subscription.filters)
+ for (let filter of subscription.filters)
{
let filterEntry = {text: filter.text};
if (filter instanceof ActiveFilter)
@@ -251,7 +251,7 @@ ABPStore.prototype =
// First make sure we have the same subscriptions on both sides
let seenSubscription = {__proto__: null};
- for each (let remoteSubscription in data)
+ for (let remoteSubscription of data)
{
seenSubscription[remoteSubscription.url] = true;
if (remoteSubscription.url in FilterStorage.knownSubscriptions)
@@ -282,7 +282,7 @@ ABPStore.prototype =
}
}
- for each (let subscription in FilterStorage.subscriptions.slice())
+ for (let subscription of FilterStorage.subscriptions.slice())
{
if (!(subscription.url in seenSubscription) && subscription instanceof DownloadableSubscription && !trackerInstance.didSubscriptionChange(subscription))
{
@@ -293,12 +293,12 @@ ABPStore.prototype =
// Now sync the custom filters
let seenFilter = {__proto__: null};
- for each (let remoteSubscription in data)
+ for (let remoteSubscription of data)
{
if (!("filters" in remoteSubscription))
continue;
- for each (let remoteFilter in remoteSubscription.filters)
+ for (let remoteFilter of remoteSubscription.filters)
{
seenFilter[remoteFilter.text] = true;
@@ -320,12 +320,12 @@ ABPStore.prototype =
}
}
- for each (let subscription in FilterStorage.subscriptions)
+ for (let subscription of FilterStorage.subscriptions)
{
if (!(subscription instanceof SpecialSubscription))
continue;
- for each (let filter in subscription.filters.slice())
+ for (let filter of subscription.filters.slice())
{
if (!(filter.text in seenFilter) && !trackerInstance.didFilterChange(filter))
{
@@ -348,13 +348,13 @@ ABPStore.prototype =
{
this._log.trace("Got wipe command, removing all data");
- for each (let subscription in FilterStorage.subscriptions.slice())
+ for (let subscription of FilterStorage.subscriptions.slice())
{
if (subscription instanceof DownloadableSubscription)
FilterStorage.removeSubscription(subscription);
else if (subscription instanceof SpecialSubscription)
{
- for each (let filter in subscription.filters.slice())
+ for (let filter of subscription.filters.slice())
FilterStorage.removeFilter(filter);
}
}
@@ -435,9 +435,9 @@ ABPTracker.prototype =
else if (item instanceof SpecialSubscription)
{
// User's filters changed via Preferences window
- for each (let filter in item.filters)
+ for (let filter of item.filters)
this.addPrivateChange("filter " + filter.text);
- for each (let filter in item.oldFilters)
+ for (let filter of item.oldFilters)
this.addPrivateChange("filter " + filter.text);
}
break;
diff --git a/lib/synchronizer.js b/lib/synchronizer.js
index 61a8f7f..590ad73 100644
--- a/lib/synchronizer.js
+++ b/lib/synchronizer.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -98,7 +98,7 @@ let Synchronizer = exports.Synchronizer =
if (!Prefs.subscriptions_autoupdate)
return;
- for each (let subscription in FilterStorage.subscriptions)
+ for (let subscription of FilterStorage.subscriptions)
{
if (subscription instanceof DownloadableSubscription)
yield this._getDownloadable(subscription, false);
@@ -255,7 +255,7 @@ let Synchronizer = exports.Synchronizer =
// Process filters
lines.shift();
let filters = [];
- for each (let line in lines)
+ for (let line of lines)
{
line = Filter.normalize(line);
if (line)
diff --git a/lib/timeline.js b/lib/timeline.js
index 7935587..18c10fb 100644
--- a/lib/timeline.js
+++ b/lib/timeline.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
diff --git a/lib/ui.js b/lib/ui.js
index a52321c..6570bca 100644
--- a/lib/ui.js
+++ b/lib/ui.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -25,11 +25,12 @@ let {FilterListener} = require("filterListener");
let {FilterStorage} = require("filterStorage");
let {FilterNotifier} = require("filterNotifier");
let {RequestNotifier} = require("requestNotifier");
-let {Filter, ActiveFilter} = require("filterClasses");
+let {Filter} = require("filterClasses");
let {Subscription, SpecialSubscription, DownloadableSubscription} = require("subscriptionClasses");
let {Synchronizer} = require("synchronizer");
let {KeySelector} = require("keySelector");
let {Notification} = require("notification");
+let {initAntiAdblockNotification} = require("antiadblockInit");
let CustomizableUI;
try
@@ -398,73 +399,6 @@ let UI = exports.UI =
}
},
- _initAntiAdblockNotification: function()
- {
- let notification = {
- id: "antiadblock",
- type: "question",
- title: Utils.getString("notification_antiadblock_title"),
- message: Utils.getString("notification_antiadblock_message"),
- urlFilters: []
- };
-
- function notificationListener(approved)
- {
- let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
- if (subscription.url in FilterStorage.knownSubscriptions)
- subscription.disabled = !approved;
- }
-
- function addAntiAdblockNotification(subscription)
- {
- let urlFilters = [];
- for each (let filter in subscription.filters)
- if (filter instanceof ActiveFilter)
- for (let domain in filter.domains)
- if (domain && urlFilters.indexOf(domain) == -1)
- urlFilters.push(domain);
- notification.urlFilters = urlFilters;
- Notification.addNotification(notification);
- Notification.addQuestionListener(notification.id, notificationListener);
- }
-
- function removeAntiAdblockNotification()
- {
- Notification.removeNotification(notification);
- Notification.removeQuestionListener(notification.id, notificationListener);
- }
-
- let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
- if (subscription.lastDownload && subscription.disabled)
- addAntiAdblockNotification(subscription);
-
- FilterNotifier.addListener(function(action, value, newItem, oldItem)
- {
- if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl)
- return;
-
- if (action == "subscription.updated")
- addAntiAdblockNotification(value);
- else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled))
- removeAntiAdblockNotification();
- });
-
- var documentCreationObserver = {
- observe: function(subject, topic, data)
- {
- if (!(subject instanceof Ci.nsIDOMWindow))
- return;
-
- this._showNextNotification(subject.location.href);
- }.bind(this)
- };
- Services.obs.addObserver(documentCreationObserver, "content-document-global-created", false);
- onShutdown.add(function()
- {
- Services.obs.removeObserver(documentCreationObserver, "content-document-global-created", false);
- });
- },
-
/**
* Gets called once the initialization is finished and Adblock Plus elements
* can be added to the UI.
@@ -522,9 +456,27 @@ let UI = exports.UI =
}.bind(this));
notificationTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
- notificationTimer.initWithCallback(this._showNextNotification.bind(this),
+ notificationTimer.initWithCallback(this.showNextNotification.bind(this),
3 * 60 * 1000, Ci.nsITimer.TYPE_ONE_SHOT);
onShutdown.add(function() notificationTimer.cancel());
+
+ // Add "anti-adblock messages" notification
+ initAntiAdblockNotification();
+
+ let documentCreationObserver = {
+ observe: function(subject, topic, data)
+ {
+ if (!(subject instanceof Ci.nsIDOMWindow))
+ return;
+
+ this.showNextNotification(subject.location.href);
+ }.bind(UI)
+ };
+ Services.obs.addObserver(documentCreationObserver, "content-document-global-created", false);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(documentCreationObserver, "content-document-global-created", false);
+ });
},
/**
@@ -597,9 +549,6 @@ let UI = exports.UI =
window.document.getElementById("abp-notification").hidePopup();
}, false);
- // Add "anti-adblock messages" notification
- this._initAntiAdblockNotification();
-
// First-run actions?
if (!this.firstRunDone)
{
@@ -947,7 +896,7 @@ let UI = exports.UI =
let url = null;
let mainSubscriptionTitle = null;
let mainSubscriptionURL = null;
- for each (let param in match[1].split('&'))
+ for (let param of match[1].split('&'))
{
let parts = param.split("=", 2);
if (parts.length != 2 || !/\S/.test(parts[1]))
@@ -1131,7 +1080,7 @@ let UI = exports.UI =
}
else
{
- if (icon.hasAttribute("context") && Prefs.defaulttoolbaraction == 0)
+ if (Prefs.defaulttoolbaraction == 0)
icon.setAttribute("type", "menu");
else
icon.setAttribute("type", "menu-button");
@@ -1374,7 +1323,7 @@ let UI = exports.UI =
}
// Prevent tooltip from overlapping menu
- for each (let id in ["abp-toolbar-popup", "abp-status-popup"])
+ for (let id of ["abp-toolbar-popup", "abp-status-popup"])
{
let element = E(id);
if (element && element.state == "open")
@@ -1842,7 +1791,7 @@ let UI = exports.UI =
{
Prefs.hideContributeButton = true;
- for each (let id in ["abp-status-contributebutton", "abp-toolbar-contributebutton", "abp-menuitem-contributebutton"])
+ for (let id of ["abp-status-contributebutton", "abp-toolbar-contributebutton", "abp-menuitem-contributebutton"])
{
let button = window.document.getElementById(id);
if (button)
@@ -1850,7 +1799,7 @@ let UI = exports.UI =
}
},
- _showNextNotification: function(url)
+ showNextNotification: function(url)
{
let window = this.currentWindow;
if (!window)
@@ -1902,7 +1851,7 @@ let UI = exports.UI =
let messageElement = window.document.getElementById("abp-notification-message");
messageElement.innerHTML = "";
let docLinks = [];
- for each (let link in notification.links)
+ for (let link of notification.links)
docLinks.push(Utils.getDocLink(link));
insertMessage(messageElement, texts.message, docLinks);
diff --git a/lib/utils.js b/lib/utils.js
index bf19912..03ca20d 100644
--- a/lib/utils.js
+++ b/lib/utils.js
@@ -1,6 +1,6 @@
/*
* This file is part of Adblock Plus <http://adblockplus.org/>,
- * Copyright (C) 2006-2013 Eyeo GmbH
+ * 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
@@ -225,7 +225,7 @@ let Utils = exports.Utils =
callback.apply(thisPtr, params);
}
};
- Utils.threadManager.currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ Services.tm.currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
},
/**
@@ -315,7 +315,7 @@ let Utils = exports.Utils =
return null;
let appLocale = Utils.appLocale;
- for each (let prefix in prefixes.split(/,/))
+ for (let prefix of prefixes.split(/,/))
if (new RegExp("^" + prefix + "\\b").test(appLocale))
return prefix;
@@ -365,6 +365,16 @@ let Utils = exports.Utils =
},
/**
+ * Pauses code execution and allows events to be processed. Warning:
+ * other extension code might execute, the extension might even shut down.
+ */
+ yield: function()
+ {
+ let thread = Services.tm.currentThread;
+ while (thread.processNextEvent(false));
+ },
+
+ /**
* Saves sidebar state before detaching/reattaching
*/
setParams: function(params)
@@ -585,7 +595,6 @@ Cache.prototype =
XPCOMUtils.defineLazyServiceGetter(Utils, "categoryManager", "@mozilla.org/categorymanager;1", "nsICategoryManager");
XPCOMUtils.defineLazyServiceGetter(Utils, "ioService", "@mozilla.org/network/io-service;1", "nsIIOService");
-XPCOMUtils.defineLazyServiceGetter(Utils, "threadManager", "@mozilla.org/thread-manager;1", "nsIThreadManager");
XPCOMUtils.defineLazyServiceGetter(Utils, "promptService", "@mozilla.org/embedcomp/prompt-service;1", "nsIPromptService");
XPCOMUtils.defineLazyServiceGetter(Utils, "effectiveTLD", "@mozilla.org/network/effective-tld-service;1", "nsIEffectiveTLDService");
XPCOMUtils.defineLazyServiceGetter(Utils, "netUtils", "@mozilla.org/network/util;1", "nsINetUtil");
diff --git a/metadata.gecko b/metadata.gecko
index 00aa27b..e6545b0 100644
--- a/metadata.gecko
+++ b/metadata.gecko
@@ -1,7 +1,7 @@
[general]
id={d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}
basename=adblockplus
-version=2.5.1
+version=2.6
author=Wladimir Palant
options=chrome://adblockplus/content/ui/settings.xul
optionsType=2
@@ -29,11 +29,11 @@ zh-CN=https://adblockplus.org/zh_CN/
zh-TW=https://adblockplus.org/zh_TW/
[compat]
-firefox=17.0/30.0
-fennec2=17.0/30.0
-thunderbird=17.0/30.0
-seamonkey=2.14/2.27
-toolkit=17.0/30.0
+firefox=19.0/32.0
+fennec2=19.0/32.0
+thunderbird=19.0/32.0
+seamonkey=2.16/2.29
+toolkit=19.0/32.0
[preprocess]
chrome/content/ui/firstRun.html =
diff --git a/normalizeLocales.pl b/normalizeLocales.pl
index cb29e87..a6948a2 100755
--- a/normalizeLocales.pl
+++ b/normalizeLocales.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# This file is part of Adblock Plus <http://adblockplus.org/>,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/search_and_replace.pl b/search_and_replace.pl
index 8c38a64..1746218 100755
--- a/search_and_replace.pl
+++ b/search_and_replace.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# This file is part of Adblock Plus <http://adblockplus.org/>,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/test_locales.pl b/test_locales.pl
index b46bfbc..2979992 100755
--- a/test_locales.pl
+++ b/test_locales.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# This file is part of Adblock Plus <http://adblockplus.org/>,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/update_locales.py b/update_locales.py
index 8a45f35..e223142 100644
--- a/update_locales.py
+++ b/update_locales.py
@@ -2,7 +2,7 @@
# coding: utf-8
# This file is part of Adblock Plus <http://adblockplus.org/>,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
diff --git a/validateChecksum.py b/validateChecksum.py
index efef367..396e66c 100755
--- a/validateChecksum.py
+++ b/validateChecksum.py
@@ -2,7 +2,7 @@
# coding: utf-8
# This file is part of Adblock Plus <http://adblockplus.org/>,
-# Copyright (C) 2006-2013 Eyeo GmbH
+# 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
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus.git
More information about the Pkg-mozext-commits
mailing list