[Pkg-mozext-commits] [tree-style-tab] 01/03: New upstream version 0.18.2016090802

Ximin Luo infinity0 at debian.org
Tue Sep 13 10:40:01 UTC 2016


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository tree-style-tab.

commit 832d352c597d6492e28b0b3da6aa785a145f04a9
Author: Ximin Luo <infinity0 at debian.org>
Date:   Tue Sep 13 12:35:44 2016 +0200

    New upstream version 0.18.2016090802
---
 META-INF/manifest.mf                               | 877 +++++++++++++++++++++
 META-INF/mozilla.rsa                               | Bin 0 -> 4189 bytes
 META-INF/mozilla.sf                                |   4 +
 chrome.manifest                                    |   6 +-
 content/treestyletab/bookmarkPropertiesOverlay.xul |   4 +
 content/treestyletab/bookmarksOverlay.js           |   2 +-
 content/treestyletab/bookmarksOverlayEditable.js   |   2 +-
 content/treestyletab/config.js                     |  12 +-
 content/treestyletab/res/bookmarkMultipleTabs.js   | 173 ++++
 content/treestyletab/res/bookmarkMultipleTabs.xul  | 146 ----
 ...kmarkMultipleTabs_bookmarkPropertiesOverlay.xul |  59 --
 content/treestyletab/treestyletab.xul              |   1 +
 content/treestyletab/windowHelper.js               |   3 +-
 install.rdf                                        |   2 +-
 locale/da-DK/treestyletab/treestyletab.properties  |   2 +-
 modules/autoHide.js                                |   8 +-
 modules/base.js                                    |  17 +-
 modules/bookmark.js                                |  15 +-
 modules/browser.js                                 |   2 +-
 modules/constants.js                               |   1 +
 modules/contentBridge.js                           |   2 +-
 modules/fullTooltip.js                             |   2 +-
 modules/groupTab.js                                |   2 +-
 modules/lib/UninstallationListener.js              | 301 +++----
 modules/lib/extensions.js                          | 242 +-----
 modules/lib/inherit.jsm                            |  26 +-
 modules/window.js                                  |   2 +-
 treestyletab.update.rdf                            |  30 +
 28 files changed, 1281 insertions(+), 662 deletions(-)

