如何在“不安全的JavaScript试图访问带有url的框架”之前测试浏览器的权限(Chrome本地框架)

How to test browser for permission before "Unsafe JavaScript attempt to access frame with URL" (Chrome local frame)?

本文关键字:框架 测试 浏览器 Chrome 权限 不安全 不安全的 JavaScript 访问 url      更新时间:2023-09-26

当HTML父窗口和iFrame内容位于同一web服务器上时,它们彼此知道并自由通信。当它们被保存到DVD, Chrome抛出一个"不安全的JavaScript试图访问框架与URL"当iFrame试图联系顶部作为一个本地文件。

下面的catch捕获权限错误,但该错误仍然被浏览器注册并且对用户可见。

在尝试访问以排除不安全的JavaScript错误之前,是否可以先测试是否允许此访问?
           // Called from script in an iframe
           function findSiblingIFrame(sibId) {
                 try {
                       var sibFrame = top.document.getElementById(sibId);
                       if (sibFrame != null) {
                           alert("found sibling iframe");
                       } else {
                           alert("did not find sibling iframe");
                       }
                   }
                   catch (err) {
                      alert("not allowed to find sibling iframe");
                      // Would rather test if permission first to prevent
                      // browser from registering the error.
                   }
           }

检查window.location。协议,然后你可以有不同的行为,无论它运行在web服务器上(http:)或本地(file:)。

你应该意识到不同的浏览器对这些事情有不同的权限,所以你也应该检查用户的浏览器

我最终使用HTML5消息传递在iframe层次结构中上下传递潜在的沙盒请求。

例如,嵌套iframe层次结构中的每个html页面都可以访问以下javascript。如果捕获的HTML5消息请求不能在本地执行,则该消息将传递给父节点。父进程也可以向下传递消息到iframe。这是因为所有的页面都可以访问相同的javascript文件。

// function to handle message request
function messageHandler(argJSON) {
    // A collection of available functions for inbound messages
    var msgFunctionMap = new Object();
    msgFunctionMap.removeBorder = removeBorder;
    msgFunctionMap.restoreBorder = restoreBorder;
    // ...more
    // try execute request
    try {
        var jsonObj = JSON.parse(argJSON.data);
        msgFunctionMap[jsonObj.request](jsonObj.args);
    }
    catch (err) {
        alert(" Request not supported: " + argJSON.data);
    }
};
// example function to remove object id x's border if it exists in "this" window, else pass request up
var removeBorder = function (jsonMsg, argObj) {
    var xiFrame = document.getElementById("x");
    if (xiFrame != null) {
        xiOrigWidth = xiFrame.style.borderWidth;
        xiFrame.style.borderWidth = '0px';
    }
    // Otherwise, pass message up else if (window.parent && window.parent.postMessage) {
        window.parent.postMessage(jsonMsg.data, "*");
    }
};
//... more
// pass predefined message request from child to parent
function messageUpHandler(message) {
    if (window.parent && window.parent.postMessage) {
        window.parent.postMessage(message.data, "*");
    }
};
// Listener for child messages
if (window.addEventListener) {
    window.addEventListener("message", messageUpHandler, true);
}