Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Firefox 57+. Временное решение проблемы #29

Closed
asrdri opened this issue Jul 12, 2018 · 23 comments
Closed

Firefox 57+. Временное решение проблемы #29

asrdri opened this issue Jul 12, 2018 · 23 comments

Comments

@asrdri
Copy link
Owner

asrdri commented Jul 12, 2018

Если вы пользуетесь Firefox версии 57 и выше, скорее всего вы заметите проблему в работе скрипта: иногда скрипт может не подгружаться корректно. После обновления страницы скрипт подгрузится.

Для этой проблемы есть временное решение:

1. В панели расширения откройте меню редактирования скрипта:

Violentmonkey


Tampermonkey


(Кликнуть правой кнопкой мыши)


Greasemonkey

2. В редакторе удалите следующую строку:

// @run-at       document-start

(Эта строка находится в самом начале)

3. Сохраните изменения нажатием Ctrl+S.

4. Когда скрипт обновится, повторите действия из пунктов 1-3.

До тех пор, пока данная проблема не будет исправлена в очередных обновлениях Firefox, стоит проделывать данные действия после каждого обновления скрипта.

Когда данная проблема будет исправлена разработчиками Firefox (после этого также потребуется обновление расширения для userscript), просто переустановите скрипт или верните данную строку на исходное место.


Вопросы и ответы:

- В чём суть проблемы?

Начиная с версии 57 браузер Firefox использует новый движок (Quantum), в котором пока не реализован механизм немедленной подгрузки скриптов перед загрузкой страниц. Из-за этого все текущие расширения для поддержки userscript подвержены данной проблеме - скрипты со свойством @run-at document-start не всегда корректно подгружаются.

Более подробные сведения и оперативную информацию можно найти здесь.

- Зачем нужно это свойство @run-at? Почему бы его просто не использовать?

Его можно отключить, что и предложено выше в качестве временного решения проблемы. Отключать его в очередном обновлении скрипта для всех пользователей некорректно:

  1. Данное свойство означает немедленную подгрузку скрипта. Если его отключить, скрипт будет подгружаться только после того, как браузер загрузит страницу полностью. Если страница будет загружаться медленно или часть ресурсов (на которых располагаются элементы страницы) будет заблокирована, пауза перед подгрузкой скрипта может быть значительной.

  2. Данной проблеме подвержен только браузер Firefox последних версий. Доля его пользователей недостаточно велика.

  3. В будущем данная проблема может быть исправлена. Отслеживать данную ситуацию и оперативно выпустить обновление скрипта ради такого события может быть затруднительно.

- Почему вместо этого не выпустить исправленную версию скрипта для Firefox?

Гораздо важнее то, что нельзя выпустить одну версию скрипта, которая бы адаптировалась под разные браузеры (не убирая свойство @run-at document-start).
Отдельную версию для Firefox всегда можно сделать. Это несколько усложнит жизнь как пользователям, так и разработчику. Кроме того, нельзя автоматически распространить такое исправление всем пользователям Firefox, если они один раз самостоятельно не установят версию скрипта с данным исправлением.


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

@superstrongAI
Copy link

Для Firefox я сделал расширение https://github.com/superstrongAI/yt-metabot-firefox/releases, правда, с обновлениями дела не очень.

@eternal-sorrow
Copy link

У меня скрипт не работает в Firefox даже после удаления этой строчки. Перестал работать после того, как я перешёл с violentmonkey на greasemonkey.

Советовать перейти обратно не надо. У меня были свои причины для перехода и я лучше откажусь от метабота.

@asrdri
Copy link
Owner Author

asrdri commented Nov 3, 2018

  1. Установил Firefox 63 Portable.
  2. Установил greasemonkey.
  3. Установил скрипт. Работает.
  4. Удалил строку. Работает.

Сомневаюсь что я что-то делаю не так.

У меня были свои причины для перехода

В любом случае интересны причины. Чем плох violentmonkey? Чем хорош greasemonkey?

@eternal-sorrow
Copy link

eternal-sorrow commented Nov 3, 2018

Чем плох violentmonkey?

не исполняет юзер-скрипты, если отключен JS

@eternal-sorrow
Copy link

Только что снёс скрипт и установил заново - не работает.

@asrdri
Copy link
Owner Author

asrdri commented Nov 3, 2018

если отключен JS

Помню раньше такое делал на Opera 12, чтобы ускорить браузер или отследить (не)нужные скрипты. В Firefox это вообще можно делать без перезапуска? Какая польза?

установил заново - не работает.

Обмениваться такими "аргументами" можно бесконечно. Предлагаю нейтральную среду - portable-версию браузера. https://portableapps.com/apps/internet/firefox_portable

@eternal-sorrow
Copy link

В Firefox это вообще можно делать без перезапуска? Какая польза?

