2

公開データベースを作成して、他の拡張機能がそれにアクセスし、テーブルを作成し、エンティティを追加し、必要に応じてエンティティを削除できるようにしたいと考えています。

これを行う唯一の方法は、複数の拡張機能間でメッセージの受け渡しを使用することであることがわかりましたが、他の拡張機能 ID を知るために「管理」へのアクセス許可が必要なため、この解決策には問題があります。

ID を知らなくてもすべての拡張機能にメッセージを送信するオプションはありますか? または、pub-sub 同期なしで public db を実装する別の方法がありますか?

ところで - localStorage または WebSQL を使用できます。

4

1 に答える 1

1

他の拡張機能を登録するために使用され、メッセージング ハブを持つ拡張機能ハブを作成できますか。

パブリック DB との通信を必要とするすべての拡張機能は、ハブを介してそれを行うことができました。バックグラウンド ページからの初期化時に、各拡張機能はハブに ID とサブスクライブするイベントを登録できます。

各拡張機能からアクションを登録する

chrome.tabs.sendRequest("hub", {
    action: "register",
    key: "somePrivKey",
    id: "extId", 
    subscribeTo: ["createFoo", "deleteFoo"]
});

次に、実行された各アクションがハブに伝達されます。

chrome.tabs.sendRequest("hub", {
    action: "createFoo",
    key: "somePrivKey",
    context: 1
});

次に、ハブ拡張機能がイベントをリッスンします。「登録」アクションの場合、ハブは拡張機能を「subscribeTo」アクションのエンドポイントとして登録します。他のアクション (「createFoo」または「deleteFoo」) の場合、ハブはイベントの登録済み拡張機能のリストを反復処理し、「アクション」名とオプションの「コンテキスト」を送信する sendRequest を実行します。

ハブと、ハブが既知のソース以外からのイベントをリッスンするのを防ぐために、通信するすべての拡張機能との間で共有 "キー" を知ることができます。

ハブ拡張 background.js:

var actionToExtMap = {};

chrome.extension.onRequestExternal.addListener(function(request, sender, sendResponse) {
    if (request.key === "somePrivKey") {
        if (request.action === "register") {
            for (i = 0; i < request.subscribeTo.length; i++) {
                var action = request.subscribeTo[i];

                var extsionsForAction = actionToExtMap[action] || [];
                extsionsForAction.push(request.id)
            }

        } else if (request.action) {
            var extensionsToSendAction = actionToExtMap[request.action];
            for (i = 0; i < extensionsToSendAction.length; i++) {
                chrome.extension.sendRequest(extensionsToSendAction[i], {
                    action: request.action,
                    context: request.context //pass an option context object
                }
            }
        }
    }
});
于 2012-01-19T05:59:55.010 に答える