Как проверить браузер на наличие разрешений перед «Небезопасной попыткой JavaScript получить доступ к фрейму с URL» (локальный фрейм Chrome)? - PullRequest
3 голосов
/ 03 декабря 2011

Родительское окно HTML и содержимое iFrame знают друг о друге и свободно общаются, когда они находятся на одном веб-сервере. Когда они сохраняются на DVD, Chrome выдает «Небезопасную попытку JavaScript получить доступ к фрейму с URL», когда iFrame пытается связаться с вершиной как локальным файлом.

В приведенном ниже улове обнаруживается ошибка прав доступа, но она все еще регистрируется браузером и отображается для пользователя.

Можно ли сначала проверить, разрешен ли этот доступ, прежде чем пытаться получить доступ, чтобы исключить небезопасную ошибку 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.
                   }
           }

Ответы [ 2 ]

0 голосов
/ 08 мая 2012

Я закончил тем, что использовал обмен сообщениями HTML5 для передачи потенциальных запросов в песочнице вверх и вниз по иерархии iframe.

Например, каждая html-страница во вложенной иерархии iframe имеет доступ к следующему javascript. Если перехваченный запрос сообщения HTML5 не может быть выполнен локально, сообщение передается родителю. Родитель также может передавать сообщения в iframes. Это работает только потому, что все страницы имеют доступ к одному и тому же файлу 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);
}
0 голосов
/ 07 марта 2012

Просто проверьте window.location.protocol , и тогда вы можете иметь другое поведение, если оно работает на веб-сервере ( http: ) или локально ( файл:. )

Вы должны знать, что разные браузеры имеют разные разрешения на эти вещи, поэтому вам следует также проверить браузер пользователя.

...