2010-06-26 2 views
7

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

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

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

alert(window.opener); 

.. но это только дает нуль.

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

+0

Могу ли я спросить, какое расширение вы/строили? Я ищу очень простой, который бы очень точно выполнял эту точную функциональность: всякий раз, когда я сомневаюсь в том, «откуда я пришел» или что открылось, я хотел бы узнать родителя текущей вкладки. Может ли ваше продление случайно ответить на этот вопрос? Или даже если нет, может быть, вы знаете подобное расширение? – Wizek

ответ

6

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

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

2

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

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

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

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

1
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 
    }); 
Смежные вопросы