Страницы

Поиск по вопросам

Показаны сообщения с ярлыком chrome-extension. Показать все сообщения
Показаны сообщения с ярлыком chrome-extension. Показать все сообщения

среда, 15 апреля 2020 г.

Как получить URL посещённых ресурсов?

#javascript #chrome_extension

                    
Всем привет.
Идея следующая: есть расширение Chrome, оно передаёт все посещённые URL на сервер,
каждый пользователь имеет свой id. Можно, конечно, использовать Историю браузера, но
этот подход не гибкий. Каким образом можно реализовать подобное? Интересует коллегиальное
решение, как общая концепция, так и технологии для реализации. Сам Java и  С++ developer,
в WEB только въезжаю, поэтому, может, вопрос глуповат-). Но прошу отнестись с пониманием.
Спасибо.
PS Это не инструмент слежки, необходимо для исследования.    


Ответы

Ответ 1



Можно, конечно, использовать Историю браузера, но этот подход не гибкий. Вполне гибкий. Хром предоставляет специальный API для работы с историей просмотров - это chrome.history. Там же есть ссылка на пример работы с API. Можно создать расширение, которое будет работать всегда, когда запущен Хром, и периодически (скажем, раз в день) в определенное время извлекать историю просмотров, прошедших с последней активации расширения, анализировать их и отсылать данные на сервер.

Ответ 2



Как вариант - опять же расширение для хрома которое будет при каждой загрузке страницы отправлять серверу текущий урл и id пользователя (id можно хранить в localStorage). На сервере анализировать урл и писать его в базу привязывая к пользователю с указанным id.

Помогите найти аналог globalStorage для Chrome

#google_chrome #chrome_extension

                    
Пишу простое расширение для Chrome, которое уведомляло бы о новых постах на сайте. 
Решил хранить в локальном хранилище номер последнего поста, который бы обновлялся
при заходе на сайт, но столкнулся с проблемой: localStorage уникален для каждого домена
и расширение не имеет доступа к данным, которые я кладу в localStorage при заходе на сайт.
Хотелось бы найти js-плагин, который бы реализовывал функционал globalStorage в Chrome.    


Ответы

Ответ 1



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

воскресенье, 15 марта 2020 г.

Как защитить google chrome расширение?

#javascript #google_chrome #chrome_extension


т.к. google chrome расширения пишутся на javascript, который является некомпилируемым
языком программирования, то любой желающий может выдернуть исходный код и использовать
его в своем расширении или, например, выложить его в общий доступ (если приложение
является платным). Собственно это и является проблемой. Как защитить google chrome
расширение?
    


Ответы

Ответ 1



Нормально защитить невозможно. Можно попробовать создать трудности при копировании, но не более того. Расширения и приложения работают на машине клиента, а значит исходники и контент могут быть скопированы. В данном случае вопрос копирования и использования Вашего JS "любым желающим" скорее из области права, чем программирования.

Альтернатива расширения для safari

#macos #chrome_extension #safari #firefox_extension


В хроме и в файерфоксе есть отличное приложения для перевода линк. Выделяем текст,
появляется иконка или горячими клавишами кликаем и получаем popup с переводом и возможностью
прослушать текст на двух языках. Но вот в сафари данного приложения не нашел и не нашел
достойной альтернативы. К примеру franker не обладает даже половиной функционала. Или
же дефолтный маковский словарь переводит только по слову. 

Есть ли что то достойное внимания?
    


Ответы

Ответ 1



Видимо вы плохо искали 1) igTranslator for Google: можно переводить целые предложения выделив текст + комбинация клавиш (по умолчанию T) или кликнув на иконку в тулбаре 2)TranslateMe: имеет массу настроек на любой вкус. При установке можете столкнутся с проблемой This developer's server appears to be busy. Please try again later. в этом случае качаем с гитхаба и устанавливаем вручную. Больше информации на оф страничке

Ответ 2



Вам возможно подойдет расширение Lingualeo.

среда, 4 марта 2020 г.

Как заставить рисовать хром “серую” иконку у расширения?

