LINUX.ORG.RU
ФорумTalks

Существует ли аддон для Firefox который останавливает выполнение JS и всяких таймеров и эвентов на странице

 , ,


4

4

Вручную это делается вызовом Browser Console Ctrl+Shift+J и командой

gBrowser.selectedBrowser.browsingContext.allowJavascript=false;

в ней.

Однако, Browser Console может только окошком быть, её никуда не пристыкуешь, и это неудобно.

Раньше можно было всего лишь нажать Esc чтобы остановить все скрипты на странице. Теперь приходится через Browser Console.

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

Отключение JS не годится.

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

Велосипедить аддон не хочется. Не может же быть чтобы никто такого не написал. В addons.mozilla.org такого не нашлось почему-то, видимо мозилла (вернее те, кто её танцует) очень не хочет чтобы юзер мог легко снизить ужор памяти и процессора отключая вебговно которое не нужно.

★★★★★

Последнее исправление: Stanson (всего исправлений: 1)

Велосипедить аддон не хочется.

Попроси АИ - пусть он навелосипедит.

bdrbt
()
Ответ на: комментарий от bdrbt

Попроси АИ - пусть он навелосипедит.

Оно принципиально не может написать то, чего никто ещё не написал. Нахрена мне пересказ Рабиновича, я оригинал хочу.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от bdrbt

Какое-то странное желание поставить что-то левое «от Васяна»

Так не от «Васяна» нету ничего. И в отличии от, я запросто могу проверить, что там Васян понаписал.

Stanson ★★★★★
() автор топика

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

А у тебя какая версия лисы? Просто, именно такое поведение, когда скрипты грузятся только по необходимости при скроллинге страницы, это фишка современных браузеров, и в последних версиях эта фича, наверно, более отлажена, чтоб не тратить ресурсы железа попусту.

krasnh ★★★★★
()

Так установи Tampermonkey и напиши свой юзерскрипт, повесив его на ту же Esc.

Tigger ★★★★★
()
Ответ на: комментарий от krasnh

чтобы страница не выжирала … память

Сам пользуюсь расширением «Auto Tab Discard».

upd. А по процессору, не замечал, чтоб в фоновая вкладка давала нагрузку.

krasnh ★★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от Stanson

Оно принципиально не может написать то, чего никто ещё не написал.

Ты ж буквально в ОП описал, что нужно сделать. Сделать пустой аддон и вставить туда нужный код он сможет.

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Манифест

{
  "manifest_version": 3,
  "name": "Stop JS",
  "version": "1.0",
  "description": "Останавливает выполнение JavaScript на текущей странице.",
  "permissions": [
    "scripting",
    "activeTab"
  ],
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icons/icon16.png",
      "48": "icons/icon48.png",
      "128": "icons/icon128.png"
    }
  },
  "background": {
    "service_worker": "background.js"
  },
  "icons": {
    "16": "icons/icon16.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png"
  }
}

Обработчик

chrome.action.onClicked.addListener((tab) => {
  if (tab.url.startsWith("http") || tab.url.startsWith("https")) {
    chrome.scripting.executeScript({
      target: { tabId: tab.id },
      function: () => {
        // Заменяем глобальные функции, которые могут выполнять JS
        const originalSetTimeout = window.setTimeout;
        const originalSetInterval = window.setInterval;
        const originalRequestAnimationFrame = window.requestAnimationFrame;

        window.setTimeout = () => {};
        window.setInterval = () => {};
        window.requestAnimationFrame = () => {};

        // Отключаем Event Listeners
        const stopAllListeners = () => {
          const elements = document.querySelectorAll('*');
          elements.forEach(el => {
            const clone = el.cloneNode(true);
            el.parentNode.replaceChild(clone, el);
          });
        };
        stopAllListeners();

        // Переопределяем методы, которые могут создавать и выполнять скрипты
        Object.defineProperty(HTMLScriptElement.prototype, 'src', {
          set: function(value) {
            console.log('Attempted to load script from:', value, ' - Blocked by Stop JS extension.');
          },
          get: function() {
            return '';
          }
        });

        Object.defineProperty(HTMLScriptElement.prototype, 'text', {
          set: function(value) {
            console.log('Attempted to execute inline script. - Blocked by Stop JS extension.');
          },
          get: function() {
            return '';
          }
        });

        // Отключаем inline-скрипты, которые могут быть в HTML-элементах (onclick, etc.)
        document.querySelectorAll('[on*]').forEach(element => {
          element.removeAttribute(element.attributes[0].name);
        });

        // Отключаем MutationObserver
        if (window.MutationObserver) {
            const originalObserve = MutationObserver.prototype.observe;
            MutationObserver.prototype.observe = () => {
                console.log('MutationObserver.observe call blocked.');
            };
        }

        console.log('JavaScript выполнение остановлено.');
      }
    });
  }
});

