Comments 38
Плюсанул… молча, просто потому что нет слов.
p.s. проблема воспроизводится только у firefox? что по поводу chromum? opera/ie greasemonkey?
p.s. проблема воспроизводится только у firefox? что по поводу chromum? opera/ie greasemonkey?
Спасибо. Сейчас попробую потестировать на других версиях firefox и в других браузерах. По ходу дела постараюсь отчитываться.
Firfox 13 — та же проблема (и не работает параметр
Firfox 14 — та же проблема.
Firfox 15 — та же проблема.
Internet Explorer, Opera, Safari (WebKit) — судя по списку совместимости, нет поддержки
На последнем хроме сейчас потестирую.
mozBackgroundRequest
, вызывает сбой).Firfox 14 — та же проблема.
Firfox 15 — та же проблема.
Internet Explorer, Opera, Safari (WebKit) — судя по списку совместимости, нет поддержки
responseType = 'document'
.На последнем хроме сейчас потестирую.
Не уверен, правильно ли я проверял в Chrome. Поскольку я не нашёл возможности запустить код в контексте браузера, пришлось открыть страницу трекера в браузере, чтобы не получать предупреждений о кроссбраузерных запросах, и тогда уже запускать код из консоли (нужно было только удалить две специфические строчки для Firefox: с
На последнем Chrome никакий таймаутов не происходит.
mozBackgroundRequest
и channel.loadFlags
).На последнем Chrome никакий таймаутов не происходит.
А ОС у вас 32-бит? Может какие-то ограничения всплывают из-за этого?
Да, 32 бита. Это возможно, но было бы странно, потому что ведь в браузере всё рендерится, а нагрузка должна быть при этом намного больше. Конечно, по логике, упомянутой администратором forums.mozilla.org (мол, мало кто использует responseType = «document» в XMLHttpRequest), могли бы урезать ресурсы по сравнению с рендерингом, но как-то уж сильно урезали и без всякого упоминания об этом. Надеюсь, всё же непреднамеренный баг.
Спасибо вам большое. Это важное добавление, а у меня самого нет возможности перепроверить на 64.
Да,
Да,
mozBackgroundRequest
, наверное, запустили начиная с 14-й версии, у меня тоже вылетало на 13-й, хотя на сайте разработчиков не удалось найти информации о совместимости этого свойства (оно нестандартное, но здесь его применять логично).Quick and dirty: почистить документ от скриптов через регулярки…
Дело в том, что при
Можно, конечно, получить код, исправить его и отослать скрытому браузеру для парсинга через data: URI, но в этом нет нужды, так как скрытый браузер и без чистки хорошо справляется, этот как раз один из тех хитрых способов по ссылке в начале статьи.
responseType = 'document'
невозможно получить доступ к responseText
и работать с кодом напрямую. А если сначала получить свойство responseText
, всё равно это ничего не даст, потому что оно только для чтения. А если бы и удалось его изменить, responseType = 'document'
нельзя потом задать задним числом и получить DOM изменённого кода. Две стратегии расходятся с самого начала.Можно, конечно, получить код, исправить его и отослать скрытому браузеру для парсинга через data: URI, но в этом нет нужды, так как скрытый браузер и без чистки хорошо справляется, этот как раз один из тех хитрых способов по ссылке в начале статьи.
А создать DIV, тупо выдрать из .responseText содержимое BODY (поиск строки), засунуть в innerHTML — вот тебе и DOM структура?
Возможно придется выдирать еще теги скриптов, чтобы не срабатывали. Приходилось в одном проекте так делать без новомодных штучек, все работало даже в IE6(не говоря про остальной зоопарк).
Возможно придется выдирать еще теги скриптов, чтобы не срабатывали. Приходилось в одном проекте так делать без новомодных штучек, все работало даже в IE6(не говоря про остальной зоопарк).
Да, приблизительно такими аферами я и занимался раньше. Но это сопряжено с такой путаницей (дополнительные скрытые браузеры или iframe для парсинга по URL с обратными вызовами, повешенными на окончание загрузки кода; непредсказуемое поведение при скармливании всяким div-ам полного или рискованно обрезанного кода; передача скрытым браузерам responseText через data: URI опять таки с обратными вызовами на завершение загрузки). Всё это опасно шатается и трещит по швам. Так хотелось чистоты и порядка)
Спасибо, он и правда работает. Но ведь при этом грузит изображения и остальные ресурсы (css и т. д.). При этом у него неудобная обработка ошибок. Вот только что тестировал, на одном из сайтов с редиректом он мало того что обрывается с сообщением об ошибке в консоль, он ещё и алерт непрошенный выдаёт с ответом сервера о редиректе. Как запасное средство подойдёт, но всё же хорошо бы доработали XMLHttpRequest.
DOMPaser не должен выполнять не скрипты, не стили, не тем более HTTP запросы. Если это происходит, то это явный баг. В wiki и в спецификации указано, что он не должен этим заниматься. Если вы говорите про Blob, то в него нужно запихивать потом. Blob это грубо говоря sandbox, или файл в памяти браузера. Из этой памяти можно строить странички например, картинки или скрипты.
Только, что проверил. В стабильной Лисе работает правильно.
Только, что проверил. В стабильной Лисе работает правильно.
Я именно про DOMPaser. Я не думаю, что он их выполняет. Однако расширения, мониторящие HTTP активность, показывают, что он загружает почему-то эти ресурсы, тогда как при чистом XMLHttpRequest никаких дополнительных запросов не происходит.
В ночной сборке тоже работает. Можно страховаться: если XHR с парсингом выдаёт таймаут, можно запрашивать повторно код и парсить при помощи DOMPaser. Но это ведь всё лишний код и лишние запросы.
Интересно, механизмы у DOMPaser и парсера XHR одни и те же или нет? Почему же такая разница…
В ночной сборке тоже работает. Можно страховаться: если XHR с парсингом выдаёт таймаут, можно запрашивать повторно код и парсить при помощи DOMPaser. Но это ведь всё лишний код и лишние запросы.
Интересно, механизмы у DOMPaser и парсера XHR одни и те же или нет? Почему же такая разница…
С DOMPaser это был баг, причём критический, затрагивающий безопасность. Вчера пофиксили для ночных сборок, но когда патч доберётся до авроры/беты/релиза, я не знаю.
У вас достатчно информации, чтобы зарепортить баг.
Я запостил на русской багзилле (почти полностью повторив статью). Но чтобы постить на английской, мне бы хотелось как-то сузить проблему, чтобы перевести только существенное, выжимку (у меня не очень хорошо получается писать на английском). Если за несколько дней больше ничего не прояснится, попробую составить английский багрепорт из того, что есть.
Читал, как детектив! Однако финал автор пока оставил на усмотрение читателя :)
Сообщения на багзиллах: русской, английской.
На счёт протестить их патч — протестить не получится естественно в автоматических сборках. Что бы протестить нужно сказать и сбилдить mozilla-central, а потом пропатчить diff из багзиллы.
Спасибо большое. А в каком случае и как скоро подобные патчи входят в бинарные ночные сборки?
Я думаю сразу после того, как статус станет RESOLVED, а потом VERIFIED в баге. Хотя я на самом деле не уверен. Многие баги фиксят и патчат в hg Мозилловский, но не включают в билды по некоторым причинам. Если баг посчитают актуальным, а «фичу» не эксперементальной, то видимо, постараются сразу как смогут.
Вообще, раз Nightly билдится каждую ночь по нескольку раз, видимо туда попадаются все фиксы которые уже в репозитории. Ведь это же dev сборки.
Вообще, раз Nightly билдится каждую ночь по нескольку раз, видимо туда попадаются все фиксы которые уже в репозитории. Ведь это же dev сборки.
Спасибо за объяснения. Там появилась ссылка на тестовые бинарники, попробую протестировать. Я обновляюсь на ночной сборке каждую ночь автоматически (браузер сам обновляется), просто не уверен что такие дежурные тестовые фиксы тоже вносятся в эти обновления.
Фича вряд ли экспериментальная, она ведь в спецификации XHR внесена. И по идее должна работать с любыми страницами. Жаль только что, похоже, никто баг не может подтвердить на багзилле. Боюсь, уж не явилась ли моя ситуация фатальным стечением неповторимых обстоятельств, которых я так и не распутаю.
Фича вряд ли экспериментальная, она ведь в спецификации XHR внесена. И по идее должна работать с любыми страницами. Жаль только что, похоже, никто баг не может подтвердить на багзилле. Боюсь, уж не явилась ли моя ситуация фатальным стечением неповторимых обстоятельств, которых я так и не распутаю.
Надо же, на тестовом бинарнике никаких зависаний! Насколько я понял из списка различий, изменения касались в основном более надёжного запрета на исполнение скриптов, хотя я плохо разбираюсь в том коде.
Остаётся лишь надеяться, что патч применят ко всем версиям начиная с 13-й.
Остаётся лишь надеяться, что патч применят ко всем версиям начиная с 13-й.
Врятли в 13ой применят. У разработчиком точно есть план работы и всё такое. То есть текущую версию фиксят только по критичским проблемам, например безопасности. Думаю просто нужно дождаться 14ой версии.
А если так
, то тоже валится?
xhr.onreadystatechange = function (aEvt) {
if (xhr.readyState == 4) {
if(xhr.status == 200){
var xmldoc = xhr.responseXML;
var urlList = xmldoc.getElementsByTagName('title');
}else{
...
}
}
};
, то тоже валится?
Добавил к коду:
На рабочих страницах выдаёт: 1-2-3-3-3-3-3-3-3-title(в консоль и в alert). На проблемной выдаёт: 1-2-3-3-3-3-3-3-3-3-3-3-timeout в alert и ошибку в консоль «xmldoc is null»
xhr.onreadystatechange = function (aEvt) {
if (xhr.readyState == 4) {
if(xhr.status == 200){
var xmldoc = xhr.responseXML;
var elmList = xmldoc.getElementsByTagName('title');
Components.classes["<hh user=mozilla>.org/consoleservice;1"].
getService(Components.interfaces.nsIConsoleService).logStringMessage(elmList[0].textContent);
}else{
Components.classes["<hh user=mozilla>.org/consoleservice;1"].
getService(Components.interfaces.nsIConsoleService).logStringMessage(xhr.status + "!");
}
}
else {
Components.classes["<hh user=mozilla>.org/consoleservice;1"].
getService(Components.interfaces.nsIConsoleService).logStringMessage(xhr.readyState);
}
};
На рабочих страницах выдаёт: 1-2-3-3-3-3-3-3-3-title(в консоль и в alert). На проблемной выдаёт: 1-2-3-3-3-3-3-3-3-3-3-3-timeout в alert и ошибку в консоль «xmldoc is null»
хабрапарсер заменил
на
"СОБАКАmozilla.org/consoleservice;1"
на
"<hh user=mozilla>.org/consoleservice;1"
Значит на проблемной станции отвалилось по таймауту, а т.к. при этом xmldoc превращается в null и readyState превращается в 4 то и происходит описанное поведение.
Видимо на проблемной станции какой-то индивидуальный глюк со стеком TCP\IP.
Там никаких расширений для браузера ещё не стоит, может быть какой-нибудь фильтр или что-нибудь ещё? В FF можно же даже с сокетами общаться напрямую, может стоит что-нибудь такое, специфическое, рубящее все попытки получить тот XML?
да, и вот эта строчка
xhr.overrideMimeType('text/html; charset=windows-1251');
она точно нужна?
Видимо на проблемной станции какой-то индивидуальный глюк со стеком TCP\IP.
Там никаких расширений для браузера ещё не стоит, может быть какой-нибудь фильтр или что-нибудь ещё? В FF можно же даже с сокетами общаться напрямую, может стоит что-нибудь такое, специфическое, рубящее все попытки получить тот XML?
да, и вот эта строчка
xhr.overrideMimeType('text/html; charset=windows-1251');
она точно нужна?
Сомневаюсь, что проблема на таком низком уровне, ведь код без парсинга получается без проблем, вина именно на стороне браузера.
Без этой строчки та же проблема, я тестировал и так, и так. Просто без неё почему-то в отдельных случаях браузер выводит кракозабры (то ли сервер забывает включать charset в код, то ли забывает отсылать его в заголовках).
На багзилле выложили временно пропатченный вариант бинарника, в нём нет никаких таймаутов. Насколько я понял, патч заключался в более последовательном запрете на исполнение скриптов при парсинге, которые по идее и так не должны были исполнятся в подобном случае, но выходил какой-то сбой в этой области. Так что скорее всего в этом дело. Жаль только, что даже в случае одобрения патч скорее всего войдёт лишь в 16-й релиз.
Без этой строчки та же проблема, я тестировал и так, и так. Просто без неё почему-то в отдельных случаях браузер выводит кракозабры (то ли сервер забывает включать charset в код, то ли забывает отсылать его в заголовках).
На багзилле выложили временно пропатченный вариант бинарника, в нём нет никаких таймаутов. Насколько я понял, патч заключался в более последовательном запрете на исполнение скриптов при парсинге, которые по идее и так не должны были исполнятся в подобном случае, но выходил какой-то сбой в этой области. Так что скорее всего в этом дело. Жаль только, что даже в случае одобрения патч скорее всего войдёт лишь в 16-й релиз.
Сегодня официально пофиксили, но когда патч распространится на все ветки разработки, я не знаю.
Sign up to leave a comment.
История одного расследования о странном поведении XMLHttpRequest в новых версиях Firefox