diff --git a/META-INF/manifest.mf b/META-INF/manifest.mf
new file mode 100644
index 0000000..bd43b41
--- /dev/null
+++ b/META-INF/manifest.mf
@@ -0,0 +1,877 @@
+Manifest-Version: 1.0
+
+Name: install.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: KZw09McTlWF2HD4qJ67wBQ==
+SHA1-Digest: 4N3gi5AU3wbLXyewx0cisZ5+ZdU=
+
+Name: chrome.manifest
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: FPihfXDVX5f6LIlzgA/FJQ==
+SHA1-Digest: LMpEgH7AuXCMeWtWObwEKeIT21U=
+
+Name: icon.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: b26p1vuhLB2vYtkJ0EpFZg==
+SHA1-Digest: T9f7i8A7iAz/ElpA361lLRpnbWc=
+
+Name: treestyletab.update.rdf
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WFG1EQMzOakGX3FfdBa+BQ==
+SHA1-Digest: bLVNCyty0ehyiOGSYvqzwLOZFi4=
+
+Name: components/AboutGroup.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: T4LxLbXCV246rvBpN3l4Rg==
+SHA1-Digest: ga6XOtzupo3piKvjSPSo4m1s5ck=
+
+Name: content/treestyletab/bookmarkPropertiesOverlay.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1zRoZN7WvTFKFKS7tomA7A==
+SHA1-Digest: 5rm9f/2UOjYdrD9HD83HZ6rCc40=
+
+Name: content/treestyletab/bookmarksOverlay.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: d7ZAlBLrFBIWE0PZjUstlA==
+SHA1-Digest: dARACbwsGkeTYBFOwDEvzxheFic=
+
+Name: content/treestyletab/bookmarksOverlay.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: aw8atg7bu14/W1Crfty5/Q==
+SHA1-Digest: W20IiyleTVAkp1ui/2jZZLRJPvU=
+
+Name: content/treestyletab/bookmarksOverlayEditable.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: y+8JAVdPMb4so6IEvtgzTw==
+SHA1-Digest: /V6d117O8c9Qgt7NoCuVRN2bOF0=
+
+Name: content/treestyletab/bookmarksOverlayEditable.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WBpdcT8EfI2Ab0FyYRVuOw==
+SHA1-Digest: PrwXjbUTQd8w10vmbDhjCXR6TZw=
+
+Name: content/treestyletab/bookmarksOverlayEditable.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xw2+1EFpMj/QoZzNOit9iw==
+SHA1-Digest: DoFHkl8xDTFaUnc9oQcEXOTSg+A=
+
+Name: content/treestyletab/config.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: CQeMI6LnYw01DCeicW8Zaw==
+SHA1-Digest: ougZFbteusnzVn8djm/xTObCf4Y=
+
+Name: content/treestyletab/config.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: AIdzEUui9m2g7S0U3tOC/Q==
+SHA1-Digest: jTTbgmSo0DamoouORrZaWoX6XWA=
+
+Name: content/treestyletab/config.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: oWFtj0roEP0prwGgmIbHNQ==
+SHA1-Digest: b9JTBbMbqyEb/TEap1A4V6xMBB8=
+
+Name: content/treestyletab/content-utils-autohide.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 5LerXpT+fFUV2k1YOWLOCw==
+SHA1-Digest: UoiQ5kghSuZB2O1NOtmcO82G6ZY=
+
+Name: content/treestyletab/content-utils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QsnrA2FapptFOR6lxTG6yA==
+SHA1-Digest: uS/wFjUiBFLwXTj03xZpzEmzCV8=
+
+Name: content/treestyletab/group.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 36AhehtnHOpGrElzTkAIzQ==
+SHA1-Digest: rrjIlOUkUzJsucg+fWIEE+E87n8=
+
+Name: content/treestyletab/hide-embed.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: sm1uHHT3GIl7tIYUz8oS5A==
+SHA1-Digest: dVIKETt9CnpIKynmf5iCpf1jDNo=
+
+Name: content/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: X5GHdwU0794vTcmyBMKgLA==
+SHA1-Digest: cpaNFJaakJy4ZMTl+Bku6h5c2Nc=
+
+Name: content/treestyletab/multipletabConfigOverlay.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: AI3+5oxDcuSxtrEn0S4kpQ==
+SHA1-Digest: TQBJwrZ+GwwBSHbAvzc4nnoSahw=
+
+Name: content/treestyletab/treestyletab-tmp.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: PI8uh44G/pdgiRi419ylMA==
+SHA1-Digest: r/2Em0TL908f3HKMxB4LqMo/JnQ=
+
+Name: content/treestyletab/treestyletab.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: kJNUcWGpesn1BVrEpRSz6A==
+SHA1-Digest: uacaL+A7qoPJhjFZVXyybrXupu4=
+
+Name: content/treestyletab/treestyletab.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 6E9tmEesiujXo1RfuXj+tw==
+SHA1-Digest: NWhDnh0jSiQ+8Yn2qWWKZl+smqA=
+
+Name: content/treestyletab/treestyletab.xml
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 0AJ4PM4kkHzJ6Skr4X5XwQ==
+SHA1-Digest: yI4r2a9JmBDqDI8qcvvn6R1wG4M=
+
+Name: content/treestyletab/treestyletab.xul
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: AaU9Zyy2Eh/Ymjckaz+b4g==
+SHA1-Digest: I/ZVyT55v0dNRAoDesMfh/5q9G4=
+
+Name: content/treestyletab/windowHelper.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xTUmqhX/sRKuLdkd45C9iQ==
+SHA1-Digest: oVXpT/YYiCRPSLoZxqo53OyW750=
+
+Name: content/treestyletab/windowHelperHacks.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: aKWkLccahu81HVylPwngIA==
+SHA1-Digest: 6P4VHPYkc4xGVHP+HaQd2Ia5m6Q=
+
+Name: content/treestyletab/res/bookmarkMultipleTabs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: swRizGupOdq3NY2Qdi4kGw==
+SHA1-Digest: TmXCzi9HL1KMdtAEY8VpOXNBUcc=
+
+Name: content/treestyletab/res/icon.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: b26p1vuhLB2vYtkJ0EpFZg==
+SHA1-Digest: T9f7i8A7iAz/ElpA361lLRpnbWc=
+
+Name: content/treestyletab/res/style-flat.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: yJ5Ng9fWzjXWr6rkY5XnxQ==
+SHA1-Digest: 21fjzektvczaL6gg46YsCnDRAoA=
+
+Name: content/treestyletab/res/style-metal.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: VLW3m1DnBgCJe/CwhatjKQ==
+SHA1-Digest: bDERNcMn+q9be5Hl5vpsOTv9+TA=
+
+Name: content/treestyletab/res/style-mixed.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: LQ+cJ4ypxMeOtrIeNb4zow==
+SHA1-Digest: fwP0Sh/HTfPlNLk8Yo4tbQurrHo=
+
+Name: content/treestyletab/res/style-plain.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: V0aScxDL7YeEz66bvCcdcw==
+SHA1-Digest: cGJJiw5nOPZqyXyvliHjM6vUXeY=
+
+Name: content/treestyletab/res/style-sidebar.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: izAqXI+MBl9HnnvYFEElqA==
+SHA1-Digest: APWbsVjSUEXhi5VaXKH7Pxcasn4=
+
+Name: content/treestyletab/res/style-vertigo.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mC/u1MvEZzc5Nh+0nMb7aQ==
+SHA1-Digest: peni4eoolSuDI/XvU/G+i1dxU9k=
+
+Name: content/treestyletab/res/tabEffects.svg
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 2kuE/MgWKXof3NwEtoMSsw==
+SHA1-Digest: WzGw9OlK27u2qgwpylJvL+GMB9k=
+
+Name: content/treestyletab/res/tabsDragUtils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QmTz7V73k1BbBb1rmFh9nQ==
+SHA1-Digest: hzgVxNq5SBN7/9nhWeHZo5TbcLM=
+
+Name: content/treestyletab/res/twisty-modern-b.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ID6G7gfZgFGmzZwpoeCllA==
+SHA1-Digest: MFCsvyhs0G1660rX6nr4BWL3j04=
+
+Name: content/treestyletab/res/twisty-modern-w.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QnmThqcAkwd6z0QfD0KO+A==
+SHA1-Digest: FkPnIvOMGo/VlOT+KQ3ZqLqi67E=
+
+Name: content/treestyletab/res/twisty-osx.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fqz2wOoq980SOp/541fdxg==
+SHA1-Digest: ItmS1DcUMeOj+uEjj4c8EIUV664=
+
+Name: content/treestyletab/res/twisty-retro.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: el+RHYOnbah9NusYiqI0wQ==
+SHA1-Digest: q0mYa40sk7KoHzdmK6voR/OuGF8=
+
+Name: defaults/preferences/treestyletab.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ycA6HipAJelmwZLMuR1fyQ==
+SHA1-Digest: /7+U/tqjRxu7bnJ0v3k634iXEp0=
+
+Name: locale/cs/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: zszUhNCZbsuXrvk0MyGtqw==
+SHA1-Digest: AmPIaBSAXJtd03ZD/LGrxu3FN3Y=
+
+Name: locale/cs/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /mX/xFzRkHcwITPow9LgCg==
+SHA1-Digest: WMnWhoa7Igq6/CETJrTdmoqwkl4=
+
+Name: locale/cs/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: O/AN4Uc0E4AQo1aPJY3juw==
+SHA1-Digest: Hqg1966n8g8nZniPCPyx5/gR0iI=
+
+Name: locale/da-DK/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9OgEctYlcrncB79Zp3Xsyw==
+SHA1-Digest: vjay7k00E2Dhmo0XsTlEeFTRPXI=
+
+Name: locale/da-DK/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: DF/qlqkW+LPOm+xiDtj1tQ==
+SHA1-Digest: COub0FsdcpxqVbVNC7KiWcB4JX8=
+
+Name: locale/da-DK/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: M/EIWAb+EMG8w4gQhvOSQw==
+SHA1-Digest: Tb3Z/YHQ3qXob7ZTDwM/79DkC1I=
+
+Name: locale/de-DE/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Bl+6HAZa3Dp3iHyhd2VYIg==
+SHA1-Digest: JdQfP7XjmROHYlyQEMxiYImBB38=
+
+Name: locale/de-DE/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WccbaoYXPT5hemDgkG02Zw==
+SHA1-Digest: QJZ9Z7S+QkW7fn9PKyR37RQDhec=
+
+Name: locale/de-DE/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 7IS4Rn+9/iCJoYNSq0MBHw==
+SHA1-Digest: +NBZ9kqAfyhgr7+ZdLZzTHldqtc=
+
+Name: locale/en-US/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mBjJFiEbKENaR38v2Zi3nw==
+SHA1-Digest: /vNGGzRR58QK5AOQjlorkE5GCAI=
+
+Name: locale/en-US/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ASou9ZtsPEgWVQMF2IRQrA==
+SHA1-Digest: 4cR3aYnrXvcG7hwpf0cA1Q+xfNc=
+
+Name: locale/en-US/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 22ZTEPS58VkA7FaHK0sbmQ==
+SHA1-Digest: qD99rSb8+piKakbtwYwzJeQKirU=
+
+Name: locale/es-ES/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 4J565KU4rP1YW2Z7FwAmVw==
+SHA1-Digest: OeORv30Cbr8ylQKVbM0O9Y5n+4Y=
+
+Name: locale/es-ES/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1ISa3rQP4wr/vUx/rgXTeA==
+SHA1-Digest: BaaGstEvjiFHlWS3XOPTROUY0BY=
+
+Name: locale/es-ES/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 8UfYIPpAbJ3l84WQNoGRpQ==
+SHA1-Digest: vxjQNy3iV4ZzXklxSwO76SQHYKs=
+
+Name: locale/fr-FR/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QnFbkycbnW1Gsz2FBnB1yg==
+SHA1-Digest: eSqlFr5OnT5gIpY1PF7f/E3bHas=
+
+Name: locale/fr-FR/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: MmU2dKfXeLH4MAtJ6fi3dg==
+SHA1-Digest: X6nsnz03rOIR03C0Enh2cHkPgGI=
+
+Name: locale/fr-FR/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ++Hzis+f+8VGKcUaMXVgyQ==
+SHA1-Digest: GjhFe1p1otrIRII5bMCDGAI+ATM=
+
+Name: locale/it-IT/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fzikcfeUYYGLBHSPKxs+ZQ==
+SHA1-Digest: DqBJQrV8f3tss7fKSnCdeXNIxYs=
+
+Name: locale/it-IT/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: R8I9lkof+2i7nzfRcCfSRg==
+SHA1-Digest: yvs8t+u6XPVP1d778dAZL3JB6wE=
+
+Name: locale/it-IT/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: OdSG45fnj9cDRt91Y0DXxw==
+SHA1-Digest: KSVrFtHQQ1VuVt1A6Ic0ebJu6g0=
+
+Name: locale/ja/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mBjJFiEbKENaR38v2Zi3nw==
+SHA1-Digest: /vNGGzRR58QK5AOQjlorkE5GCAI=
+
+Name: locale/ja/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: jlz78yuKfyWP0RqbsJQoLw==
+SHA1-Digest: lFUmY8dsbbw9c1AaRThB5ykK1PI=
+
+Name: locale/ja/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: NoQ0y4vzhtacC7ljT4o6ww==
+SHA1-Digest: kljqqPXCovLL4rLAiEAoIf+opY0=
+
+Name: locale/pl/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: btlopE6fxtFm6BGl2WqSag==
+SHA1-Digest: JwRGjnhAsrasY46ktL+EtP3fxDI=
+
+Name: locale/pl/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 05JWMIjA1YJEJ8QnOPDMzg==
+SHA1-Digest: 112CqdOybA+tAyb1vWPhBsl5g8o=
+
+Name: locale/pl/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: IddHfedr6on89fmT9uVrTA==
+SHA1-Digest: BkllKyZPkRQY7sZyylWMTbnlbjw=
+
+Name: locale/ru/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: optA3x911mM29m/ilijA9Q==
+SHA1-Digest: Ewz5/CWtInQDfBCQoje+iGZbjEE=
+
+Name: locale/ru/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: aGUwY4SQARaxSP5aW8m5Zg==
+SHA1-Digest: kvaRTT8I2w1ed/qOmNwoiriEmz4=
+
+Name: locale/ru/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: RAEGG8HPs7aimdnGgS13Uw==
+SHA1-Digest: lyzaI1FejimAOBu+Z53hyrbRID4=
+
+Name: locale/sv-SE/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: u/nBCeYTsPmbIi9OLhk6Bg==
+SHA1-Digest: Zfn4AKRpBe4E44Sg1HIuoxFmif0=
+
+Name: locale/sv-SE/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: zfQPbROEGag5+VsSQWE9Mg==
+SHA1-Digest: uYkQNqCRb/RGZhwvqKmFRbDOSU0=
+
+Name: locale/sv-SE/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GnKOXY1MMqBR34lBPvqR0Q==
+SHA1-Digest: iRgiJTH4pwbFyhe8Ubm/psOWxxk=
+
+Name: locale/zh-CN/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Z5mJDGXEoCOvu6WdrlfiBQ==
+SHA1-Digest: CxdX2iIT5cw2WR+1eMh9AA78n+U=
+
+Name: locale/zh-CN/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9tCPNHJbg5S+2yxxbT86YA==
+SHA1-Digest: Zp3pDIoHeenUkT6SAlxb1I6GKU0=
+
+Name: locale/zh-CN/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: OsR9IYx3zj4zoqhxiheJZA==
+SHA1-Digest: +Q7c8OOvoKSrgZZdgFzU86QHM24=
+
+Name: locale/zh-TW/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Ub9HxVsPH7UbfT/o6UPmxg==
+SHA1-Digest: XVqJMKhADCM73LtM7OFthNdECYo=
+
+Name: locale/zh-TW/treestyletab/treestyletab.dtd
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ZFU8RjBxpI5mULkjIgGmmg==
+SHA1-Digest: BVst1wseNpdYpEJg1GHaawsRzR4=
+
+Name: locale/zh-TW/treestyletab/treestyletab.properties
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fgsDbaou5f5LcJpduv6aag==
+SHA1-Digest: IjvrITYIupuo8dctlLwODAQN0BA=
+
+Name: modules/autoHide.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: VidzELRdPedzq49PM6oItA==
+SHA1-Digest: +/qy0uitgU5SPYj2Srgo0JhYVS4=
+
+Name: modules/base.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: YSbwZ9b7gXPxtyCxDAFAiQ==
+SHA1-Digest: I3xhcCpq33uGpm5pqRdp/akfdIc=
+
+Name: modules/bookmark.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: cMDEMd+g9AJgYNPfrkNRcw==
+SHA1-Digest: TrQsPd9SmcWiBJYkoSYNVTI7ozQ=
+
+Name: modules/browser.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Y7/B4I60oB4bthrBqTCFmQ==
+SHA1-Digest: z8aNMI0/d6e025QNRRXZswatDxQ=
+
+Name: modules/browserUIShowHideObserver.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: dNk/UnlE0F8L4dJZICP6Nw==
+SHA1-Digest: D84Jbg20wtUqqgG4pWCgF9ZdVaw=
+
+Name: modules/constants.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: payijolyNJwx0JZmOWKjrA==
+SHA1-Digest: W/IH3sanSLwefhuwDu9mbL4uSlY=
+
+Name: modules/contentBridge.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ehtVEsZbRr6L1MVVUWVmvQ==
+SHA1-Digest: mA6dCavjo4R/7g9zpynkywxjUIY=
+
+Name: modules/fullscreenObserver.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: TKVwSD0v1bAX/oWKo8OerA==
+SHA1-Digest: cc6D7hos4bGfa5ReVduq0YkLnWI=
+
+Name: modules/fullTooltip.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xVYm0qhioUh6O3YiHx26SA==
+SHA1-Digest: a+Z05xMoNkBVAvfMkJegFF6kqLM=
+
+Name: modules/getHashString.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: NATI2M/Z+BeLc6rAXCbanw==
+SHA1-Digest: eJ/4R3GFAQlf2gFZNeF3qdFOpVg=
+
+Name: modules/groupTab.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 1jg1Vz4a5YGcsdA2+JJCjQ==
+SHA1-Digest: gs/37Qf+gv4PLaj+m9/jE795MPs=
+
+Name: modules/pseudoTreeBuilder.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Kpwp2rL3SgFVDGGHaptA+A==
+SHA1-Digest: QURQEkp5d1zyuGJ3JmfZJCcIuXY=
+
+Name: modules/ReferenceCounter.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /+GL3pEvh8yXhOLV1KTL0g==
+SHA1-Digest: KwYUQNA0W5ensPrOgCQeR2NRGm4=
+
+Name: modules/tabAttributesObserver.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: GnqU1In8Jw/2jscAyXXGyg==
+SHA1-Digest: a4KpeD2z5f3xYaa//UQGtAA5+j0=
+
+Name: modules/tabbarDNDObserver.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: XdHzRMPfcXZqe8JqbZsVBQ==
+SHA1-Digest: 3iPvF3+GMJUqpdqYL1foU20zEFQ=
+
+Name: modules/tabContentsObserver.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Mx8Cw+iPLWSjkNjv10xCXg==
+SHA1-Digest: XZJFvYTu9pPIFV+zY9hH2IJsTKM=
+
+Name: modules/tabpanelDNDObserver.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: viIk0SD+R9Tc1k0cMgf98g==
+SHA1-Digest: NGDF4zuUWe9dhiX73LMiqEKgBnk=
+
+Name: modules/themeManager.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: a/AByLsB1Pgt+QN3nTOpXg==
+SHA1-Digest: lOTZlS8mhjdv/2i2EG9Md07Pv04=
+
+Name: modules/utils.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 5ngRS8P2lMHI/5rpiR3Gbg==
+SHA1-Digest: yrWQTBgmfdFT3cSY8nOFNAadyo0=
+
+Name: modules/window.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9Kff0V+6uCIzpuUZaC7YWA==
+SHA1-Digest: k8Zk3rINL4KJj8CvKVl7G7BCTkY=
+
+Name: modules/lib/animationManager.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: tCTp1R/fbEHkC/s6LAJ+wQ==
+SHA1-Digest: gOzZIMkc9xO9PfqsTDhP2ViCyVw=
+
+Name: modules/lib/autoScroll.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: wR8RRvyDf3rUzLjBt1bsnA==
+SHA1-Digest: pCuyv9MjP2/vihtyX7wv5Uxk/2o=
+
+Name: modules/lib/confirmWithPopup.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: XffmLkDOfTuIK+48IAM4sw==
+SHA1-Digest: aXUJCn5AlQpCzmZRQ/I3czVSNAk=
+
+Name: modules/lib/extended-immutable.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: QUPhhfner7CIElQ2G8x1lA==
+SHA1-Digest: DoTMaUnEwHAwfctYCu7NuQPlQlE=
+
+Name: modules/lib/extensions.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Dmku04rz2AvrkieEyF5Xyg==
+SHA1-Digest: xsbZrDwvySKEi/T+Z/lieqXZeow=
+
+Name: modules/lib/inherit.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +ogCTEJunSKJ+hybMmPZzQ==
+SHA1-Digest: Hv/NQoEmskkBC0NN4c1DzOU7ibY=
+
+Name: modules/lib/namespace.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mkAS2xBrt57mK5w9IuAxdg==
+SHA1-Digest: fr/zTLjmtBm4oo58uVCZUBv+PPs=
+
+Name: modules/lib/prefs.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: kPuMGdq2ki9wgzsdDkHyQw==
+SHA1-Digest: j4nk7SjmRPBtfA9anGuvpEhf4eo=
+
+Name: modules/lib/stringBundle.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: hLRUNAIgENilF2Gnw7P7WQ==
+SHA1-Digest: ajJwI8sQcc4YyKl9ih/Fqzfr0+Q=
+
+Name: modules/lib/UninstallationListener.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: s1g6OQHIh9BfOF3oMa9IXQ==
+SHA1-Digest: hClSyDJ2d9GMHdEuxFZjDybYBG4=
+
+Name: modules/lib/visuallyselectedTabs.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: iwd/kfZCQaJsjIkO/emj/A==
+SHA1-Digest: 8xOI2kAUhlzs7UzFQRh5ibWEhDQ=
+
+Name: skin/classic/treestyletab/base-colors.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: SjrszT+A7vBprStrxmTJ8Q==
+SHA1-Digest: R3y7LGy9olYjQJ53N4N492LTNog=
+
+Name: skin/classic/treestyletab/base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: YF6jM3bh3GR+7rG6GBo6vA==
+SHA1-Digest: 7R1p1kLWqw5m/I8JCZuYZIikVro=
+
+Name: skin/classic/treestyletab/config.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: MJsnRbLtW/eVUj6buXhyhA==
+SHA1-Digest: MvIZySBEb3xdpWl/74euLiN49ck=
+
+Name: skin/classic/treestyletab/Darwin-base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 5CgXLAOGtw6IqY0tQH4FFA==
+SHA1-Digest: /IPmBc5AJPyaoOrhreWArekX2N8=
+
+Name: skin/classic/treestyletab/Darwin-styled.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: hao95egtOAfEnBBZbhKIrg==
+SHA1-Digest: cWHEYEPCm9gaVVwa/EgpfOm09N8=
+
+Name: skin/classic/treestyletab/dummy.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: gQUbzCzxvt83giSwqT4odw==
+SHA1-Digest: uoq1oCgLlTqpdDX/iUbLy7J1Wic=
+
+Name: skin/classic/treestyletab-group-aero/group.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WAaFV+uAyxEllkfp3nUzOg==
+SHA1-Digest: SfUa64w243Tsw5GuN3o8JahyFjI=
+
+Name: skin/classic/treestyletab-group-basic/group.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fVTjGUTsV86sIh2ideYUNQ==
+SHA1-Digest: DvaxcjAmPsnt7a1LFCcI+kZ8O4U=
+
+Name: skin/classic/treestyletab/group.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: pU8uenj+36hyeIhrNwTDvw==
+SHA1-Digest: PSBTYQzFMTkunW+ORGpKAXaena8=
+
+Name: skin/classic/treestyletab/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Tc+NDhBc7EP4cr5OqQGQyQ==
+SHA1-Digest: TLhlpxf44EXADPU56xRsRroxdo4=
+
+Name: skin/classic/treestyletab/Linux-base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 5VPuRh+EyJ0J13K5fmuRUA==
+SHA1-Digest: jkJZdI44PkcueQTPVoilOnVG7iU=
+
+Name: skin/classic/treestyletab/Linux-config.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 4GgEa2Q4LfzLmtkB8N4mGA==
+SHA1-Digest: wpeaGpY/43D1mlvqaTnaC6LQOxk=
+
+Name: skin/classic/treestyletab/Linux-styled.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: DMoMZ27IfsX2HIT+djP0QQ==
+SHA1-Digest: /PutdezehubWwTE5IUOBPxSl26I=
+
+Name: skin/classic/treestyletab/pseudo-tree.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: YpzbGadA5uvjsoP1UfTk1g==
+SHA1-Digest: lRJLbWJTt07wa9FVOvoH+717+po=
+
+Name: skin/classic/treestyletab/tmp.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: +j0z5bmmvDoh/A2DHaqYfA==
+SHA1-Digest: /9UY0Y5sknM9O+tG6FBdX0zoQOU=
+
+Name: skin/classic/treestyletab/ui-australis.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: oGWteOCIdGeJh4s1CrodBQ==
+SHA1-Digest: /CcGFdIzQT8ebf8twW9s6P1rRRI=
+
+Name: skin/classic/treestyletab/ui-base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9e8b6KVQnx6D8wMVqWavMQ==
+SHA1-Digest: RuNYcY4BL6nR5sbq/2JVFYvJU3o=
+
+Name: skin/classic/treestyletab/WINNT-base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: fGHJbWeArBzHuxSsxMgFrA==
+SHA1-Digest: C3bc9mMl9hHyEMFT613jBKtvOqY=
+
+Name: skin/classic/treestyletab/WINNT-styled.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 6lYKz7TWSDA9xtkl48kHZg==
+SHA1-Digest: cpaQJNB+NOC0T7IwGWamv0loQOw=
+
+Name: skin/classic/treestyletab/metal/aero.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: yR+6SpHx6lzdaxV6bwNv4w==
+SHA1-Digest: V/bHzXC5rqlG5ibTq+FRKJ42G8Q=
+
+Name: skin/classic/treestyletab/metal/base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: VSkSLXcxYmzkFqHNeXvlBA==
+SHA1-Digest: zlNvl7EAnEaBsDgcPEp55c0QoZI=
+
+Name: skin/classic/treestyletab/metal/Darwin.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: TZb3EA3nszWCtkHD9aWR5g==
+SHA1-Digest: YQCNXwVHDahH9S9SCdLFvm2afGs=
+
+Name: skin/classic/treestyletab/metal/icon-bg.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: dPlzlNuH44lFR2S41hhIXA==
+SHA1-Digest: RVQ5erPZ39JFpyMJy+JVEPHIHiI=
+
+Name: skin/classic/treestyletab/metal/shadow-active-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mmzCLfQAQMHghi7NL51Slw==
+SHA1-Digest: M7TqKBGWXT9bW34NN+bwM898UJE=
+
+Name: skin/classic/treestyletab/metal/shadow-active-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: mB5tgnES7Pkp/lmdd8zwWg==
+SHA1-Digest: b0DAUbFO0NmlfY25pXRZVWFashs=
+
+Name: skin/classic/treestyletab/metal/shadow-inactive-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: y9CW0XGWsvn9WejkzjMB7g==
+SHA1-Digest: FsXsOA/7DGUor3REbDYVXknJLn4=
+
+Name: skin/classic/treestyletab/metal/shadow-inactive-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 9yag/NWzVKsCaa6jAfraTA==
+SHA1-Digest: TdgxoicqWnwwbzLq+jyiuBGT94M=
+
+Name: skin/classic/treestyletab/metal/tab-active-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: B9BZFX0F6XgN1hNnDekmGA==
+SHA1-Digest: n2B+BGWTc7mPc45JyBlQ5HVhoJY=
+
+Name: skin/classic/treestyletab/metal/tab-active-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xr50vqrLVqxSy6uXBjqtvw==
+SHA1-Digest: I18/nxs9m5/ctfU0e7Scn7T710s=
+
+Name: skin/classic/treestyletab/metal/tab-active-selected-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: aM+vjSb9B1Hc1dcHzXjPlQ==
+SHA1-Digest: H+w+lhUI3Zdsmuk9YnjkYKtyB6Y=
+
+Name: skin/classic/treestyletab/metal/tab-active-selected-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Pb5PisMUoHyG4c6h40AUrw==
+SHA1-Digest: NuatlkwTAYnuy3aXS0ZUgYXjyvI=
+
+Name: skin/classic/treestyletab/metal/tab-inactive-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 4SYlZnEf3p5i0nUnP/yQaA==
+SHA1-Digest: +JvVEjfOE9REL23ElSe+Pd6y3Sk=
+
+Name: skin/classic/treestyletab/metal/tab-inactive-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: HjcLuFl2y8cHmbVx6AxxEw==
+SHA1-Digest: VAXbrcfJdPh73hhh98Gqd8pZPHo=
+
+Name: skin/classic/treestyletab/metal/tab-inactive-selected-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: hlC7QI1Jppv27pbGUB9h1A==
+SHA1-Digest: QqBxmezksTxjCpQ4U4MJAIGUtlU=
+
+Name: skin/classic/treestyletab/metal/tab-inactive-selected-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: C/y9xKa3tfUwPLvpR8fUng==
+SHA1-Digest: u2GHUKdU+s+jbRmxFO5motzr4+0=
+
+Name: skin/classic/treestyletab/metal/tab.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 8VAVFHmNFr8nICwoOQZ1Tg==
+SHA1-Digest: r4okMH4SmqAzJ8dqrEIU8XBrYqY=
+
+Name: skin/classic/treestyletab/sidebar/aero.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: CA+5tlZs253P4ipgMkrVMg==
+SHA1-Digest: ba4u3UM8rNt5BxWi//oXSog6KYg=
+
+Name: skin/classic/treestyletab/sidebar/closetab-white.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ciO9HszpuusTRyytCi0h7w==
+SHA1-Digest: zIIsZqEoP7r2dFivr6FdPbOpx+g=
+
+Name: skin/classic/treestyletab/sidebar/closetab.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: SkYytZq4wqVcKz9SKHSLJA==
+SHA1-Digest: hYhVFQRyWevCLcBSTW1t8dg3cP4=
+
+Name: skin/classic/treestyletab/sidebar/dropmarker.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: G7uqA6OvOUP5hQWk1Dd2Ow==
+SHA1-Digest: 3ySucjnqrJTu7fWRs6EehENF6mk=
+
+Name: skin/classic/treestyletab/sidebar/license.txt
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: v9Eq0lPqaRSdBuATG2+oxg==
+SHA1-Digest: VNJPj9nckqPyRb2Ff3HWiGPQE58=
+
+Name: skin/classic/treestyletab/sidebar/sidebar.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: g+EE5ZihUvm1aCVLFb9fng==
+SHA1-Digest: LbEU6Zc8S7yiMgwIQhFCEEb/3oo=
+
+Name: skin/classic/treestyletab/square/base.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: ppeu5ZCdvWUDuUWajaN1Ig==
+SHA1-Digest: 0oiB6fmuq/ZPS+r37TpxPnXdcRI=
+
+Name: skin/classic/treestyletab/square/Darwin.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: B5wetbs3xlF/LDlMoFv7Bg==
+SHA1-Digest: ZgInOGf82G8PrDTmLOA3ToEuLHk=
+
+Name: skin/classic/treestyletab/square/disable-closebox-bg.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 8LDHw5xvv9yXYLDJCd3SnQ==
+SHA1-Digest: Sw5lpRR7NRMFYCOrR5ghaVmIqNU=
+
+Name: skin/classic/treestyletab/square/dropshadow.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: kUUKtKKDOV+CtYFFlZSunw==
+SHA1-Digest: qpc3P+QIL7lY1PlC4oHy6wBYcsQ=
+
+Name: skin/classic/treestyletab/square/Linux.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: uccqeOk7X7mI4WQ12y4/zg==
+SHA1-Digest: WX5BK6jKTVYPn+PjA2N/8qVNLUw=
+
+Name: skin/classic/treestyletab/square/mixed.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: G0k8pMyNcsqVfztv55X5mg==
+SHA1-Digest: B5q0FY1lXLUcxdKymyfAuhv0OgQ=
+
+Name: skin/classic/treestyletab/square/newtab-shadow.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /0+n+HVPH0by9VBCgNuHfA==
+SHA1-Digest: n/wGfo7dGvxTCtwJY8PhOE3bng8=
+
+Name: skin/classic/treestyletab/square/tab-bg-highlighted.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: T6mzHM9ZoEIITc8gz6ZQzA==
+SHA1-Digest: GZWz47jaTHZqDeuxhEev+hIa9/s=
+
+Name: skin/classic/treestyletab/square/tab-bg-hover.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 7adFA8ElKdBMgDrKt8kJMQ==
+SHA1-Digest: s/iupPpsNzXxzBpfnp46eIHe6lI=
+
+Name: skin/classic/treestyletab/square/tab-bg-selected-hover.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: MKuAAKJcABsHs40VUjTYIA==
+SHA1-Digest: Nm/r/tn7kT3Djy8JXfcXpVuBUHY=
+
+Name: skin/classic/treestyletab/square/tab-bg.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 4J6xqMjhCK3wSS7F3A9y0w==
+SHA1-Digest: CTg4j0P/755VUethbwqkLbDrXcI=
+
+Name: skin/classic/treestyletab/square/tab-surface.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Z45sYxcnpMfZ0LsF3MP5Aw==
+SHA1-Digest: f0O5oT3oEzWSTr2hkBtuW5olTMY=
+
+Name: skin/classic/treestyletab/square/vertigo.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: XXtYL5KtwYwKuL4riv6igg==
+SHA1-Digest: qOjnelw/TnW3ZojwdfLX16eRpAU=
+
+Name: skin/classic/treestyletab/twisty/twisty-modern-b-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: Ye0CPTVUEFYWL+QuYWAxig==
+SHA1-Digest: RdJUOwLPIMtDepUSe2V2rdy8aio=
+
+Name: skin/classic/treestyletab/twisty/twisty-modern-b-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: SwrqMx9DnoCHhCBNRLcW6A==
+SHA1-Digest: rVi62rNVpdlxrMcSNDP7DT2xJEs=
+
+Name: skin/classic/treestyletab/twisty/twisty-modern-w-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: xBvmfLgkFKRbEi213k5OPA==
+SHA1-Digest: aTZeSy4hEWKS0oG3t6MFl6zhzso=
+
+Name: skin/classic/treestyletab/twisty/twisty-modern-w-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: h9jqwqr8/ru4ggQHfesoyQ==
+SHA1-Digest: VaiUeO2f5HpJ8gRSkEBXvoNQL14=
+
+Name: skin/classic/treestyletab/twisty/twisty-osx-l.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: PVWQVxSX840AHjIw1vJIrQ==
+SHA1-Digest: x6xlwSveib8J18nwDFCikmE4zGA=
+
+Name: skin/classic/treestyletab/twisty/twisty-osx-r.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: WtoZwIp1hXyoGoMw7aCd/Q==
+SHA1-Digest: 8pXvMI1cCh1ON69K20rdHOfesMo=
+
+Name: skin/classic/treestyletab/twisty/twisty-retro.png
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: 5jRhJ+QQ0POMUddYnVCTOw==
+SHA1-Digest: eNNNko96Xro/9rJtX8odGQznSq0=
+
+Name: skin/classic/treestyletab/twisty/twisty.css
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: krzuqpSqTeAGSeMysT6zqA==
+SHA1-Digest: yHSf+4Iit6VToLqWngmJvGl1LmI=
+
diff --git a/META-INF/mozilla.rsa b/META-INF/mozilla.rsa
new file mode 100644
index 0000000..8cb47f1
Binary files /dev/null and b/META-INF/mozilla.rsa differ
diff --git a/META-INF/mozilla.sf b/META-INF/mozilla.sf
new file mode 100644
index 0000000..0f254fb
--- /dev/null
+++ b/META-INF/mozilla.sf
@@ -0,0 +1,4 @@
+Signature-Version: 1.0
+MD5-Digest-Manifest: M26H3NilpbG4EJLWCNmK1g==
+SHA1-Digest-Manifest: Oic0vCG4Nhw8EKvyBfpR0BUpxxU=
+
diff --git a/chrome.manifest b/chrome.manifest
index 3d763b1..0aa0f6c 100644
--- a/chrome.manifest
+++ b/chrome.manifest
@@ -8,13 +8,11 @@ overlay	chrome://browser/content/places/places.xul	chrome://treestyletab/content
 overlay	chrome://browser/content/places/places.xul	chrome://treestyletab/content/bookmarksOverlayEditable.xul
 overlay	chrome://browser/content/places/bookmarkProperties.xul	chrome://treestyletab/content/bookmarksOverlay.xul
 overlay	chrome://browser/content/places/bookmarkProperties.xul	chrome://treestyletab/content/bookmarksOverlayEditable.xul
