Повторное использование вкладки в Firefox, событие TabOpen и не только

Я следил за учебным пособием по повторному использованию вкладок в Firefox, и прямо сейчас мое расширение делает это хорошо. Однако мне также нужно повторно использовать вкладки, которые открываются извне (из какого-либо приложения, меню «Пуск» и т. д.). Как мне это сделать?

Я попытался добавить прослушиватель событий для события TabOpen, но когда я регистрирую

event.target.linkedBrowser.currentURI.spec

это значение "о: пусто". Я ожидал фактический адрес, который я ввел в адресную строку (автоматически открывается в новой вкладке), или адрес, который я открываю из какого-то другого приложения, чтобы я мог немедленно закрыть эту вкладку и сфокусироваться на нужной. Что я делаю неправильно?

Заранее спасибо.


На всякий случай вот код, который повторно использует вкладку, когда новая вкладка запрашивается из расширения.

function openAndReuseOneTabPerURL(url) {
  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance for our URL
  var found = false;
  while (!found && browserEnumerator.hasMoreElements()) {
    var browserWin = browserEnumerator.getNext();
    var tabbrowser = browserWin.getBrowser();

    // Check each tab of this browser instance
    var numTabs = tabbrowser.browsers.length;
    for(var index=0; index<numTabs; index++) {
      var currentBrowser = tabbrowser.getBrowserAtIndex(index);
      if (url == currentBrowser.currentURI.spec) {

        // The URL is already opened. Select this tab.
        tabbrowser.selectedTab = tabbrowser.mTabs[index];

        // Focus *this* browser-window
        browserWin.focus();

        found = true;
        break;
      }
    }
  }

  // Our URL isn't open. Open it now.
  if (!found) {
    var recentWindow = wm.getMostRecentWindow("navigator:browser");
    if (recentWindow) {
      // Use an existing browser window
      recentWindow.delayedOpenTab(url, null, null, null, null);
    }
    else {
      // No browser windows are open, so open a new one.
      window.open(url);
    }
  }
}

person ms.    schedule 14.06.2009    source источник


Ответы (2)


Когда вы получаете событие TabOpen, еще слишком рано загружать содержимое страницы. Однако при получении события TabOpen вы должны зарегистрироваться для загрузки или DOMContentLoaded. Когда вы получите это событие, вы сможете получить доступ к URI.

person sdwilsh    schedule 16.06.2009
comment
Спасибо, я понял, что это может быть возможным решением. Это не то, на что я надеялся, так как вкладка открыта на короткое время (прямо перед тем, как я ее закрою, если существует другая вкладка с тем же адресом). - person ms.; 19.06.2009
comment
Это должно быть довольно быстро. о: пробел уйдет очень-очень быстро. Вы захотите использовать DOMContentLoaded, если вас беспокоит скорость. - person sdwilsh; 19.06.2009
comment
Именно то, что я сделал, но все же я вижу эту вкладку в течение короткого промежутка времени. Что мне действительно нужно, так это какое-то событие PreTabOpen (: я получил еще один совет о том, как это можно сделать, поэтому я попробую это, прежде чем обращаться за дополнительной помощью здесь. - person ms.; 20.06.2009

Я думаю, вы могли бы извлечь желаемое поведение из реализации на Tab Mix Plus. расширение

person jitter    schedule 14.06.2009