Интерфейс

<!DOCTYPE html>
<html>
<head>
    <title>Stop JS</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            width: 200px;
            padding: 10px;
            text-align: center;
        }
        button {
            padding: 10px 15px;
            font-size: 16px;
            cursor: pointer;
            background-color: #f44336;
            color: white;
            border: none;
            border-radius: 5px;
        }
        button:hover {
            background-color: #d32f2f;
        }
        p {
            margin-top: 15px;
            font-size: 0.9em;
            color: #555;
        }
    </style>
</head>
<body>
    <button id="stopJsButton">Остановить JS</button>
    <p>Нажмите, чтобы остановить выполнение JavaScript на текущей странице.</p>
    <script src="popup.js"></script>
</body>
</html>

Попап

document.getElementById('stopJsButton').addEventListener('click', () => {
    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
        const activeTab = tabs[0];
        if (activeTab.url.startsWith("http") || activeTab.url.startsWith("https")) {
            chrome.scripting.executeScript({
                target: { tabId: activeTab.id },
                function: () => {
                    // Это тот же код, что и в background.js, но здесь он запускается по клику на кнопку в popup.
                    // Он должен быть здесь, чтобы гарантировать выполнение после нажатия кнопки.
                    const originalSetTimeout = window.setTimeout;
                    const originalSetInterval = window.setInterval;
                    const originalRequestAnimationFrame = window.requestAnimationFrame;

                    window.setTimeout = () => {};
                    window.setInterval = () => {};
                    window.requestAnimationFrame = () => {};

                    const stopAllListeners = () => {
                      const elements = document.querySelectorAll('*');
                      elements.forEach(el => {
                        const clone = el.cloneNode(true);
                        el.parentNode.replaceChild(clone, el);
                      });
                    };
                    stopAllListeners();

                    Object.defineProperty(HTMLScriptElement.prototype, 'src', {
                      set: function(value) {
                        console.log('Attempted to load script from:', value, ' - Blocked by Stop JS extension.');
                      },
                      get: function() {
                        return '';
                      }
                    });

                    Object.defineProperty(HTMLScriptElement.prototype, 'text', {
                      set: function(value) {
                        console.log('Attempted to execute inline script. - Blocked by Stop JS extension.');
                      },
                      get: function() {
                        return '';
                      }
                    });

                    document.querySelectorAll('[on*]').forEach(element => {
                      element.removeAttribute(element.attributes[0].name);
                    });

                    if (window.MutationObserver) {
                        const originalObserve = MutationObserver.prototype.observe;
                        MutationObserver.prototype.observe = () => {
                            console.log('MutationObserver.observe call blocked.');
                        };
                    }
                    console.log('JavaScript выполнение остановлено из Popup.');
                }
            });
        } else {
            console.log("Невозможно остановить JS на этой странице.");
        }
    });
});

Gemini, около 2-3 секунд

bdrbt
()
Ответ на: комментарий от Stanson

Если ты ему поставишь конкретную задачу «навелосипедь мне остановку скриптов по Esc через gBrowser.selectedBrowser.browsingContext.allowJavascript=false;», то напишет.

mono ★★★★★
()
Ответ на: комментарий от bdrbt

Оно там ещё подробных пояснений насыпало, как куда чего и ссылки на гитхабы с примерами «как писать экстеншены»

bdrbt
()
Ответ на: комментарий от Bad_ptr