+overlay	chrome://browser/content/places/bookmarkProperties.xul	chrome://treestyletab/content/bookmarkPropertiesOverlay.xul
+overlay	chrome://browser/content/places/bookmarkProperties2.xul	chrome://treestyletab/content/bookmarkPropertiesOverlay.xul
 
 overlay	chrome://multipletab/content/config.xul	chrome://treestyletab/content/multipletabConfigOverlay.xul
 
-overlay	chrome://browser/content/browser.xul	chrome://treestyletab/content/res/bookmarkMultipleTabs.xul
-overlay	chrome://browser/content/places/bookmarkProperties.xul	chrome://treestyletab/content/res/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
-overlay	chrome://browser/content/places/bookmarkProperties2.xul	chrome://treestyletab/content/res/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
-
 locale	treestyletab	en-US	locale/en-US/treestyletab/
 locale	treestyletab	ja	locale/ja/treestyletab/
 locale	treestyletab	it-IT	locale/it-IT/treestyletab/
diff --git a/content/treestyletab/bookmarkPropertiesOverlay.xul b/content/treestyletab/bookmarkPropertiesOverlay.xul
new file mode 100644
index 0000000..2d21b0b
--- /dev/null
+++ b/content/treestyletab/bookmarkPropertiesOverlay.xul
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+<script src="res/bookmarkMultipleTabs.js" type="application/javascript"/>
+</overlay>
diff --git a/content/treestyletab/bookmarksOverlay.js b/content/treestyletab/bookmarksOverlay.js
index bedc225..c110075 100644
--- a/content/treestyletab/bookmarksOverlay.js
+++ b/content/treestyletab/bookmarksOverlay.js
@@ -93,7 +93,7 @@ var TreeStyleTabBookmarksUIService = inherit(TreeStyleTabService, {
 		}
 	}
 
