HTMLパネルのページを作る
HTMLパネルで表示するページを作り、ルームに表示するまでの手順を説明します。
手順の概要
- ページを表示するルームのオリジンを確認します。
- ページにagentスクリプトを組み込みます。
- ページとページが読み込むファイルを、sandboxで表示できるように配信します。
- ルームのCSPで、ページのオリジンを許可します。
- SpokeでHTML Panel Elementを配置し、ルームで確認します。
ルームのオリジンを確認する
agentには、ページを表示してよいルームのオリジンを指定します。
オリジンは、ルームを開いたときにブラウザーのアドレスバーに表示されるURLのうち、https://からドメイン(ポート番号がある場合はポート番号)までの部分です。
たとえば、ルームのURLがhttps://example.metatell.app/AbCdEfGの場合、オリジンはhttps://example.metatell.appです。
ルームのURLがリダイレクトされる場合は、リダイレクトされた後のURLのオリジンを使います。 本番環境と検証環境など、複数の環境のルームで同じページを表示する場合は、すべての環境のオリジンを確認します。
agentスクリプトを組み込む
ページの<head>の先頭に、次の<script>タグを追加します。
data-host-originには、確認したルームのオリジンを指定します。
<!doctype html>
<html lang="ja">
<head>
<script
type="module"
data-host-origin="https://example.metatell.app"
></script>
<meta charset="utf-8" />
<title>パネルのページ</title>
</head>
<body>
...
</body>
</html>
agentは、ページ自身のスクリプトより前に実行する必要があります。
ページのほかの<script>タグより前に置いてください。
複数のオリジンを指定する場合は、空白で区切ります。
<script
type="module"
data-host-origin="https://example.metatell.app https://staging.example.metatell.app"
></script>
data-host-originには、オリジンを正確に書いてください。
末尾に/やパスを付けるなど、オリジンでない値が1つでも含まれていると、agentは起動しません。
data-host-originには、信頼できるルームの決まったオリジンだけを指定してください。
agentは、ページの見た目を指定したオリジンへ送ります。
ページ のURLのパラメーターなど、外部から変えられる値をそのまま指定しないでください。
バンドルに組み込む場合
ページをビルドツールでバンドルする場合は、npmパッケージからagentを読み込むこともできます。
npm install @urth/three-html-panel
ページのエントリーポイントの先頭で、ほかのコードより前にstartAgent()を呼び出します。
import { startAgent } from "@urth/three-html-panel/agent";
startAgent({ hostOrigin: ["https://example.metatell.app"] });
CDNを使わない場合は、node_modules/@urth/three-html-panel/lib/agent-script.jsを自分のサーバーから配信します。
<script>タグのsrcには、そのファイルのURLを指定します。
ページを配信する
metatellのルームは、パネルのページをいつもsandboxの<iframe>で開きます。
iframeのsandbox属 性はallow-scripts allow-forms allow-popupsで、allow-same-originは付きません。
そのため、ページは不透明なオリジン(null)で動きます。
ページと、ページが読み込むファイルを、次のように配信してください。
HTTPSで配信する
ページはHTTPSで配信します。 HTTPのページは表示されません。
ページにsandboxのCSPを付ける
ページのHTMLのレスポンスに、次のヘッダーを付けることをおすすめします。
Content-Security-Policy: sandbox allow-scripts allow-forms allow-popups
このヘッダーがあると、ページのURLを直接開いた場合も、ルームで表示した場合と同じsandboxの中で動きます。