User.js и FF

Сегодня написал небольшой user.js для «Оперы» и решил его переписать под плагин «Greasemonkey», под «Firefox». Оказалось, что есть немаловажные различия.

Во-первых, объект window браузера напрямую недоступен — нужно пользоваться «unsafeWindow», но руководство не рекомендует его использовать. Мне в user.js window браузера нужен был для доступа к jQuery, который был подгружен на странице, где работает скрипт, мне было удобно использовать этот framework. Объект «window» тоже есть, это внутренний объект Greasemonkey и выглядит как настоящий, только не радует на него, например, рекомендуется вешать все события.

Во-вторых, обращаться к функциям, определённым на странице, рекомендуется через «location.href="javascript:void(pageFunc(123))"», утвержается, что это более безопасно, видимо, чтобы не передавать контекст выполнения наружу. Говорят, что в Chrome 4 это единственный способ добраться до «window».

В-третьих, из скриптов, выполняющихся из Greasemonkey, можно использовать функции «GM_xmlhttpRequest» (XHR с возможностью делать запросы на любые адреса), «GM_log» (логгирование, как можно догадаться) и так далее.

Ну и можно использовать localStorage (FF 3.5+) и globalStorage (FF 2.0+) для сохранения данных user.js.
8 декабря 2009 22:10

arty (arty.name)
9 декабря 2009, 01:21

я тут тоже недавно возился с переносом userjs из оперы в хром и фф. В хром всё получилось достаточно быстро унести, хотя невозможность присваивать innerHTML для head меня серьёзно удивила. А вот гризманки со своей сверхзаботливостью — порождение дьявола. В итоге я просто сделал вот что: в юзерскрипте объявлена функция, и скрипт просто вставляет её .toString() в тело документа и запускает его.

кстати, проблем с window в хроме я не замечал. Может, я его особо не использую, не знаю…

ELV1S (elv1s.ru)
10 декабря 2009, 09:17

Возможно, в Greasemonkey 1.0 удастся избавится от unsafeWindow http://groups.google.com/group/greasemonkey-dev/browse_thread/thread/9f74ff190736f179

У меня были проблемы с location.href="javascript:void(pageFunc(123))" (он же location hack) в Firefox-е. Marti Martz, активный коммитер Greasemonkey, сказал: "Please note that the location hack only works under certain platforms. Nix for example won't support this fully in the Firefox distro." http://github.com/NV/nice-alert.js/issues/#issue/6 . Это похоже на правду.
(в «Опере» для этого можно использовать opera.io.filesystem)
Это же только в виджетах и юнайт приложениях. Или я не знаю чего?

ELV1S (elv1s.ru)
10 декабря 2009, 09:20, ответ предназначен arty (arty.name):

кстати, проблем с window в хроме я не замечал. Может, я его особо не использую, не знаю…
Пока ты не используешь переменные внутри window (исключая document), проблем нет.

bolk (bolknote.ru)
10 декабря 2009, 23:33, ответ предназначен ELV1S (elv1s.ru):

Это же только в виджетах и юнайт приложениях. Или я не знаю чего?
Я попробовал на скорую руку, у меня вышло. Или я что-то неаккуратно сделал и принял желаемое за действительное? Если попробуешь и не выйдет, дай знать.

ELV1S (elv1s.ru)
11 декабря 2009, 23:26, ответ предназначен bolk (bolknote.ru):

http://userscripts.ru/js/opera.io.filesystem.js говорит, что opera.io.filesystem undefined.

bolk (bolknote.ru)
12 декабря 2009, 16:48, ответ предназначен ELV1S (elv1s.ru):

Ага, спасибо. Странно.

ELV1S (elv1s.ru)
16 декабря 2009, 15:00, ответ предназначен arty (arty.name):

в юзерскрипте объявлена функция, и скрипт просто вставляет её .toString() в тело документа и запускает его.
Этот метод намного легче дебажить, чем location hack. Спасибо!

arty (arty.name)
16 декабря 2009, 17:17, ответ предназначен ELV1S (elv1s.ru):

Возможно, в Greasemonkey 1.0 удастся избавится от unsafeWindow
это было бы очень круто!

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)