-});
+}, Object);
 
 TreeStyleTabBookmarksUIService.preInit();
 
diff --git a/content/treestyletab/bookmarksOverlayEditable.js b/content/treestyletab/bookmarksOverlayEditable.js
index 38f89f0..766d51f 100644
--- a/content/treestyletab/bookmarksOverlayEditable.js
+++ b/content/treestyletab/bookmarksOverlayEditable.js
@@ -420,7 +420,7 @@ var TreeStyleTabBookmarksServiceEditable = inherit(TreeStyleTabBookmarksUIServic
 		}
 	}
 
-});
+}, Object);
 
 window.addEventListener('DOMContentLoaded', TreeStyleTabBookmarksServiceEditable, false);
 ReferenceCounter.add('window,DOMContentLoaded,TreeStyleTabBookmarksServiceEditable,false');
diff --git a/content/treestyletab/config.js b/content/treestyletab/config.js
index 349bfb5..7fbbefe 100644
--- a/content/treestyletab/config.js
+++ b/content/treestyletab/config.js
@@ -15,8 +15,8 @@ function syncEnabledState(aElement, aEnabled)
 {
 	if (typeof aElement == 'string')
 		aElement = document.getElementById(aElement);
-	if (typeof aEnabled == 'string')
-		aEnabled = (new Function('return '+aEnabled)).call(aElement);
+	if (typeof aEnabled == 'function')
+		aEnabled = aEnabled.call(aElement);
 
 	aElement.getAttribute('sync-enabled-state-targets')
 		.replace(/$\s+|\s+$/g, '')
@@ -291,9 +291,9 @@ function onSyncMaxTreeLevelPrefToUI(aTarget)
 
 function initAutoHidePane()
 {
-	syncEnabledState('extensions.treestyletab.tabbar.autoShow.mousemove-check', 'this.checked');
-	syncEnabledState('extensions.treestyletab.tabbar.autoShow.accelKeyDown-check', 'this.checked');
-	syncEnabledState('extensions.treestyletab.tabbar.autoShow.feedback-check', 'this.checked');
+	syncEnabledState('extensions.treestyletab.tabbar.autoShow.mousemove-check', function() { return this.checked; });
+	syncEnabledState('extensions.treestyletab.tabbar.autoShow.accelKeyDown-check', function() { return this.checked; });
+	syncEnabledState('extensions.treestyletab.tabbar.autoShow.feedback-check', function() { return this.checked; });
 }
 
 function onChangeAutoHideMode(aRadioGroup, aTogglePref)
@@ -305,7 +305,7 @@ function onChangeAutoHideMode(aRadioGroup, aTogglePref)
 
 function initTreePane()
 {
-	syncEnabledState('extensions.treestyletab.closeParentBehavior-radiogroup', 'this.value == 0');
+	syncEnabledState('extensions.treestyletab.closeParentBehavior-radiogroup', function() { return this.value == 0; });
 
 	var focusMode = document.getElementById('extensions.treestyletab.focusMode-check');
 	var focusModePref = document.getElementById('extensions.treestyletab.focusMode');
diff --git a/content/treestyletab/res/bookmarkMultipleTabs.js b/content/treestyletab/res/bookmarkMultipleTabs.js
new file mode 100644
index 0000000..b9cd288
--- /dev/null
+++ b/content/treestyletab/res/bookmarkMultipleTabs.js
@@ -0,0 +1,173 @@
+/**
+ * Bookmark Multiple Tabs library for Firefox 2 or later
+ *
+ * Usage:
+ *   First, load this file into three Chrome documents:
+ *     * chrome://browser/content/browser.xul
+ *     * chrome://browser/content/places/bookmarkProperties.xul
+ *     * chrome://browser/content/places/bookmarkProperties2.xul
+ *
+ *   Then, run this line in your JS files:
+ *     window['piro.sakura.ne.jp'].bookmarkMultipleTabs.addBookmarkFor(tabsArray, folderName);
+ *
+ * license: The MIT License, Copyright (c) 2009-2016 YUKI "Piro" Hiroshi
+ *   http://github.com/piroor/fxaddonlib-bookmark-multiple-tabs/blob/master/license.txt
+ * original:
+ *   http://github.com/piroor/fxaddonlib-bookmark-multiple-tabs
+ */
+(function() {
+	const currentRevision = 8;
+
+	if (!('BookmarkPropertiesPanel' in window)) {
+		window.addEventListener('DOMContentLoaded', function() {
+			window.removeEventListener('DOMContentLoaded', arguments.callee, true);
+
+			if (!('piro.sakura.ne.jp' in window)) window['piro.sakura.ne.jp'] = {};
+
+			var loadedRevision = 'bookmarkMultipleTabs' in window['piro.sakura.ne.jp'] ?
+					window['piro.sakura.ne.jp'].bookmarkMultipleTabs.revision :
+					0 ;
+			if (loadedRevision && loadedRevision > currentRevision) {
+				return;
+			}
+
+			var addBookmarkTabsFilter = function(aTab) { return aTab.linkedBrowser.currentURI; };
+			// Tab Mix Plus modifies the API.
+			if ('TMP_Places' in window && 'getTabFixedTitle' in TMP_Places) {
+				addBookmarkTabsFilter = function(aTab) {
+					var b = aTab.linkedBrowser;
+					var uri = b.currentURI;
+					return {
+						uri   : uri,
+						title : TMP_Places.getTabFixedTitle(b, uri)
+					};
+				};
+			}
+
+			window['piro.sakura.ne.jp'].bookmarkMultipleTabs = {
+				revision : currentRevision,
+
+				addBookmarkFor : function(aTabs, aFolderName) 
+				{
+					if (!aTabs) return;
+
+					var b = this.getTabBrowserFromChild(aTabs[0]);
+
+					if ('PlacesUIUtils' in window || 'PlacesUtils' in window) { // Firefox 3 or later
+						try {
+							var utils = 'PlacesUIUtils' in window ? PlacesUIUtils : PlacesUtils ;
+							var tabs = Array.slice(aTabs).map(this.addBookmarkTabsFilter);
+							if (aFolderName)
+								this.Prefs.setCharPref('temp.showMinimalAddMultiBookmarkUI.folderName', unescape(encodeURIComponent(aFolderName)));
+							if ('showBookmarkDialog' in utils) { // Firefox 9 or later
+								utils.showBookmarkDialog({
+									action  : 'add',
+									type    : 'folder',
+									// title   : aFolderName, // don't specify it, because Firefox doesn't create bookmarks if the title is given!
+									URIList : tabs,
+									hiddenRows : ['description', 'location', 'loadInSidebar', 'keyword']
+								}, window);
+							}
+							else {
+								throw new Error('there is no method to create bookmarks from tabs!');
+							}
+						}
+						catch(e) {
+							alert(e.message+'\n'+e.stack);
+						}
+						finally {
+							this.Prefs.clearUserPref('temp.showMinimalAddMultiBookmarkUI.folderName');
+						}
+						return;
+					}
+
+					var currentTabInfo;
+					var tabsInfo = Array.slice(aTabs).map(function(aTab) {
+							var webNav = aTab.linkedBrowser.webNavigation;
+							var url    = webNav.currentURI.spec;
+							var name   = '';
+							var charSet, description;
+							try {
+								var doc = webNav.document;
+								name = doc.title || url;
+								charSet = doc.characterSet;
+								description = BookmarksUtils.getDescriptionFromDocument(doc);
+							}
+							catch (e) {
+								name = url;
+							}
+							return {
+								name        : name,
+								url         : url,
+								charset     : charSet,
+								description : description
+							};
+						});
+
+					window.openDialog(
+						'chrome://browser/content/bookmarks/addBookmark2.xul',
+						'',
+						BROWSER_ADD_BM_FEATURES,
+						(aTabs.length == 1 ?
+							tabsInfo[0] :
+							{
+								name             : (aFolderName || gNavigatorBundle.getString('bookmarkAllTabsDefault')),
+								bBookmarkAllTabs : true,
+								objGroup         : tabsInfo
+							}
+						)
+					);
+				},
+				addBookmarkTabsFilter : addBookmarkTabsFilter,
+
+				Prefs : Components.classes['@mozilla.org/preferences-service;1']
+							.getService(Components.interfaces.nsIPrefBranch),
+
+				getTabBrowserFromChild : function(aTab) 
+				{
+					var b = aTab.ownerDocument.evaluate(
+							'ancestor-or-self::*[local-name()="tabbrowser"] | '+
+							'ancestor-or-self::*[local-name()="tabs" and @tabbrowser]',
+							aTab,
+							null,
+							XPathResult.FIRST_ORDERED_NODE_TYPE,
+							null
+						).singleNodeValue;
+					return (b && b.tabbrowser) || b;
+				}
+			};
+		}, true);
+	}
+	else {
+		if (!BookmarkPropertiesPanel._determineItemInfo ||
+			BookmarkPropertiesPanel.__bookmarkMultipleTabs__determineItemInfo)
+			return;
+
+		// Defined at http://mxr.mozilla.org/mozilla-central/source/browser/components/places/content/bookmarkProperties.js#73
+		const ACTION_ADD = 1;
+
+		BookmarkPropertiesPanel.__bookmarkMultipleTabs__determineItemInfo = BookmarkPropertiesPanel._determineItemInfo;
+		BookmarkPropertiesPanel._determineItemInfo = function(...aArgs) {
+			var folderNameOverride = null;
+			try {
+				folderNameOverride = Components.classes['@mozilla.org/preferences;1']
+					.getService(Components.interfaces.nsIPrefBranch)
+					.getCharPref('temp.showMinimalAddMultiBookmarkUI.folderName');
+				folderNameOverride = decodeURIComponent(escape(folderNameOverride));
+			}
+			catch(e) {
+			}
+			var retVal = this.__bookmarkMultipleTabs__determineItemInfo.apply(this, aArgs);
+			if (folderNameOverride &&
+				this._action == ACTION_ADD) {
+				let dialogInfo = window.arguments[0];
+				if (dialogInfo.type === 'folder' &&
+					!('title' in dialogInfo) &&
+					'URIList' in dialogInfo) {
+					this._title = folderNameOverride;
+				}
+			}
+			return retVal;
+		};
+	}
+})();
diff --git a/content/treestyletab/res/bookmarkMultipleTabs.xul b/content/treestyletab/res/bookmarkMultipleTabs.xul
deleted file mode 100644
index 775791a..0000000
--- a/content/treestyletab/res/bookmarkMultipleTabs.xul
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Bookmark Multiple Tabs library for Firefox 2 or later
-
- Usage:
-   in chrome.manifest:
-     overlay  chrome://browser/content/browser.xul
-              chrome://***/content/bookmarkMultipleTabs.xul
-     overlay  chrome://browser/content/places/bookmarkProperties.xul
-              chrome://***/content/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
-     overlay  chrome://browser/content/places/bookmarkProperties2.xul
-              chrome://***/content/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
-
-   in JS files:
-     window['piro.sakura.ne.jp'].bookmarkMultipleTabs.addBookmarkFor(tabsArray, folderName);
-
- license: The MIT License, Copyright (c) 2009-2015 YUKI "Piro" Hiroshi
- original:
-   http://github.com/piroor/fxaddonlib-bookmark-multiple-tabs
--->
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-<script type="application/javascript"><![CDATA[
-
-window.addEventListener('DOMContentLoaded', function() {
-	window.removeEventListener('DOMContentLoaded', arguments.callee, true);
-
-	const currentRevision = 8;
-
-	if (!('piro.sakura.ne.jp' in window)) window['piro.sakura.ne.jp'] = {};
-
-	var loadedRevision = 'bookmarkMultipleTabs' in window['piro.sakura.ne.jp'] ?
-			window['piro.sakura.ne.jp'].bookmarkMultipleTabs.revision :
-			0 ;
-	if (loadedRevision && loadedRevision > currentRevision) {
-		return;
-	}
-
-	var addBookmarkTabsFilter = function(aTab) { return aTab.linkedBrowser.currentURI; };
-	// Tab Mix Plus modifies the API.
-	if ('TMP_Places' in window && 'getTabFixedTitle' in TMP_Places) {
-		addBookmarkTabsFilter = function(aTab) {
-			var b = aTab.linkedBrowser;
-			var uri = b.currentURI;
-			return {
-				uri   : uri,
-				title : TMP_Places.getTabFixedTitle(b, uri)
-			};
-		};
-	}
-
-	window['piro.sakura.ne.jp'].bookmarkMultipleTabs = {
-		revision : currentRevision,
-
-		addBookmarkFor : function(aTabs, aFolderName) 
-		{
-			if (!aTabs) return;
-
-			var b = this.getTabBrowserFromChild(aTabs[0]);
-
-			if ('PlacesUIUtils' in window || 'PlacesUtils' in window) { // Firefox 3 or later
-				try {
-					var utils = 'PlacesUIUtils' in window ? PlacesUIUtils : PlacesUtils ;
-					var tabs = Array.slice(aTabs).map(this.addBookmarkTabsFilter);
-					if (aFolderName)
-						this.Prefs.setCharPref('temp.showMinimalAddMultiBookmarkUI.folderName', unescape(encodeURIComponent(aFolderName)));
-					if ('showBookmarkDialog' in utils) { // Firefox 9 or later
-						utils.showBookmarkDialog({
-							action  : 'add',
-							type    : 'folder',
-							// title   : aFolderName, // don't specify it, because Firefox doesn't create bookmarks if the title is given!
-							URIList : tabs,
-							hiddenRows : ['description', 'location', 'loadInSidebar', 'keyword']
-						}, window);
-					}
-					else {
-						throw new Error('there is no method to create bookmarks from tabs!');
-					}
-				}
-				catch(e) {
-					alert(e.message+'\n'+e.stack);
-				}
-				finally {
-					this.Prefs.clearUserPref('temp.showMinimalAddMultiBookmarkUI.folderName');
-				}
-				return;
-			}
-
-			var currentTabInfo;
-			var tabsInfo = Array.slice(aTabs).map(function(aTab) {
-					var webNav = aTab.linkedBrowser.webNavigation;
-					var url    = webNav.currentURI.spec;
-					var name   = '';
-					var charSet, description;
-					try {
-						var doc = webNav.document;
-						name = doc.title || url;
-						charSet = doc.characterSet;
-						description = BookmarksUtils.getDescriptionFromDocument(doc);
-					}
-					catch (e) {
-						name = url;
-					}
-					return {
-						name        : name,
-						url         : url,
-						charset     : charSet,
-						description : description
-					};
-				});
-
-			window.openDialog(
-				'chrome://browser/content/bookmarks/addBookmark2.xul',
-				'',
-				BROWSER_ADD_BM_FEATURES,
-				(aTabs.length == 1 ?
-					tabsInfo[0] :
-					{
-						name             : (aFolderName || gNavigatorBundle.getString('bookmarkAllTabsDefault')),
-						bBookmarkAllTabs : true,
-						objGroup         : tabsInfo
-					}
-				)
-			);
-		},
-		addBookmarkTabsFilter : addBookmarkTabsFilter,
-
-		Prefs : Components.classes['@mozilla.org/preferences-service;1']
-					.getService(Components.interfaces.nsIPrefBranch),
-
-		getTabBrowserFromChild : function(aTab) 
-		{
-			var b = aTab.ownerDocument.evaluate(
-					'ancestor-or-self::*[local-name()="tabbrowser"] | '+
-					'ancestor-or-self::*[local-name()="tabs" and @tabbrowser]',
-					aTab,
-					null,
-					XPathResult.FIRST_ORDERED_NODE_TYPE,
-					null
-				).singleNodeValue;
-			return (b && b.tabbrowser) || b;
-		}
-	};
-}, true);
-
-]]></script>
-</overlay>
diff --git a/content/treestyletab/res/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul b/content/treestyletab/res/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
deleted file mode 100644
index 2ecb846..0000000
--- a/content/treestyletab/res/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0"?>
-<!--
- Bookmark Multiple Tabs library for Firefox 2 or later
-
- Usage:
-   in chrome.manifest:
-     overlay  chrome://browser/content/browser.xul
-              chrome://***/content/bookmarkMultipleTabs.xul
-     overlay  chrome://browser/content/places/bookmarkProperties.xul
-              chrome://***/content/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
-     overlay  chrome://browser/content/places/bookmarkProperties2.xul
-              chrome://***/content/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
-
-   in JS files:
-     window['piro.sakura.ne.jp'].bookmarkMultipleTabs.addBookmarkFor(tabsArray, folderName);
-
- license: The MIT License, Copyright (c) 2009-2015 YUKI "Piro" Hiroshi
-   http://github.com/piroor/fxaddonlibs/blob/master/license.txt
- original:
-   http://github.com/piroor/fxaddonlibs/blob/master/bookmarkMultipleTabs.xul
-   http://github.com/piroor/fxaddonlibs/blob/master/bookmarkMultipleTabs_bookmarkPropertiesOverlay.xul
--->
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-<script type="application/javascript"><![CDATA[
-(function() {
-	if (!('BookmarkPropertiesPanel' in window) ||
-		!BookmarkPropertiesPanel._determineItemInfo ||
-		BookmarkPropertiesPanel.__bookmarkMultipleTabs__determineItemInfo)
-		return;
-
-	// Defined at http://mxr.mozilla.org/mozilla-central/source/browser/components/places/content/bookmarkProperties.js#73
-	const ACTION_ADD = 1;
-
-	BookmarkPropertiesPanel.__bookmarkMultipleTabs__determineItemInfo = BookmarkPropertiesPanel._determineItemInfo;
-	BookmarkPropertiesPanel._determineItemInfo = function(...aArgs) {
-		var folderNameOverride = null;
-		try {
-			folderNameOverride = Components.classes['@mozilla.org/preferences;1']
-				.getService(Components.interfaces.nsIPrefBranch)
-				.getCharPref('temp.showMinimalAddMultiBookmarkUI.folderName');
-			folderNameOverride = decodeURIComponent(escape(folderNameOverride));
-		}
-		catch(e) {
-		}
-		var retVal = this.__bookmarkMultipleTabs__determineItemInfo.apply(this, aArgs);
-		if (folderNameOverride &&
-			this._action == ACTION_ADD) {
-			let dialogInfo = window.arguments[0];
-			if (dialogInfo.type === 'folder' &&
-				!('title' in dialogInfo) &&
-				'URIList' in dialogInfo) {
-				this._title = folderNameOverride;
-			}
-		}
-		return retVal;
-	};
-})();
-]]></script>
-</overlay>
diff --git a/content/treestyletab/treestyletab.xul b/content/treestyletab/treestyletab.xul
index 26be71a..ff22860 100644
--- a/content/treestyletab/treestyletab.xul
+++ b/content/treestyletab/treestyletab.xul
@@ -40,6 +40,7 @@
          xmlns:svg="http://www.w3.org/2000/svg">
 
 <script src="res/tabsDragUtils.js" type="application/javascript"/>
+<script src="res/bookmarkMultipleTabs.js" type="application/javascript"/>
 <script src="treestyletab.js" type="application/javascript"/>
 <script src="windowHelper.js" type="application/javascript"/>
 <script src="windowHelperHacks.js" type="application/javascript"/>
diff --git a/content/treestyletab/windowHelper.js b/content/treestyletab/windowHelper.js
index 7b4a943..d99a25b 100644
--- a/content/treestyletab/windowHelper.js
+++ b/content/treestyletab/windowHelper.js
@@ -47,7 +47,8 @@ var TreeStyleTabWindowHelper = {
 			TabsInTitlebar._update = function(...aArgs) {
 				// See: https://dxr.mozilla.org/mozilla-central/rev/dbe4b47941c7b3d6298a0ead5e40dd828096c808/browser/base/content/browser-tabsintitlebar.js#104
 				let result = this.__treestyletab__update(...aArgs);
-				if (gBrowser.treeStyleTab.position != 'top')
+				if (gBrowser.treeStyleTab && // possibly not available while the startup process
+					gBrowser.treeStyleTab.position != 'top')
 					document.getElementById('titlebar').style.marginBottom =
 						document.getElementById('titlebar-content').style.marginBottom = '';
 				return result;
diff --git a/install.rdf b/install.rdf
index 8914cc1..00a8b2e 100644
--- a/install.rdf
+++ b/install.rdf
@@ -5,7 +5,7 @@
   <RDF:Description RDF:about="urn:mozilla:install-manifest"
                    em:id="treestyletab at piro.sakura.ne.jp"
                    em:name="Tree Style Tab"
-                   em:version="0.18.2016090601"
+                   em:version="0.18.2016090802"
                    em:creator="YUKI "Piro" Hiroshi"
                    em:description="Show tabs like a tree."
                    em:homepageURL="http://piro.sakura.ne.jp/xul/_treestyletab.html.en"
diff --git a/locale/da-DK/treestyletab/treestyletab.properties b/locale/da-DK/treestyletab/treestyletab.properties
index 9ec23f9..e13c786 100644
--- a/locale/da-DK/treestyletab/treestyletab.properties
+++ b/locale/da-DK/treestyletab/treestyletab.properties
@@ -1,4 +1,4 @@
-tooltip.collapseSubtree=Sammenfold træ
+tooltip.collapseSubtree=Sammenfold træ
 tooltip.collapseSubtree.labeled=Sammenfold:\n%S
 tooltip.expandSubtree=Udvid træ
 tooltip.expandSubtree.labeled=Udvid:\n%S
diff --git a/modules/autoHide.js b/modules/autoHide.js
index 8d88e04..59709ee 100644
--- a/modules/autoHide.js
+++ b/modules/autoHide.js
@@ -102,7 +102,7 @@ var AutoHideConstants = Object.freeze(inherit(TreeStyleTabConstants, {
 	MOUSE_POSITION_INSIDE  : (1 << 1),
 	MOUSE_POSITION_NEAR    : (1 << 2),
 	MOUSE_POSITION_SENSITIVE : (1 << 1) | (1 << 2)
-}));
+}, Object));
 
 
 function AutoHideBase(aTabBrowser) 
@@ -175,7 +175,7 @@ AutoHideBase.prototype = inherit(AutoHideConstants, {
 		this.treeStyleTab.setWindowValue(this.kMODE + '-fullscreen', aValue);
 		return aValue;
 	}
-});
+}, Object);
 
 
 function AutoHideBrowser(aTabBrowser) 
