1

2番目の拡張機能から拡張機能が存在するかどうかを確認することはできますか?

まず、少し背景があります。ブックマークマネージャーをオーバーライドする拡張機能があります。クライアントは履歴マネージャーも望んでいますが、これは1つの拡張機能では実行できないことがわかっています。

私の提案は、2つの拡張機能を作成することでした。そのうちの1つは「コア」としても機能し、クライアントのAPIで認証を処理します。2つが話し合って、認証は正常に機能していますが、コア拡張機能がインストールされていない場合に対処するのに苦労しています。コアがない場合は、コアをインストールするためのプロンプトを表示したいと思います。

メッセージを送信してキャプチャすることはできますが、chrome.extension.lastErrorこれを行うためのよりエレガントな方法はありますか?

同期メッセージはここでも恩恵になると思います。

4

1 に答える 1

2

クロスエクステンションメッセージングAPIを使用して、エクステンション2からエクステンション1にメッセージを送信します。エクステンション1が応答しない場合は、ユーザーにエクステンション1をインストールするように求めることができます。このアイデアをテストするために2つのChrome拡張機能を構築しましたが、うまく機能しました。

ダウンロードして自分で試してみたい場合は、ここに圧縮されたファイルがあります。これは、YouTubehttp://youtu.be/6u4tIH6Xfcgでの実例を示すスクリーンキャストです

内線2(部下)

マニフェスト.json

{
    "name": "Subordinate Chrome Extension Example",
    "manifest_version": 2,
    "version": "0.1",
    "description": "This is an example extension for StackOverflow that requires a master/companion Google Chrome extension to be installed for it to work",
    "browser_action": {
        "default_popup": "popup.html"
    },
    "background": {
        "scripts": ["background.js"]
    }
}

background.js

chrome.extension.onMessage.addListener(
    function(request, sender, sendResponse) {
        switch (request.directive) {
        case "popup-click":
            // check to see if master extension 1 is installed
            chrome.extension.sendMessage('jfhngkelgcildagdkgenelgaaaphlghb', {directive: "ping"}, function(extensionResponse) {
                if (extensionResponse && extensionResponse.data == 'pong') {
                    console.log("The master extension 1 is installed!");
                } else {
                    console.log("The master extension 1 is not installed");
                }
                sendResponse({});
            });
            return true; // required to return true if we want to sendResponse() later since the cross chrome extension message passing is asynchronus
            break;
        default:
            // helps debug when request directive doesn't match
            alert("Unmatched request of '" + request + "' from script to background.js from " + sender);
        }
    }
);

popup.html

<html>
    <head>
        <script src="popup.js"></script>
        <style type="text/css" media="screen">
            body { min-width:250px; text-align: center; }
            #click-me { font-size: 20px; }
        </style>
    </head>
    <body>
        <button id='click-me'>Click Me!</button>
    </body>
</html>

popup.js

function clickHandler(e) {
    chrome.extension.sendMessage({directive: "popup-click"}, function(response) {
        this.close(); // close the popup when the background finishes processing request
    });
}

document.addEventListener('DOMContentLoaded', function () {
    document.getElementById('click-me').addEventListener('click', clickHandler);
})

エクステンション1(マスター/コンパニオン)

マニフェスト.json

{
    "name": "Master Chrome Extension Example",
    "manifest_version": 2,
    "version": "0.1",
    "description": "This is an example extension for StackOverflow that is required for a subordinate/companion Google Chrome extension to work",
    "background": {
        "scripts": ["background.js"]
    }
}

background.js

chrome.extension.onMessageExternal.addListener(function(request, sender, sendResponse) {
    if (sender.id == 'ikofjngppooeeendkfenaiedmlmfjmkb') { // restricting cross extension api to known extension
        if (request.directive == 'ping') {
            sendResponse({
                data: 'pong'
            });
        }
    }
});
于 2012-08-17T02:18:13.193 に答える