公開されたWebアプリケーション/サイドバーのiframeはどこにありますか?

Aug 24 2020

window公開されたWebアプリとアドオンサイドバーのDOMを制御しようとすると、さまざまなエラーが発生します。

  • window.locationn-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ウィンドウまたはアドオンサイドバーの正確な場所はどこですか?

回答

6 TheMaster Aug 24 2020 at 03:45
              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ます。

  • 最後に、ThesandboxFrameはメインフレーム内にネストされています。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.topwindow.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ここでトップフレーム()を変更/ナビゲートすることはできません。