@@ -1576,7 +1576,7 @@ AutoHideBrowser.prototype = inherit(AutoHideBase.prototype, {
 		delete this.window;
 	}
  
-}); 
+}, Object); 
   
 function AutoHideWindow(aWindow) 
 {
@@ -1766,5 +1766,5 @@ AutoHideWindow.prototype = inherit(AutoHideBase.prototype, {
 		}
 	}
  
-}); 
+}, Object); 
   
diff --git a/modules/base.js b/modules/base.js
index 6fb48a7..71b2fae 100644
--- a/modules/base.js
+++ b/modules/base.js
@@ -325,24 +325,29 @@ var TreeStyleTabBase = inherit(TreeStyleTabConstants, {
 		var button = Services.prompt.confirmEx(this.browserWindow,
 				utils.treeBundle.getString('openGroupBookmarkBehavior.title'),
 				utils.treeBundle.getString('openGroupBookmarkBehavior.text'),
-				(Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0) +
-				(Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_1),
+				// The "cancel" button must pe placed as the second button
+				// due to the bug: https://bugzilla.mozilla.org/show_bug.cgi?id=345067
+				(Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0) |
+				(Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1) |
+				(Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_2),
 				utils.treeBundle.getString('openGroupBookmarkBehavior.subTree'),
+				'',
 				utils.treeBundle.getString('openGroupBookmarkBehavior.separate'),
-				null,
 				utils.treeBundle.getString('openGroupBookmarkBehavior.never'),
 				checked
 			);
 
 		if (button < 0)
-			button = 1;
+			return this.kGROUP_BOOKMARK_CANCEL;
+
 		var behaviors = [
 				this.kGROUP_BOOKMARK_SUBTREE | dummyTabFlag,
+				this.kGROUP_BOOKMARK_CANCEL,
 				this.kGROUP_BOOKMARK_SEPARATE
 			];
 		behavior = behaviors[button];
 
-		if (checked.value) {
+		if (checked.value && button != this.kGROUP_BOOKMARK_CANCEL) {
 			utils.setTreePref('openGroupBookmark.behavior', behavior);
 		}
 		return behavior;
@@ -2361,7 +2366,7 @@ var TreeStyleTabBase = inherit(TreeStyleTabConstants, {
 		);
 	}
    
-}); 
+}, Object); 
   
 TreeStyleTabBase.init(); 
  
