2012-01-22 6 views

Odpowiedz

1

Doszłam do podobnego problemu i rozwiązałem go w następujący sposób.

Zamiast ograniczać różnorodność dokumentów, w których zastrzykuje się skrypt zawartości, w oparciu o dokumenty "Content-Type, postanowiłem wstrzyknąć skrypt do wszystkich dokumentów, ale wykonać go tylko we właściwych dokumentach.

Odbywa się to poprzez analizę document.xmlVersion i document.doctype właściwości:

  • document.doctype nie musi być null w dokumencie HTML;
  • document.xmlVersion nie może być null w dokumencie XML;

Tak, to jest łatwy w użyciu jednej z nich, aby odróżnić jedno od drugiego typu i „bind” tylko wszystkie niezbędne skrypt rzeczy we właściwym czasie. W szczególności można wstrzyknąć mały program ładujący skrypt, który ładuje dodatkowe, ewentualnie ciężkie rzeczy, warunkowo.

Chrome nadal nie zapewnia żadnych sposobów ograniczenia wprowadzania skryptów według typu dokumentu.

0

Najbardziej niezawodny sposób to zrobić przez chrome.webRequest.onHeadersReceived, który pozwala na zapytanie i zachowanie informacji w nagłówku odpowiedzi (w tym Content-Type). Niestety ten interfejs API nie jest obecnie dostępny w stabilnych wersjach Chrome. (Możesz używać eksperymentalnego API w bieżących wersjach Chrome, ale nie będziesz w stanie publikować rozszerzeń, które go używają.)

Jednym z możliwych rozwiązań jest ustalenie, czy wstrzykiwany dokument jest traktowany przez Chrome jako XML. (A jeśli tak, przestań przetwarzać dokument.) Hackem do tego celu jest sprawdzenie, czy document.getElementById('webkit-xml-viewer-source-xml') jest null. Ta część przeglądarki przeglądarki XML Chrome/webkita.

+0

Co zrobić, jeśli skrypt treści dodaje detektor zdarzeń czekający na załadowanie dokumentu przed wykonaniem akcji? Na przykład: "document.addEventListener (" DOMContentLoaded ", function() {do.stuff()};'. – cheeken

+0

Tego właśnie powinienem uniknąć, mój skrypt musi zostać wykonany jako pierwszy (przed załadowaniem dokumentu) – spektom

+0

Rozumiem. W takim przypadku nie mam innych zaleceń. – cheeken