[Pkg-mozext-commits] [tabmixplus] 02/06: Imported Upstream version 0.4.2.3~160328a1

David Prévot taffit at moszumanska.debian.org
Sat Apr 2 01:55:37 UTC 2016


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

taffit pushed a commit to branch master
in repository tabmixplus.

commit 8165710eb5b6fa25b6033db0bc9dd1ad87bff650
Author: David Prévot <david at tilapin.org>
Date:   Fri Apr 1 21:46:19 2016 -0400

    Imported Upstream version 0.4.2.3~160328a1
---
 META-INF/manifest.mf                               | 136 ++++++++++-----------
 META-INF/mozilla.rsa                               | Bin 4197 -> 4197 bytes
 META-INF/mozilla.sf                                |   4 +-
 chrome/content/about.js                            |   2 +-
 chrome/content/changecode.js                       |   2 -
 chrome/content/click/click.js                      |  25 +---
 chrome/content/content.js                          |  37 +++---
 chrome/content/extensions/extensions.js            |  45 ++++++-
 chrome/content/links/setup.js                      |   2 +-
 chrome/content/links/userInterface.js              |  12 +-
 chrome/content/minit/minit.js                      |  15 ++-
 chrome/content/minit/tablib.js                     |  68 ++++++-----
 chrome/content/overlay/browsr.css                  |   5 -
 chrome/content/overlay/firefox.css                 |   6 +
 chrome/content/places/places.js                    |  15 +--
 chrome/content/preferences/appearance.js           |   2 +-
 chrome/content/preferences/menu.js                 |   2 +-
 .../preferences/overlay/preferencesOverlay.js      |   2 +-
 chrome/content/preferences/preferences.js          |   5 +-
 chrome/content/preferences/session.xul             |   6 -
 .../preferences/subdialogs/pref-appearance.js      |   2 +-
 chrome/content/session/sessionStore.js             |   6 +-
 chrome/content/tab/tab.js                          |  19 ++-
 chrome/content/tabmix.js                           |   9 +-
 chrome/content/utils.js                            |   4 +-
 install.rdf                                        |   2 +-
 modules/AsyncUtils.jsm                             |   1 -
 modules/ContentClick.jsm                           |   5 -
 modules/ContextMenu.jsm                            |  10 +-
 modules/DocShellCapabilities.jsm                   |   7 +-
 modules/DownloadLastDir.jsm                        |   1 -
 modules/DynamicRules.jsm                           |   2 +-
 modules/MergeWindows.jsm                           |   2 +-
 modules/Places.jsm                                 |   4 +-
 modules/Services.jsm                               |   2 -
 modules/Utils.jsm                                  |  11 +-
 modules/log.jsm                                    |  32 +++--
 37 files changed, 268 insertions(+), 242 deletions(-)

diff --git a/META-INF/manifest.mf b/META-INF/manifest.mf
index 861d679..3e79260 100644
--- a/META-INF/manifest.mf
+++ b/META-INF/manifest.mf
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
 
 Name: install.rdf
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: MkERX021fz/gShvnP444cQ==
-SHA1-Digest: BYbEW61uLawQ6BIWbh0ZQvYzS10=
+MD5-Digest: UV7csCcDLmkIJtiRrQqqXw==
+SHA1-Digest: X8HgZwQxIhSZQbE2/RlhJS16Mbc=
 
 Name: chrome.manifest
 Digest-Algorithms: MD5 SHA1
@@ -17,8 +17,8 @@ SHA1-Digest: aaPMHbdPTp3/ql/+iZOQyq+W2AY=
 
 Name: chrome/content/about.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: 83Lg2kxAjlTKC8mElKyaWg==
-SHA1-Digest: UZQrXQNElYjqwkkGCRP/P8SHRdo=
+MD5-Digest: XZHfVU4huHWt6TBrmx6jmw==
+SHA1-Digest: vEokekw78gvtBUiNQmlbX4Yjotc=
 
 Name: chrome/content/about.xul
 Digest-Algorithms: MD5 SHA1
@@ -27,18 +27,18 @@ SHA1-Digest: wrWOq6BcK6feX+a7Gge2ScBfrvA=
 
 Name: chrome/content/changecode.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: dFzpml1jlHc5W8L6OhnYKg==
-SHA1-Digest: Itda6g73nhrqHAVV7Xit91H66Co=
+MD5-Digest: oD+p4J+5bQ7Z6qHvKINtcQ==
+SHA1-Digest: BPSLBjX+sifBeaLn9n2JTYRfLM0=
 
 Name: chrome/content/content.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: oTrdq6vEXqFJgg6JtIOriw==
-SHA1-Digest: JgH48HuRAKyQ9QI+EDtoeSe+LNw=
+MD5-Digest: kd/px7UZLFp3Gamr85AhBA==
+SHA1-Digest: G9UkgLbphWAv9DRNIZ6251W6Wn0=
 
 Name: chrome/content/tabmix.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: pIpE+ESpDB8DFOra9Zkf8A==
-SHA1-Digest: /Onl/birq3Mcqw1s5g7cQ/vi3sA=
+MD5-Digest: Dk7TmyoTUzNIkw0ndhrs+w==
+SHA1-Digest: ZJaiXk+vHK0RU+e8ebQ2eUiwQtw=
 
 Name: chrome/content/tabmix.xul
 Digest-Algorithms: MD5 SHA1
@@ -47,18 +47,18 @@ SHA1-Digest: WC4Zo3WjmwipyGR7nJ6Y5be4TyE=
 
 Name: chrome/content/utils.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: gSbNE0/DW83t1xbEUzMUAg==
-SHA1-Digest: uhwrTzI9FAO7Vb7tP4tGsuE1Woo=
+MD5-Digest: fRKuIl3nvSXY+nWu3Y1OgA==
+SHA1-Digest: GS1E6vuApRC9juPfpDAEk0SIMeQ=
 
 Name: chrome/content/click/click.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: Wr4Ah30GNr2mVECIy6BwmA==
-SHA1-Digest: GPubRvGl1LEH9g6wnLXUn2Dl9Lw=
+MD5-Digest: 64BexxcwN5eBPhN3iPj9ww==
+SHA1-Digest: 6gs2665MMFdwmYlhXaQa3ZmbObM=
 
 Name: chrome/content/extensions/extensions.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: FWrjTzeVc8o9bbe7jHSH6w==
-SHA1-Digest: CRI8Ivgn5qxlLHe1nV8/pWe7yjs=
+MD5-Digest: yYZSyz5iqMneAkyCDRVjkw==
+SHA1-Digest: ChTrrIgwjmNzs9o+IaH7QF02vss=
 
 Name: chrome/content/extensions/sage.js
 Digest-Algorithms: MD5 SHA1
@@ -112,13 +112,13 @@ SHA1-Digest: vbFhd3PAqXDQX+bhbnRqePKsrCE=
 
 Name: chrome/content/links/setup.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: c7QYdZz4zxEKpKgdM6bMwQ==
-SHA1-Digest: kKCN29CQYkVPY6P6olm/hOpW0UI=
+MD5-Digest: FSjS/Tf5UWnM8ii8VGJdhA==
+SHA1-Digest: hoHhN1aAIlzKnJFBnzAg21yhRo0=
 
 Name: chrome/content/links/userInterface.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: JzAlqt4E1ciJmFoiU0ZDBg==
-SHA1-Digest: OuCOcYU1oHAIh6M3xChkmynMPrk=
+MD5-Digest: vSZ9pup/F7YYv+aR5HHpoA==
+SHA1-Digest: iWNet+/+72ckT8YBUgKn6/XCzYk=
 
 Name: chrome/content/minit/autoReload.js
 Digest-Algorithms: MD5 SHA1
@@ -132,8 +132,8 @@ SHA1-Digest: TEE8UGoirwpmJxC0fi/GdQ4Jt/Y=
 
 Name: chrome/content/minit/minit.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: KkOJGhjq/EvQyH29XlGzgw==
-SHA1-Digest: LXG8hJHphGX0xihieboCxTM5tK8=
+MD5-Digest: W7qcKqPnDkXGfZcVxXvPgQ==
+SHA1-Digest: BmIZN3dX9b19rQVZ1rwAV+AgUCo=
 
 Name: chrome/content/minit/renameTab.xul
 Digest-Algorithms: MD5 SHA1
@@ -142,8 +142,8 @@ SHA1-Digest: Xx80yx7tHvPsdU+E4zjnaWxSHR4=
 
 Name: chrome/content/minit/tablib.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: UWrur/r+gFhqM0KqlHBghw==
-SHA1-Digest: 9dqIETH+mbaS4BcXLWriN6pAXAU=
+MD5-Digest: ew094b+2KyJULacRrU+y3Q==
+SHA1-Digest: Oyh+LMPF1kx7g/1gcq6LWfYC088=
 
 Name: chrome/content/minit/tabView.js
 Digest-Algorithms: MD5 SHA1
