Javascript.RU

Кросс-доменные запросы в юзерскриптах Оперы

Все, кто хоть раз писал пользовательский сценарий, наверняка сразу же почувствовали разницу между подходами Opera Software ASA и Mozilla Foundation к этому хитрому делу. Не разглагольствуя особо, замечу лишь, что Опера позволяет перехватывать выполнение других скриптов, как внедренных, так и присоединенных. И это можно использовать в не совсем обычном контексте.

В своей документации разработчики Оперы упоминают, что для присоединенных сценариев работает свойство e.element.src, а для внедренных — e.element.text.
Но, оказыватся, для присоединенного сценария свойство .text прекрасно себе работает. Т.е., можно присоединить сценарий, получить его текстовое значение, а потом не запускать (e.preventDefault()). Да и сам сценарий, строго говоря, может сценарием и не являться.

Ниже представлен пример такого запроса.
Пример предоставлен исключительно в образовательных целях. очень не советую использовать его «как есть» в своих скриптах ввиду того, что проверки «легитимности» нет — функция лежит в глобальной видимости и позволяет получить вообще любой файл.

/* объект window.opera доступен юзерскриптам только в основном потоке */
window.opera.addEventListener('BeforeScript', function(e){ 
	
	/* если у объекта, представляющего тег script, нет метода __callback, то это обычный скрипт, и делать с ним ничего не надо */
	if (!e.element.__callback) return true; 
	
	/* вызываем callback в области window, иначе получим ошибку с неправильным this  */
	e.element.__callback.call(window, e.element.text);
	
	/* избегаем запуска этого скрипта */
	e.preventDefault();
	
	/* избегаем дальнейшую обработку скрипта */
	e.stopPropagation();
/* capturing, скрипт заведомо не рассчитан на IE */	
}, true); 

/* функция, добавляющая «хитрый» script */
function getScriptedText(url, callback){

	/* если к моменту запуска document.body еще не существует, создаем его вручную */
	if (!document.body){
		var body = document.createElement("body");
		document.getElementsByTagName("html")[0].appendChild(body);
	};
	
	/* создаем скрипт и прицепляем к нему ссылку на функцию-обработчик */
	var script = document.createElement("script");
	script.src = url;
	script.__callback = callback;
	
	/* присоединяем скрипт к документу, далее передавая работу обработчику. */
	document.body.appendChild(script);
};

/* прямой вызов */
getScriptedText('http://ya.ru/', alert);

/* вызов по событию */
document.addEventListener('DOMContentLoaded', function(){
	getScriptedText('http://example.com', alert);
}, false);

Запрос содержимого производится асинхронно, т.е., может произойти в любой момент, не задерживая загрузку остального содержимого.

Кстати, «Здравствуй, дорогой дневничок…», это моя первая запись тут.

+5

Автор: br_took, дата: 28 ноября, 2009 - 00:09
#permalink

раз уж вы подняли эту тему может быть поможете?
постановка наверное классическая: есть два хоста требуется с одного на другой кинуть POST с данными и получить ответ
серверную часть изменить нет никакой возможности(те никаких политик/серверных прокси), ну и инклюдит себе какую то версию jQuery
сервер приемника принимает стандартный пост результат возвращает в text/html
, изменить теоретически можно, но сильно нежелательно( как бы необходимость в посте отпадет все через script тогда потечет)

через iframe form submit смог корректно отправить, но не могу получить ответ
в общем перепробовал уже много чего и пока мне неуд

возможен ли в принципе для userscript opera кроссдоменный post?(работающий ессно)

js для меня родным не является и возможно я не понимаю чего-то базового
буду рад туториалу=)

может все дело в моей сборке оперы
заранее спасибо
и кстати может вы в курсе что они имели ввиду


Автор: subzey, дата: 29 ноября, 2009 - 15:32
#permalink

Это дело достаточно затруднительно технически. Но можно исхитриться, и сделать как-нибудь так:

  1. Исходное состояние. У нас есть некая исходня страница на example.com, и юзерскрипт, которому нужно послать запрос на google.com.
  2. Устанавливаем обработчик события message и создаем iframe с любой страницей с домена google.com. Для того, чтобы прицепть iframe, нужно, чтобы document.body уже существовал к тому моменту.
  3. На этой странице подгружается тот же юзерскрипт, но другая его часть - раздатчик. Раздатчик создает обработчик события message и сообщает через parent.postMessage приемнику, что готов получить данные. Одноременно с этим загрузка страницы останавливается (экономия трафика).
  4. Приемник отсылает раздатчику через тот же самый postMessage данные, которые нужно отправить постом. Передаваемые данные представляют собой строку и только строку, поэтому данные нужно как-то сериализовать. Можно было бы отправить эти данные через хеш URL, но длина GET-запроса не такая уж и больша, да и "палить контору" не всегда нужно.
  5. Раздатчик получил данные и создает по ним XHR.
  6. XHR вернул данные или ошибку. Все это сериализуется и отсылается обратно приемнику.

Прошу прощения, что опять привожу схему без конкретных примеров, это был бы интересный скрипт, но у меня, увы, и так очень мало свобоного времени Sad.


Автор: Гость (не зарегистрирован), дата: 7 декабря, 2009 - 07:56
#permalink

Большое спасибо! Именно то, что я искал.


Автор: B@rmaley.e><e (не зарегистрирован), дата: 23 декабря, 2009 - 22:42
#permalink

Кстати, а что насчет безопасности? Для пользователя такого UserJS может быть составлена специальная страница со скриптом с заданным свойством __callback. А что, если запрашивается страница с конфиденциальными данными?

Может быть, это паранойя, но я бы сделал хэш callback'ов, а в свойство __callback записывал только ключ хэша.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
12 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
subzey
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum