Обработчик пользовательских протоколов не работает в Chrome на странице SSL
Я успешно создал и зарегистрировал собственный обработчик протокола в своем веб-приложении, и он отлично работает во всех браузерах. Там есть начальный диалог с предупреждением о запуске внешнего приложения, что нормально.
Однако когда приложение развернуто и сайт работает по протоколу SSL, ссылки на настраиваемый протокол больше не работают в Chrome. Я вижу следующее сообщение появляется в консоли инструментов разработчика:
[заблокировано] На странице https://my.site.com/path/to/page был небезопасный контент из iwd:-action=myaction
Те же ссылки прекрасно работают в Internet Explorer и Firefox.
Есть идеи, как заставить это работать? Кстати, мое внешнее приложение - это консольное приложение, которое установлено на клиенте.
редактировать: еще одна важная часть информации заключается в том, что ссылка указывает на цель, которая является скрытым iframe на той же странице.
4 ответа
Решение состояло в том, чтобы не указывать целевой кадр для пользователей Chrome. Похоже, что Chrome просматривает URL-адрес, передаваемый с главной страницы во встроенный iframe, и видит, что встроенный URL-адрес iframe небезопасен, и поэтому отклоняет его.
Я не думаю, что Chrome всегда так себя вел, но с v30+ решение, похоже, заключается в том, чтобы указать и очистить цель в ссылке.
Edit - расширенное решение
Вот JavaScript, который я использую для очистки целевых атрибутов ссылок (только для пользователей Chrome). В противном случае простое решение состоит в том, чтобы не указывать целевой атрибут в HTML в первую очередь.
// 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;
}
Похоже, проблема все время в том, как написан URL.
создать URL без "//":
customproto:xyzabcdef
Вместо:
customproto://xyzabcdef
Похоже, что все ответы в этой теме уже делают что-то специфическое для Chrome, есть гораздо более простой способ открыть приложение через обработчик протокола, который будет работать только для Chrome.
Просто позвони window.location.assign("customprotocol://");
, Что касается пользователя, то это будет работать точно так же, как и подход IFRAME. Если у пользователя не установлен обработчик протокола, ничего не происходит. Если обработчик протокола установлен, он откроет приложение.
Это будет работать только в Chrome, поскольку Firefox и IE будут перенаправлять пользователя на страницу "Не удалось загрузить", если на его компьютере не установлен обработчик протокола.
Спасибо, что нашли это, используя тот же принцип, я превратил его в динамический вызов функции, вот код:
<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>
Во-первых, этот код не будет работать в iframe. Таким образом, iframe может вызывать это в родительском объекте или возможно создать объект ссылки в родительском объекте.
Кроме того, IE позволяет использовать <1000 (я не знаю точное число) символов, используя этот подход.