@@ -152,13 +152,13 @@ SHA1-Digest: UeVtsgv0xKO/t20o3bEmA7v9NKM=
 
 Name: chrome/content/overlay/browsr.css
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: ZLY8QIH0g79B0VKVo9KHbg==
-SHA1-Digest: HV3/hix8Y0IQPPqnOaSZSioDByA=
+MD5-Digest: vW5CG7bKuIoSo5QLt2Tn0w==
+SHA1-Digest: qg4KTMCNnsUHh6zvIm58Z+gCIT0=
 
 Name: chrome/content/overlay/firefox.css
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: ulyeqJ0X4tQFg/wy3AuJXg==
-SHA1-Digest: DLYmg32hnLBE/bCK/ceU2ZdAtrw=
+MD5-Digest: EImd0NuhmfyypVMaRBMa/A==
+SHA1-Digest: j+/s4HsLMUI0WlQJSQbn3fv1rdA=
 
 Name: chrome/content/overlay/palemoon.css
 Digest-Algorithms: MD5 SHA1
@@ -182,8 +182,8 @@ SHA1-Digest: EMkKp+FCu75LoR0gdTn1Aia6N6w=
 
 Name: chrome/content/places/places.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: MfJEtJd0aLzUvFHsJNOoxw==
-SHA1-Digest: 7IgHR60pw9enfOHJ1toh77MjciY=
+MD5-Digest: rnD62wm2vZ0o3zRdMcp9Mg==
+SHA1-Digest: tk2JIx3SYVf7KJP0n3SdjCqpYL0=
 
 Name: chrome/content/places/places.xul
 Digest-Algorithms: MD5 SHA1
@@ -192,8 +192,8 @@ SHA1-Digest: qyhy6qeWeszXRe2D+1PHJn3ScK0=
 
 Name: chrome/content/preferences/appearance.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: fsrL1f8fbw37ZstbvMjGMQ==
-SHA1-Digest: mdwTIs3IQ8lzaXoLMtdratRME/A=
+MD5-Digest: mLupviFZirntanJmgJtXzw==
+SHA1-Digest: i5tuxMr4AzoXXQYopxIlTrvdYcE=
 
 Name: chrome/content/preferences/appearance.xul
 Digest-Algorithms: MD5 SHA1
@@ -232,8 +232,8 @@ SHA1-Digest: 1HMOx2qZnzoyH63fbz6F0/Qs7lM=
 
 Name: chrome/content/preferences/menu.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: YkfYPAWqUh8/eNZcZXrwYg==
-SHA1-Digest: 7CVcIaWjEwhoaXiQFGRNgXzbs60=
+MD5-Digest: eGenHoBPgm+R35leLnpyww==
+SHA1-Digest: O/6zYmLNO0+ta+xW5VhuARdCOdo=
 
 Name: chrome/content/preferences/menu.xul
 Digest-Algorithms: MD5 SHA1
@@ -252,8 +252,8 @@ SHA1-Digest: 0cO2A3qfQk9Jil4RR6Gm/HUJ5v8=
 
 Name: chrome/content/preferences/preferences.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: Fzruvnz33Q20fI9/OzzrTQ==
-SHA1-Digest: RHToUGSghQ1UhZuMXT5JwcVoaNI=
+MD5-Digest: qwwxnKYLm3VaxVICCnOrvg==
+SHA1-Digest: MQmuxZSgub6v02oOjBDwkAL4vJE=
 
 Name: chrome/content/preferences/preferences.xul
 Digest-Algorithms: MD5 SHA1
@@ -267,8 +267,8 @@ SHA1-Digest: 79aIHGFyBqioo3Y9CVV6PPHvdx4=
 
 Name: chrome/content/preferences/session.xul
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: rZdMU4LTvI+uCW9Q7Xsn1A==
-SHA1-Digest: TYlXmVNQIKo/8IH1pqRGMklJa3M=
+MD5-Digest: 1S4uxGXwboCMGQl5mWPYrw==
+SHA1-Digest: zvUdm8PZVS2zX/SyGgZjO2DUyzA=
 
 Name: chrome/content/preferences/shortcuts.js
 Digest-Algorithms: MD5 SHA1
@@ -322,8 +322,8 @@ SHA1-Digest: 4MtIAAVxEKOawzqdGTko+Q8++PU=
 
 Name: chrome/content/preferences/overlay/preferencesOverlay.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: tIRvn8yYgJRsDrvU1iHObQ==
-SHA1-Digest: WyUwQe8pTUaJm3CIhRiLVX8zLHw=
+MD5-Digest: w9P+A2m/4g1sahmTeBHFTg==
+SHA1-Digest: wDlItF1BuJJMEDw8OmhcFNQuWdY=
 
 Name: chrome/content/preferences/overlay/tabs.xul
 Digest-Algorithms: MD5 SHA1
@@ -337,8 +337,8 @@ SHA1-Digest: le5vUChrsdKqqqKOKxHYda695LY=
 
 Name: chrome/content/preferences/subdialogs/pref-appearance.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: KXxIQASJR4dBCB9+q5ksow==
-SHA1-Digest: nhNdQoLp9YcAETwgeuvhwib1C1c=
+MD5-Digest: vsPsKubpCtSZ72nP+JehYA==
+SHA1-Digest: k6t7MI/kP5ykvFikJ10IQ0WJklM=
 
 Name: chrome/content/preferences/subdialogs/pref-appearance.xml
 Digest-Algorithms: MD5 SHA1
@@ -377,8 +377,8 @@ SHA1-Digest: 7hzpYxnGpbLRAD+2OoHh15StxLo=
 
 Name: chrome/content/session/sessionStore.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: 5VC1rZE6M6lT0mjipjSq/w==
-SHA1-Digest: 4Qf1SEQO95h1Km50xtpDYmLVjfg=
+MD5-Digest: Rg+nq07LSRxEOH4hsI9YKg==
+SHA1-Digest: o1uXipjQGx2JzlZRMNpSMzM8vdA=
 
 Name: chrome/content/tab/scrollbox.xml
 Digest-Algorithms: MD5 SHA1
@@ -387,8 +387,8 @@ SHA1-Digest: RoL+FVXKuIvITsyAEUfwe9FITmk=
 
 Name: chrome/content/tab/tab.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: w7ViBzH5z7eIChDnu/43Hg==
-SHA1-Digest: NXC8q5ihEP07DmsFXHJ0WtpCFUI=
+MD5-Digest: dPwrXfafi+KLn3mXtD1OiQ==
+SHA1-Digest: i7IisMAnfPUj+xiA5S7Gy7K2StY=
 
 Name: chrome/content/tab/tabbrowser.xml
 Digest-Algorithms: MD5 SHA1
@@ -2022,8 +2022,8 @@ SHA1-Digest: 41EWLE/Eld7FZmLMwogHiDitUEQ=
 
 Name: modules/AsyncUtils.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: Wb3i3dPiyGyGWo2M1fT/ZQ==
-SHA1-Digest: 6cCg+hGMPOQQX2X/32Qn1QJhVEU=
+MD5-Digest: G3xPQUwLHBaVrCgL0RSktA==
+SHA1-Digest: I2ZawXvUsMJOnFK0X11krdizQjE=
 
 Name: modules/AutoReload.jsm
 Digest-Algorithms: MD5 SHA1
@@ -2032,13 +2032,13 @@ SHA1-Digest: p+oNSLFc8w/VzPfk917ot4VPuec=
 
 Name: modules/ContentClick.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: o7u/Ol51tcpgZMQiPzfO1g==
-SHA1-Digest: DWwmXtu7kMc6cNn6D20vEg/3XuM=
+MD5-Digest: uFtPRxt2pY1xCwKnkfWeBQ==
+SHA1-Digest: scHb/dkprcmmEpXamx6dFmm/rEA=
 
 Name: modules/ContextMenu.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: o5tggOWgphSFUpAQ/6ZkBQ==
-SHA1-Digest: 44m0AjwDEQs9VezIEHMW8ANtWts=
+MD5-Digest: zs/YUVNfwIVL6GH5m5kRyw==
+SHA1-Digest: ZMjAUHvog6Gwqcol+63NtX/rWZk=
 
 Name: modules/Decode.jsm
 Digest-Algorithms: MD5 SHA1
@@ -2047,18 +2047,18 @@ SHA1-Digest: MVzcUM01SLRF8p8GT7Mbtl2KNTo=
 
 Name: modules/DocShellCapabilities.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: v4qhNAxd0bHNuc/hXto8yg==
-SHA1-Digest: D2rt1rubdOUg915Swjx1J1T3u9I=
+MD5-Digest: BhLUDCdS2kKslK5e45+WZA==
+SHA1-Digest: kdYRZenbus5q/0a6KK6WH1cpbBs=
 
 Name: modules/DownloadLastDir.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: oI4DRP/q7Ri/ojtlbl7GKA==