для этого есть удобные расширения, такие как NoScript и uMatrix. польза в том, что ты запрещаешь выполнение недоверенного кода у тебя на компьютере

Обмениваться такими "аргументами"

это не аргумент, а факт

portable-версию браузера

не могу её запустить, так как она предназначена для ОС Microsoft Windows

@asrdri
Copy link
Owner Author

asrdri commented Nov 3, 2018

польза в том, что ты запрещаешь выполнение недоверенного кода у тебя на компьютере

По-моему оно должно работать по сценарию запрета непроверенных доменов или источников, но никак не глобальной блокировки JS. Иначе я не понял, почему пользоваться violentmonkey неудобно. Оба движка (violentmonkey и greasemonkey) должны нормально уживаться внутри браузера.

не могу её запустить, так как она предназначена для ОС Microsoft Windows

Если исключить вариант проблемных настроек браузера, остаются 2 варианта:

  1. Проблемы у некоторого функционала Greasemonkey под твоей ОС.
  2. Проблемы у скрипта под твоей ОС.

Если скрипт у тебя работает хотя бы под одним движком, то вероятнее вариант 1.

Что-нибудь в консоль пишется? Ошибки должны сыпаться, если что-то не работает. Если ничего нет, то можно попробовать в разные места скрипта добавлять строку alert('Test');
Ещё могу предложить Telegram-чат.

@eternal-sorrow
Copy link

eternal-sorrow commented Nov 4, 2018

По-моему оно должно работать по сценарию запрета непроверенных доменов или источников

оно так и работает. поскольку автором большинства сайтов в интернете являюсь не я, то они по умолчанию непроверенные

Что-нибудь в консоль пишется?

[MetaBot for Youtube] YouTube New design detected. - только это. Больше ничего, имеющего отношение к метаботу не видать.

в разные места скрипта добавлять строку alert('Test');

попробую

Ещё могу предложить Telegram-чат.

там постоянно какой нибудь срач идёт, слова не вставишь

@asrdri
Copy link
Owner Author

asrdri commented Nov 4, 2018

оно так и работает. поскольку автором большинства сайтов в интернете являюсь не я, то они по умолчанию непроверенные

Я имею в виду что не понял, когда может возникать ситуация "не исполняет юзер-скрипты, если отключен JS". Если Youtube в расширениях-блокировщиках добавить в исключения (добавить в белый список), то не должно такой ситуации быть.

там постоянно какой нибудь срач идёт, слова не вставишь

Можно добавить меня и не участвовать в общем чате. @asrdri

Методом подстановки алертов в различные места скрипта пришёл к выводу, что вызов GM.xmlHttpRequest в функции getlist выполняется, но колбек, переданный ему в параметре onload - нет. То есть запрос не завершается успешно.

Там можно вставить другие параметры, чтобы отследить процесс: https://wiki.greasespot.net/GM.xmlHttpRequest (см. Event handlers)

Попробуй так:

function getlist(callback, numArr, url) {
  if (typeof GM_xmlhttpRequest !== 'undefined') {
    GM_xmlhttpRequest({
      method: "GET",
      url: url,
      onload: function(response) {
        callback(numArr, response.responseText, response.status, url);
      }
    });
  } else if (typeof GM !== 'undefined') {
    GM.xmlHttpRequest({
      method: "GET",
      url: url,
      onprogress: function(progress) {
      	console.log('[MetaBot for Youtube] onprogress ' + progress.lengthComputable + ' ' + progress.loaded + ' ' + progress.total);
    	},
      onreadystatechange: function(response) {
      	console.log('[MetaBot for Youtube] onreadystatechange ' + response.readyState + ' ' + response.status + ' ' + response.statusText);
    	},
      onerror: function(response) {
      	console.log('[MetaBot for Youtube] onerror ' + response.readyState + ' ' + response.status + ' ' + response.statusText);
    	},
      onload: function(response) {
        callback(numArr, response.responseText, response.status, url);
      }
    });
  } else {
    console.log("[MetaBot for Youtube] Unable to get supported cross-origin XMLHttpRequest function.");
  }
}

@eternal-sorrow
Copy link

eternal-sorrow commented Nov 4, 2018

Если Youtube в расширениях-блокировщиках добавить в исключения

подсказка: юзерскрипты бывают не только для ютуба

@eternal-sorrow
Copy link

Попробуй так:

Попробовал. Вот что вышло: [MetaBot for Youtube] onreadystatechange 1 null null. Больше ничего.

@eternal-sorrow
Copy link

Методом подстановки алертов в различные места скрипта пришёл к выводу, что вызов GM.xmlHttpRequest в функции getlist выполняется, но колбек, переданный ему в параметре onload - нет. То есть запрос не завершается успешно.

@asrdri
Copy link
Owner Author

asrdri commented Nov 4, 2018

