我的 iframe 在已发布的 Web 应用程序/侧边栏中在哪里?

The*_*ter 5 iframe web-applications google-apps-script

在尝试控制已window发布的 Web 应用程序和插件侧边栏的in DOM时,我遇到了各种错误。

  • window.location返回一个模糊的未知网址,n-rysutduudd.google-usercontent.com而不是我发布的网络应用网址script.google.com/[SCRIPT_ID]/exec

  • 尝试将我发布的 Web 应用重定向到新 url 失败 window.location.href=www.google.com

  • Web 应用程序中的表单,提交时重定向到空白页面。

经过研究,我认为这是由于在 iframe 中提供了网络内容。除了 webapp 在 iframe 中被沙箱化之外,文档没有显示太多内容。

我研究过的相关文档:

我研究过的一些相关问题:

我的具体问题是:我的 iframe 窗口在已发布的 Web 应用程序或侧边栏中的添加项究竟在哪里?

The*_*ter 6

              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       |    |     |
|     |    |                       |    |     |
|     |    |                       |    |     |
|     |    |                       |    |     |
|     |    |                       |    |     |
|     |    |                       |    |     |
|     |    +-----------------------+    |     |
|     |                                 |     |
|     |                                 |     |
|     +---------------------------------+     |
|                                             |
|                                             |
|                                             |
+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

你是对的。大多数错误是由于谷歌完成的iframe沙箱。要回答你的问题,

  • 您的窗口位于带有 id: 的 iframe 中userHtmlFrame,它src设置为/blank.

  • 这个框架嵌套在另一个框架中,带有src:*.googleusercontent.com和 id sandboxFrame

  • 最后, ThesandboxFrame嵌套在主框架内:script.google.com

笔记:

  • window 在您发布的应用程序中是指最里面的框架。

  • 这个最里面的框架有它自己的cookiesstorage和大多数其他窗口独有的属性。

  • 不幸的是,这个内部框架无法在其他地方导航。

  • 所有窗口导航都必须在最外层框架上完成:script.google.com。这就是为什么文档要求您设置base锚是targettop框架。

  • 没有action的表单被提交到内部框架/blank。因此,您被重定向到一个空白页面。该文档的状态,

但是在 IFRAME 模式下允许提交 HTML 表单,如果表单元素没有指定 action 属性,它将提交到一个空白页面。更糟糕的是,内部 iframe 将在 onclick 处理程序有机会完成之前重定向到空白页面。

  • 产地的iframe的userHtmlFrame继承sandboxFrame和设置*.googleusercontent.com。对于所有意图和目的(、白名单来源、请求),这是有效的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.parentwindow.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       |    | |   |
|  |  |    |                       |    | |   |
|  |  |    |                       |    | |   |
|  |  |    |                       |    | |   |
|  |  |    |                       |    | |   |
|  |  |    |                       |    | |   |
|  |  |    +-----------------------+    | |   |
|  |  |                                 | |   |
|  |  |                                 | |   |
|  |  +---------------------------------+ |   |
|  |                                      |   |
|  +--------------------------------------+   |
|                                             |
+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

对于 Web 应用程序的上述所有说明也适用于在侧边栏或模式对话框中使用 HtmlService 发布的 Web 内容。然而,

  • 这里有一个额外的 iframe 嵌套层。
  • allow-top-navigation从沙箱属性丢失。因此,无法docs.google.com在此处更改/导航顶部框架 ( )。