diff --git a/modules/bookmark.js b/modules/bookmark.js
index 9861c62..9af3cc3 100644
--- a/modules/bookmark.js
+++ b/modules/bookmark.js
@@ -297,7 +297,8 @@ var TreeStyleTabBookmarksService = inherit(TreeStyleTabConstants, {
 		var TST = aBrowserWindow.TreeStyleTabService;
 
 		result.behavior = TST.openGroupBookmarkBehavior();
-		if (result.behavior & this.kGROUP_BOOKMARK_SUBTREE) {
+		if (result.behavior != this.kGROUP_BOOKMARK_CANCEL &&
+			result.behavior & this.kGROUP_BOOKMARK_SUBTREE) {
 			log('handleTabsOpenProcess: open as a group');
 			let treeStructure = result.behavior & this.kGROUP_BOOKMARK_DONT_RESTORE_TREE_STRUCTURE ?
 						null :
@@ -388,7 +389,7 @@ var TreeStyleTabBookmarksService = inherit(TreeStyleTabConstants, {
 	onItemVisited : function TSTBMService_onItemVisited(aID, aHistoryID, aDate) {},
 	onBeginUpdateBatch : function TSTBMService_onBeginUpdateBatch() {},
 	onEndUpdateBatch : function TSTBMService_onEndUpdateBatch() {}
-});
+}, Object);
 
 
 PlacesUIUtils.__treestyletab__openTabset = PlacesUIUtils._openTabset;
@@ -412,9 +413,8 @@ PlacesUIUtils._openTabset = function(aItemsToOpen, aEvent, aWindow, ...aArgs) {
 	});
 	log('  items => '+aItemsToOpen.length);
 
-	var allArgs = [aItemsToOpen, aEvent, aWindow].concat(aArgs);
 	if (aItemsToOpen.length <= 0)
-		return this.__treestyletab__openTabset.apply(this, allArgs);
+		return this.__treestyletab__openTabset(aItemsToOpen, aEvent, aWindow, ...aArgs);
 
 	var w = aWindow && aWindow.document.documentElement.getAttribute('windowtype') == 'navigator:browser' ?
 			aWindow :
@@ -425,13 +425,16 @@ PlacesUIUtils._openTabset = function(aItemsToOpen, aEvent, aWindow, ...aArgs) {
 	var where = w && w.whereToOpenLink(aEvent, false, true) || 'window';
 	log('  where: '+where);
 	if (where === 'window')
-		return this.__treestyletab__openTabset.apply(this, allArgs);
+		return this.__treestyletab__openTabset(aItemsToOpen, aEvent, aWindow, ...aArgs);
 
 	var result = BS.handleTabsOpenProcess(where, aEvent, w, ids, uris, aItemsToOpen, this.__treestyletab__folderName);
 	log('  result: ', result);
 
+	if (result.behavior == TST.kGROUP_BOOKMARK_CANCEL)
+		return;
+
 	var tabs = TST.doAndGetNewTabs((function() {
-			this.__treestyletab__openTabset.apply(this, allArgs);
+			this.__treestyletab__openTabset(aItemsToOpen, aEvent, aWindow, ...aArgs);
 		}).bind(this), w.gBrowser);
 	log('  tabs: '+tabs.length);
 
diff --git a/modules/browser.js b/modules/browser.js
index ba9a678..fe5f471 100644
--- a/modules/browser.js
+++ b/modules/browser.js
@@ -7602,5 +7602,5 @@ TreeStyleTabBrowser.prototype = inherit(TreeStyleTabWindow.prototype, {
 		return JSON.parse(json);
 	}
  
-}); 
+}, Object); 
  
diff --git a/modules/constants.js b/modules/constants.js
index a5e565a..3b8945e 100644
--- a/modules/constants.js
+++ b/modules/constants.js
@@ -235,6 +235,7 @@ var TreeStyleTabConstants = Object.freeze({
 	kGROUP_BOOKMARK_USE_DUMMY_FORCE             : 1024,
 	kGROUP_BOOKMARK_DONT_RESTORE_TREE_STRUCTURE : 512,
 	kGROUP_BOOKMARK_EXPAND_ALL_TREE             : 2048,
+	kGROUP_BOOKMARK_CANCEL    : -1,
 
 
 	CONTENT_SCRIPT          : 'chrome://treestyletab/content/content-utils.js',
diff --git a/modules/contentBridge.js b/modules/contentBridge.js
index 8cf3985..1b63305 100644
--- a/modules/contentBridge.js
+++ b/modules/contentBridge.js
@@ -192,5 +192,5 @@ ContentBridge.prototype = inherit(TreeStyleTabConstants, {
 		}
 		return aCoordinates;
 	}
-}); 
+}, Object); 
  
diff --git a/modules/fullTooltip.js b/modules/fullTooltip.js
index e894939..0fe7fe9 100644
--- a/modules/fullTooltip.js
+++ b/modules/fullTooltip.js
@@ -671,4 +671,4 @@ FullTooltipManager.prototype = inherit(TreeStyleTabBase, {
 			/width|height/.test(aEvent.propertyName))
 			this.changingPropertiesCount--;
 	}