Проблема в том что сами аддоны работают через яваскрипт

Это разные контексты.

bdrbt
()
Ответ на: комментарий от goingUp

Видишь - не смог. :) Выдал традиционное говно жабомакак, которое не делает то, что нужно, и даже работать не будет, ибо serviceworkers отключены.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от mono

Не-а. :) Выше можешь поржать над автоматической жабомакакой.

Ну а фигли, оно натренировано на продукте жаблмакак, соответственно ничего иного выдать не может.

Stanson ★★★★★
() автор топика

не буду утверждать, nojs, spidermonkey?

SPRATAY ★★
()

Я почему-то решил, что речь о фоновых вкладках и написал выше комменты исходя из этого. Но перечитал заглавный пост и вспомнил, что наблюдал похожее, просматривая посты телеграмма в браузере - некоторые страницы, действительно, с какого-то перепугу иногда начинали сильно, чуть ли не под 100%, грузить проц. Причем, в фоне все успокаивалось.
Но я как-то не придавал этому значение, случаи редкие, а телеграм в основном читаю в приложении.

krasnh ★★★★★
()
Ответ на: комментарий от Stanson

Не-а. :) Выше можешь поржать над автоматической жабомакакой.

Пока ржать можно только над тобой. Вот изначальный промпт.

Привет, напиши мне простое расширение для chrome-based браузера которое при активации будет останавливать выполнение всех javascript-сценариев на странице

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

bdrbt
()
Ответ на: комментарий от bdrbt

И представляешь, у меня это расширение появилось уже через пару минут

Нет, не появилось.

, а ты до сих пор сосёшь.

Сосёт твой сын у твоего папы.

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

Вот вообще насрать на пермишены. Пермишен в фаерфоксе я без проблем отломаю.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Нет, не появилось.

Попахивает религиозными убеждениеми

Вот вообще насрать на пермишены. Пермишен в фаерфоксе я без проблем отломаю.

Эммм, перепишешь сандбокс? Пузико не надорви.

bdrbt
()
Ответ на: комментарий от necromant

Я в FF штатно отключал картинки и заходил на один сайт текстовой по-преимуществу сайт, а FF начинал со страшной силой жрать раму безостановочно.

rechnick ★★★
()
Ответ на: комментарий от rechnick

Чем и плохи эти джаваскрипты, что они невидимые и никогда не отгадаешь, сколько отожрут. В нативных приложениях понятно там, что если 1Мб утилита, то скорее всего много и не понадобится, а если приложение в 0.5Гб и больше, то там монстр сидит.

Вообще для «тяжелых» случаев беру в руки curl и html2text.

necromant ★★
()
Ответ на: комментарий от Bad_ptr

А смысл? Нужно .allowJavascript = false выставить для текущей вкладки, а не вот этой всей порнографией, причём необратимой, заниматься. Как после этой нейропорнографии включить JS на странице обратно, когда понадобятся?

Stanson ★★★★★
() автор топика
Ответ на: комментарий от bdrbt

Эммм, перепишешь сандбокс?

Зачем? Буду делать кнопочку и делать ,allowJavascript из config.js например. Оттуда всё можно.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от necromant

В нативных приложениях понятно там, что если 1Мб утилита, то скорее всего много и не понадобится

совсем не факт. смотря какая утилита. софт тоже «невидимый» в этом плане.

Iron_Bug ★★★★★
()
Ответ на: комментарий от necromant

В нативных приложениях понятно там, что если 1Мб утилита, то скорее всего много и не понадобится, а если приложение в 0.5Гб и больше, то там монстр сидит.

Вот выводы ниразу не очевидные. Глянул свою старую софтинку, размер 906887 байт, но утечек памяти там хватало. После обработки напильником размер уменьшился до 833895, т.е. разница в размере по большому счету не такая и большая.

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)

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

thesis ★★★★★
()
Ответ на: комментарий от Bad_ptr

Это про хром, так что не в тему.

Тем не менее -

The ID of the tab to be discarded. If specified, the tab is discarded unless it is active or already discarded.

Вопрос в том, что подразумевается под «active». Если там таймеры запущены, вебсокет открыт или ещё чего - оно «active»?