#javascript #google_chrome #chrome_extension


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

Важный момент - "серые" иконки - это именно фича хрома. Т.е. вариант с заготоволенными
иконками с нормальными и серыми цветами меня не интересует.
    


Ответы

Ответ 1



Стоит пойти от обратного: почему иконка у вас "цветная"? Полагаю вы используете page_action, иконка которого всегда цветная/оригинальная. То, что вас интересует - это browser_action. Данное API позволяет поместить иконку приложения, которая по-умолчанию не активирована для каждого таба (и имеет серый цвет).

пятница, 31 января 2020 г.

Автоустановка расширения для google chrome

#google_chrome #chrome_extension


Как установить расширение в браузер хром программным путем.
Запуск файла на компе → расширение добавлено в хром

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

Кое как разобрался с документацией, создал файл  nojpnepbplnoojhiinbpegidccgolald.json
(в качестве имени использовал id приложения, его получил установив плагин к себе в
хром и скопировав его id) в папке  

C:\Users\<имя пользователя>\AppData\Local\Google\Chrome\Application\31.0.1650.63\Extensions


со следующим содержанием:

{
"external_crx": "C:\Sdsattings.crx",

"external_version": "1.0"
}


crx файл разместил на диске C, перезапускаю хром и ничего не происходит
    


Ответы

Ответ 1



Приветствую. В целях безопасности в Chrome на Mac / Windows можно устанавливать расширения только с Chrome Web Store. Т.е. по факту в Chrome добавляется информация о том какое расширение надо обновить и после запуска браузера он подгружает расширение. Windows 1.1. В Windows установка происходит через реестр в раздел: 32-bit HKEY_LOCAL_MACHINE\Software\Google\Chrome\Extensions 64-bit HKEY_LOCAL_MACHINE\Software\Wow6432Node\Google\Chrome\Extensions 1.2. Создать новый ключ (папка) вида aaaaaaaaaabbbbbbbbbbcccccccccc (ID расширения в Chrome Web Store) 1.3. Внутри этого ключа создать свойство update_url со значением https://clients2.google.com/service/update2/crx (ссылка на Chrome Web Store) Mac 2.1. Создать файл типа aaaaaaaaaabbbbbbbbbbcccccccccc.json (ID расширения в Chrome Web Store) 2.2. Содержимое файла должно быть таким { "external_update_url": "https://clients2.google.com/service/update2/crx" } 2.3. Положить его в папку: для определенного пользователя ~USERNAME/Library/Application Support/Google/Chrome/External Extensions/ для всех /Library/Application Support/Google/Chrome/External Extensions/ Вариант для Linux Для Linux можно устанавливать как с удаленного источника, так и с локального .crx файла 3.1. Создать файл типа aaaaaaaaaabbbbbbbbbbcccccccccc.json (ID расширения) 3.2. Содержимое файла должно быть таким при установке с локального файла { "external_crx": "/path/to/extension.crx", "external_version": "1.0" } при установке по ссылке (пример) { "external_update_url": "http://myhost.com/mytestextension/updates.xml" } 3.3. Положить файл в любую из папок (должен иметь права на чтение всеми): /opt/google/chrome/extensions/ /usr/share/google-chrome/extensions/ Также возможно установить расширение простым открытием .crx файла из Chrome, если браузер запустить с флагом –enable-easy-off-store-extension-install

Ответ 2



Почему бы не поискать ответ на официальном сайте? Developer's Guide -> Finishing -> Other Deployment Options http://developer.chrome.com/extensions/external_extensions.html

пятница, 24 января 2020 г.

Расширение для Chrome DevTools

#javascript #google_chrome #chrome_extension


Подскажите, каким образом добавить свой пункт меню к меню DevTools?

Суть в следующем, при инспектировании кода, при клике правой кнопкой мыши появляется
контекстное меню 


Хотелось бы добавить в него свой пункт, и отловить событие клика по нему.
    


Ответы

Ответ 1



Из консоли можно обращаться к выделенному элементу через $0. Соответственно, если ты добавишь нужную функцию на страницу, то сможешь передать ей элемент руками из консоли.

