13

拡張機能のドメイン マッチングをユーザーが構成できるようにすることはできますか? 拡張機能を実行するタイミングをユーザーが選択できるようにしたいと考えています。

4

1 に答える 1

13

コンテンツ スクリプトのカスタマイズ可能な「一致パターン」を実装するには、メソッドを使用してバックグラウンド ページでコンテンツ スクリプトを実行する必要があります(イベント リスナー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実際には、 orを使用して一致パターンを配列に格納し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"- 必要なtabsAPI を有効にします。
  • "<all_urls>"chrome.tabs.executeScript-特定のページでコンテンツ スクリプトを実行するために使用できるようにするため。

アクセス許可の固定リスト

一致パターンのセットが固定されている場合 (つまり、ユーザーは新しいパターンを定義できず、トグル パターンのみを定義できます)、"<all_urls>"このパーミッション セットに置き換えることができます。オプションのパーミッションを使用して、要求されるパーミッションの初期数を減らすこともできます (のドキュメントでchrome.permissions明確に説明されています)。

于 2012-09-15T11:07:57.507 に答える