[Pkg-mozext-commits] [downthemall] 01/02: New upstream version 3.0.7
Michael Meskes
meskes at moszumanska.debian.org
Tue Sep 27 10:42:09 UTC 2016
This is an automated email from the git hooks/post-receive script.
meskes pushed a commit to branch master
in repository downthemall.
commit b5e3f20d8e6db656f0c4208f723f5b7e82f963c6
Author: Michael Meskes <meskes at debian.org>
Date: Tue Sep 27 12:37:50 2016 +0200
New upstream version 3.0.7
---
META-INF/manifest.mf | 243 +++++++++++++----
META-INF/mozilla.rsa | Bin 4196 -> 4196 bytes
META-INF/mozilla.sf | 4 +-
chrome.manifest | 1 +
chrome/content/common/bindings.xml | 18 +-
chrome/content/dta/addurl.js | 4 +
chrome/content/dta/manager/manager.js | 129 ++++-----
chrome/content/mac/manager.xul | 2 +
chrome/locale/it/addurl.dtd | 6 +
chrome/locale/it/addurl.properties | 8 +
chrome/locale/it/common.properties | 22 ++
chrome/locale/it/conflicts.dtd | 7 +
chrome/locale/it/conflicts.properties | 3 +
chrome/locale/it/description.properties | 2 +
chrome/locale/it/downloadHelper.properties | 4 +
chrome/locale/it/dta.dtd | 26 ++
chrome/locale/it/filters.properties | 10 +
chrome/locale/it/landingpage.dtd | 95 +++++++
chrome/locale/it/mainmenu.dtd | 5 +
chrome/locale/it/manager.dtd | 67 +++++
chrome/locale/it/manager.properties | 116 ++++++++
chrome/locale/it/mask.dtd | 31 +++
chrome/locale/it/menu.dtd | 25 ++
chrome/locale/it/menu.properties | 11 +
chrome/locale/it/metalinker.dtd | 3 +
chrome/locale/it/metalinker.properties | 7 +
chrome/locale/it/mirrors.dtd | 10 +
chrome/locale/it/mirrors.properties | 12 +
chrome/locale/it/prefpanes.dtd | 123 +++++++++
chrome/locale/it/prefpanes.properties | 16 ++
chrome/locale/it/sanitize.properties | 1 +
chrome/locale/it/saveas.dtd | 1 +
chrome/locale/it/select.dtd | 16 ++
chrome/locale/it/select.properties | 6 +
chrome/locale/sl-SI/prefpanes.dtd | 40 +--
chrome/skin/manager/style.css | 4 +-
chrome/skin/select/tabActiveEnd.svg | 2 +-
chrome/skin/select/tabActiveMiddle.svg | 2 +-
chrome/skin/select/tabActiveStart.svg | 2 +-
chrome/skin/win/manager-new.css | 2 +-
chrome/skin/win/manager-newer.css | 11 +-
chrome/skin/win/select.css | 31 +--
install.rdf | 5 +-
modules/constants.js | 3 +-
modules/defaultPrefs.js | 1 +
modules/glue.jsm | 20 +-
modules/loaders/integration-content.js | 13 +
modules/loaders/integration.js | 2 +-
modules/manager/chunk.js | 414 +++++++++++++----------------
modules/manager/connection.js | 57 ++--
modules/manager/memoryreporter.js | 27 +-
modules/manager/preallocator.js | 18 +-
modules/manager/preallocator/worker.js | 2 +-
modules/support/domainprefs.js | 104 ++++++++
modules/support/loggedprompter.js | 118 ++++----
modules/support/requestmanipulation.js | 1 -
modules/support/stringfuncs.js | 4 +
57 files changed, 1378 insertions(+), 539 deletions(-)
diff --git a/META-INF/manifest.mf b/META-INF/manifest.mf
index 61ce221..11349ff 100644
--- a/META-INF/manifest.mf
+++ b/META-INF/manifest.mf
@@ -2,13 +2,13 @@ Manifest-Version: 1.0
Name: install.rdf
Digest-Algorithms: MD5 SHA1
-MD5-Digest: +lJC1oIgCat4UY03DHRH8w==
-SHA1-Digest: o6kjIvu22/hi6NcHbmBeMZtt3JM=
+MD5-Digest: 1ocKio2IAFJIsbn2O+xyqQ==
+SHA1-Digest: UQVMUtO7XjZI/aufQtZUWhaVrnY=
Name: chrome.manifest
Digest-Algorithms: MD5 SHA1
-MD5-Digest: L2DIzKNWGePPdOOMUTCJoQ==
-SHA1-Digest: mjmHCA7QvDHrq7WoIWoxd8dU+CM=
+MD5-Digest: YpMwNauWBsZtZQu3fX61BQ==
+SHA1-Digest: GRWOcb6qfi/x7e2gwQnircTtIiw=
Name: icon.png
Digest-Algorithms: MD5 SHA1
@@ -37,8 +37,8 @@ SHA1-Digest: MyoPuAf30tnhX9Qkp3kQyvvar2Y=
Name: chrome/content/common/bindings.xml
Digest-Algorithms: MD5 SHA1
-MD5-Digest: uC2x4DOmVNMQA6fc3X3k9Q==
-SHA1-Digest: uH5QhZEiCMcDVZ8m9uRSdTOrFq4=
+MD5-Digest: POqIKyVpCuA0lAc1/8E6fg==
+SHA1-Digest: 6XIcWuxx3EDDJl3ijZHQm7ULdLI=
Name: chrome/content/common/internalFunctions.js
Digest-Algorithms: MD5 SHA1
@@ -52,8 +52,8 @@ SHA1-Digest: l3fRwPHVcTGiSjRy1tyBRH7n5LI=
Name: chrome/content/dta/addurl.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: PdjVSkJgaa54eB4SAC2CUw==
-SHA1-Digest: TZIR6mJ0rzf/9lRvNlDJ1XBW/M4=
+MD5-Digest: 16VPyYvNBkCNzDbrx3Xfow==
+SHA1-Digest: D2O+PCg2JQ9yHddy5LIiFEnvb6M=
Name: chrome/content/dta/addurl.xul
Digest-Algorithms: MD5 SHA1
@@ -127,8 +127,8 @@ SHA1-Digest: S4202h+i0zpTKtBG+lDOx9ijMlM=
Name: chrome/content/dta/manager/manager.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: jsU6tX/rn1vcCjWIFdwa/Q==
-SHA1-Digest: VQ3Kp/QDL4z6C+66JIMJxE8Ts3o=
+MD5-Digest: ndUhQsEGgDMfXxIqTggw1A==
+SHA1-Digest: Kis9rxvdhK+FrultD3fcGScVPaU=
Name: chrome/content/dta/manager/manager.xul
Digest-Algorithms: MD5 SHA1
@@ -182,8 +182,8 @@ SHA1-Digest: 3/uDd3aqvCUBFI8zajADbtyua1k=
Name: chrome/content/mac/manager.xul
Digest-Algorithms: MD5 SHA1
-MD5-Digest: cC85RxqpZ8fww87rYL+w9Q==
-SHA1-Digest: aR8XzJD5v/rI0DHsYA0/E1Y5Xsk=
+MD5-Digest: M8eMkVIF492gRi6WeUW8HQ==
+SHA1-Digest: SWBwYLc/QF3ABsgyB8wdflKrMco=
Name: chrome/content/preferences/advPane.xul
Digest-Algorithms: MD5 SHA1
@@ -1155,6 +1155,136 @@ Digest-Algorithms: MD5 SHA1
MD5-Digest: xJHnCFFzflOX1A8NwSRbzw==
SHA1-Digest: 3pLh5wAwnSWxPtsIoPYdNLy6JvQ=
+Name: chrome/locale/it/addurl.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: amXw0Oxem9CuaghDZwxO+g==
+SHA1-Digest: 3e/VOyQNcRfz7FxyCrVl5X7enRU=
+
+Name: chrome/locale/it/addurl.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: TkJ0utkwxRKnQWJwsl5Ung==
+SHA1-Digest: VlrDBbfVbFEA3bRobnhQE1DIWCY=
+
+Name: chrome/locale/it/common.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: p62Oxhr75uftnbJU2RQ4eQ==
+SHA1-Digest: EMXR8zH/41J49xKG79+/hoeFLsA=
+
+Name: chrome/locale/it/conflicts.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: vPsOSzofPS6eFxol7EvZqw==
+SHA1-Digest: sJARB5nFLwOO4kO+5xa/Hv3lgp0=
+
+Name: chrome/locale/it/conflicts.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WhcR9wQICjSdlnjFD1dYdw==
+SHA1-Digest: AHhlx2URJwg4c6/whZZcgFKyIv0=
+
+Name: chrome/locale/it/description.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: eT8hGcONVxjNW3dLNl8loQ==
+SHA1-Digest: 1wCPjJO73wq6QbZe6XstvsqfZ14=
+
+Name: chrome/locale/it/downloadHelper.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: SDv4W/s7poIkcjPYyZzjvg==
+SHA1-Digest: mMGRpdrhGkveRhzwol+8021h5bE=
+
+Name: chrome/locale/it/dta.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: CgRcEQCjd+/wrMPQfvvuKw==
+SHA1-Digest: oBHfJnzvDEzH7Qkki3vJNaw6vAY=
+
+Name: chrome/locale/it/filters.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Rh/qEjPmh++Q27hTuSegQw==
+SHA1-Digest: Bc5HcRYqRaSzzvMLFWT8W9Gw9aI=
+
+Name: chrome/locale/it/landingpage.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: m9yPP919QThWRVLQX4kAGg==
+SHA1-Digest: tssfWbhY72Xt1mhLfaKy4N+z/Lc=
+
+Name: chrome/locale/it/mainmenu.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GBnJAKaNpC3q4L7cFof8cA==
+SHA1-Digest: +35JtjZXwyFUW6IqQAeLQZ69yhA=
+
+Name: chrome/locale/it/manager.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: LEVKq2ulhqOkKL9UFe9D4Q==
+SHA1-Digest: MhG54iv86LPIdInol0yX/drHRhw=
+
+Name: chrome/locale/it/manager.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: DxrxsLf1kIaSwbtIbkQ5mQ==
+SHA1-Digest: wyuUVpJtLd8TY09f/C4EjgSzWd0=
+
+Name: chrome/locale/it/mask.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fi282Fh2KSeHb/n04sf5XA==
+SHA1-Digest: Nm5GM02j98J6M+xc/rh5HiHM7W8=
+
+Name: chrome/locale/it/menu.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Un5ISYe/WX64wjtb88HQqg==
+SHA1-Digest: wLU6Jw/iDW+pvwFcjE3GIfT67jI=
+
+Name: chrome/locale/it/menu.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: f6hNBq0YrN+IfmE1XkIdiA==
+SHA1-Digest: 7FLz9ODRQ/s6bkHVIaEk9mTkSj4=
+
+Name: chrome/locale/it/metalinker.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: IHhsD5jg0nR9UeJf8+hUVw==
+SHA1-Digest: t+ASNGcjdlnTuhHFnZiqZrsNcoc=
+
+Name: chrome/locale/it/metalinker.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: F2ZW6SQisEhZYryGnk6gGw==
+SHA1-Digest: k8QN+WqazuRsfAo0IOX/BiYeY2Y=
+
+Name: chrome/locale/it/mirrors.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: VZ8S8/oI2QtIJ2BYZxdHmQ==
+SHA1-Digest: SEUxur2vSRFrko/Z5Gz+F3ibTX4=
+
+Name: chrome/locale/it/mirrors.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Y4EXw0TJz/A7cPsEwYILwQ==
+SHA1-Digest: yOyfidCzy6gXI3AJGxrMXzf0Jn0=
+
+Name: chrome/locale/it/prefpanes.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: cNmKvfxlS4Oc4I+yOLnzlA==
+SHA1-Digest: vIcPe9kxE+tpUsfoNwh2/EEI36A=
+
+Name: chrome/locale/it/prefpanes.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: YHskQtdWkqctkbdbvQuvpw==
+SHA1-Digest: 6BA38LSVhJN5gejoRxwC7XaOFpo=
+
+Name: chrome/locale/it/sanitize.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: iBg8eCv8wIi12i05GFGjwA==
+SHA1-Digest: pJATyJ2H/OyvdKNxYuL1lrrEIig=
+
+Name: chrome/locale/it/saveas.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: sHp843H8Bjp9rtGwAsF3vQ==
+SHA1-Digest: Up5Pcb1PKTeL9BQ7DhFeN/osb+I=
+
+Name: chrome/locale/it/select.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 3bci8RhgNf2hHk/V1JQv1g==
+SHA1-Digest: kQNYHdetHKuzUZ2mRXaMP4yK5e4=
+
+Name: chrome/locale/it/select.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: XItfWY2z4Ev8j9wQ+NUeog==
+SHA1-Digest: 80vgpePiHxuO+QXUNExW2iC3MKA=
+
Name: chrome/locale/nl/addurl.dtd
Digest-Algorithms: MD5 SHA1
MD5-Digest: Grl86qyEdzDY/Bo85WNdkA==
@@ -1777,8 +1907,8 @@ SHA1-Digest: HMjAiqUoj1ladaMeAGQ2xJZPQtg=
Name: chrome/locale/sl-SI/prefpanes.dtd
Digest-Algorithms: MD5 SHA1
-MD5-Digest: KCQJfosogcQCrIS3SyB+8A==
-SHA1-Digest: DzDaBOAQkysQzInUpbgCBAv7Xxw=
+MD5-Digest: gs+iBgSyFq4jERRHgf1GiQ==
+SHA1-Digest: 4I1Yhwozlp0SUgE2BIMP04xRFlA=
Name: chrome/locale/sl-SI/prefpanes.properties
Digest-Algorithms: MD5 SHA1
@@ -2397,8 +2527,8 @@ SHA1-Digest: tylyu5lLHW8gwf0ziO7GJlVK3BU=
Name: chrome/skin/manager/style.css
Digest-Algorithms: MD5 SHA1
-MD5-Digest: D9oBwa5NXuX8hQUmYLHh9g==
-SHA1-Digest: pNK7s83EgxiJZ5XKuF6qY0WafIw=
+MD5-Digest: dl2UqPnRmkubu2rVe1JOAw==
+SHA1-Digest: rw0BDzHNKYZcZ8Bz20Xy6MjivCc=
Name: chrome/skin/manager/tools.png
Digest-Algorithms: MD5 SHA1
@@ -2472,18 +2602,18 @@ SHA1-Digest: Kxw88QgFDDzudu52exmAEybQDhM=
Name: chrome/skin/select/tabActiveEnd.svg
Digest-Algorithms: MD5 SHA1
-MD5-Digest: USBR9tLaZsVCEPja84fbkg==
-SHA1-Digest: JEsEPo9KkjYXp8HhSbMGLqkzSoY=
+MD5-Digest: JgrKKDaGbsQPAIm5X7mYkw==
+SHA1-Digest: x4aYPmw3e85vrwFt6hu7nhY2YnI=
Name: chrome/skin/select/tabActiveMiddle.svg
Digest-Algorithms: MD5 SHA1
-MD5-Digest: LHRzVMcmhosj2i32Zrl9PA==
-SHA1-Digest: 9+Az1q5XqiTFSUxtrrEJtKqtpzU=
+MD5-Digest: iywvCxhIQGPsLrGLKF0qpg==
+SHA1-Digest: AYpmWWo/YLGde7q9NNflEN/x7bc=
Name: chrome/skin/select/tabActiveStart.svg
Digest-Algorithms: MD5 SHA1
-MD5-Digest: j5UnYhjnqLWeLTuzoqHjCA==
-SHA1-Digest: U5rKy2SmaJEWX3ZzNoUnbB9WSJ0=
+MD5-Digest: NowOlvv/5OeqdSLGd+jKUw==
+SHA1-Digest: hR/+vKUUOvdZWUMj1sbfTQ/0opA=
Name: chrome/skin/select/tabBackgroundEnd.svg
Digest-Algorithms: MD5 SHA1
@@ -2572,13 +2702,13 @@ SHA1-Digest: CJSt36NK4gRmB/HWucGiA8s+YoE=
Name: chrome/skin/win/manager-new.css
Digest-Algorithms: MD5 SHA1
-MD5-Digest: SQ8CA3dUsVl2wzitL8swTQ==
-SHA1-Digest: N8CeiRnsSkISbWiiXFufX1Pdx4U=
+MD5-Digest: xMeU+E1rl/DYr+DDr/Yy9Q==
+SHA1-Digest: tSxbPRnN1iBRb8SrAeKon108GgI=
Name: chrome/skin/win/manager-newer.css
Digest-Algorithms: MD5 SHA1
-MD5-Digest: hB4N04niiZB0xkbMhpK5wg==
-SHA1-Digest: 3P1tFNH14PtSJ8lsTQDSnNil7oc=
+MD5-Digest: 79WBOLjOXVCtsZfXPVto1g==
+SHA1-Digest: 9sBDf6sbPzc/JNce7TdEmK9slk4=
Name: chrome/skin/win/manager.css
Digest-Algorithms: MD5 SHA1
@@ -2602,8 +2732,8 @@ SHA1-Digest: 7ln0SdZApF7JB8V6crZjcYL34qY=
Name: chrome/skin/win/select.css
Digest-Algorithms: MD5 SHA1
-MD5-Digest: MewD7dvq71eQydf5ONcctA==
-SHA1-Digest: VOEOuNonu6xKwMZO6uP+CedS1dQ=
+MD5-Digest: BkHyFPf+rLlWyXzYaOcZvA==
+SHA1-Digest: 8wMICl7jxNYbtjkLVO8s0McYSUI=
Name: chrome/skin/win/tools.png
Digest-Algorithms: MD5 SHA1
@@ -2647,18 +2777,18 @@ SHA1-Digest: Ng9BlsHn+batWSwau2bMpwd2q5A=
Name: modules/constants.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: 26jW1ZmAv7A+vg5flBT9MQ==
-SHA1-Digest: +jd3ZGkKWBlOjg0LnSyOkjH+KKI=
+MD5-Digest: salo5DKoauIFYLcYDBy4WQ==
+SHA1-Digest: EsT1gFiIihgtYCfvtYSUwI20B3o=
Name: modules/defaultPrefs.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: 2rk1NwAMLMNuDUuq+QGGjA==
-SHA1-Digest: fNEEyfc/RMDm2ZMs4D7XkPDSEjU=
+MD5-Digest: +tUUeAIDskadu6X9K91nUg==
+SHA1-Digest: Ftf/OKNbUdChW2oLSQ1ntee9nfA=
Name: modules/glue.jsm
Digest-Algorithms: MD5 SHA1
-MD5-Digest: u8C6GxoKZQIIDMT73eFq2g==
-SHA1-Digest: d4R10+oIJBr0vd+gauwNZ3DGdm4=
+MD5-Digest: J8nr492/zk6/F/kIAuymbQ==
+SHA1-Digest: yj3LviI/02FVKvBYVQxS6OxzT3k=
Name: modules/logging.js
Digest-Algorithms: MD5 SHA1
@@ -2692,13 +2822,13 @@ SHA1-Digest: 75aM1g7LXzGtXCTm8BdBP6cg4WI=
Name: modules/loaders/integration-content.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: T2jRU4T32RRPEt2afZQKwQ==
-SHA1-Digest: EbjGZmuYVj3C3trUDXwB87fjeos=
+MD5-Digest: pxhELOrK8MiQfAsBNFaRsQ==
+SHA1-Digest: Df0orkqZeOv6m94cxsmNg5vdkZ0=
Name: modules/loaders/integration.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: x33EGQ/Q/Z8+pOSQ6mdJmA==
-SHA1-Digest: kmvQeq0aA/poG0TJeTVH9NaHP4Y=
+MD5-Digest: Ad6hnoMtHAae/C8iRQDjgA==
+SHA1-Digest: Q8TV+IsGuYqvbN7FShVtE+aH5k4=
Name: modules/loaders/saveas.js
Digest-Algorithms: MD5 SHA1
@@ -2712,13 +2842,13 @@ SHA1-Digest: 7R8250uAVWHc7T42oOMlqDyKtjY=
Name: modules/manager/chunk.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: EIVgFEX4+ELW5+UL9sqp1w==
-SHA1-Digest: CWRfcfcdgJgQnqOTU/T7GBGwc5U=
+MD5-Digest: 7mi5MtsrJT+yAINibarkRg==
+SHA1-Digest: eAvtGh+t4kp7WN8L8iKXMOwa1Yo=
Name: modules/manager/connection.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: S7j8/SOpMTlIGrMujSKscw==
-SHA1-Digest: Pw6Cu9mdSGS2x1l8kGVg+Dy7tLM=
+MD5-Digest: MYbcSkmyc/XKQbz+LVYCWw==
+SHA1-Digest: ytvSJH3GmBApjEgH3OUX7obCJGU=
Name: modules/manager/decompressor.js
Digest-Algorithms: MD5 SHA1
@@ -2747,13 +2877,13 @@ SHA1-Digest: yi7Fsf6zmz6LVcja+FbaZqUHsOQ=
Name: modules/manager/memoryreporter.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: CxjlfdxkltWT4qokOWjsjg==
-SHA1-Digest: vjQuxPfcwIH2Vg25qxdL4VYo92w=
+MD5-Digest: MkmOokVgaZnnah0b+pt7lg==
+SHA1-Digest: TtqRbVTGF0HF1f4l2V3/zn1puk4=
Name: modules/manager/preallocator.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: XsJ20H/sOBKgLa5Vu1pjDA==
-SHA1-Digest: VGZk+8YpbDswaLrGezK7Awomn9I=
+MD5-Digest: iW81ZpiPG3NfxKKqYmgvvA==
+SHA1-Digest: Teuaqic2lqDbCrCO/Ma9EQAt/fI=
Name: modules/manager/queuestore.js
Digest-Algorithms: MD5 SHA1
@@ -2807,8 +2937,8 @@ SHA1-Digest: v0ZfteyhfU83QQ3+tnQx9Q0QUUk=
Name: modules/manager/preallocator/worker.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: O/uFcE1DrBisf0ctd2HIgg==
-SHA1-Digest: 6D6Qg1tzl3zMC9959v9+YG/27aI=
+MD5-Digest: obpXOacDC21XJaJR2lQd3g==
+SHA1-Digest: 2J1Nt/uKNhBlzoUGF2V5Mun+Ryk=
Name: modules/support/alertservice.js
Digest-Algorithms: MD5 SHA1
@@ -2850,6 +2980,11 @@ Digest-Algorithms: MD5 SHA1
MD5-Digest: CPdUnHJeBLi/D+ngp+vMuQ==
SHA1-Digest: +Pv9POBpsoBFSm9CJ8frua7p/SU=
+Name: modules/support/domainprefs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: eOJIN2+Uh6SFJrcQV19P2A==
+SHA1-Digest: iHIbwFmXBjkIQOjJXmmudqgTeJY=
+
Name: modules/support/downloadHelper.js
Digest-Algorithms: MD5 SHA1
MD5-Digest: uNmnphJG+N9+uQXFE3Mowg==
@@ -2887,8 +3022,8 @@ SHA1-Digest: Aq0Xm9brPONAR78aIGk6Xt0slSM=
Name: modules/support/loggedprompter.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: ALv66XF8NAVlfVyAFkIe2Q==
-SHA1-Digest: XYrORTzuJlhX1fPs/ZA32jgzTOo=
+MD5-Digest: DX6YRbeKTlk9Ug7KdlHJxw==
+SHA1-Digest: OKu3IwzgEXiZHc9ugnhP2IS1fAQ=
Name: modules/support/mediator.js
Digest-Algorithms: MD5 SHA1
@@ -2947,8 +3082,8 @@ SHA1-Digest: H6aSZ2cZ9/lyfIhI9DX5oolFzzo=
Name: modules/support/requestmanipulation.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: JLxtYQQhxXPZNdac0jQQTA==
-SHA1-Digest: udoE62vLHcoLfuLyHa9+t1Ifgb8=
+MD5-Digest: PcApkQZ3yWlzkrAPsZ/9bw==
+SHA1-Digest: PJmLhDeA5t3m12pxyx9wM4S+Bm0=
Name: modules/support/scheduleautostart.js
Digest-Algorithms: MD5 SHA1
@@ -2962,8 +3097,8 @@ SHA1-Digest: eNbRJvSHsua1drllbyi80Lp3kPw=
Name: modules/support/stringfuncs.js
Digest-Algorithms: MD5 SHA1
-MD5-Digest: y/Ndt8KgGdPawiQdKVbVBw==
-SHA1-Digest: LvWZyRSIHC9kQB+0U3iDatxBeEk=
+MD5-Digest: jVO8R8QbaF+P8cseP84dlQ==
+SHA1-Digest: kib5Os775+DaCOiaCXhScVFXRno=
Name: modules/support/textlinks.js
Digest-Algorithms: MD5 SHA1
diff --git a/META-INF/mozilla.rsa b/META-INF/mozilla.rsa
index 697e79f..71b4e13 100644
Binary files a/META-INF/mozilla.rsa and b/META-INF/mozilla.rsa differ
diff --git a/META-INF/mozilla.sf b/META-INF/mozilla.sf
index 91e332b..318451c 100644
--- a/META-INF/mozilla.sf
+++ b/META-INF/mozilla.sf
@@ -1,4 +1,4 @@
Signature-Version: 1.0
-MD5-Digest-Manifest: 751ZGHjeBFm+zFl7EDDW8A==
-SHA1-Digest-Manifest: hISwqZNY+0/DO5b4J0UkJ4jg5EM=
+MD5-Digest-Manifest: 2S95xw/RU0kYiHxZBEQjNA==
+SHA1-Digest-Manifest: jdF0cHOjRLOyJeRiGCgcrz5l5rg=
diff --git a/chrome.manifest b/chrome.manifest
index 44557c8..0d83eb3 100644
--- a/chrome.manifest
+++ b/chrome.manifest
@@ -17,6 +17,7 @@ locale dta et chrome/locale/et/
locale dta fr chrome/locale/fr/
locale dta gl chrome/locale/gl/
locale dta gl-ES chrome/locale/gl-ES/
+locale dta it chrome/locale/it/
locale dta nl chrome/locale/nl/
locale dta pl chrome/locale/pl/
locale dta pt-PT chrome/locale/pt-PT/
diff --git a/chrome/content/common/bindings.xml b/chrome/content/common/bindings.xml
index d28892e..ce43996 100644
--- a/chrome/content/common/bindings.xml
+++ b/chrome/content/common/bindings.xml
@@ -419,22 +419,20 @@
let iv = Math.max(this.limit, -1);
let m = Math.round((iv > 0 ? iv : this.hint / 2) / 1024);
- m = this.scale(iv > 1 ? m : 250);
- let vals = [0,10,20,50,100];
- if (m >= 1000) {
- vals = [0,100,200,500,1000];
- }
- else if (m > 400) {
- vals = [0,50,100,200,500];
- }
-
- let items = [10, 50, 100, 250, 1000]; // always include these
+ m = this.scale(iv > 1 ? m : 1000);
+ let vals = [0, 10, 20, 50, 100, 1000, 2000, 5000];
+ let items = [10, 50, 100, 250, 1000, 10000]; // always include these
for (let v of vals) {
if (v && m - v > 1) {
items.push(m - v);
}
items.push(m + v);
}
+ // push some multiples
+ items.push(m * 2);
+ items.push(m * 5);
+ items.push(m * 10);
+
mapFilterInSitu(
items,
this.scale,
diff --git a/chrome/content/dta/addurl.js b/chrome/content/dta/addurl.js
index 4b55026..0679905 100644
--- a/chrome/content/dta/addurl.js
+++ b/chrome/content/dta/addurl.js
@@ -198,6 +198,7 @@ var Dialog = {
address.value = url;
}
catch (ex) {
+ log(LOG_ERROR, "Invalid URI entered:" + address.value, ex);
errors.push('address');
}
}
@@ -227,6 +228,9 @@ var Dialog = {
return false;
}
+ // prevent multiple clicks
+ this.download = function() {};
+
if (hasItem) {
return this.downloadItem(start, hash);
}
diff --git a/chrome/content/dta/manager/manager.js b/chrome/content/dta/manager/manager.js
index d4b662a..43ec835 100644
--- a/chrome/content/dta/manager/manager.js
+++ b/chrome/content/dta/manager/manager.js
@@ -68,46 +68,46 @@ function isOSError(ex, unix, win) {
function _moveFile(destination, self) {
let remakeDir = false;
- let move = function(resolve, reject, x) {
- if (remakeDir) {
- Utils.makeDir(destination, Prefs.dirPermissions, true);
- }
- let df = destination.clone();
- df.append(self.destinationName);
- moveFile(self.tmpFile.path, df.path, self.shouldOverwrite).then(function() {
- resolve(true);
- }, function(ex) {
- if (isOSError(ex, "EEXIST", "ERROR_ALREADY_EXISTS") && !self.shouldOverwrite) {
- self.conflicts += 1;
- move(resolve, reject, x);
+ let move = function*() {
+ for (let x = 0; x < 5; ++x) {
+ if (remakeDir) {
+ yield Utils.makeDir(destination, Prefs.dirPermissions, true);
+ }
+ let df = destination.clone();
+ df.append(self.destinationName);
+ try {
+ yield moveFile(self.tmpFile.path, df.path, self.shouldOverwrite);
return;
}
-
- if (isOSError(ex, "ENAMETOOLONG", "ERROR_PATH_NOT_FOUND")) {
- try {
- self.shortenName();
- ConflictManager.unpin(pinned);
- pinned = self.destinationFile;
- ConflictManager.pin(pinned, !self.shouldOverwrite);
+ catch (ex) {
+ if (isOSError(ex, "EEXIST", "ERROR_ALREADY_EXISTS") && !self.shouldOverwrite) {
+ self.conflicts += 1;
+ continue;
+ }
+ if (isOSError(ex, "ENAMETOOLONG", "ERROR_PATH_NOT_FOUND")) {
+ try {
+ self.shortenName();
+ ConflictManager.unpin(pinned);
+ pinned = self.destinationFile;
+ ConflictManager.pin(pinned, !self.shouldOverwrite);
+ }
+ catch (iex) {
+ log(LOG_ERROR, "Failed to shorten name", ex);
+ }
}
- catch (iex) {
- log(LOG_ERROR, "Failed to shorten name", ex);
+ if (ex.becauseNoSuchFile || isOSError(ex, "ENOENT", "NONE")) {
+ remakeDir = true;
}
+ log(LOG_ERROR, ex);
+ yield new Promise(function(resolve) {
+ setTimeoutOnlyFun(() => resolve(), x * 250);
+ });
}
- if (ex.becauseNoSuchFile || isOSError(ex, "ENOENT", "NONE")) {
- remakeDir = true;
- }
- log(LOG_ERROR, ex);
- x = x || 1;
- if (x > 5) {
- log(LOG_ERROR, "shit hit the fan!");
- reject(ex);
- return;
- }
- setTimeoutOnlyFun(() => move(resolve, reject, ++x), x * 250);
- }).catch(reject);
+ }
+ log(LOG_ERROR, "shit hit the fan!");
+ throw new Exception("Failed to move file");
};
- return new Promise(move);
+ return Task.spawn(move);
};
function dieEarly() {
@@ -439,11 +439,11 @@ var Dialog = {
this._speeds.clear();
},
changeSpeedLimitUp: function() {
- $('listSpeeds').limit = Math.max(0, $('listSpeeds').limit) + 25600;
+ $('listSpeeds').limit = Math.max(0, $('listSpeeds').limit) + 102400;
this.changeSpeedLimit();
},
changeSpeedLimitDown: function() {
- $('listSpeeds').limit -= 25600;
+ $('listSpeeds').limit -= 102400;
this.changeSpeedLimit();
},
_loadDownloads: function() {
@@ -1940,20 +1940,23 @@ QueueItem.prototype = {
Tree.invalidate(this, cell);
},
- safeRetry: function() {
- // reset flags
- this.progress = this.totalSize = this.partialSize = 0;
- this.compression = null;
- this.activeChunks = this.maxChunks = 0;
- for (let c of this.chunks) {
- c.cancelChunk();
- }
- this.chunks.length = 0;
- this.speeds.clear();
- this.otherBytes = 0;
- this.visitors = new VisitorManager();
- this.setState(QUEUED);
- Dialog.run(this);
+ safeRetry: function(resumable) {
+ this.cancel().then(() => {
+ // reset flags
+ this.progress = this.totalSize = this.partialSize = 0;
+ this.compression = null;
+ this.activeChunks = this.maxChunks = 0;
+ for (let c of this.chunks) {
+ c.cancelChunk();
+ }
+ this.chunks.length = 0;
+ this.speeds.clear();
+ this.otherBytes = 0;
+ this.visitors = new VisitorManager();
+ this.resumable = resumable !== false;
+ this.setState(QUEUED);
+ Dialog.run(this);
+ });
},
refreshPartialSize: function(){
@@ -2356,7 +2359,7 @@ QueueItem.prototype = {
this.activeChunks = 0;
}
this.setState(CANCELED);
- Task.spawn(function*() {
+ return Task.spawn(function*() {
try {
yield this.closeChunks();
if (this._preallocTask) {
@@ -2425,12 +2428,11 @@ QueueItem.prototype = {
log(LOG_DEBUG, "pa: no totalsize");
return;
}
- if (this.preallocating) {
+ if (this._preallocTask) {
log(LOG_DEBUG, "pa: already working");
return;
}
- this.preallocating = true;
this._preallocTask = Task.spawn(function*() {
try {
try {
@@ -2465,9 +2467,10 @@ QueueItem.prototype = {
catch(ex) {
log(LOG_ERROR, "pa: failed", ex);
}
- this._preallocTask = null;
- this.preallocating = false;
- this.maybeResumeDownload();
+ finally {
+ this._preallocTask = null;
+ this.maybeResumeDownload();
+ }
}.bind(this));
},
@@ -2549,7 +2552,7 @@ QueueItem.prototype = {
}
}
function downloadNewChunk(download, start, end, header) {
- var chunk = new Chunk(download, start, end);
+ let chunk = new Chunk(download, start, end);
download.chunks.push(chunk);
download.chunks.sort(function(a,b) { return a.start - b.start; });
downloadChunk(download, chunk, header);
@@ -2586,7 +2589,7 @@ QueueItem.prototype = {
let paused = this.chunks.filter(chunk => !(chunk.running || chunk.complete));
while (this.activeChunks < this.maxChunks) {
- if (this.preallocating && this.activeChunks) {
+ if (this._preallocTask && this.activeChunks) {
log(LOG_DEBUG, "not resuming download " + this + " because preallocating");
return true;
}
@@ -2717,7 +2720,7 @@ QueueItem.prototype = {
};
XPCOMUtils.defineLazyGetter(QueueItem.prototype, 'AuthPrompts', function() {
- const {LoggedPrompter} = require("support/loggedPrompter");
+ const {LoggedPrompter} = require("support/loggedprompter");
return new LoggedPrompter(window);
});
@@ -2845,6 +2848,9 @@ var ConflictManager = {
else if ('_sessionSetting' in this) {
cr = this._sessionSetting;
}
+ else if ('_conflictSetting' in download) {
+ cr = download._conflictSetting;
+ }
if (cr < 0) {
let dialog = {};
@@ -2855,7 +2861,7 @@ var ConflictManager = {
conflicts = yield this._findUnique(newDest, basename, conflicts);
let options = {
url: Utils.cropCenter(download.urlManager.usable, 45),
- fn: Utils.cropCenter(newDest.leafName, 45),
+ fn: Utils.cropCenter(download.destinationLocalFile.leafName, 45),
newDest: Utils.cropCenter(newDest.leafName, 45)
};
window.openDialog(
@@ -2873,6 +2879,9 @@ var ConflictManager = {
else if (ctype === 2) {
Preferences.setExt('conflictresolution', cr);
}
+ else {
+ download._conflictSetting = cr;
+ }
}
switch (cr) {
diff --git a/chrome/content/mac/manager.xul b/chrome/content/mac/manager.xul
index 9bd76da..a4795d3 100644
--- a/chrome/content/mac/manager.xul
+++ b/chrome/content/mac/manager.xul
@@ -31,6 +31,8 @@
<keyset id="mainkeys">
<key id="kLaunch" modifiers="accel" key="O" command="cmdLaunch" />
+ <key id="kGetInfo" modifiers="accel" key="I" command="cmdGetInfo" />
+ <key id="kSelectInv" modifiers="accel,shift" key="I" command="cmdSelectInv" />
<key id="kOpenFolder" modifiers="accel,shift" key="O" command="cmdOpenFolder" />
<key id="kRename" keycode="VK_RETURN" command="cmdRename"/>
<key id="kCloseMac" modifiers="accel" key="W" command="cmdClose" />
diff --git a/chrome/locale/it/addurl.dtd b/chrome/locale/it/addurl.dtd
new file mode 100644
index 0000000..4392523
--- /dev/null
+++ b/chrome/locale/it/addurl.dtd
@@ -0,0 +1,6 @@
+<!ENTITY windowtitle "Aggiungi download">
+<!ENTITY adddescription.value "Inserisci l'URL di download e (facoltativamente) la pagina referer.">
+<!ENTITY createbatchdescriptor.label "Crea descrittore batch">
+<!ENTITY createbatchdescriptor.tooltip "Crea un descrittore batch dalla selezione di testo corrente">
+<!ENTITY desc.batches.value "Puoi anche usare descrittori batch per scaricare più file alla volta.">
+<!ENTITY examples.value "Esempi:">
diff --git a/chrome/locale/it/addurl.properties b/chrome/locale/it/addurl.properties
new file mode 100644
index 0000000..3424059
--- /dev/null
+++ b/chrome/locale/it/addurl.properties
@@ -0,0 +1,8 @@
+batch.tasks=Sembra che tu stia usando dei descrittori batch.
+batch.tasks.2=Sei sicuro di voler avviare %S download?
+batch.tasks.3=Descrittori batch riconosciuti in ordine di comparsa:
+batch.manytasks=Nota che un batch di così grandi dimensioni molto probabilmente causerà problemi di prestazioni!
+batchtitle=Download batch
+batch=Batch
+batchdownload=Download batch
+singledownload=Download singolo
diff --git a/chrome/locale/it/common.properties b/chrome/locale/it/common.properties
new file mode 100644
index 0000000..f9c2b7e
--- /dev/null
+++ b/chrome/locale/it/common.properties
@@ -0,0 +1,22 @@
+alert.mask=Specifica una maschera di ridenominazione valida
+alert.nodir=Specifica una cartella di download
+alert.hash=Specifica un checksum valido o lascia quel campo vuoto
+alert.invaliddir=La cartella di download specificata non è valida o è in sola lettura
+valid.destination=Seleziona una cartella di download valida per i tuoi download
+unknown=Sconosciuto
+nal=Non disponibile
+nas=N/D
+sizeB.2=%S byte;%S byte
+sizeBs=%S b/s
+sizeKB=%S KB
+sizeKBs=%S KB/s
+sizeMB=%S MB
+sizeMBs=%S MB/s
+sizeGB=%S GB
+sizeGBs=%S GB/s
+sizeTB=%S TB
+disabled=Disabilitato
+mirrorsText.2=Un indirizzo di download;%S indirizzi di download
+dontaskagain=Non chiedere nuovamente
+rememberpref=Ricorda preferenza
+rememberlastqueued=Vuoi che DownThemAll! ricordi la decisione di aggiungere i download senza avviarli quando si utilizza OneClick?
diff --git a/chrome/locale/it/conflicts.dtd b/chrome/locale/it/conflicts.dtd
new file mode 100644
index 0000000..d2daf92
--- /dev/null
+++ b/chrome/locale/it/conflicts.dtd
@@ -0,0 +1,7 @@
+<!ENTITY window.title "File in conflitto!">
+<!ENTITY text.value "Ricorda questa impostazione:">
+<!ENTITY download.label "Solo per questo download">
+<!ENTITY session.label "Solo per questa sessione">
+<!ENTITY always.label "Da ora in poi">
+<!ENTITY overwrite.label "Sovrascrivi file esistente">
+<!ENTITY skip.label "Salta/Annulla">
diff --git a/chrome/locale/it/conflicts.properties b/chrome/locale/it/conflicts.properties
new file mode 100644
index 0000000..4e12dc6
--- /dev/null
+++ b/chrome/locale/it/conflicts.properties
@@ -0,0 +1,3 @@
+rename2.label=Rinomina in %S
+text2.label=Un file con nome %S esiste già.
+question2.label=Cosa vuoi fare con il download %S?
diff --git a/chrome/locale/it/description.properties b/chrome/locale/it/description.properties
new file mode 100644
index 0000000..f4bdc04
--- /dev/null
+++ b/chrome/locale/it/description.properties
@@ -0,0 +1,2 @@
+extensions.{DDC359D1-844A-42a7-9AA1-88A850A938A8}.description=Lo scaricatore di massa per Firefox
+extensions.{DDC359D1-844A-42a7-9AA1-88A850A938A8}.translator.1=Il team dTa, Alessandro Menti
diff --git a/chrome/locale/it/downloadHelper.properties b/chrome/locale/it/downloadHelper.properties
new file mode 100644
index 0000000..7d976ce
--- /dev/null
+++ b/chrome/locale/it/downloadHelper.properties
@@ -0,0 +1,4 @@
+dta-regular=DownThemAll!
+dta-regular-desc=Scarica con DownThemAll!
+dta-turbo=dTa! OneClick
+dta-turbo-desc=Scarica con DownThemAll! OneClick
diff --git a/chrome/locale/it/dta.dtd b/chrome/locale/it/dta.dtd
new file mode 100644
index 0000000..2b287f7
--- /dev/null
+++ b/chrome/locale/it/dta.dtd
@@ -0,0 +1,26 @@
+<!ENTITY start.label "Avvia!">
+<!ENTITY start.key "i">
+<!ENTITY queue.label "Accoda">
+<!ENTITY queue.key "a">
+<!ENTITY options.label "Preferenze">
+<!ENTITY url.value "Download">
+<!ENTITY url.placeholder "Inserisci l'URI di download">
+<!ENTITY override.filename.value "Nome file personalizzato">
+<!ENTITY override.filename.placeholder "Inserisci il nuovo nome file">
+<!ENTITY override.filename.tip "Inserisci il nuovo nome file o lascia vuoto per il nome predefinito">
+<!ENTITY directory.caption "Salva file in:">
+<!ENTITY directory.placeholder "Inserisci o seleziona la cartella">
+<!ENTITY mirrors.value "Mirror:">
+<!ENTITY referrer.value "Pagina referer:">
+<!ENTITY referrer.placeholder "Inserisci l'URI referer">
+<!ENTITY referrer.tip "Inserisci l'URI referer o lascia vuoto per non inviare un referer">
+<!ENTITY description.value "Descrizione:">
+<!ENTITY checksum.value "Checksum (hash):">
+<!ENTITY browse.tooltip "Sfoglia...">
+<!ENTITY mirrormanager.tip "Gestisci i mirror di download">
+<!ENTITY mask3.label "Maschera">
+<!ENTITY mask.tip "I file selezionati saranno salvati e rinominati usando la maschera">
+<!ENTITY mask.once.label "Utilizza la maschera solo per questa volta">
+<!ENTITY selectall.label "Seleziona tutto">
+<!ENTITY selectinv.label "Inverti selezione">
+<!ENTITY selectnone.label "Annulla selezione">
diff --git a/chrome/locale/it/filters.properties b/chrome/locale/it/filters.properties
new file mode 100644
index 0000000..a58c4d3
--- /dev/null
+++ b/chrome/locale/it/filters.properties
@@ -0,0 +1,10 @@
+deffilter-all=Tutti i file
+deffilter-arch=Archivi (zip, rar, ...)
+deffilter-vid=Filmati (mpeg, avi, ...)
+deffilter-aud=Audio (mp3, wav, ...)
+deffilter-img=Immagini (jpg, png, ...)
+deffilter-imgjpg=Immagini JPEG
+deffilter-imgpng=Immagini PNG
+deffilter-imggif=Immagini GIF
+deffilter-bin=Programmi (exe, xpi, ...)
+deffilter-doc=Documenti (pdf, odf, ...)
diff --git a/chrome/locale/it/landingpage.dtd b/chrome/locale/it/landingpage.dtd
new file mode 100644
index 0000000..3052c0a
--- /dev/null
+++ b/chrome/locale/it/landingpage.dtd
@@ -0,0 +1,95 @@
+<!ENTITY lp.localedir "ltr">
+<!ENTITY language "Italiano">
+<!ENTITY transAuthor "Il team dTa, Alessandro Menti">
+<!ENTITY fulltranslation "Traduzione italiana del team dTa e di Alessandro Menti">
+<!ENTITY amo.summary2 "Il primo e unico gestore di download/acceleratore nel tuo browser!">
+<!ENTITY amo.description.intro "DownThemAll! è tutto ciò che puoi desiderare da un gestore di download: offre un avanzato acceleratore che rende i tuoi download fino a quattro volte più veloci e ti permette di interrompere e riprendere i download quando vuoi.">
+<!ENTITY amo.description.feat2 "DownThemAll è veloce, affidabile e facile da usare! Ti consente di scaricare tutti i collegamenti o le immagini contenuti in una pagina Web e molto altro: puoi raffinare i tuoi download utilizzando criteri completamente personalizzabili per scaricare solo ciò che veramente vuoi. Esercita il controllo totale sui tuoi download, sulla velocità dedicata e sul numero di connessioni parallele in qualunque momento. Utilizza metalink o aggiungi mirror manualmente [...]
+<!ENTITY amo.description.free2 "DownThemAll è open source e freeware. Niente adware, niente spyware, niente tracciatori, nessun costo di qualunque tipo!">
+<!ENTITY amo.description.more "Per ulteriori informazioni visita la nostra <a href='http://www.downthemall.net/howto/features/'>pagina delle caratteristiche</a>.">
+<!ENTITY lp.title "Informazioni su DownThemAll!">
+<!ENTITY lp.welcome "Benvenuto in DownThemAll!">
+<!ENTITY lp.info "Guarda i video che mostrano come usare DownThemAll! e contengono informazioni sulla privacy e sui tuoi diritti">
+<!ENTITY lp.moreinfo "Per ulteriori informazioni visita la nostra <a href='http://www.downthemall.net/howto/features/'>pagina delle caratteristiche</a>.">
+<!ENTITY lp.gettingstarted "Per iniziare">
+<!ENTITY lp.toolbar "Pulsanti della barra degli strumenti">
+<!ENTITY lp.privacy "Privacy">
+<!ENTITY lp.yourrights "I tuoi diritti">
+<!ENTITY lp.contact "Contattaci">
+<!ENTITY lp.pleasenote "Nota bene:">
+<!ENTITY lp.donate2 "Valuta l'opportunità di fare una donazione">
+<!ENTITY lp.tut.firsttitle "Il tuo primo download">
+<!ENTITY lp.tut.fd2 "Scaricare un file in dTa è abbastanza facile ma anche molto potente. Se ti viene chiesto di aprire o salvare un file puoi selezionare la voce DownThemAll!. Dopo aver scelto dove salvare il download puoi iniziare subito il download o mettere in coda il file per scaricarlo in seguito.">
+<!ENTITY lp.tut.selecttitle "Usare la finestra di selezione">
+<!ENTITY lp.tut.selintro "Il menù di scelta rapida delle pagine Web ha una nuova voce DownThemAll!. Usando tale voce comparirà la finestra di selezione di DownThemAll! che puoi usare per selezionare facilmente uno o più collegamenti da una pagina.">
+<!ENTITY lp.tut.seloptions "Nella finestra di selezione hai diversi modi per scegliere quali file scaricare:">
+<!ENTITY lp.tut.selopthand2 "Puoi controllare i collegamenti che vuoi scaricare manualmente.">
+<!ENTITY lp.tut.seloptfilters2 "Puoi usare i filtri già presenti o impostarne di personalizzati, ad es. per scaricare tutte le immagini collegate.">
+<!ENTITY lp.tut.seloptfast2 "Inoltre puoi specificare un tuo filtro nella casella Filtraggio rapido, ad esempio <code>*.pdf,*.doc</code> o usare anche espressioni regolari">
+<!ENTITY lp.tut.seltypes "La finestra di selezione contiene due schede per due diversi tipi di download:">
+<!ENTITY lp.tut.seltypelinks "La scheda Collegamenti che contiene tutti i collegamenti scaricabili trovati nella pagina">
+<!ENTITY lp.tut.seltypepics "E la scheda Immagini e file multimediali, che contiene tutte le immagini e gli altri file multimediali mostrati nella pagina">
+<!ENTITY lp.tut.selgalleries "Le immagini a dimensione piena sono spesso accessibili solo dalle pagine di una galleria, quindi le troverai nella scheda Collegamenti">
+<!ENTITY lp.tut.seldone2 "Una volta selezionati i file da scaricare clicca su Inizia! per avviare subito i tuoi download o Aggiungi in pausa per scaricarli in seguito.">
+<!ENTITY lp.tut.batchestitle "Scaricare batch">
+<!ENTITY lp.tut.batches1 "Molti utenti vogliono scaricare batch di file numerati sequenzialmente. DownThemAll! ti permette di definire i batch in modo semplice come mostrato dal video.">
+<!ENTITY lp.tut.batches2 "La sintassi base è: <code>[inizio:fine]</code> oppure <code>[inizio:fine:passo]</code> dove sia <code>inizio</code> sia <code>fine</code> possono essere un numero o un semplice carattere. <code>passo</code> indica la lunghezza del passo e, se omesso, è semplicemente pari a 1.">
+<!ENTITY lp.tut.batches3 "Per esempio, se volessi scaricare le immagini da 001 a 100, potresti cambiare l'URL a: <code>http://example.org/[001:100].jpg</code>">
+<!ENTITY lp.tut.batchesctx "Inoltre, il menù di scelta rapida del campo URL nella finestra Aggiungi download ti consente di convertire facilmente del testo selezionato in un descrittore batch.">
+<!ENTITY lp.tut.oneclicktitle "DownThemAll! OneClick">
+<!ENTITY lp.tut.oneclick1.2 "Una volta eseguito il tuo primo download sarà disponibile un'altra voce: DownThemAll! OneClick, che puoi utilizzare per scaricare direttamente file utilizzando le impostazioni stabilite in precedenza e saltando le finestre relative alle opzioni di download e/o di selezione.">
+<!ENTITY lp.tut.oneclick2 "In questo modo OneClick ti permette di accodare rapidamente molti collegamenti.">
+<!ENTITY lp.tut.oneclickn "Dopo aver usato la funzione Cancella dati privati in Firefox, la funzione OneClick non sarà disponibile fino a che non avrai nuovamente avviato un download normale con DownThemAll!.">
+<!ENTITY lp.tut.tabstitle "Scaricare elementi da tutte le schede contemporaneamente">
+<!ENTITY lp.tut.alltabs "È possibile accodare contemporaneamente elementi da tutte le schede utilizzando i menù a discesa del pulsante sulla barra degli strumenti.">
+<!ENTITY lp.tut.tabrestore "Saranno disponibili solo i collegamenti da schede completamente ripristinate.">
+<!ENTITY lp.tb.intro "DownThemAll! offre alcuni pulsanti nella barra degli strumenti per fornirti un modo pratico di accedere alle funzionalità di DownThemAll!.">
+<!ENTITY lp.tb.install "Aggiungi pulsanti alla barra degli strumenti">
+<!ENTITY lp.tb.add.title "Aggiungere e usare i pulsanti della barra degli strumenti">
+<!ENTITY lp.tb.add.p1 "DownThemAll! include quattro pulsanti della barra degli strumenti per rendere più facile trovare e accodare i download">
+<!ENTITY lp.tb.add.dta "Il pulsante DownThemAll!">
+<!ENTITY lp.tb.add.dtadesc "Apre la finestra di selezione di DownThemAll! per la scheda corrente.">
+<!ENTITY lp.tb.add.tdta "Pulsante OneClick!">
+<!ENTITY lp.tb.add.tdtadesc "Scarica gli elementi della pagina corrente in base alle preferenze e ai filtri usati per ultimi.">
+<!ENTITY lp.tb.add.manager "Pulsante DownThemAll! Manager">
+<!ENTITY lp.tb.add.managerdesc "Apre la finestra Manager.">
+<!ENTITY lp.tb.add.selector "Pulsante DownThemAll! Selector">
+<!ENTITY lp.tb.add.selectordesc "Aggiunge gli elementi quando si clicca su di essi col tasto sinistro.">
+<!ENTITY lp.tb.add.p2 "I pulsanti della barra degli strumenti possono essere aggiunti tramite <code>Visualizza → Barre degli strumenti → Personalizza...</code>.">
+<!ENTITY lp.tb.dnd.title "Trascinamento">
+<!ENTITY lp.tb.dnd.p1 "Puoi trascinare qualunque collegamento o immagine sui bottoni DownThemAll! o OneClick! per scaricarli.">
+<!ENTITY lp.tb.dnd.p2 "Puoi anche trascinare elementi da scaricare sulla finestra Manager.">
+<!ENTITY lp.tb.dnd.order "Puoi ordinare la tua coda di download con il trascinamento. Seleziona semplicemente alcuni download e rilasciali nella posizione desiderata.">
+<!ENTITY lp.tb.selector.title "Usare DownThemAll! Selector">
+<!ENTITY lp.tb.selector.queueing "DownThemAll! Selector ti consente di accodare molti download semplicemente cliccando sui collegamenti o sulle immagini.">
+<!ENTITY lp.tb.selector.how "Per abilitare Selector clicca sul pulsante della barra degli strumenti corrispondente. Per disabilitarlo una volta finito, semplicemente clicca di nuovo il pulsante.">
+<!ENTITY lp.pr.title "Informativa sulla privacy">
+<!ENTITY lp.pr.intro2 "DownThemAll rispetta la tua privacy.">
+<!ENTITY lp.pr.settings2 "Puoi far sì che DownThemAll! rimuova tutti i download completati, annullati e non terminati dall'elenco dei download una volta chiusa la finestra modificando le impostazioni nella scheda Preferenze → Privacy.">
+<!ENTITY lp.pr.diag2 "Puoi abilitare i messaggi diagnostici, che saranno registrati sia nella Console degli errori sia scritti nel file dta_log.txt, nella scheda Preferenze → Privacy. I messaggi diagnostici probabilmente conterranno informazioni sensibili come URL, percorsi di file, nomi dei file che stai scaricando o anche informazioni sui cookie. Quest'opzione è DISABILITATA per impostazione predefinita per proteggere la tua privacy. Se invii un registro diagnostico potresti voler rimu [...]
+<!ENTITY lp.pr.pwpbm "DownThemAll! supporta la Modalità navigazione anonima per singola finestra di Firefox: quando aggiungi dei download da una finestra Navigazione anonima, DownThemAll! non salverà alcuna informazione relativa ai file scaricati, alle cartelle di download o alle maschere di ridenominazione utilizzate. Nota che gli altri dati - come nuovi filtri creati o, chiaramente, i download veri e propri - sono comunque scritti su disco.">
+<!ENTITY lp.pr.link "Questa nota informativa è sempre disponibile su questa pagina (about:downthemall) ed è inoltre raggiungibile dalla finestra Preferenze.">
+<!ENTITY lp.yr.usagetitle "Utilizzo e redistribuzione">
+<!ENTITY lp.yr.usage "Gli autori concedono in licenza DownThemAll! in modo che tu possa liberamente e gratuitamente:">
+<!ENTITY lp.yr.usageuse "Utilizzare DownThemAll!">
+<!ENTITY lp.yr.usagemod "Modificare DownThemAll!">
+<!ENTITY lp.yr.usagedist "Redistribuire DownThemAll!, con o senza modifiche">
+<!ENTITY lp.yr.usagemore "Vedi le licenze per maggiori informazioni.">
+<!ENTITY lp.yr.logo "I loghi utilizzano una licenza più restrittiva per consentirci di proteggere la nostra reputazione da truffatori. Ciò significa che devi utilizzare i tuoi loghi e un tuo nome nel caso in cui tu scelga di distribuire versioni modificate di DownThemAll!">
+<!ENTITY lp.languagetitle "Lingua">
+<!ENTITY lp.language.babelzilla "Se parli correntemente più lingue, valuta l'opportunità di iscriverti a <a href='http://babelzilla.org'>babelzilla.org</a> per aiutare a tradurre questo e molti altri ottimi componenti aggiuntivi.">
+<!ENTITY lp.yr.licensetitle "Copyright e licenza">
+<!ENTITY lp.yr.licensed "DownThemAll! è concesso in licenza in base ai termini e alle condizioni della <a href='http://www.gnu.org/licenses/old-licenses/gpl-2.0.html'>GPL 2.0</a>. Vedi il file GPL. Ciò si applica a tutti i file sorgente.">
+<!ENTITY lp.yr.morelicense3 "Dei singoli file potrebbero avere licenze aggiuntive e/o differenti. Vedi i corrispondenti file nel repository disponibili a <a href='http://code.downthemall.net/repos/'>http://code.downthemall.net/repos/</a>. La maggior parte dei file è concessa in licenza in base alla MPL 2.0, compatibile con la GPL/LGPL, o con tre licenze in base alle MPL 1.1/GPL 2.0/LGPL 2.1. Vedi rispettivamente i file MPL, GPL, LGPL.">
+<!ENTITY lp.yr.gplintro "Seguono le parti più importanti della GPL 2.0, l'assenza di garanzia e le dichiarazioni di non responsabilità per eventuali danni:">
+<!ENTITY lp.yr.icons "Grafica, icone e pulsanti">
+<!ENTITY lp.yr.iconsbased4 "sono basati sulle opere di Mike Matas, Mark James, del progetto Noun e del progetto Tango">
+<!ENTITY lp.yr.artwork3 "La grafica originale sono: Copyright © 2004-2013 Stefano Verna, Federico Parodi e Nils Maier">
+<!ENTITY lp.yr.artworklicense "La grafica originale è concessa in licenza in base a:">
+<!ENTITY lp.yr.logo3 "Il design del logo DownThemAll! è: Copyright © 2004-2013 Stefano Verna.">
+<!ENTITY lp.yr.logopermissions "Il nome e il logo di DownThemAll! non possono essere utilizzati senza permesso in alcun'opera derivata, fatta eccezione per i riconoscimenti e per le note legate alle licenze.">
+<!ENTITY lp.ct.bugstitle "Segnalare bug/Richiedere funzionalità">
+<!ENTITY lp.ct.bugs2 "Segnala i bug e richiedi funzionalità sul nostro <a href='https://bugs.downthemall.net/'>bug tracker</a>.">
+<!ENTITY lp.ct.contactstitle "Contatti">
+<!ENTITY lp.ct.contactsfeed2 "Ci piacerebbe sentire la tua opinione, ascoltare i tuoi suggerimenti e/o accogliere le tue offerte di aiuto.">
+<!ENTITY lp.ct.contacts "Vedi la nostra <a href='http://www.downthemall.net/main/contacts/'>pagina dei contatti</a>.">
diff --git a/chrome/locale/it/mainmenu.dtd b/chrome/locale/it/mainmenu.dtd
new file mode 100644
index 0000000..5e9fdeb
--- /dev/null
+++ b/chrome/locale/it/mainmenu.dtd
@@ -0,0 +1,5 @@
+<!ENTITY fileMenu.label "File">
+<!ENTITY fileMenu.accesskey "F">
+<!ENTITY newNavigatorCmd.label "Nuova finestra del browser">
+<!ENTITY tabCmd.label "Nuova scheda del browser">
+<!ENTITY closeWindow.label "Chiudi DownThemAll!">
diff --git a/chrome/locale/it/manager.dtd b/chrome/locale/it/manager.dtd
new file mode 100644
index 0000000..371ee3c
--- /dev/null
+++ b/chrome/locale/it/manager.dtd
@@ -0,0 +1,67 @@
+<!ENTITY tooladddownload.label "Aggiungi download">
+<!ENTITY tooladd.tooltip "Aggiungi manualmente un URL a DownThemAll">
+<!ENTITY tooldonate.tooltiptext "Puoi aiutarci a migliorare ancora DownThemAll. Valuta l'opportunità di fare una piccola donazione!">
+<!ENTITY movetop.label "In cima">
+<!ENTITY movebottom.label "In fondo">
+<!ENTITY moveup.label "Su">
+<!ENTITY movedown.label "Giù">
+<!ENTITY search.placeholder "Cerca download">
+<!ENTITY download.label "Download/nome">
+<!ENTITY domain.label "Dominio">
+<!ENTITY percent.label "Percentuale">
+<!ENTITY pct.label "Avanzamento">
+<!ENTITY dim.label "Dimensioni">
+<!ENTITY time2.label "Tempo stimato">
+<!ENTITY parts.label "Parti">
+<!ENTITY speed.label "Velocità">
+<!ENTITY infoURLTitle.value "Da:">
+<!ENTITY infoSizeTitle.value "Dimensioni:">
+<!ENTITY infoDateTitle.value "Data di aggiunta:">
+<!ENTITY infoMultiple.value "Elementi multipli">
+<!ENTITY infoPrivate.value "Download privato">
+<!ENTITY elapsedTitle.value "Tempo trascorso:">
+<!ENTITY remainingTitle.value "Tempo rimanente:">
+<!ENTITY currentSpeedTitle.value "Velocità attuale:">
+<!ENTITY avgSpeedTitle.value "Velocità media:">
+<!ENTITY path.label "Percorso salvataggio">
+<!ENTITY hash.label "Checksum">
+<!ENTITY infos.label "Informazioni download">
+<!ENTITY launch.label "Apri file">
+<!ENTITY rename.label "Rinomina file">
+<!ENTITY delete.label "Elimina file">
+<!ENTITY targetdir.label "Apri cartella">
+<!ENTITY pause.label "Pausa">
+<!ENTITY resume.label "Riprendi">
+<!ENTITY cancel.label "Annulla">
+<!ENTITY removemenu.label "Rimuovi i download">
+<!ENTITY removeselected.label "Rimuovi elementi selezionati">
+<!ENTITY removehost.label "Rimuovi download nel dominio">
+<!ENTITY removebatch.label "Rimuovi batch corrente">
+<!ENTITY removecompleted.label "Rimuovi download completati">
+<!ENTITY removeAll.label "Rimuovi tutti">
+<!ENTITY removeFailed.label "Rimozione non riuscita">
+<!ENTITY removePaused.label "Rimuovi download in pausa">
+<!ENTITY removeDupes.label "Rimuovi duplicati">
+<!ENTITY removeGone.label "Pulisci file obsoleti">
+<!ENTITY advanced.label "Avanzate">
+<!ENTITY addchunk.label "Aggiungi segmento">
+<!ENTITY removechunk.label "Rimuovi segmento">
+<!ENTITY force.label "Forza avvio">
+<!ENTITY import.label "Importa da file">
+<!ENTITY exportto.label "Esporta elementi selezionati su file">
+<!ENTITY addlimits.label "Aggiungi limiti specifici per il dominio">
+<!ENTITY options.caption "Opzioni">
+<!ENTITY loading2.label "Caricamento in corso...">
+<!ENTITY restore.label "Ripristina">
+<!ENTITY close.label "Chiudi">
+<!ENTITY invertmatcher.label "Inverti filtri colonna">
+<!ENTITY clearmatcher.label "Pulisci filtri colonna">
+<!ENTITY speedlimit2.tooltip "Modifica il limite di velocità globale. L'elenco viene aggiornato dinamicamente.">
+<!ENTITY perdownloadspeedlimit2.label "Limite velocità">
+<!ENTITY perdownloadspeedlimit2.tooltip "Modifica il limite di velocità del download. Il limite di velocità globale continuerà ad essere rispettato.">
+<!ENTITY mirrors.label "Gestisci mirror">
+<!ENTITY mirrors.tooltip "Gestisci indirizzi mirror di download">
+<!ENTITY toolbar.icons "Usa icone">
+<!ENTITY toolbar.full "Usa icone e testo">
+<!ENTITY sortascending.label "Ordina in modo crescente">
+<!ENTITY sortdescending.label "Ordina in modo decrescente">
diff --git a/chrome/locale/it/manager.properties b/chrome/locale/it/manager.properties
new file mode 100644
index 0000000..ab440c9
--- /dev/null
+++ b/chrome/locale/it/manager.properties
@@ -0,0 +1,116 @@
+complete=Completato
+canceled=Annullato
+moving=Spostamento in corso
+currentdownloadstats=%S di %S (%S), %S in corso
+titlespeed=%S - %S - %S/%S - DownThemAll!
+titlespeedfiltered=%S - %S - %S/%S (%S) - DownThemAll!
+titleidle=%S/%S - DownThemAll!
+titleidlefiltered=%S/%S (%S) - DownThemAll!
+transfered=%S di %S
+timeout=Errore tempo scaduto
+suc=DownThemAll ha completato tutte le operazioni.
+suc.title=Tutti i download sono stati completati!
+openfolder=Vuoi esplorare l'ultima cartella di download?
+starting=Avvio in corso
+error=Errore %S
+paused=In pausa
+running=In corso
+queued=In attesa
+soonfinished=Terminerà a breve
+next10mins=Prossimi 10 minuti
+nexthour=Prossima ora
+next6hours=Prossime 6 ore
+nextday=Prossimo giorno
+offline=Non in linea
+decompressing=Decompressione in corso
+prettyhash=%S [%S]
+verifying=Verifica in corso
+verifyerror.title=Errore di verifica
+verifyerror.text=I checksum del download non corrispondono. Ciò significa che il download è corrotto o compromesso.\nSi raccomanda di non utilizzare il file scaricato.\n\nCosa vuoi fare con il download?
+verifyerror.partialstext=I checksum del download non corrispondono\nIl download ha checksum parziali che consentono di ripristinare il download scaricando nuovamente solo le parti corrotte.\n\nSi raccomanda di non utilizzare il file scaricato così com'è.\n\nCosa vuoi fare con il download?
+failed=Download di %S non riuscito.
+cancel=Annulla
+skipped=Saltato
+servererror=Errore server
+autherror=Autenticazione non riuscita
+temperror=Errore temporaneo
+pcerrortitle=Bloccato!
+pcerrortext=Questo download è stato bloccato dal Controllo genitori
+sra=Il server ha restituito un errore %S
+errmismatchtitle=Dimensione non corrispondente
+errmismatchtext=La dimensione attuale di %S non corrisponde alla dimensione riportata di %S
+downloading=Download in corso
+confclose.2=Vuoi chiudere DownThemAll!?
+nonresclose=dTa sta attualmente scaricando file che non si possono interrompere e riprendere in un secondo tempo.\nSe chiudi ora dTa, dovrai scaricare nuovamente i file dall'inizio!\n\nInterrompere i download e chiudere?
+privateclose=dTa ha attualmente dei download privati in coda.\nChiudere dTa in questo momento annullerà tutti i download privati e rimuoverà i file non completi corrispondenti!\n\nInterrompere i download privati e chiudere?
+freespace.title=Non c'è abbastanza spazio libero!
+freespace.temp=Non c'è sufficiente spazio libero nella cartella temporanea. Disabilita quest'opzione dalle Preferenze avanzate.
+freespace=Non c'è spazio libero
+freespace.dir=Non c'è sufficiente spazio libero. Libera ulteriore spazio o modifica la cartella di download.
+accesserror=Errore di accesso al file
+accesserror.long=L'accesso al file è stato negato. Impossibile creare una cartella o un file nella cartella di download. Controlla i permessi sui file o modifica la cartella di download.
+temp.notdir=L'indirizzo temporaneo non è una directory. Per ora si utilizzerà la cartella di download per salvare i file. Correggi quest'errore nelle Preferenze.
+temp.notaccessible=La cartella temporanea non è leggibile o scrivibile. Per ora si utilizzerà la cartella di download per salvare i file. Correggi quest'errore nelle Preferenze.
+temp.warnnnonerecommended=Si raccomanda di non specificare affatto una cartella temporanea e di far sì che DownThemAll! salvi semplicemente i file temporanei nella cartella di download. Utilizzare il comportamento raccomandato?
+autofix=Correggi problema
+manualfix3=Correggi manualmente...
+unknownerror=Errore sconosciuto
+unknownerror.text=Si è verificato un errore inaspettato, probabilmente un bug di DownThemAll!
+cancel.title=Annulla i download selezionati
+canceltext=Sei sicuro di voler annullare il download selezionato?
+cancelmanytext=Sei sicuro di voler annullare i download selezionati?
+docancel=Annulla download
+docancelmany=Annulla download
+dontcancel=Non annullare
+deletecaption=Elimina file
+deletetexts=Sei sicuro di voler eliminare i seguenti file?
+deletetextl.2=Sei sicuro di voler eliminare %S file?;Sei sicuro di voler eliminare %S file?
+retry=Riprova
+recover=Ripristina
+delete=Elimina
+keep=Mantieni
+disable=Disabilita
+mlerrortitle=Errore nel metalink
+mlerror=L'elaborazione del metalink ha causato il seguente errore "%S"
+mlinvalid=Documento metalink non valido
+ml.nodownloads=Nessun download supportato trovato in questo metalink!
+mlidentity=Download metalink
+ml.description=Seleziona uno o più download
+remove.title=Rimuovi download
+removequestion=Sei sicuro di voler rimuovere i download selezionati?
+removeallquestion=Sei sicuro di voler rimuovere TUTTI i download?
+removehostquestion=Sei sicuro di voler rimuovere tutti i download del dominio %S?
+removebatchquestion=Sei sicuro di voler rimuovere tutti i download del batch %S?
+removefilter.question=Sei sicuro di voler rimuovere i download corrispondenti al filtro %S?
+removecompletedquestion=Sei sicuro di voler rimuovere i download completati?
+removefailedquestion=Sei sicuro di voler rimuovere i download non riusciti?
+removepausedquestion=Sei sicuro di voler rimuovere i download in pausa?
+removecompletedfilter.question=Sei sicuro di voler rimuovere i download completati corrispondenti al filtro %S?
+import.title=Importa download
+importfailed=Importazione download non riuscita
+export.title=Esporta download
+exportfailed=Esportazione download non riuscita
+filtermetalink=Metalink (XML)
+filtermetalink3=Metalink 3 (legacy, XML)
+loading2=Caricamento dei download in corso (%S di %S, %S%). Attendere prego...
+ftperrortext=Non è stato possibile comunicare con il server FTP o il server ha risposto in modo errato
+nagtext=Hai effettuato più di %S download con DownThemAll!. Come utente abituale potresti considerare l'opportunità di fare una donazione per supportare l'ulteriore sviluppo, se non l'hai già fatto.
+nagdonate=Fai una donazione
+naghide=Nascondi
+unlimitedspeed=Illimitata
+verificationfailed=Verifica del file "%S" non riuscita!\nSi è verificato un problema durante l'elaborazione del file.
+verysmallfiles=Molto piccolo (<1 KB)
+smallfiles=Piccolo (1 KB - 1 MB)
+mediumfiles=Medio (1 MB - 250 MB)
+largefiles=Grande (250 MB - 500 MB)
+verylargefiles=Molto grande (500 MB - 4 GB)
+hugefiles=Enorme (> 4 GB)
+sortqueue=Ordina coda
+sortqueue.title=Ordina coda di download
+sortqueuemsg=Vuoi ordinare la tua coda di download?\n\nNota che quest'azione modificherà l'ordine dei download e non può essere annullata.
+schedule.running=La pianificazione attualmente consente l'avvio dei download
+schedule.paused=La pianificazione attualmente non consente l'avvio di nuovi download
+rename.title=Rinomina file
+rename.alreadythere=Non è possibile spostare il file %S in %S. Esiste già un file con lo stesso nome!
+rename.failedtomove=Impossibile spostare il file %S in %S!
+logging.enabled.warn=La registrazione diagnostica è abilitata. Essa ha un notevole impatto negativo sulle prestazioni e dovrebbe essere abilitata solo quando si ha la necessità di inviare una segnalazione d'errore.
diff --git a/chrome/locale/it/mask.dtd b/chrome/locale/it/mask.dtd
new file mode 100644
index 0000000..4784507
--- /dev/null
+++ b/chrome/locale/it/mask.dtd
@@ -0,0 +1,31 @@
+<!ENTITY mask.tags "Tag per la ridenominazione">
+<!ENTITY mask.name "Nome file">
+<!ENTITY mask.ext "Estensione">
+<!ENTITY mask.url "URL base">
+<!ENTITY mask.curl "URL completo">
+<!ENTITY mask.flatcurl "Stringa dell'intero URL">
+<!ENTITY mask.batch "Numero batch">
+<!ENTITY mask.inum "Numero di elementi">
+<!ENTITY mask.hh "Ore">
+<!ENTITY mask.mm "Minuti">
+<!ENTITY mask.ss "Secondi">
+<!ENTITY mask.d "Giorno">
+<!ENTITY mask.m "Mese">
+<!ENTITY mask.y "Anno">
+<!ENTITY mask.subdirs "Sottodirectory dell'URL">
+<!ENTITY mask.flatsubdirs "Stringa delle sottodirectory dell'URL">
+<!ENTITY mask.linktext "Testo collegamento">
+<!ENTITY mask.flatlinktext "Stringa testo collegamento">
+<!ENTITY mask.refername "Nome referer">
+<!ENTITY mask.referext "Estensione referer">
+<!ENTITY mask.refer "URL referer">
+<!ENTITY mask.crefer "Referer completo">
+<!ENTITY mask.flatcrefer "Stringa referer completo">
+<!ENTITY mask.referdirs "Sottodirectory referer">
+<!ENTITY mask.flatreferdirs "Stringa sottodirectory referer">
+<!ENTITY mask.qstring "Stringa query">
+<!ENTITY mask.referqstring "Stringa query referer">
+<!ENTITY mask.title "Titolo associato al collegamento">
+<!ENTITY mask.flattitle2 "Stringa titolo associato al collegamento">
+<!ENTITY mask.tip "Clicca o trascina sulla maschera di ridenominazione">
+<!ENTITY mask.open.tip "Legenda etichette di ridenominazione">
diff --git a/chrome/locale/it/menu.dtd b/chrome/locale/it/menu.dtd
new file mode 100644
index 0000000..6e4f978
--- /dev/null
+++ b/chrome/locale/it/menu.dtd
@@ -0,0 +1,25 @@
+<!ENTITY dta-tbinstall "Aggiungi pulsanti barra degli strumenti">
+<!ENTITY dta-pref.label "Preferenze...">
+<!ENTITY dta-about2.label "Informazioni su DownThemAll!">
+<!ENTITY dta-manager-button "dTa! Manager">
+<!ENTITY dta-manager-button.desc "Apre la finestra Manager.">
+<!ENTITY dta-selector-button2.label "Selettore OneClick!">
+<!ENTITY dta-selector-button.desc "Aggiunge degli elementi cliccandovi sopra con il tasto sinistro.">
+<!ENTITY dta-tb-all.label "Tutte le schede">
+<!ENTITY dta-tb-single.label "Scheda corrente">
+<!ENTITY dta-selection2.label "Esegui DownThemAll! sulla selezione">
+<!ENTITY dta-selection-turbo2.label "Esegui OneClick sulla selezione">
+<!ENTITY dta-regular2.label "DownThemAll!">
+<!ENTITY dta-regular.desc "Apre la finestra di selezione DownThemAll! per la scheda corrente.">
+<!ENTITY dta-regular-turbo2.label "dTa! OneClick">
+<!ENTITY dta-regular-turbo.desc "Scarica tutti gli elementi dalla pagina corrente in base alle preferenze e ai filtri usati per ultimi.">
+<!ENTITY dta-img-save2.label "Salva immagine con DownThemAll!">
+<!ENTITY dta-img-save-turbo2.label "Salva immagine con dTa! OneClick">
+<!ENTITY dta-video-save2.label "Salva video con DownThemAll!">
+<!ENTITY dta-video-save-turbo2.label "Salva video con dTa! OneClick">
+<!ENTITY dta-audio-save2.label "Salva audio con DownThemAll!">
+<!ENTITY dta-audio-save-turbo2.label "Salva audio con dTa! OneClick">
+<!ENTITY dta-link-save2.label "Salva collegamento con DownThemAll!">
+<!ENTITY dta-link-save-turbo2.label "Salva collegamento con dTa! OneClick">
+<!ENTITY dta-form-save2.label "Salva destinazione modulo con DownThemAll!">
+<!ENTITY dta-form-save-turbo2.label "Salva destinazione modulo con dTa! OneClick">
diff --git a/chrome/locale/it/menu.properties b/chrome/locale/it/menu.properties
new file mode 100644
index 0000000..7b05c27
--- /dev/null
+++ b/chrome/locale/it/menu.properties
@@ -0,0 +1,11 @@
+error=DownThemAll! - Errore
+error.nolinks=Nessun collegamento o immagine trovati!
+queuedn=%S elementi accodati
+queued=Accodato %S
+error.information=DownThemAll! non è stato in grado di procedere!\nNon c'erano collegamenti selezionati da scaricare o alcune informazioni, come la cartella di download, sono mancanti.
+errorcannotdownload=Il collegamento selezionato non è un file che dTa sappia come scaricare!
+moredtatools=Altri strumenti di dTa
+simpledtatools=Strumenti DownThemAll!
+sniffedvideo=Video rilevato
+preparing.label=Preparazione collegamenti in corso...
+processing.label=Elaborazione delle pagine in corso. %S collegamenti e %S immagini fino ad ora...
diff --git a/chrome/locale/it/metalinker.dtd b/chrome/locale/it/metalinker.dtd
new file mode 100644
index 0000000..4d79d87
--- /dev/null
+++ b/chrome/locale/it/metalinker.dtd
@@ -0,0 +1,3 @@
+<!ENTITY title "Selezione metalink">
+<!ENTITY publisher "Editore:">
+<!ENTITY license "Licenza:">
diff --git a/chrome/locale/it/metalinker.properties b/chrome/locale/it/metalinker.properties
new file mode 100644
index 0000000..daebd8a
--- /dev/null
+++ b/chrome/locale/it/metalinker.properties
@@ -0,0 +1,7 @@
+size=Dimensioni: %S
+version=Versione: %S
+lang=Lingua: %S
+sys=Sistema: %S
+mirrors=Mirror: %S
+copyright=Copyright: %S
+no.links=Nessun download selezionato! Seleziona alcuni download...
diff --git a/chrome/locale/it/mirrors.dtd b/chrome/locale/it/mirrors.dtd
new file mode 100644
index 0000000..6754e11
--- /dev/null
+++ b/chrome/locale/it/mirrors.dtd
@@ -0,0 +1,10 @@
+<!ENTITY title "Gestione dei mirror DownThemAll!">
+<!ENTITY header "Gestione dei mirror">
+<!ENTITY byline1 "I download possono essere scaricati da diversi indirizzi. Il file viene quindi riassemblato automaticamente.">
+<!ENTITY byline2 "Sei libero di aggiungere e rimuovere indirizzi che puntano allo stesso file.">
+<!ENTITY byline3 "Aggiungere indirizzi che puntano a file diversi causerà un download corrotto">
+<!ENTITY addmirror.tip "Aggiungi un mirror di download">
+<!ENTITY removemirror.tip "Rimuovi i mirror di download selezionati">
+<!ENTITY checkmirrors.tip "Controlla tutti i mirror di download">
+<!ENTITY mirrorurl "Indirizzo:">
+<!ENTITY preference "Priorità:">
diff --git a/chrome/locale/it/mirrors.properties b/chrome/locale/it/mirrors.properties
new file mode 100644
index 0000000..60f0d4a
--- /dev/null
+++ b/chrome/locale/it/mirrors.properties
@@ -0,0 +1,12 @@
+removebadmirrors.caption=Mirror inutilizzabili
+removebadmirrors.message=Rimuovere %S mirror inutilizzabili?
+removebadmirrors.keep=Mantieni
+removebadmirrors.remove=Rimuovi
+prefLow=Basso (%S)
+prefMedium=Medio (%S)
+prefHigh=Alto (%S)
+mirrorok=OK
+genericcheckerror=N/D
+sizecheckerror=Dimensione errata
+duplicatetitle=Mirror duplicato
+duplicatetext=L'indirizzo del mirror è già nell'elenco. Modifiche non applicate!
diff --git a/chrome/locale/it/prefpanes.dtd b/chrome/locale/it/prefpanes.dtd
new file mode 100644
index 0000000..3514b01
--- /dev/null
+++ b/chrome/locale/it/prefpanes.dtd
@@ -0,0 +1,123 @@
+<!ENTITY windowstyle.3 "width:48em;height:44em;">
+<!ENTITY filterspane.label "Filtri">
+<!ENTITY listhead1.label "Nome">
+<!ENTITY listhead2.label "Estensioni">
+<!ENTITY filter.label "Estensioni filtrate:">
+<!ENTITY useAs.label "Utilizza filtro come:">
+<!ENTITY filter.images.label "Filtro immagini">
+<!ENTITY filter.links.label "Filtro collegamenti">
+<!ENTITY add.label "Aggiungi nuovo filtro">
+<!ENTITY dtacontext2.label "Preferenze">
+<!ENTITY buttonlabelextra2 "Ripristina impostazioni predefinite">
+<!ENTITY dtaPreferences.title "Preferenze DownThemAll!">
+<!ENTITY manager "dTa! Manager">
+<!ENTITY mainpane.label "Generali">
+<!ENTITY mainpane.defaults.caption "Predefinite">
+<!ENTITY mainpane.defaults.desc "La cartella di download, la maschera di ridenominazione e i filtri utilizzati da OneClick! possono essere configurati nella finestra di selezione di DownThemAll!.">
+<!ENTITY mainpane.nameclash.caption "Quando esiste già un file con lo stesso nome:">
+<!ENTITY mainpane.rename.label "Rinomina">
+<!ENTITY mainpane.overwrite.label "Sovrascrivi">
+<!ENTITY mainpane.skip.label "Salta">
+<!ENTITY mainpane.ask.label "Chiedi">
+<!ENTITY mainpane.misc.caption "Varie">
+<!ENTITY mainpane.sounderror2.label "Riproduci un suono in caso di errore">
+<!ENTITY mainpane.alert.caption "Quando i download sono stati completati:">
+<!ENTITY mainpane.alert.label "Avvisami:">
+<!ENTITY mainpane.alertbox.label "Utilizzando finestre di avvertimento">
+<!ENTITY mainpane.alertnotifications2.label "Utilizzando notifiche desktop">
+<!ENTITY mainpane.alertnone.label "Non avvisarmi">
+<!ENTITY mainpane.sounddone.label "Riproduci un suono quando tutti i download sono stati completati">
+<!ENTITY mainpane.closedta.label "Chiudi DownThemAll! quando i download sono stati completati">
+<!ENTITY mainpane.settime.label "Imposta l'ora del file all'ora dell'ultima modifica (server) o all'ora in cui sono stati messi in coda">
+<!ENTITY mainpane.rememberoneclick.label "Fai ricordare a dTa OneClick! se esso agisce su tutte le schede o solo su quella attuale">
+<!ENTITY mainpane.confirmremove2.label "Conferma la rimozione dei download">
+<!ENTITY mainpane.textlinks.label "Riconosci i collegamenti testuali">
+<!ENTITY mainpane.listsniffedvideos.label "Registra ed elenca i video (Flash)">
+<!ENTITY privacypane.label "Privacy">
+<!ENTITY privacypane.closing.caption "Quando la finestra Manager viene chiusa">
+<!ENTITY privacypane.removecompleted2.label "Rimuovi i download completati">
+<!ENTITY privacypane.removecanceled2.label "Rimuovi i download annullati/non riusciti">
+<!ENTITY privacypane.removeaborted2.label "Rimuovi i download non terminati">
+<!ENTITY privacypane.deletefoldershistory.label "Svuota elenco cartelle">
+<!ENTITY privacypane.deletefiltershistory.label "Svuota i filtri aggiuntivi">
+<!ENTITY privacypane.showlog.label "Visualizza registro">
+<!ENTITY privacypane.reveallog.label "Mostra file">
+<!ENTITY privacypane.deletelog.label "Elimina registro">
+<!ENTITY privacypane.dropdowns.caption "Menù a discesa">
+<!ENTITY privacypane.dropdownresults2.label "Numero di voci da mantenere">
+<!ENTITY privacypane.logs.caption "Registro diagnostico">
+<!ENTITY privacypane.enablelogs.label "Abilita il registro diagnostico">
+<!ENTITY privacypane.notice.caption "Informativa">
+<!ENTITY privacypane.notice.desc "DownThemAll! si integra anche con il pannello Elimina dati personali (se disponibile).">
+<!ENTITY privacypane.privacynotice.label "La nostra informativa sulla privacy">
+<!ENTITY serverspane.label "Rete">
+<!ENTITY serverspane.downloads.caption "Download">
+<!ENTITY serverspane.concurrent2.label "Download concorrenti:">
+<!ENTITY serverspane.perserver2.label "Download per server:">
+<!ENTITY serverspane.url.label "Indirizzo o dominio:">
+<!ENTITY serverspane.new.label "Nuovo limite">
+<!ENTITY serverspane.limits.label "Limiti per server">
+<!ENTITY serverpane.limits.noitems "Nessun limite per server specificato">
+<!ENTITY serverspane.connections.label "Connessioni:">
+<!ENTITY serverspane.speed2.label "Limite velocità:">
+<!ENTITY serverspane.segments.label "Numero segmenti:">
+<!ENTITY serverspane.unlimited "Illimitato">
+<!ENTITY serverspane.limited "Limitato">
+<!ENTITY serverspane.autoretry2.caption "Numero nuovi tentativi automatici">
+<!ENTITY serverspane.autoretry.interval.label "Riprova ogni">
+<!ENTITY serverspane.autoretry.max.label "Numero massimo tentativi">
+<!ENTITY serverspane.cancel.label "Annulla">
+<!ENTITY serverspane.edit.label "Modifica">
+<!ENTITY serverspane.remove.label "Rimuovi">
+<!ENTITY schedpane.label "Pianificazione">
+<!ENTITY schedpane.enable.label "Abilita pianificazione">
+<!ENTITY schedpane.start.label "Avvia i download solo dalle:">
+<!ENTITY schedpane.end.label "e terminali alle:">
+<!ENTITY schedpane.open.label "Apri automaticamente il Manager">
+<!ENTITY advancedpane.label "Avanzate">
+<!ENTITY advancedpane.downloads.caption "Controllo avanzato dei download">
+<!ENTITY advancedpane.miscellaneous.caption "Varie">
+<!ENTITY advancedpane.files.caption "File">
+<!ENTITY advancedpane.chunks2.label "Numero segmenti per download:">
+<!ENTITY advancedpane.chunksdisabled "Disabilitato">
+<!ENTITY advancedpane.autosegments.label "Avvia un nuovo segmento una volta terminato uno precedente">
+<!ENTITY advancedpane.timeout2.label "Tempo scaduto download dopo">
+<!ENTITY advancedpane.seconds "secondi">
+<!ENTITY advancedpane.minute "minuto">
+<!ENTITY advancedpane.minutes "minuti">
+<!ENTITY advancedpane.hour "ora">
+<!ENTITY advancedpane.hours "ore">
+<!ENTITY advancedpane.tempfiles.caption "File temporanei">
+<!ENTITY advancedpane.usetemp.label "Salva i segmenti in una cartella temporanea">
+<!ENTITY advancedpane.tempdir.label "Utilizza questa cartella:">
+<!ENTITY advancedpane.permissions "Permessi file">
+<!ENTITY advancedpane.permissions.groupmay "I membri del gruppo possono">
+<!ENTITY advancedpane.permissions.everybodymay "Chiunque altro può">
+<!ENTITY advancedpane.permissions.read "Lettura">
+<!ENTITY advancedpane.permissions.write "Scrittura">
+<!ENTITY advancedpane.loadendfirst2.label "Carica alcuni ultimi kilobyte per primi">
+<!ENTITY advancedpane.scheduler.caption "Ordine di avvio download:">
+<!ENTITY advancedpane.scheduler.fast "Veloce - Come in coda">
+<!ENTITY advancedpane.scheduler.fair "Normale+Lento - Equamente distribuiti">
+<!ENTITY advancedpane.scheduler.legacy "Legacy - nessun limite">
+<!ENTITY advancedpane.exposeinua.label "Mostra DownThemAll! nella stringa User-Agent">
+<!ENTITY advancedpane.sparsefiles.caption "File sparse">
+<!ENTITY advancedpane.sparsefiles.label "Utilizza i file sparse se supportati">
+<!ENTITY advancedpane.sparsefiles.tooltip "I file sparse sono file che non occupano immediatamente lo spazio richiesto sul disco fisso. I file sparse possono causare una preallocazione più veloce, ma anche prestazioni in scrittura inferiori e/o una maggiore frammentazione dei file!">
+<!ENTITY uipane.label "Interfaccia">
+<!ENTITY uipane.namesonly.label "Visualizza solo i nomi dei file nella finestra Manager">
+<!ENTITY uipane.integration.caption "Integrazione">
+<!ENTITY uipane.downloadwin.label "Aggiungi DownThemAll! alla finestra 'Salva file'">
+<!ENTITY uipane.context.caption "Menù di scelta rapida">
+<!ENTITY uipane.tools.caption "Menù Strumenti">
+<!ENTITY uipane.compact.label "Usa un menù compatto">
+<!ENTITY uipane.hide.label "Nascondi questo menù">
+<!ENTITY uipane.showtooltip.label "Visualizza informazioni rapide download">
+<!ENTITY uipane.manager.caption "Finestra Manager">
+<!ENTITY uipane.startminimized.label "Avvia ridotto a icona">
+<!ENTITY uipane.minimizetotray.label "Visualizza nell'area di notifica">
+<!ENTITY uipane.getmintrayr.label "Ottieni MinTrayR">
+<!ENTITY uipane.notification.label "Quando si aggiungono download con OneClick, visualizza:">
+<!ENTITY uipane.notification.nonotification.radio "Nessuna notifica">
+<!ENTITY uipane.notification.doorhangernotification.radio "Notifiche a discesa">
+<!ENTITY uipane.notification.desktopnotification.radio "Notifica desktop">
diff --git a/chrome/locale/it/prefpanes.properties b/chrome/locale/it/prefpanes.properties
new file mode 100644
index 0000000..659224b
--- /dev/null
+++ b/chrome/locale/it/prefpanes.properties
@@ -0,0 +1,16 @@
+restoreprefstitle=Ripristina preferenze
+restoreprefstext=Vuoi ripristinare le preferenze al loro valore predefinito?\nQuest'operazione non può essere annullata!
+restorefilterstitle=Ripristina filtro
+restorefilterstext=Vuoi ripristinare il valore iniziale di questo filtro?\nQuest'operazione non può essere annullata!
+restore=Ripristina
+regex=Espressione regolare
+newfilt=Nuovo filtro
+inserthere=Inserisci qui le estensioni (separate da una virgola)
+removebutton=Elimina filtro
+restorebutton=Ripristina filtro predefinito
+unlimited=Illimitato
+removelimittitle=Rimuovi limiti per server
+removelimitdesc=Rimuovere i limiti associati a "%S"?
+removelimit=Rimuovi limiti
+createlimit=Crea
+savelimit=Salva
diff --git a/chrome/locale/it/sanitize.properties b/chrome/locale/it/sanitize.properties
new file mode 100644
index 0000000..e5678a3
--- /dev/null
+++ b/chrome/locale/it/sanitize.properties
@@ -0,0 +1 @@
+sanitizeitem=Cronologia e coda DownThemAll!
diff --git a/chrome/locale/it/saveas.dtd b/chrome/locale/it/saveas.dtd
new file mode 100644
index 0000000..39b2b3f
--- /dev/null
+++ b/chrome/locale/it/saveas.dtd
@@ -0,0 +1 @@
+<!ENTITY on "in">
diff --git a/chrome/locale/it/select.dtd b/chrome/locale/it/select.dtd
new file mode 100644
index 0000000..f052eb7
--- /dev/null
+++ b/chrome/locale/it/select.dtd
@@ -0,0 +1,16 @@
+<!ENTITY title "Fai la tua selezione">
+<!ENTITY filters.caption "Filtri">
+<!ENTITY additional.caption "Filtraggio veloce">
+<!ENTITY additional.tip "Filtro testuale: puoi impostare più filtri testuali contemporaneamente separandoli con una virgola.">
+<!ENTITY filter.tip "Scrivi qui i tuoi filtri testuali! (alcuni esempi sono nell'elenco a discesa)">
+<!ENTITY menu.check.label "Seleziona elementi evidenziati">
+<!ENTITY menu.uncheck.label "Deseleziona elementi evidenziati">
+<!ENTITY menu.toggle.label "Inverti selezione per gli elementi selezionati">
+<!ENTITY menu.copylinks2.label "Copia collegamenti">
+<!ENTITY tab.links.label "Collegamenti">
+<!ENTITY tab.media.label "Immagini e file multimediali">
+<!ENTITY header.desc.label "Descrizione">
+<!ENTITY selectfiltered.label "Seleziona gli elementi filtrati">
+<!ENTITY disableother.label "Disabilita gli altri filtri">
+<!ENTITY disableother.tooltip "Disabilita gli altri filtri e usa solo il filtraggio veloce. (Questa impostazione non viene attualmente memorizzata)">
+<!ENTITY resname.value "Nome risorsa">
diff --git a/chrome/locale/it/select.properties b/chrome/locale/it/select.properties
new file mode 100644
index 0000000..71ce3ac
--- /dev/null
+++ b/chrome/locale/it/select.properties
@@ -0,0 +1,6 @@
+status=Dopo aver selezionato i collegamenti clicca su Avvia!
+no.links=Nessun download selezionato! Scegli alcuni download...
+selel=Link selezionati: %S di %S
+default=Predefinito
+openlink=Apri %S
+openlinks=Apri %S collegamenti
diff --git a/chrome/locale/sl-SI/prefpanes.dtd b/chrome/locale/sl-SI/prefpanes.dtd
index 4100f5b..8358afc 100644
--- a/chrome/locale/sl-SI/prefpanes.dtd
+++ b/chrome/locale/sl-SI/prefpanes.dtd
@@ -4,8 +4,8 @@
<!ENTITY listhead2.label "Razširitve">
<!ENTITY filter.label "Filtrirane razširitve:">
<!ENTITY useAs.label "Uporabi kot:">
-<!ENTITY filter.images.label "Filter slik">
-<!ENTITY filter.links.label "Filter povezav">
+<!ENTITY filter.images.label "filter slik">
+<!ENTITY filter.links.label "filter povezav">
<!ENTITY add.label "Dodaj nov filter">
<!ENTITY dtacontext2.label "Nastavitve">
<!ENTITY buttonlabelextra2 "Obnovi privzete nastavitve">
@@ -20,24 +20,24 @@
<!ENTITY mainpane.skip.label "Preskoči">
<!ENTITY mainpane.ask.label "Vprašaj">
<!ENTITY mainpane.misc.caption "Razno">
-<!ENTITY mainpane.sounderror2.label "Predvajaj zvok ob napakah">
+<!ENTITY mainpane.sounderror2.label "predvajaj zvok ob napakah">
<!ENTITY mainpane.alert.caption "Ob zaključku prenosov:">
-<!ENTITY mainpane.alert.label "Opozori me:">
+<!ENTITY mainpane.alert.label "me opozori:">
<!ENTITY mainpane.alertbox.label "z uporabo opozorilnih oken">
<!ENTITY mainpane.alertnotifications2.label "z uporabo namiznih obvestil">
-<!ENTITY mainpane.alertnone.label "Ne opozarjaj me">
-<!ENTITY mainpane.sounddone.label "Predvajaj zvočno datoteko, ko so vsi prenosi dokončani">
-<!ENTITY mainpane.closedta.label "Zapri DownThemAll, ko so prenosi dokončani">
-<!ENTITY mainpane.settime.label "Določite čas datoteke na čas zadnje spremembe (strežnik) ali čas postavitve v vrsto">
+<!ENTITY mainpane.alertnone.label "ne opozarjaj me">
+<!ENTITY mainpane.sounddone.label "predvajaj zvočno datoteko, ko so vsi prenosi dokončani">
+<!ENTITY mainpane.closedta.label "zapri DownThemAll, ko so prenosi dokončani">
+<!ENTITY mainpane.settime.label "Določi čas datoteke na čas zadnje spremembe (strežnik) ali čas postavitve v vrsto">
<!ENTITY mainpane.rememberoneclick.label "dTa OneClick si naj zapomni, ali velja za vse zavihke ali za trenutni zavihek">
<!ENTITY mainpane.confirmremove2.label "Potrdi odstranitev prenosov">
<!ENTITY mainpane.textlinks.label "Prepoznaj besedilne povezave">
-<!ENTITY mainpane.listsniffedvideos.label "Snemaj in izpiši video (Flash)">
+<!ENTITY mainpane.listsniffedvideos.label "Posnemi in izpiši video (Flash)">
<!ENTITY privacypane.label "Zasebnost">
<!ENTITY privacypane.closing.caption "Ko je okno upravitelja zaprto">
-<!ENTITY privacypane.removecompleted2.label "Odstrani dokončane prenose">
-<!ENTITY privacypane.removecanceled2.label "Odstrani preklicane/spodletele prenose">
-<!ENTITY privacypane.removeaborted2.label "Odstrani nedokončane prenose">
+<!ENTITY privacypane.removecompleted2.label "odstrani dokončane prenose">
+<!ENTITY privacypane.removecanceled2.label "odstrani preklicane/spodletele prenose">
+<!ENTITY privacypane.removeaborted2.label "odstrani nedokončane prenose">
<!ENTITY privacypane.deletefoldershistory.label "Izbriši zgodovino map">
<!ENTITY privacypane.deletefiltershistory.label "Izbriši zgodovino dodatnih filtrov">
<!ENTITY privacypane.showlog.label "Pokaži zapisnik">
@@ -61,8 +61,8 @@
<!ENTITY serverspane.connections.label "Povezave:">
<!ENTITY serverspane.speed2.label "Omejitev hitrosti:">
<!ENTITY serverspane.segments.label "Odseki:">
-<!ENTITY serverspane.unlimited "neomejena">
-<!ENTITY serverspane.limited "omejena">
+<!ENTITY serverspane.unlimited "neomejeno">
+<!ENTITY serverspane.limited "omejeno">
<!ENTITY serverspane.autoretry2.caption "Samodejni ponovni poskusi">
<!ENTITY serverspane.autoretry.interval.label "Poskusi znova vsakih">
<!ENTITY serverspane.autoretry.max.label "Največ ponovnih poskusov">
@@ -71,11 +71,11 @@
<!ENTITY serverspane.remove.label "Odstrani">
<!ENTITY schedpane.label "Urnik">
<!ENTITY schedpane.enable.label "Omogoči urnik">
-<!ENTITY schedpane.start.label "Prenose začni samo med:">
+<!ENTITY schedpane.start.label "Prenose začni samo ob:">
<!ENTITY schedpane.end.label "in končaj ob:">
<!ENTITY schedpane.open.label "Samodejno odpri upravitelja">
<!ENTITY advancedpane.label "Napredno">
-<!ENTITY advancedpane.downloads.caption "Napredni nadzor nad prenosi">
+<!ENTITY advancedpane.downloads.caption "Napr. nadzor nad prenosi">
<!ENTITY advancedpane.miscellaneous.caption "Razno">
<!ENTITY advancedpane.files.caption "Datoteke">
<!ENTITY advancedpane.chunks2.label "Št. odsekov na prenos:">
@@ -97,14 +97,14 @@
<!ENTITY advancedpane.permissions.write "pišejo">
<!ENTITY advancedpane.loadendfirst2.label "Najprej naloži zadnjih nekaj kilobajtov">
<!ENTITY advancedpane.scheduler.caption "Zaporedje prenašanja:">
-<!ENTITY advancedpane.scheduler.fast "hitro - kot v vrsti">
-<!ENTITY advancedpane.scheduler.fair "pošteno in počasi - porazdeljeno">
-<!ENTITY advancedpane.scheduler.legacy "zastarelo - brez omejitev">
+<!ENTITY advancedpane.scheduler.fast "Hitro - kot v vrsti">
+<!ENTITY advancedpane.scheduler.fair "Pošteno in počasi - porazdeljeno">
+<!ENTITY advancedpane.scheduler.legacy "Zastarelo - brez omejitev">
<!ENTITY advancedpane.exposeinua.label "Razkrij DownThemAll! v uporabniškem agentu">
<!ENTITY advancedpane.sparsefiles.caption "Redke datoteke">
<!ENTITY advancedpane.sparsefiles.label "Uporabi redke datoteke, kadar so podprte">
<!ENTITY advancedpane.sparsefiles.tooltip "Redke datoteke niso takoj rezervirane na trdem disku. Lahko povzročijo hitrejše vnaprejšnje dodeljevanje, vendar manj zmogljivosti pri pisanju in/ali več več razdrobljenosti!">
-<!ENTITY uipane.label "Uporabniški vmesnik">
+<!ENTITY uipane.label "Up. vmesnik">
<!ENTITY uipane.namesonly.label "V oknu upravitelja pokaži le imena datotek">
<!ENTITY uipane.integration.caption "Vključitev">
<!ENTITY uipane.downloadwin.label "Dodaj DownThemAll! v okno 'Shrani datoteko'">
diff --git a/chrome/skin/manager/style.css b/chrome/skin/manager/style.css
index a3bb1ac..a625105 100644
--- a/chrome/skin/manager/style.css
+++ b/chrome/skin/manager/style.css
@@ -284,9 +284,6 @@ toolbox {
#tooltip grid {
-moz-box-flex: 1;
}
-tooltip textbox.plain {
- color: InfoText;
-}
#infoGrid label {
margin-bottom: 0;
font-weight: bold;
@@ -454,6 +451,7 @@ treechildren::-moz-tree-cell-text(private) {
}
#actions > toolbarseparator {
-moz-appearance: none;
+ height: 0;
border-top: 3px solid transparent;
border-bottom: 3px solid transparent;
border-left: 1px solid transparent;
diff --git a/chrome/skin/select/tabActiveEnd.svg b/chrome/skin/select/tabActiveEnd.svg
index 3a20b3d..41f9116 100644
--- a/chrome/skin/select/tabActiveEnd.svg
+++ b/chrome/skin/select/tabActiveEnd.svg
@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" height="29" width="30" version="1.1">
- <path d="m27.5,29.4c-2.9,0-6.71-0.6-8.96-4.3-1.7-2.7-1.9-4.8-3.4-10-2.4-8.3-4.6-10.6-8-12.3-2.7-1.35-5.14-1.3-8.14-1.3v30.5h28.5z" stroke-opacity=".35" fill-opacity="0.8" stroke="#0A1F33" fill="white"/>
+ <path d="m27.5,29.4c-2.9,0-6.71-0.6-8.96-4.3-1.7-2.7-1.9-4.8-3.4-10-2.4-8.3-4.6-10.6-8-12.3-2.7-1.35-5.14-1.3-8.14-1.3v30.5h28.5z" stroke-opacity=".35" fill-opacity="0.3" stroke="#0A1F33" fill="gray"/>
</svg>
diff --git a/chrome/skin/select/tabActiveMiddle.svg b/chrome/skin/select/tabActiveMiddle.svg
index cfbaa1c..9de6197 100644
--- a/chrome/skin/select/tabActiveMiddle.svg
+++ b/chrome/skin/select/tabActiveMiddle.svg
@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" height="29" width="6" version="1.1">
- <rect stroke-opacity="0.35" fill-opacity="0.8" height="30.4" width="8" stroke="#0A1F33" y="1.6" x="-1" fill="white"/>
+ <rect stroke-opacity="0.35" fill-opacity="0.3" height="30.4" width="8" stroke="#0A1F33" y="1.6" x="-1" fill="gray"/>
</svg>
diff --git a/chrome/skin/select/tabActiveStart.svg b/chrome/skin/select/tabActiveStart.svg
index ac505e7..703cfef 100644
--- a/chrome/skin/select/tabActiveStart.svg
+++ b/chrome/skin/select/tabActiveStart.svg
@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" height="29" width="30" version="1.1">
- <path d="m2.5,29.4c2.9,0,6.71-0.6,8.96-4.3,1.7-2.7,1.9-4.8,3.4-10,2.4-8.3,4.6-10.6,8-12.3,2.7-1.35,6.89-1.2,8.14-1.3v30.5h-28.5z" stroke-opacity=".35" fill-opacity="0.8" stroke="#0A1F33" fill="white"/>
+ <path d="m2.5,29.4c2.9,0,6.71-0.6,8.96-4.3,1.7-2.7,1.9-4.8,3.4-10,2.4-8.3,4.6-10.6,8-12.3,2.7-1.35,6.89-1.2,8.14-1.3v30.5h-28.5z" stroke-opacity=".35" fill-opacity="0.3" stroke="#0A1F33" fill="gray"/>
</svg>
diff --git a/chrome/skin/win/manager-new.css b/chrome/skin/win/manager-new.css
index 0230d32..49bc1a1 100644
--- a/chrome/skin/win/manager-new.css
+++ b/chrome/skin/win/manager-new.css
@@ -5,7 +5,7 @@
margin-left: 2px;
-moz-appearance: none;
}
-#actions:not(:-moz-window-inactive) {
+#actions:not(:-moz-window-inactive){
background: rgba(255,255,255,0.66);
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
diff --git a/chrome/skin/win/manager-newer.css b/chrome/skin/win/manager-newer.css
index 7d537e8..6e8782d 100644
--- a/chrome/skin/win/manager-newer.css
+++ b/chrome/skin/win/manager-newer.css
@@ -5,15 +5,12 @@
-moz-appearance: none;
}
+#actions {
+ background: transparent !important;
+}
+
#toolbox {
text-shadow: 0 0 .8em white, 0 0 .8em white, 0 1px 0 rgba(255,255,255,.4);
padding-left: 26px;
padding-bottom: 4px;
}
-
-#footer {
- text-shadow: 0pt 0pt 0.5em white, 0pt 0pt 0.5em white, 0pt 1px 0pt rgba(255, 255, 255, 0.4);
-}
-#footer:not(:-moz-window-inactive) {
- background-color: rgba(255,255,255,.66);
-}
diff --git a/chrome/skin/win/select.css b/chrome/skin/win/select.css
index afa7878..5263b6d 100644
--- a/chrome/skin/win/select.css
+++ b/chrome/skin/win/select.css
@@ -2,30 +2,19 @@
#views,
#findfiles {
- -moz-appearance: none !important;
background: transparent;
border: 0;
}
-window:-moz-system-metric(windows-default-theme) :-moz-any(#views, #findfiles) {
- background-color: rgb(185,209,234) !important;
-}
-window:-moz-system-metric(windows-default-theme):-moz-window-inactive :-moz-any(#views, #findfiles) {
- background-color: rgb(215,228,242) !important;
-}
-
- at media all and (-moz-windows-compositor) {
- /* specifity issues ahead; beware */
- #DownThemAll {
- -moz-appearance: -moz-win-glass !important;
- background-color: transparent !important;
- }
- #dta-select {
- -moz-appearance: -moz-win-exclude-glass;
- background-color: -moz-Dialog;
- }
- #views, #findfiles {
- -moz-appearance: -moz-win-glass !important;
- background-color: transparent !important;
+ at media not all and (-moz-windows-compositor) {
+ @media (-moz-windows-default-theme) {
+ #views, #findfiles {
+ -moz-appearance: none !important;
+ background-color: rgb(185,209,234);
+ }
+ #views:-moz-window-inactive , #findfiles:-moz-window-inactive {
+ -moz-appearance: none !important;
+ background-color: rgb(215,228,242);
+ }
}
}
\ No newline at end of file
diff --git a/install.rdf b/install.rdf
index 403a9f1..5fdef92 100644
--- a/install.rdf
+++ b/install.rdf
@@ -4,7 +4,7 @@
<em:id>{DDC359D1-844A-42a7-9AA1-88A850A938A8}</em:id>
<em:name>DownThemAll!</em:name>
<em:description>The mass downloader for Firefox.</em:description>
- <em:version>3.0.6</em:version>
+ <em:version>3.0.7</em:version>
<em:bootstrap>true</em:bootstrap>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:type>2</em:type>
@@ -39,6 +39,8 @@
</Description>
</em:targetApplication>
+
+
<em:localized><Description><em:locale>en-US</em:locale><em:name>DownThemAll!</em:name><em:description>The mass downloader for Firefox.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>The dTa Team</em:translator></Description></em:localized>
<em:localized><Description><em:locale>de</em:locale><em:name>DownThemAll!</em:name><em:description>Der Massen-Download-Manager für Firefox</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>Nils Maier</em:translator></Description></em:localized>
@@ -47,6 +49,7 @@
<em:localized><Description><em:locale>fr</em:locale><em:name>DownThemAll!</em:name><em:description>L'extension de téléchargement par lot pour Firefox.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>L'équipe dTa</em:translator></Description></em:localized>
<em:localized><Description><em:locale>gl</em:locale><em:name>DownThemAll!</em:name><em:description>Descargador masivo para Firefox.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>O equipo de dTa</em:translator></Description></em:localized>
<em:localized><Description><em:locale>gl-ES</em:locale><em:name>DownThemAll!</em:name><em:description>Descargador masivo para Firefox.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>O equipo de dTa</em:translator></Description></em:localized>
+ <em:localized><Description><em:locale>it</em:locale><em:name>DownThemAll!</em:name><em:description>Lo scaricatore di massa per Firefox</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>Il team dTa, Alessandro Menti</em:translator></Description></em:localized>
<em:localized><Description><em:locale>nl</em:locale><em:name>DownThemAll!</em:name><em:description>De bulkdownloader voor Firefox.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>Het dTa-team</em:translator></Description></em:localized>
<em:localized><Description><em:locale>pl</em:locale><em:name>DownThemAll!</em:name><em:description>Menedżer pobierania plików dla Firefoksa.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>Leszek(teo)Życzkowski</em:translator></Description></em:localized>
<em:localized><Description><em:locale>pt-PT</em:locale><em:name>DownThemAll!</em:name><em:description>O transferidor em massa para o Firefox.</em:description><em:creator>Federico Parodi, Stefano Verna, Nils Maier</em:creator><em:homepageURL>http://downthemall.net/</em:homepageURL><em:developer>Federico Parodi</em:developer><em:developer>Stefano Verna</em:developer><em:developer>Nils Maier</em:developer><em:translator>A Equipa dTa</em:translator></Description></em:localized>
diff --git a/modules/constants.js b/modules/constants.js
index 83c5fe9..4cb5833 100644
--- a/modules/constants.js
+++ b/modules/constants.js
@@ -9,7 +9,8 @@ Object.defineProperties(exports, {
QUEUED: {value: 1<<6, enumerable: true},
SPEED_COUNT: {value: 100, enumerable: true},
MIN_CHUNK_SIZE: {value: 1<<19, enumerable: true},
- MAX_PENDING_SIZE: {value: 1<<27, enumerable: true},
+ PIPE_SEGMENT_SIZE: {value: 1<<16, enumerable: true},
+ MAX_PIPE_SEGMENTS: {value: 100, enumerable: true},
BUFFER_SIZE: {value: 1<<19, enumerable: true},
REFRESH_FREQ: {value: 1000, enumerable: true},
TOOLTIP_FREQ: {value: 500, enumerable: true},
diff --git a/modules/defaultPrefs.js b/modules/defaultPrefs.js
index 542e332..c130630 100644
--- a/modules/defaultPrefs.js
+++ b/modules/defaultPrefs.js
@@ -64,6 +64,7 @@ pref("extensions.dta.autosegments", true);
pref("extensions.dta.notification2", 2);
pref("extensions.dta.usesysalerts", false);
pref("extensions.dta.seriesdigits", 3);
+pref("extensions.dta.usecleanrequests", false);
// Non-customizable-toolbar specific
pref("extensions.dta.tb.buttons", "1,1,0");
diff --git a/modules/glue.jsm b/modules/glue.jsm
index 5a973c5..6385fa6 100644
--- a/modules/glue.jsm
+++ b/modules/glue.jsm
@@ -75,10 +75,20 @@ var log = function logStub() {
};
var LOG_DEBUG = 0, LOG_INFO = 0, LOG_ERROR = 0;
-var LRUMap = function LRUMap(limit) {
+const DEAD = Symbol();
+
+var LRUMap = function LRUMap(limit, values) {
+ if (!(limit > 1) || (limit !== (limit | 0))) {
+ throw new Error("Invalid limit");
+ }
this._limit = limit;
this.clear();
Object.preventExtensions(this);
+
+ for (let i = (values || DEAD).length - 1; i >= 0; --i) {
+ Cu.reportError(i);
+ this.set(values[i][0], values[i][1]);
+ }
};
LRUMap.prototype = Object.freeze({
"get": function(key) { return this._dict.get(key); },
@@ -104,6 +114,13 @@ LRUMap.prototype = Object.freeze({
"clear": function() {
this._dict = new Map();
this._arr = [];
+ },
+ toJSON: function() {
+ let rv = [];
+ for (let i of this._arr) {
+ rv.push([i, this._dict.get(i)]);
+ }
+ return rv;
}
});
@@ -208,6 +225,7 @@ LRUMap.prototype = Object.freeze({
// init
itor("AsyncStreamCopier", "@mozilla.org/network/async-stream-copier;1","nsIAsyncStreamCopier", "init");
+ itor("AsyncStreamCopier2", "@mozilla.org/network/async-stream-copier;1","nsIAsyncStreamCopier2", "init");
itor("BinaryInputStream", "@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream", "setInputStream");
itor("BinaryOutputStream", "@mozilla.org/binaryoutputstream;1", "nsIBinaryOutputStream", "setOutputStream");
itor("BufferedOutputStream", "@mozilla.org/network/buffered-output-stream;1", "nsIBufferedOutputStream", "init");
diff --git a/modules/loaders/integration-content.js b/modules/loaders/integration-content.js
index 32c1ebc..184b50c 100644
--- a/modules/loaders/integration-content.js
+++ b/modules/loaders/integration-content.js
@@ -5,6 +5,10 @@
/* global content, setTimeout, removeMessageListener, addMessageListener, sendAsyncMessage */
+if (!("setTimeout" in this)) {
+ Components.utils.import("resource://gre/modules/Timer.jsm");
+}
+
(function() {
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
@@ -54,6 +58,11 @@ const {filterInSitu, filterMapInSitu, unique} = require("support/uniquelinks");
/* **
* Helpers and tools
*/
+
+// This will be handled more finegrained in the main process, so just throw
+// out some obvious stuff.
+const blocked_schemes = new Set(["javascript", "file", "blob", "data"]);
+
const trimMore = function(t) {
return t.replace(/^[\s_]+|[\s_]+$/gi, '').replace(/(_){2,}/g, "_");
};
@@ -151,6 +160,10 @@ const addLinksToArray = function* addLinksToArray(lnks, urls, doc) {
try {
let url = Services.io.newURI(link.href, doc.characterSet, null);
+ let scheme = url.scheme;
+ if (blocked_schemes.has(scheme)) {
+ continue;
+ }
let title = '';
if (link.hasAttribute('title')) {
title = trimMore(link.getAttribute('title'));
diff --git a/modules/loaders/integration.js b/modules/loaders/integration.js
index 01545b1..0bef3d1 100644
--- a/modules/loaders/integration.js
+++ b/modules/loaders/integration.js
@@ -393,7 +393,7 @@ exports.load = function load(window, outerEvent) {
bundle.getString('error.information')
);
}
- if (typeof queued === 'number') {
+ else if (typeof queued === 'number') {
notifyInfo(bundle.getFormattedString('queuedn', [queued]));
}
else {
diff --git a/modules/manager/chunk.js b/modules/manager/chunk.js
index 61900e3..93c50f8 100644
--- a/modules/manager/chunk.js
+++ b/modules/manager/chunk.js
@@ -3,7 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
-/* global BUFFER_SIZE, MAX_PENDING_SIZE */
+/* global BUFFER_SIZE, PIPE_SEGMENT_SIZE, MAX_PIPE_SEGMENTS */
requireJoined(this, "constants");
const Prefs = require("preferences");
const {ByteBucketTee} = require("support/bytebucket");
@@ -49,22 +49,7 @@ const _thread = (function() {
return AsyncCopierThread;
})();
-var buffer_size = Math.max(1<<18, BUFFER_SIZE);
-
-function roundp2(s) {
- s |= (--s) >> 1;
- s |= s >> 2;
- s |= s >> 4;
- s |= s >> 8;
- s |= s >> 16;
- return ++s;
-}
-
exports.hintChunkBufferSize = function(bs) {
- if (!bs) {
- return;
- }
- buffer_size = Math.max(1<<18, Math.min(BUFFER_SIZE * 32, roundp2(bs * 2)));
};
const Observer = {
@@ -84,72 +69,14 @@ const Observer = {
};
Prefs.addObserver("extensions.dta.permissions", Observer);
-function Buffer(size) {
- this.size = size;
- this._pipe = new Instances.Pipe(true, true, size, 1);
- this._out = this._pipe.outputStream;
-}
-Buffer.prototype = Object.seal({
- length: 0,
- get free() {
- return this.size - this.length;
- },
- writeFrom: function(inputStream, length) {
- if (length > this.free) {
- throw new Error(`Buffer overflow, free: ${this.free}, length: ${length}, blen: ${this.length}`);
- }
- let exception = null;
- for (let i = 0; i < 10; ++i) {
- try {
- this._out.writeFrom(inputStream, length);
- exception = null;
- break;
- }
- catch (ex) {
- exception = ex;
- try {
- Services.memrm.minimizeMemoryUsage(() => {});
- }
- catch (iex) {
- log(LOG_ERROR, "Failed to minimize memory usage", iex);
- }
- for (let j = 0; j < (i + 1) * 1000; ++j) {
- // Do some busy looping
- }
- }
- }
- if (exception) {
- throw exception;
- }
- this.length += length;
- return length;
- },
- unlink: function() {
- if (this._out) {
- this._out.close();
- this._out = null;
- }
- if (this._pipe) {
- this._pipe = null;
- delete this._pipe;
- }
- this.length = this.size = 0;
- },
- get stream() {
- return this._pipe.inputStream;
- }
-});
-
-function shipStream(instream, outstream, closeSink) {
- let copier = new Instances.AsyncStreamCopier(
+function asyncCopy(instream, outstream, close) {
+ let copier = new Instances.AsyncStreamCopier2(
instream,
outstream,
_thread,
- true, // source buffered
- false, // sink buffered
- instream.available(),
- true, // close source
- closeSink // close sink
+ PIPE_SEGMENT_SIZE,
+ false, // close source
+ close // close sink
);
return new Promise(function(resolve, reject) {
copier.asyncCopy({
@@ -181,18 +108,12 @@ function Chunk(download, start, end, written) {
Chunk.prototype = {
_inited: false,
- _buffered: 0,
_written: 0,
- _pendingWrites: 0,
_wnd: 2048,
running: false,
safeBytes: 0,
- get _hasBuffer() {
- return !!this._buffer;
- },
-
get starter() {
return this.end <= 0;
},
@@ -212,14 +133,29 @@ Chunk.prototype = {
get written() {
return this._written;
},
- get bufferedPending() {
- return this._buffered;
- },
- get bufferedCached() {
- return this._hasBuffer ? this._buffer.length : 0;
- },
get buffered() {
- return this.bufferedPending + this.bufferedCached;
+ let rv = 0;
+ try {
+ if (this._inStream) {
+ rv += this._inStream.available();
+ }
+ }
+ catch (ex) {
+ log(LOG_DEBUG, "Failed to get buffered size, which is probably OK", ex);
+ }
+ try {
+ if (this._overflowPipe) {
+ rv += this._overflowPipe.inputStream.available();
+ }
+ }
+ catch (ex) {
+ log(LOG_DEBUG, "Failed to get overflow size, which is probably OK", ex);
+ }
+ if (rv) {
+ // Add a segment size on top to be on the safer side
+ rv += PIPE_SEGMENT_SIZE;
+ }
+ return rv;
},
get currentPosition() {
return this.start + this.written;
@@ -240,12 +176,11 @@ Chunk.prototype = {
return this._sessionBytes;
},
- _init: function() {
+ open: function() {
if (this._inited) {
- return;
+ return new Promise(r => r());
}
this._inited = true;
- this.errored = false;
this._sessionBytes = 0;
this._canceled = false;
@@ -256,11 +191,7 @@ Chunk.prototype = {
);
this.buckets.register(this);
memoryReporter.registerChunk(this);
- },
- _open: function() {
- if (this._outStream) {
- return new Promise(r => r(this._outStream));
- }
+
if (this._openPromise) {
return this._openPromise;
}
@@ -271,87 +202,48 @@ Chunk.prototype = {
this.errored = false;
return this._openPromise = Task.spawn(function*() {
try {
- yield makeDir(file.parent, Prefs.dirPermissions);
- }
- catch (ex if ex.becauseExists) {
- // no op
+ try {
+ yield makeDir(file.parent, Prefs.dirPermissions);
+ }
+ catch (ex if ex.becauseExists) {
+ // no op
+ }
+ let outStream = new Instances.FileOutputStream(
+ file,
+ 0x02 | 0x08,
+ Prefs.permissions,
+ Ci.nsIFileOutputStream.DEFER_OPEN
+ );
+ if (pos) {
+ let seekable = outStream.QueryInterface(Ci.nsISeekableStream);
+ seekable.seek(0x00, pos);
+ }
+ this._pipe = new Instances.Pipe(
+ true,
+ true,
+ PIPE_SEGMENT_SIZE,
+ MAX_PIPE_SEGMENTS);
+ this._inStream = this._pipe.inputStream;
+ this._outStream = this._pipe.outputStream;
+ this._copier = asyncCopy(this._inStream, outStream, true);
+ this._copier.catch(status => {
+ this.errored = true;
+ this.download.writeFailed(status);
+ });
}
- let outStream = new Instances.FileOutputStream(
- file,
- 0x02 | 0x08,
- Prefs.permissions,
- Ci.nsIFileOutputStream.DEFER_OPEN
- );
- if (pos) {
- let seekable = outStream.QueryInterface(Ci.nsISeekableStream);
- seekable.seek(0x00, pos);
+ finally {
+ delete this._openPromise;
}
- delete this._openPromise;
- return (this._outStream = outStream);
}.bind(this));
},
_noteBytesWritten: function(bytes) {
this._written += bytes;
this._sessionBytes += bytes;
+ this.safeBytes = Math.max(this.safeBytes, this._written - this.buffered);
memoryReporter.noteBytesWritten(bytes);
this.parent.timeLastProgress = getTimestamp();
},
- _ensureBuffer: function() {
- if (this._hasBuffer) {
- return;
- }
- this.buffer_size = buffer_size;
- this._buffer = new Buffer(this.buffer_size);
- },
- _shipBuffer: function() {
- let buffer = this._buffer;
- delete this._buffer;
- if (!buffer) {
- return;
- }
- let length = buffer.length;
- if (!length) {
- log(LOG_DEBUG, "Not shipping buffer, zero length");
- return;
- }
-
- log(LOG_DEBUG, "shipping buffer: " + length);
- let stream = buffer.stream;
- buffer.unlink();
- this._buffered += length;
- ++this._pendingWrites;
- if (this.errored) {
- log(LOG_DEBUG, "Not shipping buffer, we're errored");
- return;
- }
- Task.spawn(function* _shipBufferTask() {
- try {
- yield shipStream(stream, (yield this._open()), false);
- this._buffered -= length;
- --this._pendingWrites;
- this.safeBytes += length;
- if (!this.running) {
- this.close();
- }
- }
- catch (ex) {
- try {
- this.errored = true;
- this._buffered -= length;
- --this._pendingWrites;
- log(LOG_ERROR, "Failed to write", ex);
- this.download.writeFailed(ex);
- }
- catch (ex2) {
- log(LOG_ERROR, "aggregate failure", ex2);
- }
- if (!this.running) {
- this.close();
- }
- }
- }.bind(this));
- },
close: function() {
if (this._closing) {
return this._closing;
@@ -362,15 +254,67 @@ Chunk.prototype = {
this.running = false;
return (this._closing = Task.spawn(function*() {
try {
- if (this._hasBuffer) {
- this._shipBuffer();
+ if (this._openPromise) {
+ yield this._openPromise;
+ }
+ // drain the overflowPipe, if any
+ if (this._overflowPipe && !this.errored) {
+ log(LOG_DEBUG, "draining overflow");
+ try {
+ yield asyncCopy(this._overflowPipe.inputStream, this._outStream, false);
+ }
+ catch (status) {
+ this.download.writeFailed(status);
+ }
+ }
+ if (this._overflowPipe) {
+ // Still got an overflow pipe, meaning we failed a write
+ // Since we kill the pipe now, we need to adjust written sizes
+ // beforehand accordingly so saveBytes and rollback() are still
+ // correct
+ try {
+ let pending = this._overflowPipe.inputStream.available();
+ this._written -= pending;
+ this._sessionBytes -= pending;
+ }
+ catch (ex) {
+ log(LOG_DEBUG, "failed to substract overflow, which is probably OK", ex);
+ }
+ this._overflowPipe.outputStream.close();
+ this._overflowPipe.inputStream.close();
+ delete this._overflowPipe;
}
- if (this._outStream || this._openPromise) {
- // hacky way to close the stream off the main thread
- let is = new Instances.StringInputStream("", 0);
- yield shipStream(is, (yield this._open()), true);
+ // we are done writing to the pipe
+ if (this._outStream) {
+ this._outStream.close();
+ delete this._pipe;
delete this._outStream;
}
+ // but still need to wait for the copy into the file
+ if (this._copier) {
+ try {
+ yield this._copier;
+ }
+ catch (ex) {
+ // ignore here!
+ }
+ delete this._copier;
+ }
+
+ // upate the counters one last time
+ this._noteBytesWritten(0);
+ // and close the input stream end of the pipe
+ if (this._inStream) {
+ try {
+ this._inStream.close();
+ }
+ catch (ex) {
+ // no op
+ }
+ delete this._inStream; // ... before deleting the instream
+ }
+
+ // and do some cleanup
if (this.buckets) {
this.buckets.unregister(this);
delete this.buckets;
@@ -380,14 +324,13 @@ Chunk.prototype = {
this._inited = false;
this._sessionBytes = 0;
- this._buffered = 0;
this._written = this.safeBytes;
- delete this.download;
}
catch (ex) {
log(LOG_ERROR, "Damn!", ex);
}
finally {
+ delete this.download;
delete this._closing;
}
}.bind(this)));
@@ -408,18 +351,8 @@ Chunk.prototype = {
this._sessionBytes = 0;
},
cancelChunk: function() {
- this.running = false;
this._canceled = true;
-
- // prevent shipping the current buffer
- if (this._hasBuffer) {
- this._buffer.unlink();
- delete this._buffer;
- }
- this.close();
- if (this.download) {
- this.download.cancel();
- }
+ this.pauseChunk();
},
pauseChunk: function() {
this.running = false;
@@ -434,7 +367,6 @@ Chunk.prototype = {
if (!this.running) {
return -1;
}
- this._init();
let bytes = this.remainder;
if (!this.total || aCount < bytes) {
bytes = aCount;
@@ -463,48 +395,38 @@ Chunk.prototype = {
// or in our case all remainder bytes
// reqPending from above makes sure that we won't re-schedule
// the download too early
- let written = 0;
- if (this._hasBuffer) {
- let fill = Math.min(bytes, this._buffer.free);
- bytes -= fill;
- if (fill && this._buffer.writeFrom(aInputStream, fill) !== fill) {
- throw new Error("Failed to fill current stream. fill: " +
- fill + " bytes: " + bytes + "chunk: " + this);
- }
- if (!this._buffer.free) {
- this._shipBuffer();
- }
- written += fill;
+ if (this._overflowPipe) {
+ // We still got overflow
+ log(LOG_DEBUG, "writing to overflow");
+ this._overflowPipe.outputStream.writeFrom(aInputStream, bytes);
}
- this._ensureBuffer();
- while (bytes >= this.buffer_size) {
- if (this._buffer.writeFrom(aInputStream, this.buffer_size) !== this.buffer_size) {
- throw new Error("Failed to write full stream. " + this);
- }
- this._shipBuffer();
- bytes -= this.buffer_size;
- written += this.buffer_size;
- this._ensureBuffer();
- }
- if (bytes) {
- this._ensureBuffer();
+ else {
+ let written = 0;
try {
- let part = this._buffer.writeFrom(aInputStream, bytes);
- if (part !== bytes) {
- throw new Error("Failed to write all requested bytes to current stream. bytes: " +
- bytes + " actual: " + part + " chunk: " + this);
- }
- written += part;
- bytes -= part;
+ written = this._outStream.writeFrom(aInputStream, bytes);
}
- catch (ex) {
- log(LOG_ERROR, "Failed to write: " + bytes + "/" + this._buffer.free + "/" + this.buffer_size, ex);
- throw ex;
+ catch (ex if ex.result == Cr.NS_BASE_STREAM_WOULD_BLOCK || ex == NS_BASE_STREAM_WOULD_BLOCK) {
+ // aka still nothing written
+ }
+ let remain = bytes - written;
+ if (remain > 0) {
+ if (!this._overflowPipe) {
+ // If everything goes according to plan, we won't need much!
+ // Having an overflow pipe will eventually suspend the request
+ // until it clears up!
+ log(LOG_DEBUG, "creating overflow pipe");
+ this._overflowPipe = new Instances.Pipe(
+ false,
+ true,
+ PIPE_SEGMENT_SIZE,
+ MAX_PIPE_SEGMENTS * 10);
+ }
+ log(LOG_DEBUG, "writing to remainder to overflow");
+ this._overflowPipe.outputStream.writeFrom(aInputStream, remain);
}
}
- this._noteBytesWritten(got);
-
- return written;
+ this._noteBytesWritten(bytes);
+ return bytes;
}
catch (ex) {
log(LOG_ERROR, 'write: ' + this.parent.tmpFile.path, ex);
@@ -516,12 +438,39 @@ Chunk.prototype = {
this.run();
},
requestBytes: function(requested) {
- if (memoryReporter.pendingBytes > MAX_PENDING_SIZE) {
- log(LOG_INFO, "Under pressure: " + memoryReporter.pendingBytes + " : " + memoryReporter.memoryPressure);
- // basically stop processing while under memory pressure
- this.schedule();
- return 0;
+ if (this._overflowPipe) {
+ let instream = this._overflowPipe.inputStream;
+ let avail = instream.available();
+ if (!avail) {
+ this._overflowPipe.outputStream.close();
+ this._overflowPipe.inputStream.close();
+ delete this._overflowPipe;
+ }
+ else {
+ log(LOG_DEBUG, `still overflow: ${avail}`);
+ // decreasing requested will put the stream into suspended mode, need
+ // to schedule
+ requested = Math.max(requested - avail, 0);
+ let written = 0;
+ try {
+ written = this._outStream.writeFrom(instream, avail);
+ }
+ catch (ex if ex.result == Cr.NS_BASE_STREAM_WOULD_BLOCK || ex == NS_BASE_STREAM_WOULD_BLOCK) {
+ // nothing written
+ }
+ avail -= written;
+ log(LOG_DEBUG, `overflow written: ${written} ${avail}`);
+ if (!avail) {
+ log(LOG_DEBUG, "overflow cleared");
+ this._overflowPipe.outputStream.close();
+ this._overflowPipe.inputStream.close();
+ delete this._overflowPipe;
+ }
+ // .. which we do here
+ this.schedule();
+ }
}
+
if (memoryReporter.memoryPressure > 0) {
log(LOG_INFO, "Under some pressure: " + memoryReporter.pendingBytes +
" : " + memoryReporter.memoryPressure + " : " + requested);
@@ -551,7 +500,6 @@ Chunk.prototype = {
if (!got) {
return;
}
- this._noteBytesWritten(got);
if (got < requested) {
this._wnd = Math.round(Math.min(this._wnd / 2, 1024));
}
diff --git a/modules/manager/connection.js b/modules/manager/connection.js
index 055ae1b..106a3e8 100644
--- a/modules/manager/connection.js
+++ b/modules/manager/connection.js
@@ -17,6 +17,7 @@ requireJoined(this, "constants");
const {formatNumber, StringBundles, getTimestamp} = require("utils");
const {modifyURL, modifyHttp} = require("support/requestmanipulation");
const Preferences = require("preferences");
+const DomainPrefs = require("support/domainprefs");
const {Task} = requireJSM("resource://gre/modules/Task.jsm");
const {
@@ -42,6 +43,8 @@ const _ = (function(global) {
};
})(this);
+const cleanRequest = Symbol.for("cleanRequest");
+
let proxyInfo = null;
const proxyObserver = {
observe: function() {
@@ -71,10 +74,13 @@ const proxyObserver = {
Preferences.addObserver("extensions.dta.proxy", proxyObserver);
proxyObserver.observe();
-function maybeTempBlacklisted(item, httpchan) {
+function maybeTempBlacklisted(conn, item, httpchan) {
try {
- if (httpchan.getResponseHeader("Server").includes("cloudflare")) {
+ let server = httpchan.getResponseHeader("Server");
+ if (server.includes("cloudflare")) {
item.cleanRequest = true;
+ DomainPrefs.setTLD(conn.origURL, cleanRequest, true);
+ DomainPrefs.setTLD(httpchan.URI, cleanRequest, true);
return true;
}
return false;
@@ -93,6 +99,7 @@ function Connection(d, c, isInfoGetter) {
this.url = d.urlManager.getURL();
let url = modifyURL(this.url.url.clone());
+ this.origURL = url;
let referrer = d.referrer;
log(LOG_INFO, "starting: " + url.spec);
@@ -155,8 +162,12 @@ function Connection(d, c, isInfoGetter) {
this.prepareChannel(this._chan);
c.running = true;
- this._chan.asyncOpen(this, null);
- log(LOG_INFO, c + "is now open");
+ c.open().then(() => {
+ this._chan.asyncOpen(this, null);
+ log(LOG_INFO, `chunk ${c} ${isInfoGetter ? "InfoGetter" : "Regular"} is now open!`);
+ }).catch(ex => {
+ this.writeFailed(ex);
+ });
}
Connection.prototype = {
@@ -195,7 +206,9 @@ Connection.prototype = {
if (chan instanceof Ci.nsIHttpChannel) {
let c = this.c;
- if (!d.cleanRequest) {
+ if (!d.cleanRequest &&
+ !Preferences.getExt("usecleanrequests", false) &&
+ !DomainPrefs.getTLD(chan.URI, cleanRequest)) {
log(LOG_DEBUG, `setting up ${chan.URI.spec}`);
// Cannot hash when compressed
chan.setRequestHeader("Accept-Encoding", "", false);
@@ -260,6 +273,12 @@ Connection.prototype = {
if (!aReason) {
aReason = NS_ERROR_BINDING_ABORTED;
}
+ try {
+ this._chan.resume();
+ }
+ catch (ex) {
+ // no op
+ }
this._chan.cancel(aReason);
this._closed = true;
}
@@ -772,7 +791,6 @@ Connection.prototype = {
if (c.starter && d.urlManager.markBad(this.url)) {
log(LOG_ERROR, "caught bad server (Error: " + code + ")", d.toString());
- d.cancel();
d.safeRetry();
return false;
}
@@ -796,7 +814,7 @@ Connection.prototype = {
let file = d.fileName.length > 50 ? d.fileName.substring(0, 50) + "..." : d.fileName;
if (~[401, 402, 407, 500, 502, 503, 504].indexOf(code) ||
(Preferences.getExt('recoverallhttperrors', false) && code !== 404) ||
- (code === 403 && aChannel instanceof Ci.nsIHttpChannel && maybeTempBlacklisted(d, aChannel))) {
+ (code === 403 && aChannel instanceof Ci.nsIHttpChannel && maybeTempBlacklisted(this, d, aChannel))) {
log(LOG_DEBUG, "we got temp failure!", code);
d.pauseAndRetry();
d.status = code >= 500 ? _('temperror') : _("error", [formatNumber(code, 3)]);
@@ -853,9 +871,7 @@ Connection.prototype = {
aChannel.visitResponseHeaders(vis);
log(LOG_ERROR, vis.value);
}
- d.cancel();
- d.resumable = false;
- d.safeRetry();
+ d.safeRetry(false);
return false;
}
}
@@ -868,9 +884,7 @@ Connection.prototype = {
log(LOG_ERROR, "header failed! " + d, ex);
// restart download from the beginning
if (!this.handleError()) {
- d.cancel();
- d.resumable = false;
- d.safeRetry();
+ d.safeRetry(false);
}
return false;
}
@@ -985,9 +999,7 @@ Connection.prototype = {
catch (ex) {
log(LOG_ERROR, "header failed! " + d, ex);
// restart download from the beginning
- d.cancel();
- d.resumable = false;
- d.safeRetry();
+ d.safeRetry(false);
return false;
}
return false;
@@ -1038,7 +1050,16 @@ Connection.prototype = {
this.started = true;
- if (!d || !d.chunks || !~d.chunks.indexOf(c)) {
+ if (!d) {
+ this.writeFailed("invalid connection state (download)");
+ return;
+ }
+ if (!d.chunks) {
+ this.writeFailed("invalid connection state (chunks)");
+ return;
+ }
+ if (!~d.chunks.indexOf(c)) {
+ log(LOG_DEBUG, "invalid connection state (chunk index): " + d.chunks.indexOf(c) + " / " + JSON.stringify(c) + " / " + JSON.stringify(d.chunks));
return;
}
@@ -1140,7 +1161,6 @@ Connection.prototype = {
}
else {
log(LOG_ERROR, "caught bad server", d.toString());
- d.cancel();
d.safeRetry();
}
return;
@@ -1170,7 +1190,6 @@ Connection.prototype = {
}
else {
log(LOG_ERROR, "caught bad server", d.toString());
- d.cancel();
d.safeRetry();
}
return;
diff --git a/modules/manager/memoryreporter.js b/modules/manager/memoryreporter.js
index 5fb2b24..8682c46 100644
--- a/modules/manager/memoryreporter.js
+++ b/modules/manager/memoryreporter.js
@@ -33,19 +33,12 @@ MemoryReporter.prototype = {
}
}
this._pendingBytes = 0;
- this._cachedBytes = 0;
- this._overflow = 0;
this._chunksScheduled = 0;
this._chunksActive = 0;
for (let c of this.chunks) {
let bs = c.buffer_size;
- let pending = 0;
- this._pendingBytes += pending;
- this._overflow += (bs - (pending % bs)) % bs;
- let cached = c.bufferedCached;
- this._cachedBytes += cached;
- this._overflow += (bs - (cached % bs)) % bs;
+ this._pendingBytes += c.buffered;
if (c._req) {
++this._chunksScheduled;
}
@@ -78,24 +71,6 @@ MemoryReporter.prototype = {
);
callback.callback(
this.process,
- "downthemall-downloads-memory-cached",
- Ci.nsIMemoryReporter.KIND_OTHER,
- Ci.nsIMemoryReporter.UNITS_BYTES,
- this._cachedBytes,
- "Downloaded bytes currently residing in memory.",
- closure
- );
- callback.callback(
- this.process,
- "downthemall-downloads-memory-overflow",
- Ci.nsIMemoryReporter.KIND_OTHER,
- Ci.nsIMemoryReporter.UNITS_BYTES,
- this._overflow,
- "Unused memory that was (potentially) over-committed.",
- closure
- );
- callback.callback(
- this.process,
"downthemall-connections-active",
Ci.nsIMemoryReporter.KIND_OTHER,
Ci.nsIMemoryReporter.UNITS_COUNT,
diff --git a/modules/manager/preallocator.js b/modules/manager/preallocator.js
index f4f72f9..705c38b 100644
--- a/modules/manager/preallocator.js
+++ b/modules/manager/preallocator.js
@@ -15,14 +15,16 @@ const SIZE_COTHREAD_MAX = (1<<24);
const _impl = createOptimizedImplementation(
"manager/preallocator/worker",
- function(impl) { return function (file, size, perms, sparseOK, callback) {
- let data = Object.create(null);
- data.file = file.path;
- data.size = size;
- data.perms = perms;
- data.sparseOK = sparseOK;
- return impl(data, callback);
- }; },
+ function(impl) {
+ return function (file, size, perms, sparseOK, callback) {
+ let data = Object.create(null);
+ data.file = file.path;
+ data.size = size;
+ data.perms = perms;
+ data.sparseOK = sparseOK;
+ return impl(data, callback);
+ };
+ },
function(file, size, perms, sparseOK, callback) {
if (size < SIZE_COTHREAD_MAX) {
return _cothread(file, size, perms, sparseOK, callback);
diff --git a/modules/manager/preallocator/worker.js b/modules/manager/preallocator/worker.js
index 4b87d0a..2bf20a8 100644
--- a/modules/manager/preallocator/worker.js
+++ b/modules/manager/preallocator/worker.js
@@ -25,7 +25,7 @@ onmessage = function(event) {
}
try {
- log("allocating:" + data.file + " with size: " + data.size + " sparse: " + data.sparseOK);
+ log("allocating: " + JSON.stringify(data));
data.result = prealloc(data.file, data.size, data.perms, data.sparseOK);
}
catch (ex) {
diff --git a/modules/support/domainprefs.js b/modules/support/domainprefs.js
new file mode 100644
index 0000000..1c1c0ba
--- /dev/null
+++ b/modules/support/domainprefs.js
@@ -0,0 +1,104 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+// for now domain prefs are non-persistent
+// XXX Make persistent and migrate limits
+
+const {symbolize} = require("./stringfuncs");
+
+const domains = new LRUMap(500);
+
+function domain(url, tld) {
+ try {
+ return Services.eTLD.getBaseDomain(url, tld ? 0 : 3);
+ }
+ catch (ex) {
+ try {
+ log(LOG_ERROR, "Failed to get tld for " + (url.spec || url));
+ return url.host;
+ }
+ catch (ex) {
+ return null;
+ }
+ }
+}
+
+function getPref(url, pref, defaultValue, tld) {
+ let dom = domain(url, tld);
+ if (!dom) {
+ return defaultValue;
+ }
+ let prefs = domains.get(Symbol.for(dom));
+ if (!prefs) {
+ return defaultValue;
+ }
+ return prefs.get(symbolize(pref)) || defaultValue;
+}
+
+function setPref(url, pref, value, tld) {
+ let dom = domain(url, tld);
+ if (!dom) {
+ // We cannot store for stuff we cannot get a domain from
+ // then again, no big deal, since the prefs are not persistent anyway at the moment
+ // XXX this may change
+ return;
+ }
+ dom = Symbol.for(dom);
+ let prefs = domains.get(dom);
+ if (!prefs) {
+ prefs = new Map();
+ domains.set(dom, prefs);
+ }
+ prefs.set(symbolize(pref), value);
+}
+
+function deletePref(url, pref, tld) {
+ let dom = domain(url, tld);
+ if (!dom) {
+ return;
+ }
+ dom = Symbol.for(dom);
+ let prefs = domains.get(dom);
+ if (!prefs) {
+ return;
+ }
+ prefs.delete(symbolize(pref));
+ if (!prefs.size) {
+ domains.delete(dom);
+ }
+}
+
+Object.defineProperties(exports, {
+ "get": {
+ value: getPref,
+ enumerable: true
+ },
+ "set": {
+ value: setPref,
+ enumerable: true
+ },
+ "delete": {
+ value: deletePref,
+ enumerable: true
+ },
+ "getTLD": {
+ value: function(url, pref, defaultValue) {
+ return getPref(url, pref, defaultValue, true);
+ },
+ enumerable: true
+ },
+ "setTLD": {
+ value: function(url, pref, value) {
+ return setPref(url, pref, value, true);
+ },
+ enumerable: true
+ },
+ "deleteTLD": {
+ value: function(url, pref, value) {
+ return deletePref(url, pref, true);
+ },
+ enumerable: true
+ }
+});
diff --git a/modules/support/loggedprompter.js b/modules/support/loggedprompter.js
index 118f5c9..15c4d35 100644
--- a/modules/support/loggedprompter.js
+++ b/modules/support/loggedprompter.js
@@ -19,50 +19,42 @@ function LoggedPrompter(window) {
* Property providing nsIAuthPrompt
*/
lazy(this, "authPrompter", function() {
- let _p = Services.ww.getNewAuthPrompter(window).QueryInterface(Ci.nsIAuthPrompt);
+ let _p = Services.ww.getNewAuthPrompter(window).
+ QueryInterface(Ci.nsIAuthPrompt).
+ QueryInterface(Ci.nsIAuthPrompt2);
let restricted = new Map();
- let proxy = new Proxy(_p, {
- has: function(name) { return name in _p; },
- hasOwn: function(name) { returnname in _p; },
- get: function(receiver, name) {
- log(LOG_DEBUG, "called: " + name);
- if (name === "QueryInterface") {
- return function(iid) {
- _p.QueryInterface(iid);
- return proxy;
+ let bind = key => _p[key].bind(_p);
+ return {
+ QueryInterface: function(iid) {
+ _p.QueryInterface(iid);
+ return this;
+ },
+ prompt: bind("prompt"),
+ promptUsernameAndPassword: bind("promptUsernameAndPassword"),
+ promptPassword: bind("promptPassword"),
+ promptAuth: bind("promptAuth"),
+ asyncAuthPrompt: function(channel, callback, context, level, info) {
+ const key = uriToKey(channel.URI);
+ if (restricted.has(key)) {
+ log(LOG_DEBUG, "Restricted " + key);
+ callback.onAuthCancelled(context, true);
+ return {
+ cancel: function() {}
};
}
- if (name === "restrictLogin") {
- return function(uri) {
- const key = uriToKey(uri);
- restricted.set(key, true);
- };
- }
- if (name === "allowLogin") {
- return function(uri) {
- const key = uriToKey(uri);
- log(LOG_DEBUG, "Lifting restriction " + key);
- restricted.delete(key, true);
- };
- }
- if (name === "asyncPromptAuth") {
- return function(channel, cb, ctx, level, info) {
- const key = uriToKey(channel.URI);
- if (restricted.has(key)) {
- log(LOG_DEBUG, "Restricted " + key);
- cb.onAuthCancelled(ctx, true);
- return {
- cancel: function() {}
- };
- }
- log(LOG_DEBUG, "Not restricted " + key);
- return _p.asyncPromptAuth(channel, cb, ctx, level, info);
- };
- }
- return _p[name];
+ log(LOG_DEBUG, "Not restricted " + key);
+ return _p.asyncPromptAuth(channel, callback, context, level, info);
+ },
+ restrictLogin: function(uri) {
+ const key = uriToKey(uri);
+ restricted.set(key, true);
+ },
+ allowLogin: function(uri) {
+ const key = uriToKey(uri);
+ log(LOG_DEBUG, "Lifting restriction " + key);
+ restricted.delete(key, true);
}
- });
- return proxy;
+ };
});
/**
@@ -72,33 +64,27 @@ function LoggedPrompter(window) {
let _p = Services.ww
.getNewPrompter(window)
.QueryInterface(Ci.nsIPrompt);
+ let bind = key => _p[key].bind(_p);
- // Log any alerts instead of showing a dialog.
- // Everything else pass thru to the actual prompter.
- let proxy = new Proxy(_p, {
- has: function(name) { return name in _p },
- hasOwn: function(name) { return name in _p; },
- get: function(receiver, name) {
- if (name === "QueryInterface") {
- return function(iid) {
- _p.QueryInterface(iid);
- return proxy;
- };
- }
- if (name === "alert") {
- return function(text, title) {
- log(LOG_INFO, "LoggedPrompter " + title + ": " + text);
- };
- }
- if (name === "alertCheck") {
- return function(text, title, cm, cs) {
- log(LOG_INFO, "LoggedPrompter " + title + ": " + text);
- };
- }
- return _p[name];
- }
- });
- return proxy;
+ return {
+ QueryInterface: function(iid) {
+ _p.QueryInterface(iid);
+ return this;
+ },
+ alert: function(text, title) {
+ log(LOG_INFO, "LoggedPrompter " + title + ": " + text);
+ },
+ alertCheck: function(text, title, cm, cs) {
+ log(LOG_INFO, "LoggedPrompter " + title + ": " + text);
+ },
+ confirm: bind("confirm"),
+ confirmCheck: bind("confirmCheck"),
+ confirmEx: bind("confirmEx"),
+ prompt: bind("prompt"),
+ promptPassword: bind("promptPassword"),
+ promptUsernameAndPassword: bind("promptUsernameAndPassword"),
+ select: bind("select")
+ };
});
}
exports.LoggedPrompter = LoggedPrompter;
diff --git a/modules/support/requestmanipulation.js b/modules/support/requestmanipulation.js
index 3b8ca84..f80fd7a 100644
--- a/modules/support/requestmanipulation.js
+++ b/modules/support/requestmanipulation.js
@@ -122,7 +122,6 @@ exports.registerDownload(
"chan CDN",
/^https?:\/\/(?:media\.8ch\.net|(?:[^.]?\.)?4cdn\.org)\//i,
function() {
- log(LOG_ERROR, `4cdn ${this.urlManager.spec}`);
this.cleanRequest = true;
}
);
diff --git a/modules/support/stringfuncs.js b/modules/support/stringfuncs.js
index 8abd62b..39a36c3 100644
--- a/modules/support/stringfuncs.js
+++ b/modules/support/stringfuncs.js
@@ -121,6 +121,10 @@ exports.cropCenter = function(str, newLength) {
return str;
};
+exports.symbolize = function(value) {
+ return typeof(value) === "symbol" ? value : Symbol.for(value);
+}
+
function toURI(str, charset, baseURI) {
return Services.io.newURI(str, charset, baseURI);
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/downthemall.git
More information about the Pkg-mozext-commits
mailing list