我正在尋找一種方式來顯示使用WebExtensions一些網站一個孤立的覆蓋。
一個IFRAME似乎喜歡的方式去爲這個,因爲它提供了CSS,JS和DOM整體單獨範圍。另一個好消息是目標網站將無法讀取或更改內容。火狐WebExtension,孤立的HTML覆蓋
在Chrome擴展,似乎沒有任何問題是可能的,但WebExtensions在Firefox中,即使它們共享相同的語法,我收到安全警告/錯誤,這是行不通的。
我試過兩個不同的東西:
創建一個iframe沒有src屬性,並注入到該網站的身體。 這種方法失敗了,因爲我得到CSP錯誤/警告,當我做
iframe.contentWindow.document.open()
。
相關內容腳本代碼: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()
我想(這將使方式更有意義,因爲它會從訪問內容禁止的網站)的另一件事,是把我的iframe的代碼到一個文件中(
overlay.html
)在我WebExtension,使IFRAME通過設置它的SRC到browser.extension.getURL('overlay.html')
加載它。
相關內容腳本代碼:let iframe = document.createElement('iframe') iframe.src = browser.extension.getURL('overlay.html') document.body.appendChild(iframe)
在清單中,我定義的overlay.html爲
web_accessible_resources
此:"web_accessible_resources": [ "overlay.html" ],
有關的事情是,在iframe根本不加載overlay.html文件。但它絕對可用,否則
location.href = browser.extension.getURL('overlay.html')
將無法正常工作。如果這樣做能夠工作,這將非常方便,因爲我可以將整個疊加層(html,css,js)作爲單獨的文件存儲在我的擴展中。就好像它將是一個獨立的網站。使用內容腳本我可以訪問它來添加新的數據或其他內容。
編輯:
目前,我用我的iframe來設置源代碼,它應該包含(感謝wOxxOm爲)的srcdoc
屬性。所以至少我現在有一些工作。但是我真的不喜歡這種方法,我無法與我的內容腳本中的iframe內容交互。有趣的是,我可以在iframe的js代碼中與父頁面進行交互,但又不能與內容腳本進行交互。這也很麻煩,不方便,很難保持把所有的html,css,js代碼放到一個字符串中,而不是像普通網站那樣的多個文件。
也許你已經嘗試定義一個非常嚴格的CSP的網站?我會嘗試'iframe.srcdoc'。至於風格隔離,你可以使用Shadow DOM而不是iframe。 – wOxxOm
非常感謝您的幫助! – Forivin
1)關於CSP問題:我不認爲它是網站。它在'file:/// C:/'上給我同樣的錯誤。我認爲這與擴展自己的CSP有關。我仍然不熟悉語法,所以不能提供解決方案。如果不能完全理解您可能無意中允許的其他內容,請謹慎地鑽孔。 2)我創建,然後立即附加iframe。直接賦值對於所有屬性不起作用,儘管'iframe.src'確實對我有用。嘗試用iframe.setAttribute(attribute,value)指定ALL屬性;'具體來說,我認爲'class'是有問題的。 – user314159