Pergunta sobre iframe, userscripts, google-chrome, greasemonkey, javascript – Erro do usercript do Chrome: "Tentativa de JavaScript inseguro para acessar o frame"

4
// the iframe of the div I need to access
var iframe = document.getElementsByTagName("iframe")[2];
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;

// resize 'player' in the iframe
innerDoc.getElementById('player').width = "1000px";
innerDoc.getElementById('player').height = "650px";

Rodando em um userscript para este url:http://www.free-tv-video-online.me/player/sockshare.php?id=24DA6EAA2561FD60

Por que o Chrome apresenta esse erro e falha no script ?:

Unsafe JavaScript attempt to access frame with URL http://www.sockshare.com/embed/24DA6EAA2561FD60 
from frame with URL http://www.free-tv-video-online.me/player/sockshare.php?id=24DA6EAA2561FD60. 
Domains, protocols and ports must match.

(Sou apenas um usuário básico de Javascript)

Código final, muito obrigado ao respondente:

// ==UserScript==
// @name       Resize
// @include    http://www.free-tv-video-online.me/player/sockshare.php*
// @include    http://www.sockshare.com/*
// ==/UserScript==

if (!(window.top === window.self)) {
    var player = document.getElementById('player');
    setSize(player);
}

function setSize(player) {
    player.style.setProperty("width", "1000px");
    player.style.setProperty("height", "650px");
}

Sua resposta

2   a resposta
1

seu navegador não permitirá que você acesse o javascript em um iframe de outro domínio.

Veja a resposta principal aqui:

jQuery cross domain scripting iframe

Ah eu vejo. Eu não entendi o erro (e as outras explicações para isso). Você de alguma forma tornou mais simples de entender :) J.B.
Esta resposta não está correta para userscripts. Eles têm um mecanismo para contornar essa restrição de domínio cruzado esem comprometendo a segurança. Brock Adams
Rhodesian, como eu disse, é para umuserscript J.B.
Não espera que seus usuários façam isso, mas você está? Sherms
stackoverflow.com/a/6083677/1053937 - encontrei uma maneira de desativar essa opção de segurança :) J.B.
13

É verdade que o javascript comum não pode acessar o conteúdo iframe, que está em um domínio diferente, por motivos de segurança.Contudo, isso não impede de maneira alguma os scripts de usuários no Chrome, no Tampermonkey ou no Greasemonkey.

Você pode processar conteúdo iframed em um userscript porque o Chrome (e o Firefox) processam páginas iframe'd como se fossem a página principal. Contabilizando isso, o script de tais páginas é instantâneo.

Por exemplo, suponha que você tenha esta página emdomain_A.com:

<html>
<body>
    <iframe src="http://domain_B.com/SomePage.htm"></iframe>
</body>
</html>


Se você definir seu@match diretivas como esta:

// @match http://domain_A.com/*
// @match http://domain_B.com/*

Em seguida, seu script será executado duas vezes - uma vez na página principal e uma vez no iframe, como se fosse uma página autônoma.

Então, se o seu script foi assim:

// ==UserScript==
// @name  _Test iFrame processing in Chrome and Tampermonkey
// @match http://domain_A.com/*
// @match http://domain_B.com/*
// ==/UserScript==

if (/domain_A\.com/i.test (document.location.href) ) {
    //Main page
    document.body.style.setProperty ("background", "lime", "important");
}
else {
    //iFrame
    document.body.style.setProperty ("background", "pink", "important");
}

Você veria a página principal em verde-limão, e a página iframed em rosa.


Alternativamente, você pode testar assim:

if (window.top === window.self) {
    //--- Code to run when page is the main site...
}
else {
    //--- Code to run when page is in an iframe...
}


Como você descobriu (por comentário sobre outra resposta), você podedesativar a mesma política de origem no Chrome. Não faça isso! Você ficará aberto a todos os tipos de travessuras criadas por pessoas más. Além de sites maléficos, muitos sites "bons" - que permitem que os usuários publiquem conteúdo - poderiam rastrear, hackear ou imitar você.

Seja bem-vindo; feliz em ajudar! Brock Adams
Oh uau, isso funcionou perfeitamente. Coloque o meu código final no OP, obrigado gentilmente! J.B.

Perguntas relacionadas