デスクトップとインターネット対応テレビの両方で実行される Web アプリケーションがあります。現在、User-Agent ヘッダーを使用して、提供するインターフェイスを決定しています。
私は今、デスクトップ Web サイトへのアクセスをブロックすることなく、デスクトップ ブラウザから TV インターフェイスにアクセスできるようにする任務を負っています。
パッケージアプリ方式
メイン Web サイトをロードする iframe を含むプレーンな html ファイルと、chrome.webRequest.onBeforeSendHeaders 関数を使用して User-Agent をオーバーライドする JavaScript を含むパッケージ化されたアプリを作成しました。
マニフェスト.json
{
"app": {
"launch": {
"local_path": "index.html"
}
},
"permissions": [
"webRequest", "webRequestBlocking", "cookies",
"*://my.site.url/*"
]
}
index.html
<html>
<head>
<script src="main.js"></script>
</head>
<body>
<iframe src="http://my.site.url"></iframe>
</body>
</html>
main.js
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details)
{
var headers = details.requestHeaders;
for (var i = 0; i < headers.length; ++i)
{
if (headers[i].name === 'User-Agent')
{
headers[i].value += " Chromebox"
break;
}
}
return {requestHeaders: headers};
},
{
urls: ["*://my.site.url/*"]
},
["blocking", "requestHeaders"]
);
問題
- サイト全体を iframe 内にロードできるようにする必要があり、クリックジャッキングの可能性があります
- アプリが開いていると、別のタブでメイン サイトに移動するときに onBeforeSendHeaders リスナーもトリガーされ、ユーザー エージェントが変更され、サイトへのすべてのリクエストが TV インターフェースにリダイレクトされます。
ホストされたアプリの方法
メイン サイトを指す開始 URL を持つホストされたアプリを作成し、JavaScript を実行して User-Agent をオーバーライドするバックグラウンド ページを作成しました。
マニフェスト.json
{
"app": {
"launch": {
"web_url": "http://my.site.url"
}
},
"background_page": "https://my.site.url/chromebox/index.html",
"permissions": [
"webRequest", "webRequestBlocking", "background",
"*://my.site.url/*"
]
}
index.html
<html><script src="main.js"></script></html>
問題
- バックグラウンド ページの JavaScript をインストールすると、常に実行されるため、ユーザーは常に TV サイトにリダイレクトされます。
理想的なソリューションは、アプリが開いているときにのみバックグラウンド ページが実行され、onBeforeSendHeaders リスナーが chrome アプリの外部の要求に影響を与えないホスト型アプリです。
どうすればこれを達成できるか、誰にもわかりませんか?