-SHA1-Digest: zT3bTqkNxrglLNtHUMMkBL6KdjY=
+MD5-Digest: Jw/w0whiSQ/IGgMsuzkxiQ==
+SHA1-Digest: ASLHUyKlSLxk2RzQZ5rYGcy3G6g=
 
 Name: modules/DynamicRules.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: fTKtb5kVwhIDaIzcAO7W+g==
-SHA1-Digest: sBwMjUD9owwQ84ERRznbS2cOu54=
+MD5-Digest: 5iEtInwUwSDL2+TJrnvJsw==
+SHA1-Digest: PwBwA0XEKRoUvyA0ps1glMdXO04=
 
 Name: modules/LinkNodeUtils.jsm
 Digest-Algorithms: MD5 SHA1
@@ -2067,13 +2067,13 @@ SHA1-Digest: vxH4QUSj23nIG8h4vJV0xkfzQBQ=
 
 Name: modules/log.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: +KluleeAnpIbx4jWWyd04w==
-SHA1-Digest: 13wpYjttM3ADh+lehaBSkYCf0tI=
+MD5-Digest: srGBYnwnIFFtRylIdX5Mug==
+SHA1-Digest: TESTHqRNhyaqmr5q5pdslfhZAeU=
 
 Name: modules/MergeWindows.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: womsImP/rpWkNnFRHCq+xw==
-SHA1-Digest: /FzZyta3y4kxEMZQytDo48e68OQ=
+MD5-Digest: HuLZKYy2PkKLrqAvy9LGHw==
+SHA1-Digest: AXqbIS7fs/HlxoMyvi2lFsc//7M=
 
 Name: modules/NewTabURL.jsm
 Digest-Algorithms: MD5 SHA1
@@ -2082,8 +2082,8 @@ SHA1-Digest: bcNadHzBsBxNXOXrDWaiOpqollA=
 
 Name: modules/Places.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: fm8Yr8RiM+ob6QW3nmxpvg==
-SHA1-Digest: 9MWascc9XLqjAy7rAtURizBAy3A=
+MD5-Digest: Ot3rNn6vqdZ2x1+Dj3norg==
+SHA1-Digest: vdydiQRWYTcOcSAYYD9C3Rdx0Iw=
 
 Name: modules/RenameTab.jsm
 Digest-Algorithms: MD5 SHA1
@@ -2092,8 +2092,8 @@ SHA1-Digest: ayf+UM/PHxKKVLDWiGzYCgZ6Q9M=
 
 Name: modules/Services.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: 8BllQS3S53t2X72KyHkXbg==
-SHA1-Digest: I+xD2DxcA+CARze1Ai2Z7aFxcys=
+MD5-Digest: kgPzcYRqNhWsDc4IckpAfg==
+SHA1-Digest: pwnVk5Jzf6s7WaErpfHBXDDrFyk=
 
 Name: modules/Shortcuts.jsm
 Digest-Algorithms: MD5 SHA1
@@ -2117,8 +2117,8 @@ SHA1-Digest: zs1zO6rUCQXx4/GQjpnzuX7qGYI=
 
 Name: modules/Utils.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: VpZjKQetA/Hrz5dyvuNoRA==
-SHA1-Digest: tX+2MrHyyv5DiaskA4ZhNgqgM74=
+MD5-Digest: GLBRgxmL7yI56ovxSm7PQg==
+SHA1-Digest: 9mfmdwfOJh1LQV6eA1zP144jDho=
 
 Name: modules/extensions/AddonManager.jsm
 Digest-Algorithms: MD5 SHA1
diff --git a/META-INF/mozilla.rsa b/META-INF/mozilla.rsa
index 7e15c91..f5f9259 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 1daf161..3c95f57 100644
--- a/META-INF/mozilla.sf
+++ b/META-INF/mozilla.sf
@@ -1,4 +1,4 @@
 Signature-Version: 1.0
-MD5-Digest-Manifest: CU/ajd7dNlEY0zN+tTzXBA==
-SHA1-Digest-Manifest: iIOUB082slY6ACxLphM20gYPJoU=
+MD5-Digest-Manifest: PPLqdhSaITrBZH2beB7MwQ==
+SHA1-Digest-Manifest: 9unlXEZV92PI+aZd5jhgqJYtZuc=
 
diff --git a/chrome/content/about.js b/chrome/content/about.js
index 2ff7aca..1b7d57e 100644
--- a/chrome/content/about.js
+++ b/chrome/content/about.js
@@ -1,7 +1,7 @@
 /* exported init */
 "use strict";
 
