2

機能の 1 つを提供するために履歴へのアクセスを必要とする拡張機能を構築しています。

許可を必須として含むバージョンを公開した後、拡張機能がユーザーの履歴を詮索できる可能性があるという大きな警告に怖がってユーザーの一部を失いました (私は本当にそうするつもりはありませんでした)。 、問題のある部分を削除し、一時的な修正として許可を無効にしたバージョンを公開することにしました。

オプションの権限を使用して、この機能を実装したいと思います。
まず、新しいオプションのアクセス許可をマニフェスト ファイルに追加しました。

...

"permissions": [
  "https://news.ycombinator.com/",
  "http://news.ycombinator.com/"
],

"optional_permissions": [ "history" ],

...

次に、拡張機能の設定を処理するスクリプトにアクセス許可を要求する関数を作成しました。

Settings.prototype.applyPermissions = function (permissions, map) {
  Object.keys(permissions).forEach(function (key) {
    if (map[key]) {
      var checkbox = map[key].getElementsByTagName("input")[0];
      checkbox.addEventListener("change", function (e) {
        if (this.checked) {
          chrome.permissions.request(permissions[key], function(granted) {
            if (granted) {
              // Permission has been granted
            } else {
              // Not granted
            }
          });
        }
      });
    }
  });
};

ここでの重要な部分は次のとおりです。

checkbox.addEventListener("change", function (e) {
  if (this.checked) {
    chrome.permissions.request(permissions[key], function(granted) {
      if (granted) {
        // Permission has been granted
      } else {
        // Not granted
      }
    });
  }
});

ユーザーの操作によって発生したイベントでリクエストを実行し (ガイドでは、それ以外の場合は機能しないと述べています)、permissions[key]拡張機能の設定で指定された次のようなオブジェクトを渡します。

"permissions": {
    "mark_as_read": {
        "permissions": ["history"]
    }
}

としてアクセスするとpermissions[key]、次の部分が得られます。

{
    "permissions": ["history"]
}

これは基本的に、この種のリクエストに対してドキュメントが示す形式です。


このコードを実行し、機能を有効にするチェックボックスを切り替えて、エラー ログを確認すると、次のエラーが表示されます。

chrome.permissions は利用できません: この API にアクセスする権限がありません。必要な権限またはマニフェスト プロパティが manifest.json に含まれていることを確認します。

また、実際に利用できるバックグラウンド ページからこの API にアクセスしようとしましたが、Chrome ではユーザー インタラクションからアクセスする必要があり、バックグラウンド ページにメッセージを送信するとそのようなインタラクションが失われるため、使用は許可されませんでした。アクティベーションをリクエストするコンテンツ スクリプト。

ここで明らかな何かが欠けていますか?マニフェストに何かを追加する必要があるかもしれませんが、それに関する明示的なドキュメントが見つかりません。

4

1 に答える 1