Chrome отказывает в разрешении ‹all_urls› для внедрения скрипта контента

Я не уверен, является ли это ошибкой или неправильной настройкой моего файла манифеста, но разрешение <all_urls> не работает с внедрением контента в скрипт. Вот простой пример, который вызывает ошибку

манифест.json:

{
  "manifest_version": 2,
  "name": "Bug?",
  "version": "1",
  "description": "This seems to be a bug",
  "minimum_chrome_version": "50",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
   "permissions": [
     "<all_urls>",
     "tabs",
     "webNavigation"
   ]
 }

фон.js:

chrome.webNavigation.onBeforeNavigate.addListener(info => {
    chrome.tabs.executeScript(info.tabId, {
        frameId: info.frameId,
        code: 'console.log("works")',
        runAt: 'document_start'
    }, () => {
        if(chrome.runtime.lastError)
            console.error(chrome.runtime.lastError.message)
    })
})

Моя цель

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

Что на самом деле происходит

Скрипты содержимого не выполняются со следующей ошибкой для каждого кадра:

Cannot access contents of url "<some url>". Extension manifest must request permission to access this host.

Что?... <all_urls> не означает все URL?

Что заставляет это работать?

Если я изменю chrome.webNavigation.onBeforeNavigate на chrome.webNavigation.onCommitted, инъекция будет работать как положено (за исключением страниц about:blank, которые можно легко исправить). Однако это не гарантирует, что мой сценарий содержимого будет запущен до обработки любого html.

есть идеи?


person Gabriel Rossmann    schedule 17.05.2016    source источник
comment
<all_urls> означает не все URL-адреса, а все поддерживаемые URL-адреса. Можете ли вы привести пример URL-адреса, который не работает?   -  person Xan    schedule 17.05.2016


Ответы (1)


Вы сталкиваетесь с плохой путаницей проблем со временем.

Если вы попытаетесь внедрить до onCommitted, вы фактически попытаетесь внедрить в старый документ, поскольку он еще не изменился.

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

В отношении webNavigation/tabs событий нет подходящего времени для планирования run_at: "document_start". Он эффективно работает только в том случае, если вы укажете его в манифесте (или все еще экспериментальном действии скрипта содержимого для declarativeContent API).

Теперь, говоря о вашей проблеме:

Однако это не позволяет мне запускать другой сценарий содержимого для корня и подфреймов.

Это совсем не так. Вы можете разветвить свою логику в зависимости от вашего положения в иерархии iframe:

if (window.parent != window) {
  // Subframe
} else {
  // Main frame
}

Таким образом, вы должны полагаться на внедрение манифеста для сценариев "document_start", и вы можете синхронно реализовать другую логику для подкадров.

person Xan    schedule 17.05.2016