javascript

Ограничения Manifest V3 в расширении EasyProxy для управления прокси

  • среда, 24 июня 2026 г. в 00:00:02
https://habr.com/ru/articles/1050942/

С выходом Manifest V3 в Google Chrome большинство расширений, позволяющих управлять настройками прокси, перестали полноценно работать, а некоторые и вовсе перестали. Основным функционалом для меня (как думаю и для большинства пользователей) было автоматическое туннелирование запросов для сформированного пользователем списка хостов, а также включение прокси для отдельной вкладки (окна), не затрагивая остальные.

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

В силу того, что Manifest V3 ударил и по блокировщикам рекламы в том числе, решил что настало время перейти на Firefox. Особенно после того, как посмотрел документацию и понял, что Proxy API здесь намного гибче. И, как самый крупный бонус, возможность установки расширения на Android версию браузера.

Сказано - сделано. Firefox позволил реализовать все пожелания по управлению прокси. API дает доступ к сетевым запросам, показывая: запрашиваемый адрес, id вкладки, с которой пришел запрос, режим (regular, incognito) и пр. и позволяет точечно пускать трафик через прокси, в зависимости от условий. Полная панель управления получилась такой.

Controls
Controls

Чтобы хост текущей вкладки было удобно добавлять/удалять из пользовательсного списка Host list, сделал большую кнопку сверху. Простой вариант - брать хост из адресной строки не подошел, так как он становится доступным только после ответа от сервера. Если запрос “зависнет”, то пришлось бы ждать, пока он не “отвалится” по таймауту. Поэтому выручил browser.webRequest.onBeforeRequest.

По настройкам прокси все стандартно. Доступные типы: HTTP, HTTPS, SOCKS4, SOCKS5 + авторизация. Я же использую локальный SOCKS5 без авторизации.

Settings
Settings

Сам Host list реализовал как обычную таблицу с полями, но с возможностью переключения на текстовое поле, чтобы можно было разом загрузить/выгрузить большой список. Также добавил поддержку поддоменов, если основной домен не должен быть туннелирован.

Host list
Host list

В процессе написания понял, что было бы удобно получить полный список запрашиваемых хостов для конкретной вкладки и конкретного ресурса, поэтому добавил Host tracker, позволяющий добавлять/удалять адреса в Host list в своей же вкладке.

Host tracker
Host tracker

Реализация довольно простая - с помощью все того же onBeforeRequest. Но в этот раз нам нужно знать чем закончился запрос (т. е. доступен ли хост). Поэтому реализовал такую логику: если отслеживаемый хост хотя бы на один из запросов ответил кодом 200, красим поле зеленым цветом, если все запросы с ошибкой - красным, в процессе выполнения - синим.

Полный объем расширения со всеми иконками составил чуть меньше 40 кБ. Протестировал и опубликова его в Firefox ADD-ONS. Дополнение на момент написания поста собрало более 500 пользователей. Изначально даже не рассчитывал на аудиторию больше 10-15 человек. Что удивительно - большая часть установок пришлась на Android устройства, видимо там альтернатив значительно меньше. Товарищи же попросили портировать расширение для Google Chrome, потому как оказалось большая часть пользуется хромиум-подобными браузерами и осознанно обходят Firefox стороной.

Просмотрев документацию MV3 Chrome Extensions понял, что можно попрощаться с тумблером “прокси для вкладки” и прямого доступа к туннелированию запроса в зависимости от его параметров я не получу. Здесь прокси работает либо для всего браузера сразу, либо через PAC скрипт. Еще есть вариант с bypassList, который не пускает указанные адреса через прокси, но это совсем не то, что нам нужно. Также из ограничений - отсутствие авторизации для SOCKS5 (для кого-то может быть критично). Из хороших новостей Chrome API позволяет запускать разные прокси для обычного режима и режима инкогнито. Панель управления стала полегче, в отличие от версии для Firefox.

Chrome Controls
Chrome Controls

Проблему с работой Host list решил через генерирование PAC скрипта с обновлением параметров прокси для браузера после каждого добавления/изменения хоста.

Из других проблем MV3, это возможность “засыпания” расширения, которое хранит в оперативной памяти данные по хостам для всех вкладок, а также последние примененные параметры прокси. По наблюдениям приложение засыпает только во время простоя браузера, т. е. при отслеживании хостов для активных вкладок проблем не возникает. При пробуждении Host tracker будет пустым, с этим придется смириться, потому как использовать local storage самого расширения для этих целей - не самое удачное решение. С настройками прокси же проблем не возникает, после пробуждения их легко применить по необходимости.

Закончив работу над портированной версией также загрузил ее в интернет-магазин Chrome. Удивил единоразовый взнос в 5$ за возможность публикации там дополнений. Еще больше удивили сроки рассмотрения публикации. Если в Firefox все происходит в течении 15 минут, то здесь же пришлось ждать 3 дня. Внесение любых правок в уже существующий пакет также занимает не мало времени. Из положительных сторон - это возможность любого хромиум-подобного браузера установить расширение из магазина Chrome. Расширение протестировано на: Chrome, Edge и Яндекс Браузер.

В заключение скажу, что MV3 хоть и имеет заметные ограничения, но все же еще позволяет строить велосипеды, пусть и с некоторым количеством компромисов.

Ссылка на проект: github