Можно ли определить открыватель вкладки в расширении Google Chrome? - PullRequest
7 голосов
/ 26 июня 2010

Я ищу способ определения открывателя данной вкладки (родительской вкладки) в расширении Google Chrome.

Я посмотрел документацию для Tab, но на самом деле ничего не видноэто дало бы эту информацию.http://code.google.com/chrome/extensions/tabs.html

Я пытался внедрить этот скрипт контента в страницы (думая, что мог бы передать значение моей фоновой странице):

alert(window.opener);

.. но он просто возвращает ноль.

Лучшее, что я до сих пор придумал, - это отслеживать текущую фокусированную вкладку, и всякий раз, когда создается новая вкладка, просто предполагайте, что сфокусированная вкладка является открывателем / родителем новой вкладки.Я полагаю, что это будет де-факто идентифицировать родительскую вкладку в большинстве случаев правильно, так как фоновые вкладки редко (позволяют) открывать новые страницы.Тем не менее, время от времени это кажется грязным и потенциально неточным - например, если другое расширение открыло новую вкладку, этот метод может неверно идентифицировать средство открытия новой вкладки.

Ответы [ 4 ]

7 голосов
/ 21 декабря 2011

Обновление: теперь можно надежно определять вкладку открывания вкладки в расширении Chrome изначально, используя недавно добавленный интерфейс webNavigation API, в частности, перехватывая событие onCreatedNavigationTarget.

https://code.google.com/chrome/extensions/trunk/webNavigation.html

2 голосов
/ 04 июня 2011

Chrome добавил экспериментальное расширение API, которое может выполнить это, в частности, webNavigation.onBeforeRetarget.http://code.google.com/chrome/extensions/experimental.webNavigation.html

Однако, поскольку это все еще экспериментально (не используется в стабильных версиях Chrome или не выпускается в Интернет-магазине Chrome), я остановился на другом подходе.

В основном:

В content_script.js:

chrome.extension.sendRequest({
    request: {
        op: "pageLoadStarted", 
        url: document.location.href, 
        referrer: document.referrer
    }
}); 

В background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    console.log('onRequest: ' + JSON.stringify(request)); 
    console.log(JSON.stringify(sender)); 
  }); 

Этот подход позволяет мне получить реферер вкладки, которую язатем можно сопоставить с URL существующей вкладки.Это не всегда взаимно-однозначное сопоставление, поэтому я делаю некоторые дополнительные действия, такие как предпочтение текущей выбранной вкладки в качестве средства открытия, если ее URL-адрес совпадает с реферером новой вкладки.

Это действительно просто хакчтобы приблизить функциональность, которая была бы предоставлена ​​проще и точнее с помощью webNavigation.onBeforeRetarget или window.opener.

1 голос
/ 20 февраля 2013
port.onMessage.addListener(
     function(msg) {
         var tabid = port.sender.tab.openerTabId;
         console.log("Received message from tab that was opened by tab id : " + tabid);
         // reliably shows the tab id of the tab that opened
         // the tab sending the message
     }); 
1 голос
/ 20 мая 2012

Дальнейшее исследование показало, что onCreatedNavigationTarget () не всегда срабатывает, когда вы думаете, что это указывает на открытое открытием отношение.

Иногда в объекте Tab можно найти дополнительную подсказку, возвращаемую chrome.tabs.onCreated / onUpdated в параметре .openerTabId.

Комплексное решение, вероятно, должно опираться на несколько методов, описанных в этих ответах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...