юзерскрипты бывают не только для ютуба

  1. Их можно добавить в greasemonkey, установленном рядом с violentmonkey. Нет?
  2. С другими сайтами всё аналогично - белый список настроить 1 раз, после чего нужные скрипты на нём должны заработать. Не так?

Попробовал. Вот что вышло: [MetaBot for Youtube] onreadystatechange 1 null null. Больше ничего.

Значит проблема либо в том что GM.xmlHttpRequest сам по себе глючит в твоей среде, либо конфликтует с другими расширениями. Можно попробовать всё остальное удалить/отключить, но я не уверен что остальные настройки браузера не войдут в новый конфликт. Поэтому и предлагал portable-версию.

Можно по-другому - закрыть браузер, временно переименовать папку профиля <профиль>\Mozilla\Firefox\Profiles (со всеми настройками и расширениями браузера) и запустить снова - создастся новая папка профиля без настроек, там и попробовать с нуля без остальных расширений. После тестирования вернуть старую папку профиля.

@eternal-sorrow
Copy link

Их можно добавить в greasemonkey, установленном рядом с violentmonkey

ну это уже оверкилл

новая папка профиля без настроек, там и попробовать с нуля без остальных расширений

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

а что это даст? допустим, в пустом профиле скрипт работает. и что? мне нужно, чтоб в моём всё работало.

@asrdri
Copy link
Owner Author

asrdri commented Nov 4, 2018

ну это уже оверкилл

А что со вторым пунктом?

допустим, в пустом профиле скрипт работает. и что?

Будет означать что имеются конфликты между greasemonkey и расширениями для блокировки скриптов. Либо эти конфликты можно исправить вручную, не отказываясь от расширений, либо нельзя. Если нельзя - може получится найти причинное расширение и сообщить разработчикам о проблеме.

Вообще какие-то другие юзерскрипты с GM.xmlHttpRequest работают у тебя?

@eternal-sorrow
Copy link

А что со вторым пунктом?

В uMatrix нет способа разрешить только исполнение юзерскриптов, но не разрешать исполнение обычных скриптов на странице.

имеются конфликты между greasemonkey и расширениями для блокировки скриптов

это выяснить гораздо проще. это вообще первое, что я проверил. достаточно лишь отключить соответствующее расширение.

другие юзерскрипты с GM.xmlHttpRequest работают у тебя

таких нет

@asrdri
Copy link
Owner Author

asrdri commented Nov 4, 2018

В uMatrix нет способа разрешить только исполнение юзерскриптов, но не разрешать исполнение обычных скриптов на странице.

Т.е. у тебя перманентно заблокированы скрипты на Youtube? Как он вообще тогда может работать? Или для того чтобы он работал нужно глобально отключить блокировки? Функционала белого списка нет?

таких нет

Пробуй (установи, обнови любую страницу и смотри в консоль)
https://github.com/greasemonkey/greasemonkey/blob/master/test/scripts/api-xhr.user.js
https://github.com/greasemonkey/greasemonkey/blob/master/test/scripts/api-xhr-xml.user.js

@eternal-sorrow
Copy link

Т.е. у тебя перманентно заблокированы скрипты на Youtube?

причём тут youtube? юзерскрипты только для ютуба бывают что ли?

Пробуй (установи, обнови любую страницу и смотри в консоль)

вот за это спасибо. удалось найти причину.
greasemonkey/greasemonkey#2985

@asrdri
Copy link
Owner Author

asrdri commented Nov 4, 2018

причём тут youtube? юзерскрипты только для ютуба бывают что ли?

Скрипты для youtube ничем не отличаются от скриптов для других сайтов. Есть скрипт для сайта name.com. Я в первый раз захожу на сайт name.com, ничего не работает потому что всё JS заблокировано. Осматриваю список доменов, с которых подгружаются скрипты, разрешаю часть из них, в т.ч. локальные (юзерскрипты). После этого при любом заходе на name.com всё что нужно (в т.ч. юзерскрипт для name.com) работает. По-моему примерно такой должен быть процесс при NoScript. Если теперь процесс выглядит иначе и содержит больше неудобств, может быть опять виноваты новые ограничения Quantum.

@eternal-sorrow
Copy link

в т.ч. локальные (юзерскрипты)

такой возможности нет, в uMatrix такого пункта нет, он ничего о юзерскриптах не знает. как насчёт NoScript - не знаю (и знать не хочу).

@ScorpioT1000
Copy link

Проблема случилась на 84.0, фикс помог. Причем до сегодняшнего дня всё работало.

@asrdri
Copy link
Owner Author

asrdri commented Mar 13, 2021

Начиная с версии 210313 значение параметра @run-at изменено - как результат описанное поведение отключено. Скрипт будет подгружаться после полной загрузки страницы для всех браузеров.

@asrdri asrdri closed this as completed Mar 13, 2021
asrdri added a commit that referenced this issue Oct 15, 2021
Удаление инструкций, ведущих на уже исправленный и закрытый #29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants