如何防止iframe修改顶级浏览上下文(top.history)?

时间:2016-06-03 18:37:27

标签: javascript html5 iframe html5-history

我尝试创建一些能够在其中托管其他子应用程序(同域)的布局管理Web应用程序。

Overview

目前,主应用程序可以跟踪子应用程序中的任何导航并在主应用程序中保留导航记录。用户可以单击后退或前进按钮转到最近页面。一切正常,直到我在子应用程序中找到一些代码,以编程方式更改location.hash属性或在子应用程序中调用history.pushState方法。

通常,浏览器会自动将旧的历史状态添加到正确的子应用程序的历史堆栈中。但现代浏览器总是共享历史堆栈在导致主要应用程序破损历史的主应用程序其他所有iframes (子应用程序)之间。用户无法在浏览器中单击返回主应用程序之前访问的上一页。

根据W3C

  

顶级浏览上下文联合会话历史记录是联盟   所有完全浏览上下文的所有会话历史记录   共享该顶级浏览上下文的活动Document对象,   包含各自当前条目的所有条目   会话历史记录已删除,但联合会的当前条目除外   会话历史。

我有两个问题。

  1. 是否可以为每个iframe创建单独的历史记录?我尝试像这样设置document.domain

    • 主要应用领域是' apps.site.com'。
    • 子应用程序域是' apps.site.com'但我把它更改为' site.com'防止跨站点脚本。但它不起作用,因为浏览器同步这段历史而不是iframe。
  2. 有没有办法阻止iframe导航/ hashchange / pushState? 我目前的想法是修补每个相关的属性/方法,并听取click事件以防止更改浏览器历史记录。我不确定这会起作用,这样做似乎风险太大。

  3. 谢谢,

    价: https://html.spec.whatwg.org/multipage/browsers.html#traverse-the-history

1 个答案:

答案 0 :(得分:0)

我知道Chrome有一个新标签,它在一个与您的应用程序不同的进程中运行。您可以查看:https://developer.chrome.com/apps/tags/webview

但是这个标签不是HTML5标准化的标签。大多数其他主流浏览器都不支持此功能。

但对于Iframe,答案是否定的。