Дело в том что у меня платное расширение, в котором на JavaScript работает тяжёлый алгоритм сегментоидного распознавание изображений. До 23го фаерфокса от 3 до 22, работа алгоритма занимала 5 секунд, 23-й фаерфокс 15 секунд. Могу предположить, что падение производительности общее, ибо все скрипты стали работать медленнее, по крайней мере в расширениях точно. Клиенты уже поголовно переставили 22й фокс, но это не дело, согласитесь)
Вопросы:
1. У кого были аналогичные тормоза, кто тестил, не нашли ли более конкретную проблему, чем просто "тормозит"?
2. В 23м фаерфоксе не ввели ли дополнительные мониторы/проверки/настроки безопасности, связанные с JavaScript? Если ввели, подскажите, как их отключить?
3. Кто листал английское комьюнити, возможно там описывали это в виде бага?
Использование функционала вроде setAttribute, document.cookie= , .innerHTML= вообще нежелательно (особенно в коде страницы а не расширения) и при них не гарантируется браузеро-независимость. Лучше jQuery. А если хочешь отладить баг используй расширение firebug, или на худой конец:
SunnyDay
Весьма вероятно что что-то изменилось в движке JS. Тебе нужно либо интересоваться тем, как он работает, и под него подстраиваться (иногда один и тот же цикл, записанный разными способами, может работать с разницей в десятки и сотни раз в скорости) или переписать свой алгоритм на чём-то вроде C++ и «скомпилировать» в asm.js.
Спс, всё это интересно, но метр кода под компилятор перелопачивать не хотелось бы :) Да и не шибко гонюсь за производительностью, просто хотелось бы вернуть, как было, а то на вопросы клиентов - почему тупит, заставлять их переставлять 22й фокс, как-то не айс. А вот по поводу изменений в движке, мне кажется это какие-то настройки безопасности - с 3го по 22й фаерфокс работало нормально а тут бах, и все скрипты, даже которые не относятся к распознаванию изображений работают медленнее..
Я наверное проведу тесты, выясню конкретно, что тормозит там - замыкания, циклы, объявления переменных, итп, или
…День добрый всем! С 23м фаерфоксом у меня появилась проблема - значительно медленнее (раза в полтора-два) стал работать javascript по сравнению с 22м фоксом. Я разработчик плагина с тяжёлым алгоритмом распознавания изображений - мои пользователи сразу все заметили падение производительности. Подскажите пожалуйста, с чем это может быть связано? Тесты пока не проводил, но потом если это только я заметил, проведу детальнее анализ..
По просьбе орец выкладываю рабочий код кормёжки флеша событиями:
обновлённый класс работы с windows (linux пока не заморачивал..)
[code]
var YBOSWrapper = {
loaded: false,
//объявление windows-типов
CallBackABI: false,
WinABI: false,
EnumWindowsProc: false,
//windows-функции
EnumWindows: false,
EnumChildWindows: false,
PostMessage: false,
load: function () {
try{
eval('Components.utils.import("resource://gre/modules/ctypes.jsm")');
this.user32dll = ctypes.open("user32.dll");
/*
Linux
ctypes.open("libc.so.6");
Most other Unixes
libc = ctypes.open("libc.so");
*/
if (ctypes.size_t.size == 8) {
this.CallBackABI = ctypes.default_abi;
this.WinABI = ctypes.default_abi;
} else {
this.CallBackABI = ctypes.stdcall_abi;
this.WinABI = ctypes.winapi
А зачем тебе заменять скрипты, почему бы просто не добавлять свой фунционал? В фаерфоксе событие DOMContentLoaded, реализуется добавление скрипта например так: target_document.defaultView.wrappedJSObject.eval(Yo_js_inject)
это уже php и к фаерфоксу никак не относится, пропиши
header('Content-Type: text/html; charset=utf-8');
уж не знаю что есть require("widget") и require("page-mod") но предполагаю, что у объекта, который ты называешь "виджет" есть собственный документ, и при инъекции document.getElementById он ищет именно в этом документе.
Тем более если работает конструкция (а также если запощеный тобой JS-код внутри расширения):
test = "Page matches ruleset"; pageMod.PageMod({ include: "*.org", contentScript: 'window.alert(test);' });
это означает только одно - что документ для этого "виджета" является корневым документом браузера Firefox - естественно скрипт там не найдёт поля логина и пароля.
Если я неправ - обобщи проблемму, напиши хотябы где и как выполняются скрипты которые ты запостил, я вот например не знаю что за класс "page-mod" , "widget", и функция require , и 100 лет бы не знал)
…Есть много способов, первый - WJO:
//в JS расширения alert(content.document.defaultView.wrappedJSObject.some_target_JS_var);//читаем внешнюю переменную content.document.defaultView.wrappedJSObject.some_target_JS_var = 'afk';//записываем внешнюю переменную content.document.defaultView.wrappedJSObject.some_target_JS_func('fukfuk');//выполняем внешнюю функцию
второй более архитектурный(observer) - свои события:
//в JS target-документа ... MyEvent = document.createEvent("Events") MyEvent.initEvent("MyEvent", true, false); ... MyEvent.someparam = someval; SomeDomElement.dispatchEvent(MyEvent); //в JS расширения content.document.getElementById('SomeDomElement').addEventListener('MyEvent', some_dispatch_function); var some_dispatch_function = function(event){ alert(event.target.getAttribute('id')); alert(event.someparam); }
Проблемма решена! Как и обещал, выкладываю решение:
небольшая обёрточка на js-ctypes для работы с windows-окнами, и отправки событий мышки:
[code]
var YBWindows = {
loaded: false,
//объявление windows-типов
CallBackABI: false,
WinABI: false,
EnumWindowsProc: false,
//windows-функции
EnumWindows: false,
EnumChildWindows: false,
PostMessage: false,
load: function () {
try{
eval('Components.utils.import("resource://gre/modules/ctypes.jsm")');
this.user32dll = ctypes.open("user32.dll");
/*
Linux
ctypes.open("libc.so.6");
Most other Unixes
libc = ctypes.open("libc.so");
*/
if (ctypes.size_t.size == 8) {
this.CallBackABI = ctypes.default_abi;
this.WinABI = ctypes.default_abi;
} else {
this.CallBackABI = ctypes.stdcall_abi;
this.WinABI = ctyp
Именно с методом drawWindow она прозрачна мало того для секьюрности фаерфокса, так и в target-документе нельзя отловить, что ты забираешь скриншот с документа.
... <!-- где-то в твоём XUL --> <html:canvas id="xcanvas" style="display:none;" width="600" height="400"/> <!-- усё --> ...
глобальную позицию можно вычислить следущей ф-ей
function elGlobalPos(element, brel) { var offsetLeft=0; var offsetTop=0; do { if (brel != undefined && element == brel) break; offsetLeft += element.offsetLeft; offsetTop += element.offsetTop; }while (element = element.offsetParent); var ret= new Object(); ret.x=offsetLeft; ret.y=offsetTop; return ret; };
[code]
//.. где-то в твоём жаваскрипте
//target_document - документ, в котором находится картинка с id=capcha
var some_dom_img_element = target_document.getElementById('capcha');
var pos = elGlobalPos(some_dom_img_element); //получаем глоб-позицию нужного элемента
var width = some_dom_img_element.getAttribute('width');
var height = some_dom_img_element.getAttribute('height');
var canvas = document
…Ясно, спасибо. Что-то придумаю, решение кину в тему. Кнопки в флеше не являются окнами, покрайней мере в AS3.
- но для win32-приложений это обычное дело
В идеале - найти нужную вкладку ФФ, и послать туда событие, после этого по логике флеш-плеер должен задиспечить событие себе тоже. Вкладка ФФ это ведь отдельное окно в win32?
SunnyDay
js-ctypes + mouse_event/SendInput. Других способов нет.
Большое спасибо за инфу, отличное решение!
Единственное, в первый раз слышу о js-ctypes, тоесть надо примерно так сделать:
1. Импортим ctypes.
2. Грузим user32.dll для винды
3. Далее выполняем из user32.dll цепочку mouse_event - с зажатой левой кнопкой мыши, затем с отжатой (эмулируя тем самым щелчок) в нужных координатах.
Всё верно? Если реализовывал сам, поделись плиз кусочком кода =)
-и все события они обрабатывают напрямую и сами
вот это печально.. Тоесть флеш спрашивает у ОС координаты мышки/какие клавиши сейчас нажаты, а не у фоерфокса?
-о наверное никак
один то способ есть всегда, но он уж черезчур костыльный, и будет работать только на флеш-плеере debug версии:
1. Ставим флеш-дебаг версию.
2. Указываем профайлер для флеша, наподобие как это делается в расширении Flash Firebug - можно и взять FFBug-профайлер.
3. Обмениваемся данными с флешом нативными методами swf.flashfirebug_send(some_data) в том числе можно посылать скрипты, в том числе и создавать события.
Известно, что при симуляции события из под расширения, например щелчка по какому либо элементу:
evt = target_document.createEvent("MouseEvents"); evt.initMouseEvent("click", true, true, target_document.defaultView, 1, x+ox, y+oy, x, y, false, false, false, false, v, null); element.dispatchEvent(evt);
оно посылается с параметром trusted=true , тоесть ведёт себя в принципе как настоящее, и target_document его видит как настоящее. Тоесть по логике при симуляции щелчка на sfw объекте, фаерфокс должен передать события в Flash интерпретатор, но он этого не делает. Собственно необходимо симулировать щелчок на flash-кнопке. Пробовал сделать: DOM видит событие, а во flash не выполняется действие по щелчку в заданных координатах - тоесть во флеше событие не пошло.
Вопрос - как средствами фаерфокс-расширения кормить флешу события, чтобы он их обрабатывал ровно также, как настоящие щелчки/перемещения мышки, нажатия клавиш?
Буду очень благодарен за любую помощь и ссылки!
…нашёл замечательное расширение https://addons.mozilla.org/ru/firefox/addon/flashfirebug/?src=ss он может инспектировать флеш полностью в виде дерева. Этот дебаггер обладает как-раз нужным функционалом, хоть и требует debug-версию флеша. Буду копать сорцы, всем спасибо.
Да, для автоматизации. Спасибо за совет, пока я ещё не разобрался в том, что такое FlexMonkey но по-моему это явно не JavaScript библиотека?
Всем доброго времени суток! Итересует возможность доступа из JS-кода расширения во флеш. Нашёл вот такую темку, где во флеш-пространство ломятся через wrappedJSObject http://forum.mozilla-russia.org/viewtopic.php?id=24823 . Интересно узнать побольше информации об flash.wrappedJSObject - поискал, ничего путного не нашёл. Конкретно интересует:
1. Возможно ли получить дерево флеш-объектов из флешки?
2. Возможно ли посылать события во флеш - например щелчок на определённую кнопку, или щелчок во флешке по заданным координатам?
Если кто знает ссылки или информацию по данной теме, поделитесь пожалуйста, буду благодарен.
если сохраняется в кеш, то в принципе легко будет там эту капчу найти... Но кеш я так понимаю тут
Local Settings\Application Data\Mozilla\Firefox\Profiles\0un7fhmb.default\Cache
а там этого не было.. Придётся отложить пока этот вопрос)
okkamas_knife
Там капчу выдаёт пхп скрипт, и если на этот скрипт послать запрос второй раз, капча будет другая... А уже загруженную в браузере картинку можно в файл сохранить, без getImageData? Если да, то это решило бы всю проблемму)
Да, видимо задача специфичнаяя, может есть какие-нибудь XPCOM интерфейсы для этого?
Elena
Советую почитать про снятие ограничений безопасности через XPCOM)
http://www.intuit.ru/department/se/mozilla/16/10.html
>как из javascript получить доступ к функции которая описано внутри iframe
frame_window.wrappedJSObject.function_in_frame()
Всем доброго времени суток! Имеется проблемма, известно о существовании элемента CANVAS который позволяет нехитрым способом получить побитовое содержимое любого изображения:
var readCnv = docu.createElement("CANVAS"); var image = docu.getElementsByTagName('IMG')[0]; readCnv.setAttribute("width", image); readCnv.setAttribute("heigth", image); docu.body.appendChild(readCnv); var ctxA = readCnv.getContext('2d'); ctxA.drawImage(image , 0, 0); var imgDA = ctxA.getImageData(0, 0, image.width, image.height);
но вот беда, если данный скрипт выполняется не в документе, который содержит это изображение, а выполняется в расширении, то мне выдают ошибку доступа - мол секьюрити, нельзя читать не своё изображение.
Это всё мне нужно для того чтобы расшифровать картинку-капчу.
До недавних пор я обходил это так - вставлял динамически в документ, содержащий изображение, этот скрипт. Но модификация исходного кода данного документа уже не прокатывает - создатели проекта(бр