Как изменить активную вкладку в другом окне в расширении браузера? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь разработать расширение Firefox . Я хочу go на вкладку браузера в другом окне. Как я понимаю из API Firefox Browser Extensions, я могу изменить сфокусированное окно и отдельно изменить активную вкладку в сфокусированном окне. Таким образом, я написал приведенный ниже код в свой фоновый скрипт для достижения этой цели Однако, когда я использую этот код, браузер сначала меняет фокус на окно с ранее активной вкладкой этого окна, а затем активирует нужную вкладку в этом окне. Такое поведение вызывает затруднения.

browser.windows.update(windowId, {focused:true})
browser.tabs.update(tabId,{active:true})

Можете ли вы предложить мне способ go для указания c вкладки в другом окне за одну операцию?

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

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Когда Пиро вдохновил меня сначала активировать вкладку и изменить фокус окна, я попробовал две части кода ниже. Тем не менее, в обеих из них активация вкладок не могла идти в ногу с изменением фокуса windows и приводила к одному и тому же глюковому ощущению.

browser.tabs.update(tabId,{active:true})
browser.windows.update(windowId, {focused:true})

browser.tabs.update(tabId,{active:true}).then(() =>
 browser.windows.update(windowId, {focused:true})
)

Наконец, я только что реализовал следующее, что немного спит перед изменением фокус окна. С оптимизацией продолжительности сна до 50 мс я получил плавный опыт.

browser.tabs.update(audibleTabs[0].id,{active:true})
setTimeout(() => 
    browser.windows.update(window.id, {focused:true})
, 50);

Chrome Редактировать: я пытался запустить свое расширение на Chrome и испытал, что 50 мс сна не достаточно для Chrome. Таким образом, я оптимизировал время сна до 150 мс для Chrome.

0 голосов
/ 14 апреля 2020

К сожалению, нет никакого способа сделать это с помощью только одной операции, поэтому я думаю, что вам нужно сначала активировать вкладку и сосредоточиться на окне после активации вкладки, например:

async function focusToTab(tabId) {
  const tab = await browser.tabs.get(tabId);
  if (!tab.active)
    await new Promise(resolve => {
      const listener = activeInfo => {
        if (activeInfo.tabId != tabId)
          return;
        browser.tabs.onActivated.removeListener(listener);
        resolve();
      };
      browser.tabs.onActivated.addListener(listener)
      browser.tabs.update(tabId, { active: true });
    });
  browser.windows.update(tab.windowId, { focused: true });
}

focusToTab(1);
...