postMessage не работает в GreaseMonkey - PullRequest
4 голосов
/ 17 июля 2010

Поскольку он не может получить доступ к свойству contentWindow в междоменном iframe, но в чистом Firefox он будет работать.Вот несколько кодов, изолирующих эту проблему:

  1. создайте 3 файла на локальном сервере:

test.html

<SCRIPT language="JavaScript" SRC="http://localhost/postmsg.js"></SCRIPT>
<iframe src="http://127.0.0.1/iframe.htm" id="iframe"></iframe>
<div>Click anywhere on this page to see message from embedded iframe,
which do not need to be on the same domain</div>

iframe.html

<SCRIPT language="JavaScript" SRC="http://127.0.0.1/postmsg.js"></SCRIPT>
<div id="message"></div>

postmsg.js

// ==UserScript==
// @include       *
// ==/UserScript==

alert('script loaded')
window.addEventListener('click', 
    function() {
        frame = document.getElementsByTagName("iframe")[0]
        cwindow = frame.contentWindow //here comes the error anything after this line won't execute in greasemonkey
        alert("this won't show in greasemonkey");
        cwindow.postMessage("hello, iframe!","*")
    },
true);

window.addEventListener("message", function(e){
        alert("message from iframe: main window was clicked!  " +e.data);
        document.getElementById('message').textContent += "message from iframe: main window was clicked!\n"
}, true);

этот js-файл может работать как стандартный включенный html-файл, затем первые комментарии игнорируются, но после переименования расширение для user.js может быть установлено в greasemonkey, а затем перестает работать после строки, когда contentWindow вызывается

, обратите внимание, что даже если основной и рамочный html находятся на одном сервере для интерпретатора js, эти файлы находятся в разных доменах, потому что интерпретатор js не знает, что localhost и 127.0.0.1 идентичны

Я поставил "@include *", чтобы вы могли проверить его на разных сайтах, и похоже, что эта ошибка существует только для междоменных фреймов.Если вы перейдете на translate.google.com, на котором есть несколько iframe, но все они находятся в одном домене, этот сценарий работает, как и ожидалось

Вопрос в том, что делает адская междоменная проверка безопасности на greasemonkey?Это противоречит использованию этого инструмента.Вредоносный сайт не может установить скрипт, пользователь должен согласиться с этим.Я надолго застрял в этом, потому что firebug не указывал, что свойства, которые он показывает в междоменном iframe, фактически недоступны движком js браузера.

...