O manipulador de protocolo personalizado não funciona no Chrome na página SSL

2

Eu criei e registrei com êxito um manipulador de protocolo personalizado em meu aplicativo da web e ele está funcionando bem em todos os navegadores. Há o diálogo de aviso inicial sobre o lançamento de um aplicativo externo, o que é bom.

No entanto, quando o aplicativo é implantado e o site é executado em SSL, os links de protocolo personalizados não funcionam mais no Chrome. Eu vejo a seguinte mensagem aparece no console Developer Tools:

[blocked] The page at https://my.site.com/path/to/page ran insecure content from iwd:-action=myaction

Os mesmos links funcionam bem no Internet Explorer e no Firefox.

Alguma idéia de como fazer isso funcionar? Meu aplicativo externo, por sinal, é um aplicativo de console instalado no cliente.

edit: Uma informação extra importante é que o link especifica um destino que é um iframe oculto na mesma página.

    
por Catch22 07.10.2013 / 12:02

4 respostas

2

A solução foi não especificar um quadro de destino para usuários do Chrome. Parece que o Chrome está vendo o URL sendo passado da página principal para o iframe incorporado e vê que o URL do iframe incorporado não é seguro e, portanto, está sendo rejeitado.

Eu não acho que o Chrome sempre se comportou dessa maneira, mas com a v30 + a solução parece ser especificar e esvaziar o destino no link.

Editar - solução expandida

Aqui está o JavaScript que uso para limpar os atributos de destino dos links (somente para usuários do Chrome). Caso contrário, a solução simples é não especificar um atributo de destino no HTML em primeiro lugar.

// Get a list of all the links with external commands
var commandButtons = $("a[target='my_command']");
updateCommandButtonTargetsForChrome();

// Remove target attribute for Chrome only users
function updateCommandButtonTargetsForChrome() {
    var browserInfo = getBrowserInfo();
    if (browserInfo[0] == "Chrome")
        commandButtons.attr("target", "");
}

function getBrowserInfo() {
    var n = navigator.appName, ua = navigator.userAgent, tem;
    var m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if (m && (tem = ua.match(/version\/([\.\d]+)/i)) != null) m[2] = tem[1];
    m = m ? [m[1], m[2]] : [n, navigator.appVersion, '-?'];
    return m;
}
    
por 07.10.2013 / 13:22
1

Como todas as respostas neste tópico já estão sendo feitas especificamente para o Google Chrome, há uma maneira muito mais simples de abrir um aplicativo por meio do manipulador de protocolo que só funcionará apenas no Google Chrome.

Basta ligar para window.location.assign("customprotocol://"); . No que diz respeito ao usuário, isso funcionará exatamente da mesma forma que a abordagem IFRAME usada. Se o usuário não tiver o manipulador de protocolo instalado, nada acontece. Se o manipulador de protocolo estiver instalado, ele abrirá o aplicativo.

Isso só funcionará no Chrome, pois o Firefox e o IE redirecionarão o usuário para a página "Não foi possível carregar" se eles não tiverem o manipulador de protocolo instalado em sua máquina.

    
por 18.10.2013 / 20:32
1

Parece que o problema o tempo todo é como o URL é escrito.

crie o URL sem o "//":

customproto:xyzabcdef

Em vez de:

customproto://xyzabcdef
    
por 12.11.2013 / 14:57
0

Obrigado por descobrir isso, usando o mesmo princípio, eu o transformei em uma chamada de função dinâmica, aqui está o código:

    <input type='button' value='Test Custom Url' onclick='exec()'>

    <script>
    function submitRequest(buttonId) {
        if (document.getElementById(buttonId) == null || document.getElementById(buttonId) == undefined) return;
        if (document.getElementById(buttonId).dispatchEvent) {
                var e = document.createEvent("MouseEvents");
                e.initEvent("click", true, true);
                document.getElementById(buttonId).dispatchEvent(e);
        } 
        else {
                document.getElementById(buttonId).click();
        }
    }

    function exec(){
        var f = document.getElementById('customUrlLink')
        if (f ) {f.parentNode.removeChild(f);}
        var a = document.createElement('a');
        a.href =  'mycustomproto://arg1';    
        a.innerHTML = "Link"                                    
        a.setAttribute('id',        'customUrlLink');
        a.setAttribute("style", "display:none; "); 
        document.body.appendChild(a); 
        submitRequest("customUrlLink");
    }
    </script>

Uma coisa, esse código não será executado em um iframe. Assim, o iframe pode chamar isso no pai ou é possível criar o objeto de link no pai.

O IE também permite apenas caracteres do tipo < 1000 (não sei o número exato) usando essa abordagem.

    
por 18.10.2013 / 16:25