Skip to content

コンテキストメニューから起動したとき、サイドパネルを表示できない #363

@ujiro99

Description

@ujiro99

以下を参考に対応する

chrime拡張機能開発で、ブラウザネイティブのコンテキストメニューから拡張機能のサイドパネルを表示できますか?

はい、できます。Chrome 拡張では、ブラウザ標準のコンテキストメニューに拡張機能の項目を追加し、そのクリックを契機に `chrome.sidePanel.open()` でサイドパネルを表示できます。[1][1]

## 結論

Chrome の公式ドキュメントには、`chrome.contextMenus.create()` でメニュー項目を作成し、`chrome.contextMenus.onClicked` 内で `chrome.sidePanel.open({ windowId: tab.windowId })` を呼ぶサンプルが掲載されています。[1][1]

つまり「ブラウザネイティブのコンテキストメニュー → 拡張機能のサイドパネルを開く」は、正式にサポートされている実装パターンです。[1]

## 必要な権限

少なくとも `manifest.json` には `sidePanel` 権限と `contextMenus` 権限が必要です。[1][2]

また、サイドパネル自体を使うには `side_panel.default_path` などで表示する HTML を用意する構成が一般的です。[1]

## 実装イメージ

最小構成の考え方は次のとおりです。[1]

- `manifest.json` に `permissions: ["sidePanel", "contextMenus"]` を入れる。[1][2]
- `runtime.onInstalled` でコンテキストメニュー項目を作る。[1]
- `contextMenus.onClicked` で対象メニューか判定し、`chrome.sidePanel.open()` を呼ぶ。[1]

/`/`/`js
chrome.runtime.onInstalled.addListener(() => {
  chrome.contextMenus.create({
    id: "openSidePanel",
    title: "Open side panel",
    contexts: ["all"],
  });
});

chrome.contextMenus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "openSidePanel") {
    chrome.sidePanel.open({ windowId: tab.windowId });
  }
});
/`/`/`

この形は公式サンプルとほぼ同じです。[1][1]

## 注意点

`sidePanel.open()` はユーザー操作に応じて呼ぶ必要があり、公式にはアクションクリック、キーボードショートカット、コンテキストメニュー、拡張機能ページやコンテンツスクリプト上のユーザージェスチャーが対象として説明されています。[1]

実運用では、`contextMenus.onClicked` の中で余計な非同期処理を挟むと「ユーザー操作扱い」が外れて失敗する報告もあるため、まずはクリックハンドラ内で直接 `chrome.sidePanel.open()` を呼ぶ形にしておくのが安全です。[3][4]

## 補足

タブ単位で開きたい場合は `tabId`、ウィンドウ全体のグローバルパネルとして開きたい場合は `windowId` を使います。[1]

質問文の「chrime」はおそらく「Chrome」だと思いますが、もし Firefox や Edge も含めた拡張互換性が気になっているなら、その観点で整理して答えます。[1]


Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions