公開されたWebアプリケーション/サイドバーのiframeはどこにありますか?
window
公開されたWebアプリとアドオンサイドバーのDOMを制御しようとすると、さまざまなエラーが発生します。
window.location
n-rysutduudd.google-usercontent.com
公開されたWebアプリのURLの代わりに、のような漠然とした不明なURLを返しますscript.google.com/[SCRIPT_ID]/exec
公開したWebアプリを新しいURLにリダイレクトしようとすると失敗します
window.location.href=www.google.com
Webアプリのフォームは、送信されると空白のページにリダイレクトされます。
調査した結果、これはWebコンテンツがiframeで提供されているためだと思いました。Webアプリがiframeでサンドボックス化されていることを除いて、ドキュメントにはあまり表示されていません。
私が調査した関連ドキュメント:
- https://developers.google.com/apps-script/migration/iframe
- https://developers.google.com/apps-script/guides/html/restrictions
私が調べた関連する質問のいくつか:
- window.location.href = window.location.hrefは空白のページを返します
- Google ScriptWebアプリは送信後に空白のページになります
- リダイレクトされたURLがマスクされないようにするにはどうすればよいですか?
私の具体的な質問は、公開されたWebアプリのiframeウィンドウまたはアドオンサイドバーの正確な場所はどこですか?
回答
PUBLISHED WEB APP
+---------------------------------------------+
| script.google.com |
| |<------- [#0] window.top The top frame
| |
| +---------------------------------+ |
| | *.googleusercontent.com |<----+-------- [#1] Outer Sandboxed Iframe
| | sandboxFrame | |
| | +-----------------------+ | |
| | | /blank | | |
| | | userHtmlFrame | | |
| | | | | |
| | | Where the html |<---+-----+-------- [#2] Inner Sandboxed Iframe
| | | file you created | | |
| | | is loaded | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | +-----------------------+ | |
| | | |
| | | |
| +---------------------------------+ |
| |
| |
| |
+---------------------------------------------+
あなたが正しい。エラーのほとんどは、Googleによって行われたiframeサンドボックス化が原因です。あなたの質問に答えるために、
あなたの窓は、idのiframe内に位置しています:
userHtmlFrame
それはだとsrc
に設定します/blank
。このフレームは、
src
:*.googleusercontent.com
とidを持つ別のフレーム内にネストされていsandboxFrame
ます。最後に、The
sandboxFrame
はメインフレーム内にネストされています。script.google.com
ノート:
window
公開されたアプリでは、最も内側のフレームを指します。この最も内側のフレームには、独自のCookie、ストレージ、およびウィンドウに固有の他のほとんどの属性があります。
残念ながら、この内側のフレームは他の場所に移動できません。
すべてのウィンドウナビゲーションは、最も外側のフレームで実行する必要があります
script.google.com
。理由はここにありドキュメントがセットにあなたを尋ねbaseたりアンカーのtargetにtop
フレーム。なしのフォームactionは、内側のフレームに送信され
/blank
ます。したがって、空白のページにリダイレクトされます。ドキュメントの状態、
ただし、IFRAMEモードでは、HTMLフォームの送信が許可され、フォーム要素にアクション属性が指定されていない場合は、空白のページに送信されます。さらに悪いことに、onclickハンドラーが終了する前に、内側のiframeが空白のページにリダイレクトされます。
起源あなたのiframeのが
userHtmlFrame
されて継承されたからsandboxFrame
とに設定します*.googleusercontent.com
。すべての目的と目的(cors、オリジンのホワイトリスト、フェッチリクエスト)に対して、これは効果的origin
です。sandboxFrame
現在持っている次の機能のポリシーを:allow
accelerometer *; ambient-light-sensor *; autoplay *; camera *; encrypted-media *; fullscreen *; geolocation *; gyroscope *; magnetometer *; microphone *; midi *; payment *; picture-in-picture *; speaker *; usb *; vibrate *; vr *
- 現在、次のサンドボックス属性があり、他のフレームに対して実行できることを制限しています。
allow-downloads allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-top-navigation
- 外側のウィンドウ/他のウィンドウは、内側のフレームを使用して
window.top
、window.parent
またはwindow.opener
内側のフレームから参照できます。ただし、同一生成元ポリシーのために複数の制限が課せられます。クロスオリジンアクセスはほとんど制限されています。特に注目すべきはwindow.postMessage
、フレーム間の通信を可能にするです。
SIDEBAR/MODAL DIALOG
+---------------------------------------------+
| docs.google.com |
| +--------------------------------------+ |<------- [#0] window.top The top frame
| | /macros/.../iframedAppPanel |<--+-------- [#1] Frame1 Same origin
| | +---------------------------------+ | |
| | | *.googleusercontent.com |<|---+-------- [#2] Outer Sandboxed Iframe
| | | sandboxFrame | | |
| | | +-----------------------+ | | |
| | | | /blank | | | |
| | | | userHtmlFrame | | | |
| | | | | | | |
| | | | Where the html |<---+-|---+-------- [#3] Inner Sandboxed Iframe
| | | | file you created | | | |
| | | | is loaded | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | +-----------------------+ | | |
| | | | | |
| | | | | |
| | +---------------------------------+ | |
| | | |
| +--------------------------------------+ |
| |
+---------------------------------------------+
Webアプリに関する上記のすべての注意事項は、サイドバーまたはモーダルダイアログでHtmlServiceを使用して公開されたWebコンテンツにも当てはまります。しかしながら、
- ここには、iframeのネストされた追加のレイヤーがあります。
allow-top-navigation
サンドボックスの属性から欠落しています。したがって、docs.google.com
ここでトップフレーム()を変更/ナビゲートすることはできません。