Tab History
Код любезно выдран Infocatcher'ом из дополнения ithinc'a "Tab Utilities".
Описание: все вкладки будут наследовать историю родительских вкладок (если они есть).
Заменяет дополнения: Tab History, Tab History Redux.

Инициализация

Выделить код

Код:

var TU_hookCode = TU_hookMethod;
function TU_hookMethod(aStr) {
  try {
    var namespaces = aStr.split(".");

    try {
      var object = this;
      while (namespaces.length > 1) {
        object = object[namespaces.shift()];
      }
    }
    catch (e) {
      throw TypeError(aStr + " is not a function");
    }

    var method = namespaces.pop();
    if (typeof object[method] != "function")
      throw TypeError(aStr + " is not a function");

    return object[method] = TU_hookFunc.apply(this, Array.concat(object[method], Array.slice(arguments, 1)));
  }
  catch (e) {
    Components.utils.reportError("Failed to hook " + aStr + ": " + e.message);
  }
}
function TU_hookFunc(aFunc) {
  var myCode = aFunc.toString();
  for (var i = 1; i < arguments.length;) {
    if (arguments[i].constructor.name == "Array") {
      var [orgCode, newCode, flags] = arguments[i++];
    }
    else {
      var [orgCode, newCode, flags] = [arguments[i++], arguments[i++], arguments[i++]];
    }

    if (typeof newCode == "function" && newCode.length == 0)
      newCode = newCode.toString().replace(/^.*{|}$/g, "");

    switch (orgCode) {
      case "{": [orgCode, newCode] = [/{/, "$&\n" + newCode];break;
      case "}": [orgCode, newCode] = [/}$/, newCode + "\n$&"];break;
    }

    if (typeof orgCode == "string")
      orgCode = RegExp(orgCode.replace(/[{[(\\^|$.?*+/)\]}]/g, "\\$&"), flags || "");

    myCode = myCode.replace(orgCode, newCode);
  }

  return eval("(" + myCode + ")");
}

  TU_hookCode("gBrowser.loadOneTab",
    ["{", function() {
      var currentTab = this.mCurrentTab;
    }],
    [/(?=return tab;)/, function() {
      if (aReferrerURI/* && TU_getPref("extensions.tabutils.openLinkWithHistory", false)*/) {
        let currentHistory = currentTab.linkedBrowser.sessionHistory;
        let newHistory = tab.linkedBrowser.sessionHistory.QueryInterface(Ci.nsISHistoryInternal);
        for (let i = 0; i <= currentHistory.index; i++) {
          newHistory.addEntry(currentHistory.getEntryAtIndex(i, false), true);
        }
      }
    }]
  );