2010-09-01 14 views
7

W moim rozszerzeniu próbuję określić, czy nowa karta została utworzona jako wyskakujące okienko przez inną kartę, a jeśli tak, to która karta.Czy skrypty rozszerzeń przeglądarki Chrome mogą otwierać okno.opener?

Pomyślałem, że będę mógł użyć window.opener ze skryptu treści, aby to zrozumieć. Ale wygląda na to, że window.opener nie działa poprawnie w skryptach treści.

Gdy ręcznie utworzę kartę, parametr window.opener ma wartość null zgodnie z oczekiwaniami.

Gdy zakładka jest tworzona jako wyskakujące okienko przez inną kartę, jej window.opener jest niezdefiniowana. Mogę wywnioskować z tego, że zakładka została utworzona jako wyskakujące okienko, ale nie mogę jej użyć do ustalenia, która zakładka utworzyła nową.

Czy jest to znany problem i czy ktoś wie o jakichkolwiek obejściach?

+0

Prawdopodobny duplikat http://stackoverflow.com/questions/3124543/is-it-possible-to-determine-a-tabs-opener-within-a-google-chrome-extension – npdoty

+0

Tak, wygląda na to. Ale żadne pytanie nie zostało udzielone .. – Greg

+0

[Mamy tendencję do pozostawiania podobnych pytań.] (Http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned- to-stop-worrying-and-love-duplication /) – Will

Odpowiedz

16

Nie przyjrzałem się temu problemowi, ale myślę, że mogę wskazać ci właściwy kierunek. Skrypt treści nie może uzyskać dostępu do zmiennej z okna nadrzędnego, ponieważ jest piaskownicą. Rozwiązaniem byłoby uruchomić kod bezpośrednio na stronie, do tego trzeba wstrzyknąć skrypt wewnątrz tagu skrypt zrobić:

Skrypt zawartość będzie wyglądać następująco:

function injectJs(link) { 
     var scr = document.createElement("script"); 
     scr.type="text/javascript"; 
     scr.src=link; 
     (document.head || document.body || document.documentElement).appendChild(scr); 
} 

injectJs(chrome.extension.getURL("inject.js")); 

Teraz można uruchomić Twój kod bez ograniczeń piaskownicy tak, jakby był tuż na stronie:

inject.js:

alert(window.opener); 

zakładam chcesz teraz przekazać tę informację z powrotem do ba strona ckground, co jest kolejnym wyzwaniem, ponieważ nie możesz używać interfejsu API Chrome. Dobrą wiadomością jest to, że skrypt treści może uzyskać dostęp do DOM i słuchać zdarzeń DOM, więc można ich użyć do przekazania informacji do skryptu treści, który wysłałby go na stronę w tle. Jestem prawie pewny, że powinieneś być w stanie zarejestrować niestandardowe zdarzenie DOM i słuchać jego skryptu treści (nie próbowałem tej części samodzielnie).

+0

Skończyło się na rozwiązaniu mojego problemu przy użyciu takiej metody; wstrzyknięcie dużej ilości kodu na stronę i użycie 'postMessage' do komunikacji między ramkami i między stroną a moim skryptem treści. To bardzo bolesne, ale wydaje się, że działa przez większość czasu. – Greg

+3

Dowolna szansa zobaczenia przykładów tego skryptu "wstrzyknięty skrypt -> treść" -> strona ". z @Greg lub @serg Mam problem z tym dokładnie problemem: – kevzettler

+2

@kevzettler można wstrzyknąć skrypt, który przechowuje 'window.desiredData' jako atrybut na' document.body', a następnie odczytać atrybut z twojego content- skrypt (ponieważ mają ten sam DOM) – levi