Сбой букмарклета Javascript на определенных сайтах, создает призрачную новую страницу

#javascript #security #bookmarklet #bookmarks

#javascript #Безопасность #букмарклет #закладки

Вопрос:

Я заметил, что мой букмарклет Javascript завершался с ошибкой на определенных сайтах, таких как Google Reader и страницы результатов поиска Google (и случайным образом на некоторых сайтах, отличных от Google). Глядя на консоль, я мог видеть, что для этих страниц нажатие букмарклета не добавляло элементы к заголовку / телу, как это обычно делалось, но создавало новый документ, который выглядел следующим образом:

 <html>
  <head></head>
  <body></body>
</html>
  

Даже когда я уменьшал свой букмарклет до javascript:alert(window.location.href); , он создавал эту пустую страницу и запускал букмарклет на ней, чтобы отображалось предупреждение about:blank . На большинстве сайтов эта пустая страница не создается и отображается правильное местоположение.

Кто-нибудь может это объяснить? Эти сайты изолируют внешний запускаемый код в качестве меры безопасности?

ОБНОВЛЕНИЕ: в настоящее время я не могу воспроизвести это в браузерах, отличных от Chrome 17.0.932.0 dev. Пожалуйста, дайте мне знать, может ли кто-нибудь еще воспроизвести эти результаты в Chrome или иным образом.

Комментарии:

1. Я не могу воспроизвести ваши выводы. Какой браузер вызывает проблемы?

2. Удивительные. Я мог бы поклясться, что это происходит во всех браузерах, но теперь я могу воспроизвести это только в Chrome dev. Если кто-либо другой не сможет воспроизвести в других браузерах, считайте, что эта проблема отложена.

3. Вы тестируете с помощью букмарклетов или вставляете в строку расположения?

4. Я тестировал с помощью букмарклетов. Безусловно, стоит вставить. Запуск одного и того же кода из консоли работает должным образом каждый раз, так что, похоже, проблема с навигацией с javascript: links.

5. 1 для веб-страницы, похожей на призрак.

Ответ №1:

Я думаю, что это ошибка в Google Chrome, я отправил ее в их базу данных ошибок:https://bugs.webkit.org/show_bug.cgi?id=72606

Ответ №2:

Вам нужно убедиться, что самый верхний код, то есть тот, что сразу после javascript: , ничего не возвращает.

Обычно это делается путем переноса всего в void() :

 javascript:void(alert(window.location.href));
  

Очень странно, что он прерывается с alert() , хотя, поскольку сама функция ничего не возвращает…

Комментарии:

1. Спасибо, ThiefMaster. Я попробовал это с void и получил те же результаты. Все еще очень часто получаю это в Chrome dev. Откройте ее в FF и сделайте букмарклет = нет проблем. Нужно попробовать больше в Chrome stable и сообщить им.

Ответ №3:

Если javascript: URL возвращает строку, она будет использована для создания нового документа:

 javascript:'foo bar baz';
  

Это может быть сложной проблемой для отладки, если вы не знаете, как за этим следить. Это может возникнуть, если вы используете функцию, которая возвращает строку, или заканчиваете свой букмарклет строкой, которая задает строковое значение:

 javascript: a = prompt('foo bar baz'); b = a;
  

Простое решение — использовать закрытие:

 javascript:(function(){ var a; a = prompt('foo bar baz'); window.b = a}());
  

Альтернативой является завершение с void 0;

 javascript: a = prompt('foo bar baz'); b = a; void 0;