[Pkg-mozext-commits] [tabmixplus] 21/56: Replace eval of gBrowser.addTab with wrapped function

David Prévot taffit at moszumanska.debian.org
Mon Jun 6 00:02:34 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 5525fc643c739dcb19970a81a9593d391de24061
Author: onemen <tabmix.onemen at gmail.com>
Date:   Thu May 12 09:34:41 2016 +0300

    Replace eval of gBrowser.addTab with wrapped function
---
 chrome/content/minit/tablib.js | 163 ++++++++++++++++++-----------------------
 1 file changed, 73 insertions(+), 90 deletions(-)

diff --git a/chrome/content/minit/tablib.js b/chrome/content/minit/tablib.js
index b91b718..71bb897 100644
--- a/chrome/content/minit/tablib.js
+++ b/chrome/content/minit/tablib.js
@@ -136,83 +136,80 @@ var tablib = { // eslint-disable-line
   },
 
   change_gBrowser: function change_gBrowser() {
-    var obj, fnName;
-    // RequestPolicy Continued extension https://requestpolicycontinued.github.io
-    var rp = gBrowser.rpcontinuedWrappedFunctions;
-    if (typeof rp == "object" && typeof rp.addTab == "object" &&
-        typeof rp.addTab.main == "function") {
-      [obj, fnName] = [rp.addTab, "rpcontinuedWrappedFunctions.addTab.main"];
-    } else if (typeof Fd == "object" && typeof Fd.addTab == "function") {
-      [obj, fnName] = [Fd, "Fd.addTab"];
-    } else if (Tabmix.extensions.ieTab2) {
-      [obj, fnName] = [Tabmix.originalFunctions, "oldAddTab"];
-    // NRA-ILA toolbar extension replace the original addTab function
-    } else if ("origAddTab7c3de167ed6f494aa652f11a71ecb40c" in gBrowser) {
-      [obj, fnName] = [gBrowser, "origAddTab7c3de167ed6f494aa652f11a71ecb40c"];
-    } else {
-      [obj, fnName] = [gBrowser, "addTab"];
-    }
+    Tabmix.originalFunctions.gBrowser_addTab = gBrowser.addTab;
+    gBrowser.addTab = function(...args) {
+      let dontMove, isPending, referrerURI, fromExternal, relatedToCurrent,
+          callerTrace = Tabmix.callerTrace(),
+          isRestoringTab = callerTrace.contain("ssi_restoreWindow"),
+          // new tab can trigger selection change by some extensions (divX HiQ)
+          // see use below
+          selectedTab = this.selectedTab,
+          lastRelatedTab = this._lastRelatedTab;
+
+      // we prevents the original function from moving the new tab by setting
+      // params.relatedToCurrent to false
+      let params = args[1];
+      if (args.length <= 6 && params &&
+          (typeof params != "object" || params instanceof Ci.nsIURI)) {
+        referrerURI = params;
+        params = {
+          referrerURI: referrerURI,
+          charset: args[2],
+          postData: args[3],
+          ownerTab: args[4],
+          allowThirdPartyFixup: args[5],
+          relatedToCurrent: false
+        };
+        let uri = args[0];
+        args = [uri, params];
+      } else if (args.length == 2 &&
+          typeof params == "object" &&
+          !(params instanceof Ci.nsIURI)) {
+        dontMove = params.dontMove;
+        isPending = params.isPending;
+        referrerURI = params.referrerURI;
+        fromExternal = params.fromExternal;
+        relatedToCurrent = params.relatedToCurrent;
+        params.relatedToCurrent = false;
+        args[1] = params;
+      }
 
-    let $LF = '\n            ';
-    Tabmix.changeCode(obj, "gBrowser." + fnName)._replace(
-      '{', '{\n' +
-      '            let dontMove, isPending, callerTrace = Tabmix.callerTrace(),\n' +
-      '                isRestoringTab = callerTrace.contain("ssi_restoreWindow");\n'
-    )._replace(
-      'let params = arguments[1];',
-      '$&\n' +
-      '              params = tablib.definedParams(params);\n' +
-      '              dontMove              = params.dontMove;\n' +
-      '              isPending             = params.isPending;'
-    )._replace(
-      't.setAttribute("label", aURI);',
-      't.setAttribute("label", TabmixTabbar.widthFitTitle && !aURI.startsWith("about") ?\n' +
-      '                              this.mStringBundle.getString("tabs.connecting") : aURI);',
-      {check: !Tabmix.isVersion(280)}
-    )._replace(
-      't.className = "tabbrowser-tab";',
-      '$&\
-       t.setAttribute("last-tab", "true"); \
-       if (isPending || isRestoringTab && Services.prefs.getBoolPref("browser.sessionstore.restore_on_demand")) \
-         t.setAttribute("tabmix_pending", "true"); \
-       var lastChild = this.tabContainer.lastChild; \
-       if (lastChild) lastChild.removeAttribute("last-tab");'
-    )._replace(
-      'this._lastRelatedTab = t;',
-      'if (Tabmix.prefs.getBoolPref("openTabNextInverse")) {\
-         TMP_LastTab.attachTab(t, _lastRelatedTab);\
-         $&\
-       }'
-    )._replace(
-      'this.selectedTab)._tPos + 1', '_selectedTab)._tPos + 1'
-    )._replace(
-      /*
-        replace Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent")
-        before we use it in the next section.
-      */
-      'Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent")',
-      'openTabnext'
-    )._replace(
-      'this.tabContainer.appendChild(t);',
-      'var _selectedTab = this.selectedTab;' +
-      'var _lastRelatedTab = this._lastRelatedTab;' +
-      'var openTabnext = Tabmix.prefs.getBoolPref("openTabNext");' +
-      'if (openTabnext) {' +
-      '  if (dontMove || Tabmix.dontMoveNewTab(callerTrace))' +
-      '    openTabnext = false;' +
-      '  else if (!Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent"))' +
-      '    aRelatedToCurrent = true;' + $LF +
-      '  let checkToOpenTabNext = openTabnext && (callerTrace.contain("openUILinkIn") || aFromExternal) &&' + $LF +
-      '      (aRelatedToCurrent == null ? aReferrerURI : aRelatedToCurrent);' + $LF +
-      '  TMP_extensionsCompatibility.treeStyleTab.checkToOpenTabNext(this.selectedTab, checkToOpenTabNext);' + $LF +
-      '}' + $LF +
-      '$&'
-    )._replace(//  new tab can trigger selection change by some extensions (divX HiQ)
-      't.owner = this.selectedTab;', 't.owner = _selectedTab;'
-    ).toCode();
+      let openTabnext = Tabmix.prefs.getBoolPref("openTabNext");
+      if (openTabnext) {
+        let dontMoveNewTab = dontMove ||
+            callerTrace.contain("ssi_restoreWindow", "ssi_duplicateTab");
+        if (dontMoveNewTab) {
+          openTabnext = false;
+        } else if (!Services.prefs.getBoolPref("browser.tabs.insertRelatedAfterCurrent")) {
+          relatedToCurrent = true;
+        }
+        let checkToOpenTabNext = openTabnext && (callerTrace.contain("openUILinkIn") || fromExternal) &&
+            (relatedToCurrent === null ? referrerURI : relatedToCurrent);
+        TMP_extensionsCompatibility.treeStyleTab.checkToOpenTabNext(this.selectedTab, checkToOpenTabNext);
+      }
+
+      let tab = Tabmix.originalFunctions.gBrowser_addTab.apply(this, args);
+
+      if (isPending || isRestoringTab &&
+          Services.prefs.getBoolPref("browser.sessionstore.restore_on_demand")) {
+        tab.setAttribute("tabmix_pending", "true");
+      }
 
-    Tabmix.dontMoveNewTab = function(callerTrace) {
-      return callerTrace.contain("ssi_restoreWindow", "ssi_duplicateTab");
+      if ((relatedToCurrent === null ? referrerURI : relatedToCurrent) &&
+          openTabnext) {
+        let newTabPos = (this._lastRelatedTab || selectedTab)._tPos + 1;
+        if (this._lastRelatedTab) {
+          this._lastRelatedTab.owner = null;
+        } else {
+          tab.owner = selectedTab;
+        }
+        this.moveTabTo(tab, newTabPos);
+        if (Tabmix.prefs.getBoolPref("openTabNextInverse")) {
+          TMP_LastTab.attachTab(tab, lastRelatedTab);
+          this._lastRelatedTab = tab;
+        }
+      }
+      return tab;
     };
 
     // ContextMenu Extensions replace the original removeTab function
@@ -306,6 +303,7 @@ var tablib = { // eslint-disable-line
       ).toCode();
     }
 
+    var obj, fnName;
     if (Tabmix.extensions.ieTab2) {
       [obj, fnName] = [Tabmix.originalFunctions, "oldSetTabTitle"];
     } else {
@@ -1704,21 +1702,6 @@ var tablib = { // eslint-disable-line
     gBrowser.renameTab = aTab => Tabmix.renameTab.editTitle(aTab);
   },
 
-  // prevent 'ReferenceError: reference to undefined property params'
-  // in gBrowser.addTab
-  props: ["referrerURI", "charset", "postData", "ownerTab",
-          "allowThirdPartyFixup", "fromExternal", "relatedToCurrent",
-          "allowMixedContent", "skipAnimation", "isUTF8", "dontMove", "isPending",
-          "aForceNotRemote", "aNoReferrer"],
-
-  definedParams: function(params) {
-    this.props.forEach(function(prop) {
-      if (typeof params[prop] == "undefined")
-        params[prop] = null;
-    });
-    return params;
-  },
-
   getTabTitle: function TMP_getTabTitle(aTab, url, title) {
     // return the current tab only if it is visible
     if (TabmixTabbar.widthFitTitle &&

-- 
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