Отладка JS в Opera

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Это вполне может делать встроенный в венду firewall, или ещё какой-нибудь антивирус.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:Это вполне может делать встроенный в венду firewall, или ещё какой-нибудь антивирус.
Просто очень неожиданный эффект... так подспудно думаешь - "ну это Венда-7...
наверно во всю поддерживает HTML-5... ща всё просто реактивно взлетит на этих
гигагерцах и ядрах..."
И неожиданно видишь "розовую птицу обломинго" там где её не ждал... :lol:
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Я что-то тут одной JS конструкцией озадачился... :(

Code: Select all

    myInterval = setInterval( "multiexecute()", dtimeMS ); //-- Интервал в миллисекундах;

/*
 *   multiexecute() - call from function runBinary();
 *
 */
function multiexecute() {
  if( !debug || autoDebugg ) { //- если НЕдебаггер или если авто-дебаггер
    for( var w=0; w<64; w++ ) {
         execute(); //-- выполняем код 6502 
         execute(); //-- выполняем код 6502 
       }
    }
}
dtimeMS выставляется равным 1 ms.

Значит получается так, если 128 вызовов execute() выполнятся быстрее, чем 1 ms, то возникнет пауза в эмуляции кода 6502.
Но вот если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?

Я к тому этим озадачился, не прервет ли таймер эмуляцию прямо в ходе исполнения очередного кода 6502?
Или функция execute() все-таки закончится нормально в этот момент?
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:...если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?
Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
setTimeout и setInterval wrote:Принцип работы таймеров в JavaScript

Многие начинающие в JavaScript разработчики путают принцип работы его таймеров с принципом работы имеющейся во многих языках функции sleep. sleep приостанавливает выполнение программы на определённый промежуток времени, после чего работа продолжается с того же места, где была остановлена. В JavaScript такое невозможно, по крайней мере в браузерном JavaScript.

JavaScript язык однопоточный. Когда он выполняется в браузере, браузер никаких действий не производит. Если скрипт выполняется достаточно долго, становится заметно, что браузер "висит". Поэтому функция sleep вместе с приостановкой скрипта "вешала" бы браузер.

Вместо этого функции setTimeout/setInterval "делают отметку", что необходимо запустить некий код через столько-то миллисекунд, а скрипт продолжает работать своим чередом.

Code: Select all

var n = 0;
setTimeout(function() {
    alert(n);  // На момент вывода сообщения n уже будет равна 5.
}, 1);  // Ставим минимально возможный интервал
n = 5;  // После установки таймера меняем значение переменной.
Из того, что язык однопоточный следует ещё одно следствие — код выполнится не через строго заданный промежуток времени, а не раньше, чем через этот промежуток. Если в нужный момент времени будет выполняться какой-либо код, то интерпретатор дождётся его окончания, после чего только запустит код по таймеру.
Но более неприятным оказался другой факт... :(
Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.
Обескураживает такой подход... и нафига тогда указывать задержку в единицах мс, если выполняться это все-равно не будет... :-?
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Lavr wrote: Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
Честно сказать, у меня было такое предположение, но так как не подкреплено фактами, я тактично промолчал., итак сильно много имхи выкладываю последнее время.
Lavr wrote: Но более неприятным оказался другой факт... :(
Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.
Обескураживает такой подход... и нафига тогда указывать задержку в единицах мс, если выполняться это все-равно не будет... :-?
А вот хрен их знает, этих разработчиков. Может это каким-то образом связано с кроссплатформенностью HTML? :roll:
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:
Lavr wrote:Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
Честно сказать, у меня было такое предположение, но так как не подкреплено фактами,
я тактично промолчал., итак сильно много имхи выкладываю последнее время.
А ты выкладывай не стесняйся! Я же на повод посоветоваться спрашиваю...
Так что мнение человека с опытом хоть какое-то направление поиска задает.

А то я погуглил на тему "как выполняется код JavaScript" - меня убедили, что сейчас быстро,
зачастую с частичной или полной компиляцией на лету...
Ну я и думаю - хотя и подозрительна дискретность в 1 мс, но кто знает - машины быстрые
сейчас, может разработчики и достигли такой точности таймера.
Хотя и в самой Венде знаю, что таймер неточный. Но в Венде-то тебя полюбому выкинет в
функцию таймера, а тут - видишь как необычно...

Так что излагай своё "имхо" не раздумывая, всё может проще поиск получится.

Я ведь случайно нашел про особенности setTimeout/setInterval, в официальных справочных
данных этого почему-то предпочитают не сообщать. :-?
iLavr
User avatar
Shaos
Admin
Posts: 24083
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Возможно неточность таймеров связана с виндой как таковой - в линухе должно быть лучше...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:Возможно неточность таймеров связана с виндой как таковой...
Похоже на то - странно было бы, если б у "интерпретатора", работающего в браузере
и под Вендой точность была бы лучше самой Венды.

Я просто немного подзабыл какую точность дают таймеры Венды, но здесь просто
+/- "лапоть" по определению.
И большинство статей про таймер в JS пишут о его неточности. :(

Но разница 1 - 12 мс всё же неприятна. Это ж ошибка "на порядок" получается... :-?
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Собственно, особенности таймера связаны даже не столько с Вендой, сколько
с самими браузерами и реализацией таймеров в них.
Минимальная задержка таймера

У браузерного таймера есть минимальная возможная задержка. Она меняется примерно от нуля до 4мс в современных браузерах. В более старых она может быть больше и достигать 15мс.

По стандарту, минимальная задержка составляет 4мс. Так что нет разницы между setTimeout(..,1) и setTimeout(..,4).

Реальная частота срабатывания

Срабатывание может быть и гораздо реже
В ряде случаев задержка может быть не 4мс, а 30мс или даже 1000мс.
Большинство браузеров (десктопных в первую очередь) продолжают выполнять setTimeout/setInterval, даже если вкладка неактивна.

При этом ряд из них (Chrome, FF, IE10) снижают минимальную частоту таймера, до 1 раза в секунду. Получается, что в «фоновой» вкладке будет срабатывать таймер, но редко.
При работе от батареи, в ноутбуке — браузеры тоже могут снижать частоту, чтобы реже выполнять код и экономить заряд батареи. Особенно этим известен IE. Снижение может достигать нескольких раз, в зависимости от настроек.
При слишком большой загрузке процессора JavaScript может не успевать обрабатывать таймеры вовремя. При этом некоторые запуски setInterval будут пропущены.

Вывод: на интервал 4мс стоит ориентироваться, но не стоит рассчитывать.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:Кто-нибуть знает надежный код отследить потерю фокуса всем окном, т.е.
когда всё всплывающее окно становится неактивным?
Ну надо же... :o Такая ерундовина - и прямо камень преклонения! :(
Нашел в сети библиотеку - ifvisible.js - якобы она без проблем отслеживает
активность вкладок...

Но, как выяснилось, она отслеживает то же самое: window.onblur = function(e){...

http://serkanyersen.github.io/ifvisible.js/demo.html

То есть, при переходе вкладки в неактивное состояние - эта библиотека выдает
сразу несколько сообщений "hidden", собственно, дублируя фактически window.onblur....
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Пару раз подходил к разбору этой задачки, но ровно ничего вразумительного и кроссплатформенного не вышло. Связано это, "как ни странно", с разной реализацией безопасности у разных браузеров, да ещё и от настроек оной зависит.

Кстати, как я понял в ходе экспериментов, мозилка считает фрейм как отдельный документ, опера же считает его за часть основного, соответственно и событийная модель ведёт себя по-разному.

Возможно, к решению нужно подходить не через открытие дочерних окон, а через открытие/сокрытие элементов (типа div) одного окна, и с более мудрёным использованием css.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:Пару раз подходил к разбору этой задачки, но ровно ничего вразумительного и кроссплатформенного не вышло.
Да я сам уже много вариантов перепробовал... И не один я, как я вижу в поиске, этой проблемой озадачен.

Довольно перспективным казалось мне параллельно с window.onblur отслеживать события мыши (клик вне вкладки),
но тут другая проблема вырисовалась - окно может стать неактивным чисто от событий горячих клавиш клавиатуры...

В общем сейчас остановился на варианте - "если браузер Опера" - закрываем окно по window.onblur,
во всех других ситуациях - окно не закрывается.
И здесь опять что неприятно - в зависимости от браузера следующий вызов pop-up окна может направить новый
контент в уже открытое окно, а может и новое окно создать - что приводит к путанице с открытыми окнами.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Самое неприятное, что все эти коллизии проявляются только при работе в офф-лайн с диска.

В он-лайне всё это совершенно не имеет места: 6502 CPU Emulator... - в основном всё корректно.
Всякие неприятные заморочки есть только в каких-то мелких особенностях внешнего интерфейса.

Хотелось просто сделать для своих целей эмулятор 65хх, в работу которого можно оперативно
вмешаться, если что-то надо быстро изменить в его поведении.
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

А если попробовать сделать HTA (Hyper Text Application)?
Решение только под венду, но в некоторых случаях очень полезное.
Из особенностей - при создании опираемся исключительно на DOM IE5 или выше. Некоторые защитные механизмы при этом не работают.

P.S. Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.
Да - мутят они там свои скрипты, как всё отлажу, займусь тем чтобы отключать их приблуды
через 1..3 секунды после старта страницы.

Совсем выкидывать нельзя, это условие "бесплатности" их хостинга.

У меня видно вот такое всплывающее окно:

Image

Ну и по тексту замечаю, что они вставляют в HTML-код 2 своих скрипта:
В начале:

Code: Select all

<script type="text/javascript" src="/abnl/?adsdata=QrLRhLjsUAjuxdH^zgg79lmeAgglQ92xJQv2wTka;psGQ3C9j2GKRbbEWPx20KtFmz;yYFxEAcvuyFstBwz^1Xx3Hrgh0y!E2UPWL1kamFiBFWxZTscyYczxaIZ^5VvvOJN7sR4sjpgu8Nu3CeXK3uINXqj7mEQnKrUFvygW^tGSHQcAiS;1QfkeZqyE26aUWebv65z57cY74FS4JIZrbs1LkUoo"></script>
И в самом конце документа:

Code: Select all

<div><script type="text/javascript">var script = document.createElement("script");script.src="/stat/dspixel.js?ab=uc&cl="+window.location.href+"&bcn="+navigator.appCodeName+"&bn="+navigator.appName+"&bv="+navigator.appVersion+"&ce="+navigator.cookieEnabled+"&bl="+navigator.language+"&np="+navigator.platform+"&sw="+screen.width+"&sh="+screen.height+"&r="+Math.random();document.getElementsByTagName("head")[0].appendChild(script);</script></div>
iLavr