Szukam sposobu na wyświetlenie izolowanej nakładki na niektórych stronach internetowych przy użyciu rozszerzenia WebExtensions.
Iframe wydaje się być sposobem na to, ponieważ zapewnia oddzielny zakres dla css, js i DOM. Kolejną fajną rzeczą jest to, że docelowa strona nie będzie mogła odczytać ani zmienić treści.Internetowe rozszerzenie przeglądarki Firefox, izolowana nakładka HTML
W rozszerzeniach Chrome, które wydają się możliwe bez żadnych problemów, ale z rozszerzeniami Web w Firefoksie, mimo że mają tę samą składnię, otrzymuję ostrzeżenia/błędy bezpieczeństwa i to nie działa.
Próbowałem dwóch różnych rzeczy:
tworzenia iframe bez atrybutu src i wstrzyknąć do organizmu, że strony internetowej. Ta metoda nie powiodła się, ponieważ dostaję błędy/ostrzeżenia CSP, gdy wykonuję
iframe.contentWindow.document.open()
.
odpowiedni kod treści skryptu:let html = ` <!DOCTYPE html> <html> <head></head> <body> <h1>TEST</h1> </body> </html> ` let iframe = document.createElement('iframe') document.body.appendChild(iframe) iframe.contentWindow.document.open() iframe.contentWindow.document.write(html) iframe.contentWindow.document.close()
Inną rzeczą próbowałem (co byłoby zrobić więcej sensu gdyż uniemożliwi internetową z dostępem do treści), było umieścić moje kod iframe do pliku (
overlay.html
) w moim rozszerzeniu internetowym i spraw, aby element iframe wczytał go, ustawiając go jako src nabrowser.extension.getURL('overlay.html')
.
odpowiedni kod treści skryptu:let iframe = document.createElement('iframe') iframe.src = browser.extension.getURL('overlay.html') document.body.appendChild(iframe)
W manifeście ja zdefiniował overlay.html jak
web_accessible_resources
dla tego:"web_accessible_resources": [ "overlay.html" ],
Chodzi o to, że po prostu nie iframe załadować plik overlay.html. Ale jest zdecydowanie dostępny, w przeciwnym razie
location.href = browser.extension.getURL('overlay.html')
nie działa. Byłoby niezwykle wygodne, gdyby to działało, ponieważ mogłem przechowywać całą nakładkę (html, css, js) jako osobne pliki w moim rozszerzeniu. Jakby była to samodzielna strona internetowa. I używając skryptu treści, do którego mogłem uzyskać dostęp, aby dodać nowe dane lub cokolwiek innego.
Edit:
Obecnie używam atrybut moim iframe, aby ustawić kod źródłowy powinien zawierać (dzięki wOxxOm do tego) srcdoc
. Tak przynajmniej mam coś, co działa teraz. Ale nie podoba mi się to podejście, ponieważ nie mogę wchodzić w interakcję z treścią iframe z mojego skryptu treści. Interesujące jest jednak to, że mogę wchodzić w interakcję ze stroną nadrzędną z kodu js iframe, ale znowu nie ze skryptem treści. Jest również bardzo niechlujny, niewygodny i trudny do utrzymania, aby umieścić cały kod HTML, CSS, JS w jednym ciągu zamiast wielu plików, takich jak zwykła strona internetowa.
Może witryn próbowałem zdefiniować bardzo restrykcyjnej CSP? Spróbowałbym 'iframe.srcdoc'. Jeśli chodzi o izolację stylu, możesz użyć Shadow DOM zamiast iframe. – wOxxOm
Dziękuję, że było to niezwykle pomocne! – Forivin
1) O problemie CSP: Nie sądzę, że to strona. Daje mi ten sam błąd w pliku 'file: /// C: /'. Myślę, że jest to związane z własnym CSP rozszerzenia. Wciąż nie znam składni, więc nie mogę zaoferować rozwiązania. Bądź ostrożny wywiercając dziury bez pełnego zrozumienia, na co jeszcze możesz pozwolić przypadkowo. 2) Stworzyłem natychmiast dołączony element iframe. Bezpośrednie przypisanie NIE działa równo dla wszystkich atrybutów, chociaż "iframe.src" działało dla mnie. Spróbuj podać WSZYSTKIE atrybuty za pomocą 'iframe.setAttribute (attribute, value);' W szczególności myślę, że 'klasa' jest problematyczna. – user314159