В хроме убрали возможность штатно отключить service workers, например, пока что только всякие костыли с правами на директорию и пр. работают, но неизвестно надолго ли. Опять же, в хроме потихоньку закручивают гайки для блокировщиков рекламы. С таким подходом к курощанию пользователя, чтобы он ни в коем случае не избавился от всяких «жучков» подселяемых вебмакаками, я не уверен, что discard там будет работать так, как хотелось бы.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Это про хром

так у фаерфокса то же самое Web Extensions API

Bad_ptr ★★★★★
()
Ответ на: комментарий от Stanson

что подразумевается под «active»

Под актив по-моему понимается что она отображается (выбрана как «текущая» для окна)

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Под актив по-моему понимается что она отображается (выбрана как «текущая» для окна)

Ну это честный человек так предположит. Вот только ожидать что те, кто пишет браузер-монополист честные - полный идиотизм.

Доверять документации хрома и фаерфокса - это верх наивности. Оба браузерных движка являются наимерзейшими примерами строго анти-пользовательской блоатвари. Если заглянуть в сырцы это становится очевидно - код обеих движков намеренно превращён в кашу, в которой отдельно взятый человек никогда не разберётся полностью. Каша рассчитана на использование в разработке некоторого количества отдельных команд каждая из которых совершенно не в курсе того, чем занимается другая. Код разных частей движков разный по стилю и подходам. Достаточно сравнить код khtml/WebKit и первых фаерфоксов с нынешним кодом движков хрома и фаерфокса. И нет, добавление современных фич html/css/js никак не может быть причиной этого. Последний релизнутый вебкит, например, по возможностям (в т.ч. html5) не так уж и сильно отстаёт от современных движков, но если бы его развивали в том же стиле до их уровня, то все анти-пользовательские нововведения в нём легко выпиливались бы даже небольшой группой энтузиастов, а то и вовсе одним человеком. C хромом и фаерфоксом нынче это практически нереально.

Stanson ★★★★★
() автор топика
Последнее исправление: Stanson (всего исправлений: 1)

Есть superstop, но он в последнее время не очень-то останавливает.

Beewek ★★★
()
Ответ на: комментарий от Bad_ptr

Что делать? Как решать собираешься свою проблему?

Будет нечего делать - посмотрю как из /usr/lib64/firefox/config.js создать кнопку тулбарную и повесить на неё ...allowJavascript ^= true.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от frunobulax

Не юзерскрипт, а chromeскрипт. Юзерскрипт только содержимое страницы может. А тут надо XUL или как оно там сейчас называется.

Говноеды из мазиллы уже очень давно заканселили UserChrome.js и UserChrome.css, чтобы пользователи не могли легко и просто чинить превращающийся в говно интерфейс фаерфокса и добавлять фичи которые невыгодны хозяевам мазиллы.

Но в директорию где лежат бинари фаерфокса можно положить config.js, который по замыслу мозилловцев предназначен дл ограничения прав пользователей (например чтобы админ мог запретить uBlock ставить), но мозилловцы лоханулись и туда можно напихать не только «энетерпрайзные ограничения для галерных рабов», но и кучу всяких полезных и совершенно некошерных штуковин у которых будет полный доступ как к контенту, так и к интерфейсу фаерфокса.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от MirandaUser2

Работает если сделать toolkit.legacyUserProfileCustomizations.stylesheets=true а дефолтно нет.

Про userChrome.js не слышал вообще, по-моему такое только аддонами было всегда.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Работает если сделать toolkit.legacyUserProfileCustomizations.stylesheets=true а дефолтно нет.

Ну, переключить настройку в about:config это пожалуй самое простое в деле настройки и отладки своих правил для userChrome.css.
Browser Toolbox опять же отлично работает.

MirandaUser2
()
Ответ на: комментарий от somemong

noscript

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

Stanson ★★★★★
() автор топика
Ответ на: комментарий от firkax

Работает если сделать toolkit.legacyUserProfileCustomizations.stylesheets=true а дефолтно нет.

Это про UserChrome.css

Stanson ★★★★★
() автор топика
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)