-});
+}, Object);
diff --git a/modules/groupTab.js b/modules/groupTab.js
index 51d3892..6781440 100644
--- a/modules/groupTab.js
+++ b/modules/groupTab.js
@@ -447,4 +447,4 @@ GroupTab.prototype = inherit(TreeStyleTabBase, {
 
 		this.checkUpdateTreeNow();
 	}
-});
+}, Object);
diff --git a/modules/lib/UninstallationListener.js b/modules/lib/UninstallationListener.js
index c8fb795..4ef92d9 100644
--- a/modules/lib/UninstallationListener.js
+++ b/modules/lib/UninstallationListener.js
@@ -1,189 +1,112 @@
-/*
- Uninstallation Listener Library
-
- Usage:
-   new window['piro.sakura.ne.jp'].UninstallationListener({
-     id : 'test at exmaple.com',
-     onuninstalled : function() { ... },
-     ondisabled : function() { ... }
-   });
-
- license: The MIT License, Copyright (c) 2009-2011 YUKI "Piro" Hiroshi
-   http://github.com/piroor/fxaddonlibs/blob/master/license.txt
- original:
-   http://github.com/piroor/fxaddonlibs/blob/master/UninstallationListener.js
-*/
-
-/* To work as a JS Code Module  */
-if (typeof window == 'undefined' ||
-	(window && typeof window.constructor == 'function')) {
-	this.EXPORTED_SYMBOLS = ['UninstallationListener'];
-
-	// If namespace.jsm is available, export symbols to the shared namespace.
-	// See: http://github.com/piroor/fxaddonlibs/blob/master/namespace.jsm
-	try {
-		let ns = {};
-		Components.utils.import('resource://my-modules/namespace.jsm', ns);
-		/* var */ window = ns.getNamespaceFor('piro.sakura.ne.jp');
-	}
-	catch(e) {
-		window = {};
-	}
-}
-
-(function() {
-	const currentRevision = 2;
-
-	if (!('piro.sakura.ne.jp' in window)) window['piro.sakura.ne.jp'] = {};
-
-	var loadedRevision = 'UninstallationListener' in window['piro.sakura.ne.jp'] ?
-			window['piro.sakura.ne.jp'].UninstallationListener.prototype.revision :
-			0 ;
-	if (loadedRevision && loadedRevision > currentRevision) {
-		return;
-	}
-
-	const Cc = Components.classes;
-	const Ci = Components.interfaces;
-
-	const ObserverService = Cc['@mozilla.org/observer-service;1']
-							.getService(Ci.nsIObserverService);
-
-	var AddonManager;
-	try {
-		let ns = {};
-		Components.utils.import('resource://gre/modules/AddonManager.jsm', ns);
-		AddonManager = ns.AddonManager;
-	}
-	catch(e) {
-	}
-
-	window['piro.sakura.ne.jp'].UninstallationListener = function(aArguments) {
-		this.init(aArguments);
-	};
-	window['piro.sakura.ne.jp'].UninstallationListener.prototype = {
-		revision : currentRevision,
-
-		// for Firefox 3.6 or older
-		observe : function(aSubject, aTopic, aData)
-		{
-			switch (aTopic)
-			{
-				case 'em-action-requested':
-					switch (aData)
-					{
-						case 'item-uninstalled':
-							if (this.isTargetExtension(aSubject))
-								this.toBeUninstalled = true;
-							break;
-						case 'item-cancel-action':
-							if (this.isTargetExtension(aSubject)) {
-								this.toBeUninstalled = false;
-								this.toBeDisabled = false;
-							}
-							break;
-						case 'item-disabled':
-							if (this.isTargetExtension(aSubject))
-								this.toBeDisabled = true;
-							break;
-						case 'item-enabled':
-							if (this.isTargetExtension(aSubject))
-								this.toBeDisabled = false;
-							break;
-					}
-					return;
-
-				case 'quit-application-granted':
-					this.destroy();
-					return;
-			}
-		},
-		isTargetExtension : function(aSubject)
-		{
-			return (aSubject instanceof Ci.nsIUpdateItem) && (aSubject.id == this.id);
-		},
-
-		// for Firefox 4 or later
-		onEnabling : function(aAddon, aRestartRequired) {},
-		onEnabled : function(aAddon) {},
-		onDisabling : function(aAddon, aRestartRequired) {
-			if (aAddon.id == this.id) {
-				this.toBeDisabled = true;
-			}
-		},
-		onDisabled : function(aAddon)
-		{
-			if (aAddon.id == this.id) {
-				if (this.ondisabled) this.ondisabled();
-				delete this.ondisabled;
-			}
-		},
-		onInstalling : function(aAddon, aRestartRequired) {},
-		onInstalled : function(aAddon) {},
-		onUninstalling : function(aAddon, aRestartRequired) {
-			if (aAddon.id == this.id) {
-				this.toBeUninstalled = true;
-			}
-		},
-		onUninstalled : function(aAddon)
-		{
-			if (aAddon.id == this.id) {
-				if (this.onuninstalled) this.onuninstalled();
-				delete this.onuninstalled;
-			}
-		},
-		onOperationCancelled : function(aAddon)
-		{
-			if (aAddon.id == this.id) {
-				this.toBeDisabled = false;
-				this.toBeUninstalled = false;
-			}
-		},
-		onPropertyChanged : function(aAddon, aProperties) {},
-
-		init : function(aArguments)
-		{
-			if (!aArguments) return;
-
-			this.id = (typeof aArguments == 'string') ? aArguments : aArguments.id ;
-
-			this.toBeUninstalled = false;
-			this.toBeDisabled = false;
-			if (typeof aArguments == 'object') {
-				this.onuninstalled = aArguments.onuninstalled;
-				this.ondisabled = aArguments.ondisabled;
-			}
-
-			if (AddonManager) { // Firefox 4 or later
-				AddonManager.addAddonListener(this);
-			}
-			else {
-				ObserverService.addObserver(this, 'em-action-requested', false);
-			}
-			ObserverService.addObserver(this, 'quit-application-granted', false);
-		},
-
-		destroy : function()
-		{
-			if (this.toBeUninstalled && this.onuninstalled)
-				this.onuninstalled();
-			delete this.onuninstalled;
-
-			if (this.toBeDisabled && this.ondisabled)
-				this.ondisabled();
-			delete this.ondisabled;
-
-			if (AddonManager) { // Firefox 4 or later
-				AddonManager.removeAddonListener(this);
-			}
-			else {
-				ObserverService.removeObserver(this, 'em-action-requested');
-			}
-			ObserverService.removeObserver(this, 'quit-application-granted');
-		}
-	};
-})();
-
-if (window != this) { // work as a JS Code Module
-	this.UninstallationListener = window['piro.sakura.ne.jp'].UninstallationListener;
-}
+/**
+ * @fileOverview Uninstallation Listener Library
+ * @author       YUKI "Piro" Hiroshi
+ * @version      3
+ *
+ * @license
+ *   The MIT License, Copyright (c) 2009-2016 YUKI "Piro" Hiroshi.
+ *   https://github.com/piroor/fxaddonlib-uninstallation-listener/blob/master/license.txt
+ * @url https://github.com/piroor/fxaddonlib-uninstallation-listener
+ *
+ * Usage:
+ *   new UninstallationListener({
+ *     id : 'test at exmaple.com',
+ *    onuninstalled : function() { ... },
+ *     ondisabled : function() { ... }
+ *   });
+ */
+
+var EXPORTED_SYMBOLS = ['UninstallationListener'];
+
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+const ObserverService = Cc['@mozilla.org/observer-service;1']
+						.getService(Ci.nsIObserverService);
+
+var { AddonManager } = Components.utils.import('resource://gre/modules/AddonManager.jsm', {});
+
+var UninstallationListener = function(aArguments) {
+	this.init(aArguments);
+};
+UninstallationListener.prototype = {
+	onEnabling : function(aAddon, aRestartRequired) {},
+	onEnabled : function(aAddon) {},
+	onDisabling : function(aAddon, aRestartRequired) {
+		if (aAddon.id == this.id) {
+			this.toBeDisabled = true;
+		}
+	},
+	onDisabled : function(aAddon)
+	{
+		if (aAddon.id == this.id) {
+			if (this.ondisabled) this.ondisabled();
+			delete this.ondisabled;
+		}
+	},
+	onInstalling : function(aAddon, aRestartRequired) {},
+	onInstalled : function(aAddon) {},
+	onUninstalling : function(aAddon, aRestartRequired) {
+		if (aAddon.id == this.id) {
+			this.toBeUninstalled = true;
+		}
+	},
+	onUninstalled : function(aAddon)
+	{
+		if (aAddon.id == this.id) {
+			if (this.onuninstalled) this.onuninstalled();
+			delete this.onuninstalled;
+		}
+	},
+	onOperationCancelled : function(aAddon)
+	{
+		if (aAddon.id == this.id) {
+			this.toBeDisabled = false;
+			this.toBeUninstalled = false;
+		}
+	},
+	onPropertyChanged : function(aAddon, aProperties) {},
+
+	init : function(aArguments)
+	{
+		if (!aArguments) return;
+
+		this.id = (typeof aArguments == 'string') ? aArguments : aArguments.id ;
+
+		this.toBeUninstalled = false;
+		this.toBeDisabled = false;
+		if (typeof aArguments == 'object') {
+			this.onuninstalled = aArguments.onuninstalled;
+			this.ondisabled = aArguments.ondisabled;
+		}
+
+		AddonManager.addAddonListener(this);
+		ObserverService.addObserver(this, 'quit-application-granted', false);
+	},
+
+	destroy : function()
+	{
+		if (this.toBeUninstalled && this.onuninstalled)
+			this.onuninstalled();
+		delete this.onuninstalled;
+
+		if (this.toBeDisabled && this.ondisabled)
+			this.ondisabled();
+		delete this.ondisabled;
+
+		AddonManager.removeAddonListener(this);
+		ObserverService.removeObserver(this, 'quit-application-granted');
+	},
+
+	observe : function(aSubject, aTopic, aData)
+	{
+		switch (aTopic)
+		{
+			case 'quit-application-granted':
+				this.destroy();
+				return;
+		}
+	}
+};
+
diff --git a/modules/lib/extensions.js b/modules/lib/extensions.js
index 4ac3161..f06effa 100644
--- a/modules/lib/extensions.js
+++ b/modules/lib/extensions.js
@@ -2,7 +2,6 @@
  Extensions Compatibility Library
 
  Usage:
-   Asynchronus:
      var extensions = window['piro.sakura.ne.jp'].extensions;
      extensions.isAvailable('my.extension.id at example.com', {
        ok : function() { extensions.goToOptions('my.extension.id at example.com'); },
@@ -14,16 +13,9 @@
        }
      });
 
-   Synchronus: (DEPRECATED)
-     if (extensions.isAvailable('my.extension.id at example.com'))
-         extensions.goToOptions('my.extension.id at example.com');
-     var dir = extensions.getInstalledLocation('my.extension.id at example.com'); // nsILocalFile
-
- license: The MIT License, Copyright (c) 2009-2010 YUKI "Piro" Hiroshi
-   http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/license.txt
+ license: The MIT License, Copyright (c) 2009-2016 YUKI "Piro" Hiroshi
  original:
-   http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/extensions.js
-   http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/extensions.test.js
+   http://github.com/piroor/fxaddonlib-extensions
 */
 
 /* To work as a JS Code Module */
