2016-05-17 8 views
0

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

manifest.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" 
    ] 
} 

background.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> не означает все URLs?

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

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

Любые мысли?

+0

'' не означает _all_ URL, но все _supported_ URL. Можете ли вы привести пример URL-адреса, который терпит неудачу? – Xan

ответ

0

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

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

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

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

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

Это не означает, однако, позвольте мне выбрать для запуска другого контента сценария для корня и подрамников.

Это не так.Вы можете расшириться логикой depending on your position in the iframe hierarchy:

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

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