Ответ 2



Скорее всего никак, в оф. доках нигде не указана возможность работы с контекстным меню вызванным из devTools хрома. Весь интерфейс для расширения ограничивается только: inspectedWindow network panels Panels, как сначала может показаться, доступа к контекстному меню не предоставляет. network - работа с сетью. inspectwindow - доступ к текущему окну, в котором открыт devTools. Почитать, поразбираться UPD: Я вот что подумал, последний выделенный элемент в консоли доступен по ссылке $0, может быть попробовать воспользоваться ею? Что бы получить код, можете сделать так $0.outerHtml

понедельник, 6 января 2020 г.

Как правильно реализовать вызов модального окна в расширении?

#javascript #html #chrome_extension #extension


У меня есть расширение, и мне нужно что бы по клику на кнопку на клавиатуре, допустим,
L вызывалось модальное окно с какой-то надписью(простой alert не подойдет, т.к. окно
нужно стилизовать). Но столкнулся с проблемой что не понимаю как именно это сделать:
то ли нужно отдельные файлы с html и css делать или просто по нажатию на кнопку просто
постоянно создавать html разметку с помощью  js. Кто уже работал с этим подскажите
как это происходит? Функция вызова окна находиться в content-script.js.
    


Ответы

Ответ 1



Наиболее правильным решением будет использовать Shadow DOM для создания модального окна. Это позводит изолировать встраеваемые стили от основного документа. Обратите внимание, что при обращении к созданному модальному окну необходимо использовать shadowRoot вместо document. manifest.json { "manifest_version": 2, "name": "Test", "version": "1.0", "description": "", "content_scripts": [{ "matches": [""], "js": ["content-script.js"], "run_at": "document_start" }] } content-script.js document.addEventListener('DOMContentLoaded', function() { // создаем хост элемент для Shadow DOM const div = document.createElement('div'); // создаем shadow DOM const shadowRoot = div.attachShadow({mode: 'open'}); // создаем модальное окно в shadow DOM shadowRoot.innerHTML = '

Modal

'; // добавляем хост элемент в оригинальный DOM (document) document.body.appendChild(div); window.addEventListener('keydown', e => { if(e.keyCode === 76 ){ // "l" - key // показываем модальное окно // обратите внимание что здесь используется "shadowRoot" shadowRoot.querySelector('#modal_form').style.display = "block"; } }); });

четверг, 2 января 2020 г.

Как получить ссылку из баннера?

#javascript #jquery #google_chrome #chrome_extension


Необходимо получить ссылки из баннеров на сайте посредством JavaScript в браузере Chrome.


Как пример взял сайт speedtest.net, где размещены баннеры: как видно на скриншоте
— Chrome может видеть ссылки баннера, но как самому достичь этого средствами JavaScript? 
    


Ответы

Ответ 1



Если я Вас правильно понял - следует использовать специальное расширение для Chrome: Tampermonkey. Данное расширение позволяет запускать Ваши скрипты на необходимых страницах/доменах и т.д. Что касается самого когда скрипта: Если использовать чистый JS: // Сохраняем в переменную узел с нашим баннером, узнав его по id var someDOMElement = document.getElementById('aw0'); // А так мы можем взять любой атрибут, например href var hrefOfelement = someDOMElement.getAttribute('href'); // Можно всё делать в одну строку var hrefOfelement = document.getElementById('aw0').getAttribute('href'); Можно получить элементы и по другим атрибутам Что касается именно Вашей задачи - алгоритм следующий: 1) Собираете все необходимые Вам DOM элементы, например, в массив (в JS это объекты); 2) В цикле проходимся по каждому из них

Ответ 2



Со страницы добраться до элементов внутри ifram'а другого домена невозможно, если только хром не запущен с флагом --disable-web-security.

Ответ 3



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

пятница, 27 декабря 2019 г.

Расширение для Chrome в инкогнито режиме

#cookie #сессия #chrome_extension


Есть расширение для Chrome, которое делает ajax запрос на сайт. На сайте используются
сессии.

Так, вот, в ответе на ajax запрос к сайту, возвращается заголовок Set-Cookie c некоторым
идентификатором сессии и в разделе кук появляется соответсвующая запись. Речь идёт
о DevPanel фоновой страницы расширения.

Но, если посмотреть на куки в DevPanel браузера, то там совсем другой идентификатор
сессии.

Расширению разрешена работа в инкогнито режиме.

В обычном режиме браузера куки (идентификаторы сессии) в DevPanel расширения и браузера
одинаковы.

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

Получается, что, несмотря на то, что расширению разрешено работать в инкогнито режиме,
он сам работает в обычном режиме?
    


Ответы

Ответ 1



Для всех, кого интересует данный вопрос. Решение мне подсказали на форуме для обсуждения Google Chrome. В manifest есть ключ "incognito", у которого три значения: "spanning" (по умолчанию), "split" и "not_allowed". Подробнее об этой настройке можете прочитать здесь: https://developer.chrome.com/extensions/manifest/incognito. Решение моего вопроса, заключалось в задание значения "split". При этом значении, для расширения в инкогнито режиме, будет создаваться отдельный процесс. Другими словами, будет два процесса: для обычного и инкогнито режимов. Теперь, запросы в инкогнито режиме выполняются в инкогнито процессе и сессионная кука, получаемая расширением, может использоваться при редиректе на сайт. P.S. Если вы разрабатываете кроссбраузерное расширение, используя WebExtension API, то Firefox до сих пор (на 2017-12-11) поддерживает только "spanning" значение для ключа "incognito".

четверг, 26 декабря 2019 г.

Как увеличить пинг?

#javascript #сокет #google_chrome #chrome_extension


Делаю игру на сокетах, чтобы сделать отладку интерполяции и экстраполяции нужно увеличить
пинг и возможно эмулировать потерю пакетов на открытой вкладке в Chrome. Может быть
у кого то была подобная задача, нашёл только через виртуалку WANem http://habrahabr.ru/post/127274/ 

Но не очень хочется поднимать целую виртуалку для небольшой задачи. 
    


Ответы

Ответ 1



В developer tools есть уже все что нужно. Нажать f12. В верхнем левом углу нажать на иконку телефона. Вверху будет секция network и там в старых версиях будет список возможных задержек, а в новых - кнопка "configure throttling". Там можно как увеличить пинг, так и ограничить скорость соединения.

пятница, 20 декабря 2019 г.

Как вернуть значение из асинхронной функции? [дубликат]

#javascript #функции #chrome_extension


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            Как вернуть значение из события или из функции обратного
вызова? Или хотя бы дождаться их окончания
                                
                                    (3 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Как правильно возвратить значение в этой функции ?


function getValue(variable, defaultvalue) {
  chrome.storage.sync.get({
    [variable]: defaultvalue,
  }, function(items) {
    if (items[variable]) {
      return items[variable];
    }
  });
}




Вот так не получается,а если return items[variable] заменить на alert(items[variable])
то успешно выводиться что нужно,а если с return то возвращает undefined.
Нужно чтобы при alert(getValue('test', 'var')) возвращалось то, что мне нужно, а
не undefined .
    


Ответы

Ответ 1



Так как в данном случае функция getValue ничего не возвращает, то результат выполнения getValue(variable, defaultvalue) всегда будет undefined. Возможные пути решения: Пробросить callback - функцию, которая будет вызвана при успешном выполнении, например function getValue(variable, defaultvalue, successCallback) { chrome.storage.sync.get({ [variable]: defaultvalue, }, function(items) { if (items[variable]) { successCallback(items[variable]);//вызываем callback если все хорошо } }); } И вызывать ее следующим образом: getValue(variable, defaultvalue, function(items){//items внутри этой функции - будут нужным значением ... }) Можно использовать Promise, например так: function getValue(variable, defaultvalue, successCallback) { return new Promise(function(resolve, reject){ chrome.storage.sync.get({ [variable]: defaultvalue, }, function(items) { if (items[variable]) { resolve(items[variable]);//говорим что все хорошо }else{ reject(/*тут можно указать причину почему все плохо*/); } }); }); } И использовать так getValue(variable, defaultvalue).then(function success(items){//items внутри этой функции - будут нужным значением ... });

воскресенье, 15 декабря 2019 г.

Переключение между вкладками Chrome, зная tabId этих вкладок

#javascript #google_chrome #chrome_extension


Здравствуйте. 

Хочу реализовать переключение между вкладками Google Chrome в своём расширении. Расширение
уже узнаёт id вкладок и может их обновлять. 

Возможно ли сделать переключение между необходимыми мне вкладками, зная их tabId?


    


Ответы

Ответ 1



Для этого используйте updateProperties в методе .update(): chrome.tabs.update(tabId, { active: true });

воскресенье, 8 декабря 2019 г.

Некоторые сервера VK отдают неверные CORS заголовки

#javascript #вконтакте #chrome_extension #cors


Я разрабатываю музыкальное расширение для Google Chrome и столкнулся с такой проблемой.

Музыка ВКонтакте располагается на нескольких серверах, которые находятся в зоне
*.vk-cdn.net

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


  accept-ranges:bytes
  access-control-allow-methods:GET, HEAD, OPTIONS
  access-control-allow-origin:*
  cache-control:max-age=604800
  content-length:5292838
  content-type:audio/mpeg
  date:Wed, 13 Jan 2016 20:32:05 GMT
  expires:Wed, 20 Jan 2016 20:32:05 GMT
  last-modified:Wed, 13 Jan 2016 16:45:43 GMT
  server:nginx
  status:200 OK
  version:HTTP/1.1  


А некоторые сервера, которые на Apache, не отдают этих заголовков


  Accept-Ranges:bytes
  Cache-Control:max-age=1468800
  Connection:keep-alive
  Content-Length:655080
  Content-Type:audio/mpeg
  Date:Wed, 13 Jan 2016 20:34:52 GMT
  ETag:"4b23d502-9fee8"
  Expires:Sat, 30 Jan 2016 20:34:52 GMT
  Last-Modified:Sat, 12 Dec 2009 17:38:10 GMT
  Server:Apache  


Таким образом, запросы к таким серверам через JS невозможны, так как Chrome c 45
версии это запретил. Получаем ошибку о том, MediaElementAudioSource выдает нули вместо
контента, из-за CORS


  MediaElementAudioSource outputs zeroes due to CORS access restrictions
  for https://psv4.vk.me/c613321/u3197020/audios/00a66935ba83.mp3


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

Я пытался общаться с поддержкой ВК, но получил ответ, что на баг-трекер сайта давно
забили и никто исправлять не будет это.

Можно ли как-то обойти это ограничение?
    


Ответы

Ответ 1



Вы можете поставить где-нибудь свой прокси сервер, который будет проксировать аудио с серверов ВК и добавлять заголовки чтоб всё корректно работало через AJAX. Для таких целей наверно лучше всего подойдет nginx

воскресенье, 1 декабря 2019 г.

Как в google chrome программно выбрать микрофон?

#javascript #google_chrome #selenium_webdriver #chrome_extension #google_chrome_devtools




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

Может это можно как-то сделать на JavaScipt? Если это можно реализовать на JS, то
потом можно сделать расширение, через tampermonkey или запустить скрипт через webdriver
Selenium.

Нашел следующий пример, который выводит в консоль список аудиоустройств. Можно ли
также через консоль сменить микрофон? Пожалуйста дайте пример, если это возможно. Если
это не возможно, то пожалуйста напишите почему не получится и как можно по другому
попытаться решить задачу.


navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
  devices.forEach(function(device) {
    console.log(device.kind + ": " + device.label +
            " id = " + device.deviceId);
  });
})



    


Ответы

Ответ 1



Можно выбрать девайс с помощью метода setSinkId(deviceId) как указано в https://developers.google.com/web/updates/2015/10/media-devices element.setSinkId(sinkId) .then(function() { console.log('Audio output device attached: ' + sinkId); }) .catch(function(error) { // ... });

Ответ 2



Нет, но можно сделать кастомный конфиг для хрома, где разрешен микрофон и в exceptions добавлено: "media_stream_mic":{"http://localhost:1337,*": {"last_used":1470931206, "setting":1} }, и селениуму передавать эти настройки.

Что лучше: chrome.storage.sync, chrome.storage.local, или localStorage?

#javascript #google_chrome #chrome_extension #localstorage


Что лучше использовать для хранения данных расширения Google Сhrome Extention,  и
в чём кардинальная разница между chrome.storage.sync / chrome.storage.local / localStorage,
с учётом возможности получения этих данных в любой вкладке?

Желательно с примером, пожалуйста.
    


Ответы

Ответ 1



localStorage это хранилище данных стандарта HTML5. Документация https://developer.mozilla.org/en/docs/Web/API/Window/localStorage Хранит данные для текущей страницы. То есть для страницы бэкграунд - один набор данных. Для страницы контента - другой набор данных (для каждой страницы свой набор). Хранит данные в виде: имя=значение (значение - строка), то есть не позволяет хранить составные объекты. При чем, типы вроде true, false будут храниться как "true" и "false". Обращение к данным происходит синхронным методом: var x = localStorage.x; var x = localStorage['x']; var x = localStorage.getItem('x'); chrome.storage.local - хранилище данных экстеншена. Можно получить доступ как со страницы бэкграунд, так и со страницы контента - это единое хранилище. Позволяет хранить объекты, в отличии от localStorage. Обращение к данным происходит асинхронно. Позволяет "слушать" изменения переменных. Документация по работе с хранилищем https://developer.chrome.com/extensions/storage chrome.storage.sync - работает как chrome.storage.local, но хранит данные на сервере, синхронизированные по google-аккаунту Для экстеншенов предпочтительнее использовать chrome.storage local/sync - зависит от ваших потребностей

суббота, 13 июля 2019 г.

Программное нажатие на кнопку из расширения обозревателя

Делаю расширение для сайта. Согласно логике необходимо добавить ссылку, при нажатие (пользователем) на которую, мне необходимо инициировать (программно) нажатие ссылки на сайте.
Конкретно, добавляю ссылку в панель инструментов. При клике на ссылку, необходимо открыть меню добавления комментария под вопросом за счет клика на ссылке «добавить комментарий».
function processAddingAssociationLink() { $("#question .post-menu").append("" + associateHelpText + ""); $("#associate-link").click(function() { $(".question .js-add-link").trigger("click"); $(".question .comment-form textarea").text(associationTag + " "); $(".question .comment-form input").val(addAssociationHelpText); event.preventDefault(); }); }
Вызов $(".question .js-add-link").trigger("click"); не создает нажатия, хотя если выполнять этот код в консоли Хрома, все работает, как надо. Подскажите, пожалуйста, как исправить?
Если выполнить код ($(".question .js-add-link").trigger("click");) в консоли, а затем нажать на созданную мной кнопку, то необходимые поля обновляются (то есть часть обработчика отрабатывает).
Обновление
Решение может быть такое
var event;
if (document.createEvent) { event = document.createEvent("HTMLEvents"); event.initEvent("click", true, true); } else { event = document.createEventObject(); event.eventType = "click"; }
event.eventName = "click";
var element = $(".question .js-add-link")[0]; if (document.createEvent) { element.dispatchEvent(event); } else { element.fireEvent("on" + event.eventType, event); }
Но не до конца понятно, почему оно работает, а стандартный вызов – нет.


Ответ

Тут есть две проблемы.
Основная проблема заключается в том, что метод trigger в jquery выполняет только те обработчики, которые были назначены элементу в том же самом jquery. Ну еще иногда выполняет другие обработчики - но не всегда. А у вас в расширении загружен другой инстанс jquery.
Вторая проблема, content script выполняется в изолированном окружении и в принципе не имеет доступа к объектам страницы, поэтому обычный ответ в таком случае "зачем вы добавили на страницу вторую jquery?" не применим.

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