Более одного пункта меню верхнего уровня в chrome.contextMenus. Как?
Кто нибудь знает о возможности добавления нескольких пунктов меню в контекстное меню расширения chrome?
Очень долго переходить в подменю :(
Дело в том, что при добавлении нескольких пунктов они группируются. Опции в chrome.contextMenus.create я такой не нашел.
Может быть какой хак или флаг браузера?
UPD: Все сайты за сутки перерыл и ничего не нашел :( Пришлось ниже...
Ответы (1 шт):
Важное Замечание: Никогда так не делайте!
Только для личного использования и непреодолимого желания быстрого доступа к меню.
На этой устаревшей странице сказано:
- Элементы расширения отображаются в нижней части контекстного меню над «Inspect element», отсортированные по имени расширения.
- Если расширение добавляет более 1 элемента, мы автоматически помещаем эти элементы в подменю.
- Слева от элемента верхнего уровня появится значок расширения.
Это оставляет последнюю возможность - создать несколько расширений ради одного меню:
- Основное Master - включает в себя управление slave расширениями
- Зависимые Slave - всего несколько строк кода для пунктов(он может быть один) и взаимодействия с master
Проблема сортировки/именования элементов
На самом деле сортировка зависит не от имени расширения, а от пункта меню. Имя расширения используется при группировке, когда верхний уровень становится полем name манифеста. Таким образом, расширение для подгрупп приходится именовать желаемым именем группы.
С другой строны, стандартное использование contextMenus, не позволяет установить несколько иконок. С несколькими мы получаем свободу установки иконок верхнего уровня - куда'ж без дизайна.
Enable/Disable ...
... только одним ведущим Master(это когда на вкладке расширений мы кликаем на отключить) достигается с помощью:
- chrome.management.setEnabled(...) - при включении master вызываем сразу все slave
- chrome.management.onDisabled.addListener(...) - проверяем когда отключается master из slave и сами себя выключаем
Взаимодействие | Long-lived connections
- chrome.runtime.onConnectExternal.addListener( port ) - при запуске master устанавливаем слушателя для запроса "долгоживущих" портов от slave
port =chrome.runtime.connect(...) - получаем порт от master
Порты "живут" до выключения master и кроме port.onMessage() и port.postMessage() больше особо ничего не надо. Вся задача соединения послать click и checked от slave и получить enabled:true|false от master.
Результат
Минусы
- На странице chrome://extensions/ будет беспорядок - особо туда лазить необходимости нет.
- Подбор имен для сортировки.
Плюсы
- Установка иконок для всех пунктов верхнего уровня, что нельзя сделать для сгруппированного меню.
- Желаемый быстрый доступ в один клик без раздражающих переходов.