@@ -32,7 +24,7 @@ if (typeof window == 'undefined' ||
 	this.EXPORTED_SYMBOLS = ['extensions'];
 
 	// If namespace.jsm is available, export symbols to the shared namespace.
-	// See: http://www.cozmixng.org/repos/piro/fx3-compatibility-lib/trunk/namespace.jsm
+	// See: http://github.com/piroor/fxaddonlibs/blob/master/namespace.jsm
 	try {
 		let ns = {};
 		Components.utils.import('resource://treestyletab-modules/lib/namespace.jsm', ns);
@@ -44,7 +36,7 @@ if (typeof window == 'undefined' ||
 }
 
 (function() {
-	const currentRevision = 11;
+	const currentRevision = 13;
 
 	if (!('piro.sakura.ne.jp' in window)) window['piro.sakura.ne.jp'] = {};
 
@@ -58,30 +50,11 @@ if (typeof window == 'undefined' ||
 	const Cc = Components.classes;
 	const Ci = Components.interfaces;
 
-	// Firefox 3.7 or later
-	var AM = {};
-	if ('@mozilla.org/addons/integration;1' in Cc)
-		Components.utils.import('resource://gre/modules/AddonManager.jsm', AM);
+	var { AddonManager } = Components.utils.import('resource://gre/modules/AddonManager.jsm', {});
 
 	window['piro.sakura.ne.jp'].extensions = {
 		revision : currentRevision,
 
-		// Firefox 3.7 or later
-		_getInstalledAddonNow : function(aId)
-		{
-			var addon;
-			AM.AddonManager.getAddonByID(aId, function(aAddon) {
-				addon = aAddon;
-			});
-			var thread = Cc['@mozilla.org/thread-manager;1']
-							.getService()
-							.mainThread;
-			while (addon === void(0)) {
-				thread.processNextEvent(true);
-			}
-			return addon;
-		},
-
 		_formatCallbacks : function(aOKCallback, aNGCallback)
 		{
 			var callbacks = {
@@ -99,18 +72,6 @@ if (typeof window == 'undefined' ||
 			return callbacks;
 		},
 
-		// Firefox 3.6 or older
-		_ExtensionManager : ('@mozilla.org/extensions/manager;1' in Cc) ?
-			Cc['@mozilla.org/extensions/manager;1']
-				.getService(Ci.nsIExtensionManager) :
-			null,
-		_RDF : Cc['@mozilla.org/rdf/rdf-service;1']
-			.getService(Ci.nsIRDFService),
-		_WindowMediator : Cc['@mozilla.org/appshell/window-mediator;1']
-			.getService(Ci.nsIWindowMediator),
-		_Prefs : Cc['@mozilla.org/preferences;1']
-			.getService(Ci.nsIPrefBranch),
-
 
 		isAvailable : function(aId, aOKCallback, aNGCallback)
 		{
@@ -120,149 +81,37 @@ if (typeof window == 'undefined' ||
 
 		isInstalled : function(aId, aOKCallback, aNGCallback)
 		{
-			if (!aOKCallback)
-				return this._ExtensionManager ? this._isInstalled_EM(aId) : this._isInstalled_AM(aId) ;
-
 			var callbacks = this._formatCallbacks(aOKCallback, aNGCallback);
-			if (this._ExtensionManager) {
-				callbacks[this._isInstalled_EM(aId) ? 'ok' : 'ng']();
-			}
-			else {
-				AM.AddonManager.getAddonByID(aId, function(aAddon) {
-					callbacks[aAddon ? 'ok' : 'ng']();
-				});
-			}
-		},
-		_isInstalled_EM : function(aId)
-		{
-			return this._ExtensionManager.getInstallLocation(aId) ? true : false ;
-		},
-		_isInstalled_AM : function(aId)
-		{
-			return this._getInstalledAddonNow(aId) ? true : false ;
+			AddonManager.getAddonByID(aId, function(aAddon) {
+				callbacks[aAddon ? 'ok' : 'ng']();
+			});
 		},
 
 
 		isEnabled : function(aId, aOKCallback, aNGCallback)
 		{
-			if (!aOKCallback)
-				return this._ExtensionManager ? this._isEnabled_EM(aId) : this._isEnabled_AM(aId) ;
-
 			var callbacks = this._formatCallbacks(aOKCallback, aNGCallback);
-			if (this._ExtensionManager) {
-				callbacks[this._isEnabled_EM(aId) ? 'ok' : 'ng']();
-			}
-			else {
-				AM.AddonManager.getAddonByID(aId, function(aAddon) {
-					callbacks[aAddon && aAddon.isActive ? 'ok' : 'ng']();
-				});
-			}
-		},
-		_isEnabled_EM : function(aId)
-		{
-			if (!this._isInstalled_EM(aId))
-				return false;
-
-			var res  = this._RDF.GetResource('urn:mozilla:item:'+aId);
-			var appDisabled = false;
-			try {
-				appDisabled = this._ExtensionManager.datasource.GetTarget(
-						res,
-						this._RDF.GetResource('http://www.mozilla.org/2004/em-rdf#appDisabled'),
-						true
-					).QueryInterface(Ci.nsIRDFLiteral)
-					.Value == 'true';
-			}
-			catch(e) {
-			}
-			var userDisabled = false;
-			try {
-				userDisabled = this._ExtensionManager.datasource.GetTarget(
-						res,
-						this._RDF.GetResource('http://www.mozilla.org/2004/em-rdf#userDisabled'),
-						true
-					).QueryInterface(Ci.nsIRDFLiteral)
-					.Value == 'true';
-			}
-			catch(e) {
-			}
-
-			return !appDisabled && !userDisabled;
-		},
-		_isEnabled_AM : function(aId)
-		{
-			var addon = this._getInstalledAddonNow(aId);
-			return addon ? addon.isActive : false ;
+			AddonManager.getAddonByID(aId, function(aAddon) {
+				callbacks[aAddon && aAddon.isActive ? 'ok' : 'ng']();
+			});
 		},
 
 
 		getInstalledLocation : function(aId, aCallback)
 		{
-			if (!aCallback)
-				return this._ExtensionManager ? this._getInstalledLocation_EM(aId) : this._getInstalledLocation_AM(aId) ;
-
-			if (this._ExtensionManager) {
-				aCallback(this._getInstalledLocation_EM(aId));
-			}
-			else {
-				AM.AddonManager.getAddonByID(aId, function(aAddon) {
-					var location = null;
-					if (aAddon)
-						location = aAddon.getResourceURI('/').QueryInterface(Ci.nsIFileURL).file.clone();
-					aCallback(location);
-				});
-			}
-		},
-		_getInstalledLocation_EM : function(aId)
-		{
-			var addon = this._ExtensionManager.getInstallLocation(aId);
-			if (!addon) return null;
-			return addon.getItemFile(aId, '').clone();
-		},
-		_getInstalledLocation_AM : function(aId)
-		{
-			var addon = this._getInstalledAddonNow(aId);
-			if (!addon) return null;
-			return addon.getResourceURI('/').QueryInterface(Ci.nsIFileURL).file.clone();
+			AddonManager.getAddonByID(aId, function(aAddon) {
+				var location = null;
+				if (aAddon)
+					location = aAddon.getResourceURI('/').QueryInterface(Ci.nsIFileURL).file.clone();
+				aCallback(location);
+			});
 		},
 
 		getVersion : function(aId, aCallback)
 		{
-			if (!aCallback)
-				return this._ExtensionManager ? this._getVersion_EM(aId) : this._getVersion_AM(aId) ;
-
-			if (this._ExtensionManager) {
-				aCallback(this._getVersion_EM(aId));
-			}
-			else {
-				AM.AddonManager.getAddonByID(aId, function(aAddon) {
-					aCallback(aAddon ? aAddon.version : null );
-				});
-			}
-		},
-		_getVersion_EM : function(aId)
-		{
-			if (!this._isInstalled_EM(aId))
-				return null;
-
-			var res  = this._RDF.GetResource('urn:mozilla:item:'+aId);
-			var version = null;
-			try {
-				version = this._ExtensionManager.datasource.GetTarget(
-						res,
-						this._RDF.GetResource('http://www.mozilla.org/2004/em-rdf#version'),
-						true
-					).QueryInterface(Ci.nsIRDFLiteral)
-					.Value;
-			}
-			catch(e) {
-			}
-			return version;
-		},
-		_getVersion_AM : function(aId)
-		{
-			var addon = this._getInstalledAddonNow(aId);
-			return addon ? addon.version : null ;
+			AddonManager.getAddonByID(aId, function(aAddon) {
+				aCallback(aAddon ? aAddon.version : null );
+			});
 		},
 
 
@@ -272,46 +121,10 @@ if (typeof window == 'undefined' ||
 			var callback = function(aURI) {
 					self.goToOptionsInternal(aURI, aOwnerWindow);
 				};
-			return this._ExtensionManager ? this._getOptionsURI_EM(aId, callback) : this._getOptionsURI_AM(aId, callback);
-		},
-		_getOptionsURI_EM : function(aId, aCallback)
-		{
-			var res  = this._RDF.GetResource('urn:mozilla:item:'+aId);
-			var uri = null;
-			try {
-				uri = this._ExtensionManager.datasource.GetTarget(
-						res,
-						this._RDF.GetResource('http://www.mozilla.org/2004/em-rdf#optionsURL'),
-						true
-					).QueryInterface(Ci.nsIRDFLiteral)
-					.Value;
-			}
-			catch(e) {
-			}
-			return aCallback ? aCallback(uri) : uri ;
-		},
-		_getOptionsURI_AM : function(aId, aCallback)
-		{
-			if (aCallback) {
-				AM.AddonManager.getAddonByID(aId, function(aAddon) {
-					aCallback(aAddon && aAddon.isActive ? aAddon.optionsURL : null );
-				});
-				return null;
-			}
-			else {
-				var addon = this._getInstalledAddonNow(aId);
-				return (addon && addon.isActive) ? addon.optionsURL : null ;
-			}
-		},
-
-		goToOptionsNow : function(aId, aOwnerWindow)
-		{
-			this.goToOptionsInternal(
-				(this._ExtensionManager ? this._getOptionsURI_EM(aId) : this._getOptionsURI_AM(aId) ),
-				aOwnerWindow
-			);
+			AddonManager.getAddonByID(aId, function(aAddon) {
+				callback(aAddon && aAddon.isActive ? aAddon.optionsURL : null );
+			});
 		},
-
 		goToOptionsInternal : function(aURI, aOwnerWindow)
 		{
 			if (!aURI) return;
@@ -320,19 +133,21 @@ if (typeof window == 'undefined' ||
 			while (windows.hasMoreElements())
 			{
 				let win = windows.getNext();
-				if (win.location.href == uri) {
+				if (win.location.href == aURI) {
 					win.focus();
 					return;
 				}
 			}
 			var instantApply = false;
 			try {
-				instantApply = this._Prefs.getBoolPref('browser.preferences.instantApply');
+				instantApply = Cc['@mozilla.org/preferences;1']
+								.getService(Ci.nsIPrefBranch)
+								.getBoolPref('browser.preferences.instantApply');
 			}
 			catch(e) {
 			}
 			(aOwnerWindow || window).openDialog(
-				uri,
+				aURI,
 				'',
 				'chrome,titlebar,toolbar,centerscreen,' + (instantApply ? 'dialog=no' : 'modal' )
 			);
@@ -343,3 +158,4 @@ if (typeof window == 'undefined' ||
 if (window != this) { // work as a JS Code Module
 	this.extensions = window['piro.sakura.ne.jp'].extensions;
 }
+
diff --git a/modules/lib/inherit.jsm b/modules/lib/inherit.jsm
index cb7730e..ed705ba 100644
--- a/modules/lib/inherit.jsm
+++ b/modules/lib/inherit.jsm
@@ -2,10 +2,10 @@
  * @fileOverview inherit, an alternative for __proto__
  * @author       YUKI "Piro" Hiroshi
  * @contributor  Infocatcher
- * @version      3
+ * @version      4
  *
  * @license
- *   The MIT License, Copyright (c) 2014 YUKI "Piro" Hiroshi.
+ *   The MIT License, Copyright (c) 2014-2016 YUKI "Piro" Hiroshi.
  *   https://github.com/piroor/fxaddonlib-inherit/blob/master/LICENSE
  * @url http://github.com/piroor/fxaddonlib-inherit
  */
@@ -21,23 +21,11 @@ function toPropertyDescriptors(aProperties) {
 	return descriptors;
 }
 
-function inherit(aParent, aExtraProperties) {
-	var global;
-	if (Components.utils.getGlobalForObject)
-		global = Components.utils.getGlobalForObject(aParent);
-	else
-		global = aParent.valueOf.call();
-	global = global || this;
-
-	var ObjectClass = global.Object || Object;
-
-	if (!ObjectClass.create) {
-		aExtraProperties = aExtraProperties || new ObjectClass;
-		aExtraProperties.__proto__ = aParent;
-		return aExtraProperties;
-	}
+function inherit(aParent, aExtraProperties, aObjectClass) {
+	aObjectClass = aObjectClass || Object;
 	if (aExtraProperties)
-		return ObjectClass.create(aParent, toPropertyDescriptors(aExtraProperties));
+		return aObjectClass.create(aParent, toPropertyDescriptors(aExtraProperties));
 	else
-		return ObjectClass.create(aParent);
+		return aObjectClass.create(aParent);
 }
+
diff --git a/modules/window.js b/modules/window.js
index f7c260c..784f919 100644
--- a/modules/window.js
+++ b/modules/window.js
@@ -2046,5 +2046,5 @@ TreeStyleTabWindow.prototype = inherit(TreeStyleTabBase, {
 		}
 	}
   
-}); 
+}, Object); 
   
diff --git a/treestyletab.update.rdf b/treestyletab.update.rdf
new file mode 100644
index 0000000..5a625e6
--- /dev/null
+++ b/treestyletab.update.rdf
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+        xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+    <rdf:Description rdf:about="urn:mozilla:extension:treestyletab at piro.sakura.ne.jp">
+        <em:updates>
+            <rdf:Seq>
+                <rdf:li>
+                    <rdf:Description>
+                        <em:version>0.18.2016090802</em:version>
+                        <em:targetApplication>
+                            <rdf:Description>
+                                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+                                <em:minVersion>45.0</em:minVersion>
+                                <em:maxVersion>51.0a1</em:maxVersion>
+                                <em:updateLink>http://piro.sakura.ne.jp/xul/xpi/treestyletab.xpi?version=0.18.2016090802</em:updateLink>
+                                <em:updateHash>sha1:e6ee377b6df5853bb90016acd4879f7337081fde</em:updateHash>
+                            </rdf:Description>
+                        </em:targetApplication>
+                    </rdf:Description>
+                </rdf:li>
+            </rdf:Seq>
+        </em:updates>
+        <em:signature>
+            MIGRMAsGCSqGSIb3DQEBDQOBgQB9ADxK5oGK0GDGOhQYeMPpTC1/R6/182jThC4G
+            wS4WmRFaX344NMlBKtqEO/auJzc0sOzdCgrXO+alNwePOisor95TsIqHcwf3CV9i
+            3boyTvbD63gXlgfWCN8mjIlwp4LDkmzArUaDMYg85dB0aoenSTRtMv16xoTzlTY9
+            ludWkg==
+        </em:signature>
+    </rdf:Description>
+</rdf:RDF>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/tree-style-tab.git



More information about the Pkg-mozext-commits mailing list