gpt4 book ai didi

google-chrome-extension - 我可以允许扩展用户选择匹配的域吗?

转载 作者:行者123 更新时间:2023-12-03 23:44:27 30 4
gpt4 key购买 nike

我可以允许用户配置我的扩展的域匹配吗?
我想让我的用户选择扩展程序的运行时间。

最佳答案

要为内容脚本实现可定制的“匹配模式”,需要在后台页面中使用 chrome.tabs.executeScript 执行内容脚本。方法(在使用 chrome.tabs.onUpdated 事件监听器检测到页面加载之后)。

因为匹配模式检查没有在任何 API 中公开,所以您必须自己创建方法。它在 url_pattern.cc 中实现,规范可在 match patterns .

下面是一个解析器的例子:

/**
* @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;
}

示例:在匹配模式的页面上运行内容脚本

在下面的示例中,数组是硬编码的。在实践中,您可以使用 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
});
}
}
});

要使其工作,您需要请求以下 permissions in the manifest file :
  • "tabs" - 启用必要的 tabs API。
  • "<all_urls>" - 能够使用chrome.tabs.executeScript在特定页面中执行内容脚本。

  • 固定的权限列表

    如果匹配模式的集合是固定的(即用户不能定义新的,只能切换模式), "<all_urls>"可以用这组权限替换。您甚至可以使用 optional permissions减少请求权限的初始数量(在 documentation of chrome.permissions 中有明确说明)。

    关于google-chrome-extension - 我可以允许扩展用户选择匹配的域吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12433271/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com