Можно ли разрешить настройку домена для моего расширения? Я хочу, чтобы мои пользователи выбирали, когда выполняется расширение.
Могу ли я позволить внутреннему пользователю выбирать подходящие домены?
Ответ 1
Чтобы реализовать настраиваемые шаблоны соответствия для сценариев контента, Content script необходимо выполнить на фоновом изображении с помощью метода chrome.tabs.executeScript
(после обнаружение загрузки страницы с помощью chrome.tabs.onUpdated
прослушивателя событий).
Поскольку проверка совпадающего шаблона не отображается в каком-либо API, вам нужно создать метод самостоятельно. Он реализован в url_pattern.cc
, а спецификация доступна в шаблонах соответствия.
Вот пример синтаксического анализатора:
/**
* @param String input A match pattern
* @returns null if input is invalid
* @returns String to be passed to the RegExp constructor */
function parse_match_pattern(input) {
if (typeof input !== 'string') return null;
var match_pattern = '(?:^'
, regEscape = function(s) {return s.replace(/[[^$.|?*+(){}\\]/g, '\\$&');}
, result = /^(\*|https?|file|ftp|chrome-extension):\/\//.exec(input);
// Parse scheme
if (!result) return null;
input = input.substr(result[0].length);
match_pattern += result[1] === '*' ? 'https?://' : result[1] + '://';
// Parse host if scheme is not `file`
if (result[1] !== 'file') {
if (!(result = /^(?:\*|(\*\.)?([^\/*]+))(?=\/)/.exec(input))) return null;
input = input.substr(result[0].length);
if (result[0] === '*') { // host is '*'
match_pattern += '[^/]+';
} else {
if (result[1]) { // Subdomain wildcard exists
match_pattern += '(?:[^/]+\\.)?';
}
// Append host (escape special regex characters)
match_pattern += regEscape(result[2]);
}
}
// Add remainder (path)
match_pattern += input.split('*').map(regEscape).join('.*');
match_pattern += '$)';
return match_pattern;
}
Пример: Запустите контент script на страницах, которые соответствуют шаблону
В приведенном ниже примере массив жестко закодирован. На практике вы сохраните шаблоны соответствия в массиве, используя localStorage
или chrome.storage
.
// Example: Parse a list of match patterns:
var patterns = ['*://*/*', '*exampleofinvalid*', 'file://*'];
// Parse list and filter(exclude) invalid match patterns
var parsed = patterns.map(parse_match_pattern)
.filter(function(pattern){return pattern !== null});
// Create pattern for validation:
var pattern = new RegExp(parsed.join('|'));
// Example of filtering:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status === 'complete') {
var url = tab.url.split('#')[0]; // Exclude URL fragments
if (pattern.test(url)) {
chrome.tabs.executeScript(tabId, {
file: 'contentscript.js'
// or: code: '<JavaScript code here>'
// Other valid options: allFrames, runAt
});
}
}
});
Чтобы это получилось, вам необходимо запросить следующие разрешения в файле манифеста:
-
"tabs"
. Чтобы включить необходимый APItabs
. -
"<all_urls>"
. Чтобы использоватьchrome.tabs.executeScript
для выполнения содержимого script на определенной странице.
Фиксированный список разрешений
Если набор шаблонов совпадений фиксирован (т.е. пользователь не может определить новые, только переключать шаблоны), "<all_urls>"
можно заменить этим набором разрешений. Вы даже можете использовать дополнительные разрешения, чтобы уменьшить начальное количество запрошенных разрешений (ясно объяснено в документации chrome.permissions
).