-function init() { // jshint ignore:line
+function init() {
   var addon = window.arguments[0];
   var extensionsStrings = document.getElementById("extensionsStrings");
   var extensionVersion, currentVersion;
diff --git a/chrome/content/changecode.js b/chrome/content/changecode.js
index 72b7026..0db6724 100644
--- a/chrome/content/changecode.js
+++ b/chrome/content/changecode.js
@@ -1,4 +1,3 @@
-/* jshint strict: false */
 /* eslint strict: 0 */
 
 // don't use strict for this file
@@ -180,7 +179,6 @@ Tabmix.nonStrictMode = function(aObj, aFn, aArg) {
 };
 
 (function(obj) {
-  /* jshint moz: true, esnext: false */
   let global = Components.utils.getGlobalForObject(obj);
   let fn = global["ev" + "al"];
   Tabmix._makeCode = function(name, code) {
diff --git a/chrome/content/click/click.js b/chrome/content/click/click.js
index 8e56036..204b191 100644
--- a/chrome/content/click/click.js
+++ b/chrome/content/click/click.js
@@ -608,6 +608,9 @@ var TabmixContext = {
     if (!gContextMenu || event.originalTarget != document.getElementById("contentAreaContextMenu"))
       return true;
 
+    gContextMenu.tabmixLinks = Tabmix.contextMenuLinks;
+    Tabmix.contextMenuLinks = null;
+
     var tab = gBrowser.selectedTab;
     try {
       var contentClick = gContextMenu.onTextInput || gContextMenu.onLink || gContextMenu.onImage;
@@ -730,26 +733,8 @@ var TabmixContext = {
   },
 
   openMultipleLinks: function TMP_openMultipleLinks(check) {
-    let urls = [];
-    let browser = window.gBrowser.selectedBrowser;
-
-    function getLinks() {
-      try {
-        let handler = TabmixSvc.syncHandlers.get(browser.permanentKey);
-        let result = handler.getSelectedLinks();
-        gContextMenu.tabmixLinks = result && result.split('\n');
-      } catch (ex) {
-        Tabmix.log("unable to get syncHandlers for page " +
-                   browser.currentURI.spec + "\n" + ex);
-      }
-      return gContextMenu.tabmixLinks || [];
-    }
-
-    if (Tabmix.isVersion(320))
-      urls = gContextMenu.tabmixLinks || getLinks();
-    // getSelectedLinks was not implemented for remote tabs before Firefox 32
-    else if (browser.getAttribute("remote") != "true")
-      urls = Tabmix.ContextMenu.getSelectedLinks(content, check);
+    let urls = Tabmix.isVersion(420) ? gContextMenu.tabmixLinks :
+        Tabmix.ContextMenu.getSelectedLinks(content, check);
 
     if (!check && urls.length) {
       Tabmix.loadTabs(urls, false);
diff --git a/chrome/content/content.js b/chrome/content/content.js
index e6cfe8f..492b3dc 100644
--- a/chrome/content/content.js
+++ b/chrome/content/content.js
@@ -1,7 +1,7 @@
 /* eslint mozilla/balanced-listeners:0 */
 "use strict";
 
-var {classes: Cc, interfaces: Ci, utils: Cu} = Components; // jshint ignore:line
+var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
 
@@ -50,10 +50,6 @@ var TabmixContentHandler = {
   init: function() {
     this.MESSAGES.forEach(m => addMessageListener(m, this));
 
-    // Send a CPOW to the parent so that it can synchronously request
-    // docShell capabilities.
-    sendSyncMessage("Tabmix:SetSyncHandler", {}, {syncHandler: this});
-
     if (PROCESS_TYPE_CONTENT) {
       addEventListener("drop", this.onDrop);
     }
@@ -145,15 +141,6 @@ var TabmixContentHandler = {
     return DocShellCapabilities.collect(docShell).join(",") || "";
   },
 
-  getSelectedLinks: function() {
-    return ContextMenu.getSelectedLinks(content).join("\n");
-  },
-
-  wrapNode: function(node) {
-    let window = TabmixClickEventHandler._focusedWindow;
-    return LinkNodeUtils.wrap(node, window);
-  },
-
   onDrop: function(event) {
     let uri, name = { };
     let linkHandler = Cc["@mozilla.org/content/dropped-link-handler;1"].
@@ -382,6 +369,28 @@ var AboutNewTabHandler = {
   }
 };
 
+var ContextMenuHandler = {
+  init: function(global) {
+    Cc["@mozilla.org/eventlistenerservice;1"]
+      .getService(Ci.nsIEventListenerService)
+      .addSystemEventListener(global, "contextmenu", this.prepareContextMenu, true);
+  },
+
+  prepareContextMenu: function(event) {
+    if (event.defaultPrevented) {
+      return;
+    }
+
+    let links;
+    if (TabmixSvc.prefBranch.getBoolPref("openAllLinks")) {
+      links = ContextMenu.getSelectedLinks(content).join("\n");
+    }
+
+    sendRpcMessage("Tabmix:contextmenu", {links: links});
+  }
+};
+
 TabmixContentHandler.init();
 TabmixClickEventHandler.init(this);
 AboutNewTabHandler.init(this);
+ContextMenuHandler.init(this);
diff --git a/chrome/content/extensions/extensions.js b/chrome/content/extensions/extensions.js
index 5e94150..8badcb9 100644
--- a/chrome/content/extensions/extensions.js
+++ b/chrome/content/extensions/extensions.js
@@ -77,6 +77,7 @@ var TMP_extensionsCompatibility = {
     try {
       if ("TreeStyleTabService" in window) {
         this.treeStyleTab.onContentLoaded();
+        this.treeStyleTab.installed = true;
         Tabmix.extensions.treeStyleTab = true;
         Tabmix.extensions.verticalTabBar = true;
       }
@@ -127,7 +128,7 @@ var TMP_extensionsCompatibility = {
             aTab.setAttribute("image", browser.mIconURL);
           else
             aTab.removeAttribute("image");
-          gBrowser._tabAttrModified(aTab);
+          gBrowser._tabAttrModified(aTab, ["image"]);
         }
       }
     }
@@ -566,6 +567,7 @@ TMP_extensionsCompatibility.newsfox = {
  *  https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/
  */
 TMP_extensionsCompatibility.treeStyleTab = {
+  installed: false,
   errorMsg: "Error in Tabmix when trying to load compatible functions with TreeStyleTab extension",
 
   preInit: function() {
@@ -766,10 +768,41 @@ TMP_extensionsCompatibility.treeStyleTab = {
         'TreeStyleTabService.readyToOpenChildTab(gBrowser, true); $1 TreeStyleTabService.stopToOpenChildTab(gBrowser);'
       ).toCode();
     }
+  },
 
-    Tabmix.changeCode(window, "window.TMP_BrowserOpenTab")._replace(
-      'var newTab = gBrowser.addTab',
-      'gBrowser.treeStyleTab.onBeforeNewTabCommand();\n   $&'
-    ).toCode();
-  }
+  onBeforeNewTabCommand: function(tab, openTabNext) {
+    if (!this.installed) {
+      return;
+    }
+    if (openTabNext) {
+      this.openNewTabNext(tab, true);
+    } else {
+      gBrowser.treeStyleTab.onBeforeNewTabCommand();
+    }
+  },
+
+  // instruct treeStyleTab to use 'kNEWTAB_OPEN_AS_NEXT_SIBLING' when our preference
+  // is to open the tab next
+  openNewTabNext: function(tab, openTabNext, clean) {
+    if (!this.installed || !openTabNext) {
+      return;
+    }
+
+    let tst = gBrowser.treeStyleTab;
+    let browser = tst.getBrowserFromTabBrowserElements(tab);
+    if (!browser) {
+      return;
+    }
+    let baseTab = tst.getTabFromBrowser(browser, tst.getTabBrowserFromChild(browser));
+
+    // clean previously ready state set by treeStyleTab
+    if (clean) {
+      tst.stopToOpenChildTab(baseTab);
+      let parentTab = tst.getParentTab(baseTab);
+      if (parentTab) {
+        tst.stopToOpenChildTab(parentTab);
+      }
+    }
+    tst.readyToOpenNextSiblingTabNow(baseTab);
+  },
 };
diff --git a/chrome/content/links/setup.js b/chrome/content/links/setup.js
index 97e9628..59f7972 100644
--- a/chrome/content/links/setup.js
+++ b/chrome/content/links/setup.js
@@ -341,7 +341,7 @@ Tabmix.adjustTabstrip = function tabContainer_adjustTabstrip(skipUpdateScrollSta
   *  Don't use return in this function
   *  TreeStyleTabe add some code at the end
   */
-  let transitionend = Tabmix.callerName() == "onxbltransitionend";
+  let transitionend = Tabmix.callerTrace("onxbltransitionend");
   if (tabsCount == 1) {
     let tab = this.selectedItem;
     if (!aUrl) {
diff --git a/chrome/content/links/userInterface.js b/chrome/content/links/userInterface.js
index b3d3ad7..a944536 100644
--- a/chrome/content/links/userInterface.js
+++ b/chrome/content/links/userInterface.js
@@ -158,6 +158,10 @@ function TMP_BrowserOpenTab(aTab, replaceLastTab) {
       TabmixSvc.prefs.get("extensions.privateTab.makeNewEmptyTabsPrivate", 0) === 0) {
     privateTab.readyToOpenTab(false);
   }
+
+  let baseTab = aTab && aTab.localName == "tab" ? aTab : null;
+  let openTabNext = baseTab || !replaceLastTab && Tabmix.prefs.getBoolPref("openNewTabNext");
+  TMP_extensionsCompatibility.treeStyleTab.onBeforeNewTabCommand(baseTab || selectedTab, openTabNext);
   var newTab = gBrowser.addTab(url, {
     charset: loadBlank ? null : gBrowser.selectedBrowser.characterSet,
     ownerTab: loadInBackground ? null : selectedTab,
@@ -176,12 +180,8 @@ function TMP_BrowserOpenTab(aTab, replaceLastTab) {
     }
   }
 
-  if (aTab && aTab.localName == "tab")
-    gBrowser.moveTabTo(newTab, aTab._tPos + 1);
-  else if (!replaceLastTab && Tabmix.prefs.getBoolPref("openNewTabNext")) {
-    // we used to move tab after lastRelatedTab but we don't need it on new tabs
-    // and it mess with recently used tabs order
-    gBrowser.moveTabTo(newTab, selectedTab._tPos + 1);
+  if (openTabNext) {
+    gBrowser.moveTabTo(newTab, (baseTab || selectedTab)._tPos + 1);
   }
   // make sure to update recently used tabs
   // if user open many tabs quickly select event don't have time to fire
diff --git a/chrome/content/minit/minit.js b/chrome/content/minit/minit.js
index f7e2470..6365e26 100644
--- a/chrome/content/minit/minit.js
+++ b/chrome/content/minit/minit.js
@@ -365,10 +365,10 @@ var TMP_tabDNDObserver = {
     event.stopPropagation();
 
     document.getElementById("tabmix-tooltip").hidePopup();
-    /* jshint ignore:start */ /* eslint-disable */
+    /* eslint-disable */
     // old TreeStyleTab extension version look for isTabReorder in our code
     var isTabReorder = draggeType == this.DRAG_TAB_IN_SAME_WINDOW;
-    /* jshint ignore:end */ /* eslint-enable */
+    /* eslint-enable */
     var newIndex = this._getDNDIndex(event);
     var oldIndex = draggedTab ? draggedTab._tPos : -1;
     var left_right;
@@ -1191,6 +1191,7 @@ Tabmix.navToolbox = {
         Tabmix.originalFunctions.oldHandleCommand.toString().indexOf(TMP_fn) > -1)
       return;
 
+    let $LF = "\n                ";
     // we don't do anything regarding IeTab and URL Suffix extensions
     Tabmix.changeCode(obj, "gURLBar." + fn, {silent: this.urlBarInitialized})._replace(
       '{',
@@ -1218,8 +1219,14 @@ Tabmix.navToolbox = {
       '(where == "current" || !isMouseEvent && !loadNewTab && /^tab/.test(where))'
     )._replace(
       'openUILinkIn(url, where, params);',
-      'params.inBackground = Tabmix.prefs.getBoolPref("loadUrlInBackground");\
-       $&'
+      'params.inBackground = Tabmix.prefs.getBoolPref("loadUrlInBackground");' + $LF +
+      'if (/^tab/.test(where)) {' + $LF +
+      '  let openTabNext = Tabmix.prefs.getBoolPref("openTabNext") &&' + $LF +
+      '    !Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent");' + $LF +
+      '  TMP_extensionsCompatibility.treeStyleTab' + $LF +
+      '    .openNewTabNext(gBrowser.selectedTab, openTabNext);' + $LF +
+      '}' + $LF +
+      '$&'
     ).toCode();
 
     // don't call ChangeCode.isValidToChange after urlbar initialized,
diff --git a/chrome/content/minit/tablib.js b/chrome/content/minit/tablib.js
index 7f20c25..0d8d357 100644
--- a/chrome/content/minit/tablib.js
+++ b/chrome/content/minit/tablib.js
@@ -155,8 +155,8 @@ var tablib = { // eslint-disable-line
 
     Tabmix.changeCode(obj, "gBrowser." + fnName)._replace(
       '{', '{\n' +
-      '            let dontMove, isPending, stack = Tabmix.stackTrace(),\n' +
-      '                isRestoringTab = stack.contain("ssi_restoreWindow");\n'
+      '            let dontMove, isPending, callerTrace = Tabmix.callerTrace(),\n' +
+      '                isRestoringTab = callerTrace.contain("ssi_restoreWindow");\n'
     )._replace(
       'let params = arguments[1];',
       '$&\n' +
@@ -198,7 +198,7 @@ var tablib = { // eslint-disable-line
       't.dispatchEvent(evt);' +
       'var openTabnext = Tabmix.prefs.getBoolPref("openTabNext");' +
       'if (openTabnext) {' +
-      '  if (dontMove || Tabmix.dontMoveNewTab(stack))' +
+      '  if (dontMove || Tabmix.dontMoveNewTab(callerTrace))' +
       '    openTabnext = false;' +
       '  else if (!Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent"))' +
       '    aRelatedToCurrent = true;' +
@@ -207,8 +207,8 @@ var tablib = { // eslint-disable-line
       't.owner = this.selectedTab;', 't.owner = _selectedTab;'
     ).toCode();
 
-    Tabmix.dontMoveNewTab = function(stack) {
-      return stack.contain("ssi_restoreWindow", "ssi_duplicateTab");
+    Tabmix.dontMoveNewTab = function(callerTrace) {
+      return callerTrace.contain("ssi_restoreWindow", "ssi_duplicateTab");
     };
 
     // ContextMenu Extensions raplce the original removeTab function
@@ -499,7 +499,7 @@ var tablib = { // eslint-disable-line
     // before our mousedown handler can prevent it
     Tabmix.changeCode(tabBar, "gBrowser.tabContainer._selectNewTab")._replace(
       '{',
-      '{if(!Tabmix.prefs.getBoolPref("selectTabOnMouseDown") && Tabmix.isCallerInList("onxblmousedown")) return;'
+      '{if(!Tabmix.prefs.getBoolPref("selectTabOnMouseDown") && Tabmix.callerTrace("onxblmousedown")) return;'
     ).toCode();
 
     Tabmix.changeCode(tabBar, "gBrowser.tabContainer.visible", {setter: true})._replace(
@@ -571,22 +571,28 @@ var tablib = { // eslint-disable-line
         arguments[1] = "tabshifted";
       }
 
+      if (where == window) {
+        return Tabmix.originalFunctions.duplicateTabIn.apply(this, arguments);
+      }
+
+      let pref = Tabmix.callerTrace("gotoHistoryIndex", "BrowserForward", "BrowserBack") ?
+          "openTabNext" : "openDuplicateNext";
+      let openTabNext = Tabmix.prefs.getBoolPref(pref);
+      TMP_extensionsCompatibility.treeStyleTab.openNewTabNext(aTab, openTabNext, true);
+
       let result = Tabmix.originalFunctions.duplicateTabIn.apply(this, arguments);
 
-      if (where != window) {
-        let pref = Tabmix.isCallerInList("gotoHistoryIndex", "BrowserForward", "BrowserBack") ?
-            "openTabNext" : "openDuplicateNext";
-        let newTab = gBrowser.getTabForLastPanel();
-        if (Tabmix.prefs.getBoolPref(pref)) {
-          let pos = newTab._tPos > aTab._tPos ? 1 : 0;
-          gBrowser.moveTabTo(newTab, aTab._tPos + pos);
-        }
-        let bgLoad = Tabmix.prefs.getBoolPref("loadDuplicateInBackground");
-        let selectNewTab = where == "tab" ? !bgLoad : bgLoad;
-        if (selectNewTab) {
-          gBrowser.selectedTab = newTab;
-        }
+      let newTab = gBrowser.getTabForLastPanel();
+      if (openTabNext) {
+        let pos = newTab._tPos > aTab._tPos ? 1 : 0;
+        gBrowser.moveTabTo(newTab, aTab._tPos + pos);
       }
+      let bgLoad = Tabmix.prefs.getBoolPref("loadDuplicateInBackground");
+      let selectNewTab = where == "tab" ? !bgLoad : bgLoad;
+      if (selectNewTab) {
+        gBrowser.selectedTab = newTab;
+      }
+
       return result;
     };
 
@@ -786,7 +792,7 @@ var tablib = { // eslint-disable-line
 
     Tabmix.changeCode(window, "goQuitApplication")._replace(
       'var appStartup',
-      'let closedtByToolkit = Tabmix.isCallerInList("toolkitCloseallOnUnload");' +
+      'let closedtByToolkit = Tabmix.callerTrace("toolkitCloseallOnUnload");' +
       'if (!TabmixSessionManager.canQuitApplication(closedtByToolkit))' +
       '  return false;' +
       '$&'
@@ -934,8 +940,11 @@ var tablib = { // eslint-disable-line
         aTab = this.mCurrentTab;
 
       var newTab = null;
-      // try to have SessionStore duplicate the given tab
+      let copyToNewWindow = window != aTab.ownerDocument.defaultView;
+      let openDuplicateNext = !disallowSelect && !copyToNewWindow && Tabmix.prefs.getBoolPref("openDuplicateNext");
+      TMP_extensionsCompatibility.treeStyleTab.openNewTabNext(aTab, openDuplicateNext);
 
+      // try to have SessionStore duplicate the given tab
       if (!aHref && !aTabData) {
         newTab = TabmixSvc.ss.duplicateTab(window, aTab, 0);
       } else {
@@ -952,8 +961,7 @@ var tablib = { // eslint-disable-line
       this.selectedBrowser.focus();
 
       // move new tab to place before we select it
-      var copyToNewWindow = window != aTab.ownerDocument.defaultView;
-      if (!disallowSelect && !copyToNewWindow && Tabmix.prefs.getBoolPref("openDuplicateNext")) {
+      if (openDuplicateNext) {
         let pos = newTab._tPos > aTab._tPos ? 1 : 0;
         this.moveTabTo(newTab, aTab._tPos + pos);
       }
@@ -985,7 +993,6 @@ var tablib = { // eslint-disable-line
       }
       // we need to update history title after the new page loaded for use in back/forword button
       function updateNewHistoryTitle() {
-        /* jshint validthis: true */
         try {
           this.removeEventListener("SSTabRestored", updateNewHistoryTitle, true);
           let browser = this.linkedBrowser;
@@ -1000,7 +1007,6 @@ var tablib = { // eslint-disable-line
         }
       }
       function urlForDownload() {
-        /* jshint validthis: true */
         try {
           this.removeEventListener("SSTabRestored", urlForDownload, true);
           let browser = this.linkedBrowser;
@@ -1111,8 +1117,10 @@ var tablib = { // eslint-disable-line
         let json = {button: 0, shiftKey: false, ctrlKey: false, metaKey: false,
                     altKey: false, target: {},
                     tabmix_openLinkWithHistory: true};
+        // we only get here when it is safe to use contentWindowAsCPOW
+        // see TabmixContext.updateMainContextMenu
         let result = Tabmix.ContentClick.getParamsForLink(json,
-              target, url, browser, document.commandDispatcher.focusedWindow);
+              target, url, browser, gBrowser.selectedBrowser._contentWindow);
         return result._href && isValid(result._href) ? result._href : null;
       }
       return url;
@@ -1331,7 +1339,7 @@ var tablib = { // eslint-disable-line
         aTab.setAttribute("mergeselected", "true");
         aTab.label = "(*) " + aTab.label;
       }
-      this._tabAttrModified(aTab);
+      this._tabAttrModified(aTab, ["label"]);
       if (TabmixTabbar.widthFitTitle) {
         TabmixTabbar.updateScrollStatus();
         TabmixTabbar.updateBeforeAndAfter();
@@ -1462,8 +1470,9 @@ var tablib = { // eslint-disable-line
 
     let warnAboutClosingTabs = function(whatToClose, aTab, aDomain) {
       // see tablib.closeWindow comment
-      if (Tabmix.isCallerInList("BG__onQuitRequest"))
+      if (Tabmix.callerTrace("BG__onQuitRequest")) {
         return true;
+      }
       var closing = this.closingTabsEnum;
       // try to cach call from other extensions to warnAboutClosingTabs (before Firefox 24)
       if (typeof (whatToClose) == "boolean")
@@ -1867,8 +1876,7 @@ var tablib = { // eslint-disable-line
     // we always show our prompt on Mac
     var showPrompt = TabmixSvc.isMac || !isAfterFirefoxPrompt();
     // get caller caller name and make sure we are not on restart
-    var quitType = Tabmix.getCallerNameByIndex(2);
-    var askBeforSave = quitType != "restartApp" && quitType != "restart";
+    var askBeforSave = !Tabmix.callerTrace("restartApp", "restart");
     var isLastWindow = Tabmix.isLastBrowserWindow;
     var result = TabmixSessionManager.deinit(isLastWindow, askBeforSave);
     var canClose = result.canClose;
diff --git a/chrome/content/overlay/browsr.css b/chrome/content/overlay/browsr.css
index c5a982e..55b42f4 100644
--- a/chrome/content/overlay/browsr.css
+++ b/chrome/content/overlay/browsr.css
@@ -322,8 +322,3 @@ so display: none !important; does not hide the button */
 #tabmix-rows-tooltip:not([flowing="multibar"]) {
   display: none;
 }
-
-#main-window[tabsintitlebar][tabmix-tabbaronbottom] .tabbrowser-tabbox,
-#main-window[tabsintitlebar] #TabsToolbar[tabmix-disallow-drag] {
-  -moz-window-dragging: no-drag;
-}
diff --git a/chrome/content/overlay/firefox.css b/chrome/content/overlay/firefox.css
index e27341a..2d18c5a 100644
--- a/chrome/content/overlay/firefox.css
+++ b/chrome/content/overlay/firefox.css
@@ -15,3 +15,9 @@
   */
   margin-top: 1px !important;
 }
+
+/* -moz-window-dragging is not recognize by Plaemoon */
+#main-window[tabsintitlebar][tabmix-tabbaronbottom] .tabbrowser-tabbox,
+#main-window[tabsintitlebar] #TabsToolbar[tabmix-disallow-drag] {
+  -moz-window-dragging: no-drag;
+}
diff --git a/chrome/content/places/places.js b/chrome/content/places/places.js
index e78ceaf..f137f3b 100644
--- a/chrome/content/places/places.js
+++ b/chrome/content/places/places.js
@@ -63,7 +63,7 @@ var TMP_Places = {
       let $LF = '\n        ';
       Tabmix.changeCode(PlacesCommandHook, "uniqueCurrentPages", {getter: true})._replace(
         'URIs.push(tab.linkedBrowser.currentURI);',
-        'if (Tabmix.getCallerNameByIndex(2) == "PCH_updateBookmarkAllTabsCommand") {' + $LF +
+        'if (Tabmix.callerTrace("PCH_updateBookmarkAllTabsCommand")) {' + $LF +
         '  $&' + $LF +
         '} else {' + $LF +
         '  let uri = tab.linkedBrowser.currentURI;' + $LF +
@@ -312,7 +312,7 @@ var TMP_Places = {
       aTab.label = title;
       aTab.crop = title != aUrl || aUrl == TabmixSvc.aboutBlank ? "end" : "center";
       aTab.setAttribute("tabmix_changed_label", title);
-      gBrowser._tabAttrModified(aTab);
+      gBrowser._tabAttrModified(aTab, ["label", "crop"]);
       if (aTab.selected)
         gBrowser.updateTitlebar();
       if (!aTab.hasAttribute("faviconized"))
@@ -683,11 +683,12 @@ Tabmix.onContentLoaded = {
     )._replace(
       'return shift ? "tabshifted" : "tab";',
       '{' + $LF +
+      'let callerTrace = Tabmix.callerTrace();' + $LF +
       'let list = ["openUILink", "handleLinkClick", "TMP_tabshifted", "TMP_contentLinkClick"];' + $LF +
-      'let pref = Tabmix.isCallerInList(list) ?' + $LF +
+      'let pref = callerTrace.contain(list) ?' + $LF +
       '    "extensions.tabmix.inversefocusLinks" : "extensions.tabmix.inversefocusOther";' + $LF +
       'let notOneClickSearch = !getBoolPref("browser.search.showOneOffButtons", false) ||' + $LF +
-      '                        Tabmix.callerName() != "onPopupClick";' + $LF +
+      '                        !callerTrace.contain("onPopupClick");' + $LF +
       'if (notOneClickSearch && getBoolPref(pref, true))' + $LF +
       '  shift = !shift;' + $LF +
       '$&' + $LF +
@@ -703,11 +704,11 @@ Tabmix.onContentLoaded = {
     Tabmix.changeCode(fnObj, fnName)._replace(
       '{',
       '{\n' +
-      '  let tabmixCaller = Tabmix.getCallerNameByIndex(2);\n' +
-      '  if (tabmixCaller == "BG_observe") {\n' +
+      '  let callerTrace = Tabmix.callerTrace();\n' +
+      '  if (callerTrace.contain("BG_observe")) {\n' +
       '    params.inBackground = getBoolPref("browser.tabs.loadInBackground");\n' +
       '  } else if (where == "current" &&\n' +
-      '      tabmixCaller == "ReaderParent.toggleReaderMode") {\n' +
+      '      callerTrace.contain("ReaderParent.toggleReaderMode")) {\n' +
       '    gBrowser.selectedBrowser.tabmix_allowLoad = true;\n' +
       '  }\n'
     )._replace(
diff --git a/chrome/content/preferences/appearance.js b/chrome/content/preferences/appearance.js
index 68ad4e5..64cd6c3 100644
--- a/chrome/content/preferences/appearance.js
+++ b/chrome/content/preferences/appearance.js
@@ -1,7 +1,7 @@
 /* exported gAppearancePane */
 "use strict";
 
-var gAppearancePane = { // jshint ignore:line
+var gAppearancePane = {
   init: function() {
     var browserWindow = Tabmix.getTopWin();
     // disable options for position the tabbar and scroll mode if TreeStyleTab extension installed
diff --git a/chrome/content/preferences/menu.js b/chrome/content/preferences/menu.js
index 523693b..8780e6e 100644
--- a/chrome/content/preferences/menu.js
+++ b/chrome/content/preferences/menu.js
@@ -1,7 +1,7 @@
 /* exported gMenuPane */
 "use strict";
 
-var gMenuPane = { // jshint ignore:line
+var gMenuPane = {
   init: function() {
     $("pinTab").label = gPrefWindow.pinTabLabel;
     $("togglePinTab").setAttribute("label", gPrefWindow.pinTabLabel);
diff --git a/chrome/content/preferences/overlay/preferencesOverlay.js b/chrome/content/preferences/overlay/preferencesOverlay.js
index 5115e91..31e1332 100644
--- a/chrome/content/preferences/overlay/preferencesOverlay.js
+++ b/chrome/content/preferences/overlay/preferencesOverlay.js
@@ -2,7 +2,7 @@
 
 Components.utils.import("resource://tabmixplus/Services.jsm");
 
-var gTabMix_preferencesOverlay = { // jshint ignore:line
+var gTabMix_preferencesOverlay = {
   id: function(id) {
     return document.getElementById(id);
   },
diff --git a/chrome/content/preferences/preferences.js b/chrome/content/preferences/preferences.js
index 4b24061..013d72c 100644
--- a/chrome/content/preferences/preferences.js
+++ b/chrome/content/preferences/preferences.js
@@ -1,4 +1,3 @@
-/* jshint esnext: true */
 /* globals _sminstalled, gPreferenceList */
 /* exported  defaultSetting, toggleSyncPreference, exportData, importData,
              showPane, openHelp */
@@ -6,12 +5,12 @@
 
 /***** Preference Dialog Functions *****/
 var gIncompatiblePane;
-var {classes: Cc, interfaces: Ci, utils: Cu} = Components; // jshint ignore:line
+var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 var PrefFn = {0: "", 32: "CharPref", 64: "IntPref", 128: "BoolPref"};
 
 this.$ = id => document.getElementById(id);
 
-var gPrefWindow = { // jshint ignore:line
+var gPrefWindow = {
   widthChanged: false,
   _initialized: false,
   init: function() {
diff --git a/chrome/content/preferences/session.xul b/chrome/content/preferences/session.xul
index 07da5f7..4fd070c 100644
--- a/chrome/content/preferences/session.xul
+++ b/chrome/content/preferences/session.xul
@@ -3,8 +3,6 @@
 <!DOCTYPE overlay [
 <!ENTITY % pref-tabmixDTD SYSTEM "chrome://tabmixplus/locale/pref-tabmix.dtd">
 %pref-tabmixDTD;
-<!ENTITY % tabsDTD SYSTEM "chrome://browser/locale/preferences/tabs.dtd">
-%tabsDTD;
 ]>
 
 <overlay id="SessionPaneOverlay"
@@ -66,8 +64,6 @@
                   name="extensions.tabmix.sessions.restore.concatenate"      type="bool"/>
       <preference id="pref_onRestore.reloadall"
                   name="extensions.tabmix.sessions.restore.reloadall"        type="bool"/>
-      <preference id="pref_restore_on_demand"
-                  name="browser.sessionstore.restore_on_demand"              type="bool"/>
       <preference id="pref_session.History"
                   name="extensions.tabmix.sessions.save.history"             type="bool"/>
       <preference id="pref_session.Permissions"
@@ -213,8 +209,6 @@
                             preference="pref_onOverwrite-Save" observes="obs_onRestore.overwritewindows"/>
                   <checkbox_tmp id="onRestore.concatenate" label="&sm.restore.merge;" preference="pref_onRestore.concatenate"/>
                   <checkbox_tmp id="onRestore.reloadall" label="&sm.restore.bypassCache;" preference="pref_onRestore.reloadall"/>
-                  <checkbox id="restoreOnDemand" label="&restoreTabsOnDemand.label;"
-                            preference="pref_restore_on_demand"/>
                 </groupbox>
               </tabpanel>
               <!-- Build-in SessionStore (we hide thid panel, don't put it in first or last tab)-->
diff --git a/chrome/content/preferences/subdialogs/pref-appearance.js b/chrome/content/preferences/subdialogs/pref-appearance.js
index 9029a16..6e77275 100644
--- a/chrome/content/preferences/subdialogs/pref-appearance.js
+++ b/chrome/content/preferences/subdialogs/pref-appearance.js
@@ -3,7 +3,7 @@
 
 var $ = id => document.getElementById(id);
 
-var tabstyles = { // jshint ignore:line
+var tabstyles = {
   pref: "appearance_tab",
   init: function() {
     $("stylestabs").selectedIndex = Tabmix.prefs.prefHasUserValue(this.pref) ?
diff --git a/chrome/content/session/sessionStore.js b/chrome/content/session/sessionStore.js
index fc27e80..d07b339 100644
--- a/chrome/content/session/sessionStore.js
+++ b/chrome/content/session/sessionStore.js
@@ -6,7 +6,7 @@
  * original code by onemen
  *
  */
-var TMP_SessionStore = { // jshint ignore:line
+var TMP_SessionStore = {
   // get title for closed window from bookmark title or user tab title
   getTitleForClosedWindow: function TMP_ss_getTitleForClosedWindow(aUndoItem) {
     // if user already rename this item wo don't use other title
@@ -287,7 +287,7 @@ var TMP_SessionStore = { // jshint ignore:line
 
 };
 
-var TMP_ClosedTabs = { // jshint ignore:line
+var TMP_ClosedTabs = {
   _buttonBroadcaster: null,
   get buttonBroadcaster() {
     if (!this._buttonBroadcaster)
@@ -608,7 +608,7 @@ var TMP_ClosedTabs = { // jshint ignore:line
 
 };
 
-var TabmixConvertSession = { // jshint ignore:line
+var TabmixConvertSession = {
   get getTitle() {
     return TabmixSvc.getString("incompatible.title") + " - " + TabmixSvc.getSMString("sm.title");
   },
diff --git a/chrome/content/tab/tab.js b/chrome/content/tab/tab.js
index 966281c..271b5f8 100644
--- a/chrome/content/tab/tab.js
+++ b/chrome/content/tab/tab.js
@@ -254,7 +254,7 @@ var TabmixTabbar = {
       return;
     }
 
-    var newHeight, fillRowsHeights;
+    var newHeight, fillRowsHeights, updateAppearanceOnce;
     if (typeof (this._heights[tabsPosition]) == "undefined") {
       this._heights[tabsPosition] = {};
       fillRowsHeights = true;
@@ -262,6 +262,7 @@ var TabmixTabbar = {
     if (aRows in this._heights[tabsPosition])
       newHeight = this._heights[tabsPosition][aRows];
     else {
+      updateAppearanceOnce = true;
       if (Tabmix.tabsUtils.tabstripInnerbox) {
         let height = Tabmix.tabsUtils.tabstripInnerbox.getBoundingClientRect().height;
         if (tabBar.getAttribute("multibar") == "scrollbar") {
@@ -292,8 +293,7 @@ var TabmixTabbar = {
       this.setHeightByPixels(newHeight);
 
     // fix multi-row background on windows XP
-    if (this.updateAppearanceOnce) {
-      this.updateAppearanceOnce = false;
+    if (this.updateAppearanceOnce && updateAppearanceOnce) {
       TabsInTitlebar.updateAppearance(true);
     }
   },
@@ -826,8 +826,8 @@ Tabmix.tabsUtils = {
           Services.prefs.getBoolPref("browser.tabs.animate")) {
         // after 250ms new tab is fully opened
         if (!this.adjustNewtabButtonTimeout) {
-          let timeout = 250, callerName = Tabmix.callerName();
-          if (callerName == "onxbloverflow") {
+          let timeout = 250;
+          if (Tabmix.callerTrace("onxbloverflow")) {
             let timeFromLastTabOpened = Date.now() - Tabmix._lastTabOpenedTime;
             if (timeFromLastTabOpened < 250)
               timeout = 0;
@@ -1796,6 +1796,13 @@ gTMPprefObserver = {
   },
 
   miscellaneousRules: function TMP_PO_miscellaneousRules() {
+    // make sure we have valid height for the buttons. with some extensions
+    // combination it is possible to get zero height, if Tabmix.getButtonsHeight
+    // called to early
+    if (!Tabmix._buttonsHeight) {
+      Tabmix.getButtonsHeight(true);
+    }
+
     let skin;
     // with Walnut theme we get wrong height on Firefox 36
     if (Tabmix._buttonsHeight > 50) {
@@ -2755,7 +2762,7 @@ TabmixProgressListener = {
             tab._tabmix_downloadingTimeout = null;
             if (this && this.mTabBrowser && tab && tab.parentNode)
               this.mTabBrowser.removeTab(tab, {animate: false});
-          }, 500, this);
+          }, 1000, this);
         }
 
         let tabsCount = this.mTabBrowser.visibleTabs.length;
diff --git a/chrome/content/tabmix.js b/chrome/content/tabmix.js
index c11f0cb..927ba1b 100644
--- a/chrome/content/tabmix.js
+++ b/chrome/content/tabmix.js
@@ -99,7 +99,7 @@ Tabmix.sessionInitialized = function() {
 
 // we call gTMPprefObserver.miscellaneousRules to add some dynamic rules
 // from Tabmix.afterDelayedStartup
-Tabmix.getButtonsHeight = function() {
+Tabmix.getButtonsHeight = function(setDefault) {
   if (gBrowser.tabContainer.orient == "horizontal") {
     let tabBar = gBrowser.tabContainer;
     let stripIsHidden = TabmixTabbar.hideMode !== 0 && !tabBar.visible;
@@ -108,6 +108,10 @@ Tabmix.getButtonsHeight = function() {
     this._buttonsHeight = Tabmix.visibleTabs.first.getBoundingClientRect().height;
     if (stripIsHidden)
       tabBar.visible = false;
+
+    if (setDefault && !this._buttonsHeight) {
+      this._buttonsHeight = TabmixSvc.australis ? 31 : 24;
+    }
   } else {
     this._buttonsHeight = 24;
   }
@@ -833,9 +837,6 @@ var TMP_eventListener = {
     }
 
     // clean WeakMap
-    let browser = tab.linkedBrowser;
-    if (Tabmix.isVersion(320) && browser && TabmixSvc.syncHandlers.has(browser.permanentKey))
-      TabmixSvc.syncHandlers.delete(browser.permanentKey);
     if (this.tabWidthCache.has(tab))
       this.tabWidthCache.delete(tab);
   },
diff --git a/chrome/content/utils.js b/chrome/content/utils.js
index bc5e963..ddab77a 100644
--- a/chrome/content/utils.js
+++ b/chrome/content/utils.js
@@ -1,6 +1,6 @@
 "use strict";
 
-var Tabmix = { // jshint ignore:line
+var Tabmix = {
   get prefs() {
     delete this.prefs;
     return (this.prefs = Services.prefs.getBranch("extensions.tabmix."));
@@ -248,7 +248,7 @@ var Tabmix = { // jshint ignore:line
 
     var methods = ["changeCode", "setNewFunction", "nonStrictMode",
                    "getObject", "log", "getCallerNameByIndex", "callerName",
-                   "clog", "isCallerInList", "stackTrace",
+                   "clog", "isCallerInList", "callerTrace",
                    "obj", "assert", "trace", "reportError"];
     methods.forEach(function(id) {
       this[id] = function TMP_console_wrapper() {
diff --git a/install.rdf b/install.rdf
index d90721e..ebf1584 100644
--- a/install.rdf
+++ b/install.rdf
@@ -5,7 +5,7 @@
   <RDF:Description RDF:about="urn:mozilla:install-manifest"
                    NS1:id="{dc572301-7619-498c-a57d-39143191b318}"
                    NS1:name="Tab Mix Plus"
-                   NS1:version="0.4.2.3pre.160319a1"
+                   NS1:version="0.4.2.3pre.160328a1"
                    NS1:type="2"
                    NS1:multiprocessCompatible="true"
                    NS1:description="Tab browsing with an added boost."
diff --git a/modules/AsyncUtils.jsm b/modules/AsyncUtils.jsm
index 73538d1..3074d41 100644
--- a/modules/AsyncUtils.jsm
+++ b/modules/AsyncUtils.jsm
@@ -1,4 +1,3 @@
-/* jshint esnext: true */
 "use strict";
 
 this.EXPORTED_SYMBOLS = ["AsyncUtils"];
diff --git a/modules/ContentClick.jsm b/modules/ContentClick.jsm
index d15b236..68ee9e4 100644
--- a/modules/ContentClick.jsm
+++ b/modules/ContentClick.jsm
@@ -180,11 +180,6 @@ ContentClickInternal = {
   },
 
   getParamsForLink: function(event, linkNode, href, browser, focusedWindow) {
-    if (browser.getAttribute("remote") == "true" &&
-        TabmixSvc.syncHandlers.has(browser.permanentKey)) {
-      let handler = TabmixSvc.syncHandlers.get(browser.permanentKey);
-      linkNode = handler.wrapNode(linkNode);
-    }
     let wrappedNode = this.getWrappedNode(linkNode, focusedWindow, event.button === 0);
     return this._getParamsForLink(event, wrappedNode, href, browser);
   },
diff --git a/modules/ContextMenu.jsm b/modules/ContextMenu.jsm
index a8c75cf..d4a675f 100644
--- a/modules/ContextMenu.jsm
+++ b/modules/ContextMenu.jsm
@@ -2,7 +2,7 @@
 
 this.EXPORTED_SYMBOLS = ["ContextMenu"];
 
-const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+const {interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
 Cu.import("resource://gre/modules/Services.jsm");
@@ -12,11 +12,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "TabmixSvc",
 
 this.ContextMenu = {
   getSelectedLinks: function(content, check) {
-    // get focused window selection
-    let fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
-    let focusedWindow = {};
-    fm.getFocusedElementForWindow(content, true, focusedWindow);
-    let selectionObject = focusedWindow.value.getSelection();
+    let doc = content.document;
+    let selectionObject = doc.getSelection();
     if (selectionObject.isCollapsed) // nothing selected
       return [];
 
@@ -31,7 +28,6 @@ this.ContextMenu = {
     };
 
     // do urlSecurityCheck for each link in the treeWalker....
-    let doc = content.document;
     let secMan = Services.scriptSecurityManager;
     let securityCheck = function(url) {
       if (!url)
diff --git a/modules/DocShellCapabilities.jsm b/modules/DocShellCapabilities.jsm
index 795efc1..e6e1d51 100644
--- a/modules/DocShellCapabilities.jsm
+++ b/modules/DocShellCapabilities.jsm
@@ -36,15 +36,12 @@ this.DocShellCapabilities = {
       return this.caps.filter(cap => !browser.docShell["allow" + cap]);
     }
 
-    if (tab.ownerDocument.defaultView.__SSi) {
+    let window = tab.ownerDocument.defaultView;
+    if (window && window.__SSi) {
       let tabState = TabState.collect(tab);
       return tabState.disallow || "";
     }
 
-    try {
-      let handler = TabmixSvc.syncHandlers.get(browser.permanentKey);
-      return handler.getCapabilities();
-    } catch (ex) { }
     return "";
   },
 
diff --git a/modules/DownloadLastDir.jsm b/modules/DownloadLastDir.jsm
index c9434a2..a9846ca 100644
--- a/modules/DownloadLastDir.jsm
+++ b/modules/DownloadLastDir.jsm
@@ -1,6 +1,5 @@
 /// "use strict";
 
-/* jshint strict: false */
 /* eslint strict: 0 */
 
 this.EXPORTED_SYMBOLS = ["TabmixDownloadLastDir"];
diff --git a/modules/DynamicRules.jsm b/modules/DynamicRules.jsm
index b919bd1..d5e966d 100644
--- a/modules/DynamicRules.jsm
+++ b/modules/DynamicRules.jsm
@@ -284,7 +284,7 @@ this.DynamicRules = {
     this.createTemplates();
 
     function updateButtonHeight(Tabmix, rules) {
-      let newHeight = Tabmix.getButtonsHeight();
+      let newHeight = Tabmix.getButtonsHeight(true);
       ["new-tab", "pb-indicator", "scrollbutton", "toolbarbutton"].forEach(name => {
         let rule = rules[name + "-height"];
         if (typeof rule == "object") {
diff --git a/modules/MergeWindows.jsm b/modules/MergeWindows.jsm
index 1b86a58..7a7382a 100644
--- a/modules/MergeWindows.jsm
+++ b/modules/MergeWindows.jsm
@@ -70,7 +70,7 @@ this.MergeWindows = {
           if (tab.hasAttribute("mergeselected")) {
             tab.removeAttribute("mergeselected");
             tab.label = tab.label.substr(4);
-            tabbrowser._tabAttrModified(tab);
+            tabbrowser._tabAttrModified(tab, ["label"]);
           } else if (canClose) {
             tabbrowser.removeTab(tab);
           }
diff --git a/modules/Places.jsm b/modules/Places.jsm
index 0596589..eb6f417 100644
--- a/modules/Places.jsm
+++ b/modules/Places.jsm
@@ -181,9 +181,9 @@ PlacesUtilsInternal = {
       '        if (TMP_Event) aWhere = TMP_Places.isBookmarklet(aNode.uri) ? "current" :\n' +
       '                       TMP_Places.fixWhereToOpen(TMP_Event, aWhere);\n' +
       '        else if (aWhere == "current" && !TMP_Places.isBookmarklet(aNode.uri)) {\n' +
-      '          let caller = browserWindow.Tabmix.getCallerNameByIndex(2);\n' +
-      '          if (caller != "PC_doCommand")\n' +
+      '          if (!browserWindow.Tabmix.callerTrace("PC_doCommand")) {\n' +
       '            aWhere = TMP_Places.fixWhereToOpen(null, aWhere);\n' +
+      '          }\n' +
       '        }\n' +
       '      }\n' +
       '      if (browserWindow && aWhere == "current")\n' +
diff --git a/modules/Services.jsm b/modules/Services.jsm
index c567c70..b5481b8 100644
--- a/modules/Services.jsm
+++ b/modules/Services.jsm
@@ -155,8 +155,6 @@ this.TabmixSvc = {
     }
   },
 
-  syncHandlers: new WeakMap(),
-
   windowStartup: {
     QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
                                            Ci.nsISupportsWeakReference]),
diff --git a/modules/Utils.jsm b/modules/Utils.jsm
index 92ce1f4..be8167a 100644
--- a/modules/Utils.jsm
+++ b/modules/Utils.jsm
@@ -6,12 +6,12 @@ const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 // Messages that will be received via the Frame Message Manager.
 const FMM_MESSAGES = [
-  "Tabmix:SetSyncHandler",
   "Tabmix:restorePermissionsComplete",
   "Tabmix:updateScrollPosition",
   "Tabmix:reloadTab",
   "Tabmix:getOpener",
   "Tabmix:contentDrop",
+  "Tabmix:contextmenu",
 ];
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
@@ -59,9 +59,6 @@ this.TabmixUtils = {
     let browser = message.target;
     let win, tab;
     switch (message.name) {
-      case "Tabmix:SetSyncHandler":
-        TabmixSvc.syncHandlers.set(browser.permanentKey, message.objects.syncHandler);
-        break;
       case "Tabmix:restorePermissionsComplete":
         DocShellCapabilities.update(browser, message.data);
         break;
@@ -96,6 +93,12 @@ this.TabmixUtils = {
         }
         return false;
       }
+      case "Tabmix:contextmenu": {
+        win = browser.ownerDocument.defaultView;
+        let links = message.data.links;
+        win.Tabmix.contextMenuLinks = links && links.split("\n") || [];
+        break;
+      }
     }
     return null;
   },
diff --git a/modules/log.jsm b/modules/log.jsm
index ae68f48..cb04e5d 100644
--- a/modules/log.jsm
+++ b/modules/log.jsm
@@ -135,20 +135,6 @@ this.console = {
     return fnName;
   },
 
-/*
-  _nameFromComponentsStack: function(Cs) {
-    return Cs.name ||
-           Cs.filename.substr(Cs.filename.lastIndexOf("/") + 1) + ":" + Cs.lineNumber;
-  },
-
-  callerName: function() {
-    try {
-      var name = this._nameFromComponentsStack(Components.stack.caller.caller);
-    } catch (ex) { }
-    return name || "";
-  },
-*/
-
   callerName: function TMP_console_callerName() {
     return this.getCallerNameByIndex(1);
   },
@@ -177,14 +163,24 @@ this.console = {
     return false;
   },
 
-  stackTrace: function TMP_console_stackTrace() {
-    let stack = this._getStackExcludingInternal().join("\n");
+  callerTrace: function TMP_console_callerTrace(...args) {
+    let stack = this._getStackExcludingInternal();
 
-    return {
+    let stackUtil = {
       contain: function(...names) {
-        return names.some(name => stack.indexOf(name) > -1);
+        if (Array.isArray(names[0])) {
+          names = names[0];
+        }
+        let _isCallerInList = function(caller) {
+          return names.some(name => caller.startsWith(name + "@"));
+        };
+        return stack.some(_isCallerInList);
       },
     };
+    if (args.length) {
+      return stackUtil.contain.apply(null, args);
+    }
+    return stackUtil;
   },
 
 /*

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



More information about the Pkg-mozext-commits mailing list