tabs.executeScript - как я могу узнать, вводился ли скрипт содержимого? - PullRequest
0 голосов
/ 06 июля 2019

Я внедряю контент-скрипты в веб-сайты программно, используя browser.tabs.executeScript.Это вернет Обещание, но в случае его отклонения, по-видимому, нет способа провести различие между следующими 2 случаями:

  1. Не удалось внедрить скрипт содержимого (т. Е. Из-за отсутствия разрешения хоста)
  2. Произошла ошибка в сценарии обновление синтаксический анализ end: обновление (но вводился сценарий)

Меня интересует тольков том, был ли сценарий внедрен или нет.

Аргумент, переданный catch, является объектом Error.catch(e => console.log(e.toString()) выведет сообщение об ошибке, которое может быть причиной сбоя инъекции (например, Missing host permission) или ошибки, произошедшей update при чтении скрипта end: update .

    browser.tabs.executeScript(tabId, {
        file: '../path/to/content-script.js',
        frameId: 0,
        runAt: 'document_idle'
    })
        .catch(e => console.log(e.toString()));

Так, например, если скрипт содержимого выглядит следующим образом:

    window.document.body.addEventListener('click', e => console.log('clicked body'), false);
    bla.bla();

, тогда Обещание отклоняется, поскольку bla.bla не определено, но сценарий внедряетсяуспешно.

В случае, если скрипт содержимого не может быть введен, я хотел бы уведомить пользователя соответствующим сообщением об ошибке.Но когда произошла ошибка update , которая не связана с тем, можно ли внедрить скрипт end: update , в то время как скрипт вводился, я не хочу уведомлять пользователя, нообращаться с этим молча.Есть ли способ провести различие между этими двумя случаями?

РЕДАКТИРОВАТЬ: Я пришел к косвенному решению: в случае отклонения возвращенного обещания я пытаюсь отправить сообщение в сценарий содержимого,Если это не удается, то фоновый сценарий «знает», что сценарий содержимого не был введен -> уведомить пользователя.

1 Ответ

0 голосов
/ 07 июля 2019

Вот как работает Обещание ....

browser.tabs.executeScript(tabId, {
  file: '../path/to/content-script.js',
  frameId: 0,
  runAt: 'document_idle'
})
.catch(e => console.log(e.toString()));

catch в выше будет ловить ошибки, если tabs.executeScript не удалось ввести.Это может также показать некоторые ошибки при синтаксическом анализе файла для вставки, если файл JS имеет ошибки синтаксического анализа (недопустимый JS).Это не имеет ничего общего с тем, что « .. / path / to / content-script.js » будет делать впоследствии.

Так что, как только оно было введено, то выше обещание выполняется.

Если введенный скрипт имеет возврат sync , то он может быть получен tabs.executeScript через then() например,

browser.tabs.executeScript(tabId, {
  file: '../path/to/content-script.js',
  frameId: 0,
  runAt: 'document_idle'
})
.then(result => {})
.catch(e => console.log(e.toString()));

В случае async функций, таких как .addEventListener, которые произойдут позже, затем ничего не будет возвращено в tabs.executeScript

Чтобы отловить ошибки в скриптах контента, вы можете сгенерировать сообщение об ошибке в скрипте контента или отправитьсценарий сообщения в фоновом режиме, например sendMessage & onMessage.addListener

tabs.executeScript ()
Обещание, которое будет выполнено с массивом объектов, представляющихРезультат сценария в каждом введенном кадре.
Результатом сценария является последний оцененный оператор, который похож на то, что будет выводиться (результаты, а не любой вывод console.log ()), если вы выполнили сценарий ввеб-консоль.Например, рассмотрим сценарий, подобный следующему:

var foo='my result';foo;
browser.tabs.executeScript(tabId, {
  file: '../path/to/content-script.js',
  frameId: 0,
  runAt: 'document_idle'
})
.then(result => {
  // result is returned by the Promise
  if (result === []) { 
    // it was fine but there was nothing to return
  }
  else if (result[0]) {
    // result[0] is return from the promise
  }
})
.catch(e => console.log(e.toString()));

Теперь, если вы хотите получить возврат (он должен быть синхронизирован или вы должны привязать его к другому обещанию), верните что-нибудь из .. / путь / к / контент-script.js'

...