Feat/download button#395
Conversation
コードレビュー概要このPRは、Selection Command Hubとの通信方式を刷新するものです。従来の 問題点・改善提案🔴 セキュリティ上の懸念
window.postMessage(
{ action: "SyncInstalledCommand", installedIds: commands.map((c) => c.id) },
"*",
)
window.postMessage(
{ action: "SyncInstalledCommand", installedIds: ids },
"*",
)
} else if (action === "RequestInstalledCommand") {
const ids = commandsRef.current?.map((c) => c.id) ?? []
;(event.source as WindowProxy)?.postMessage(
{ action: "SyncInstalledCommand", installedIds: ids },
{ targetOrigin: event.origin }, // hubOrigin を指定
)
}proactive push(L731)については Hub ウィンドウの参照がないため 🟡
|
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #395 +/- ##
==========================================
+ Coverage 26.61% 26.77% +0.15%
==========================================
Files 314 312 -2
Lines 31929 31742 -187
Branches 1684 1682 -2
==========================================
Hits 8498 8498
+ Misses 23431 23244 -187 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
新しい(Hub 側UI/ボタン挙動に合わせた)Command Hub 連携として、従来の DOM 直付けクリック監視・URL変更監視を廃止し、Hub からの postMessage を受けてコマンド追加/削除を行うブリッジに置き換えるPRです。
Changes:
- Hub との連携を
useCommandHubBridge(postMessage ベース)に集約し、CommandHubはブリッジ起動のみ行う構成へ変更 - 旧実装(DownloadButton/StarButton、URL変更監視 hook)を削除
install_id返却のためgetOrCreateClientIdを export 化、不要になった i18n キーを削除
概要
- Hub ↔ 拡張間の通信を
postMessageに寄せたことで、Hub 側の新しいダウンロードボタン挙動に追従しやすい構成になっています。
懸念点
SyncInstalledCommandをpostMessage(..., "*")で送っており、インストール済みID一覧の露出が大きい点(セキュリティ)- 追加失敗時でも
COMMAND_HUB_ADDが計測されうる点(計測の正確性) - PR説明(新Hub)に対して origin 判定が
HUB_URL前提になっている点(意図どおり新Hubで動くか)
改善提案
postMessageの送信先 origin をhubOriginに限定(必要なら要求元event.sourceへ返信)- analytics は成功時のみ送信
- Hub 側が送る payload 仕様(
idの有無など)と実装/コメントを一致させる
Reviewed changes
Copilot reviewed 20 out of 20 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/extension/src/services/analytics.ts | getOrCreateClientId を外部利用可能に変更 |
| packages/extension/src/hooks/useDetectUrlChanged.ts | URL変更監視 hook を削除(旧Hub DOM監視ベース) |
| packages/extension/src/hooks/useCommandHubBridge.ts | Hub からの postMessage を受けて add/remove/sync を行う新ブリッジを追加 |
| packages/extension/src/components/commandHub/StarButton.tsx | 旧スター連携(DOM直付け)を削除 |
| packages/extension/src/components/commandHub/DownloadButton.tsx | 旧ダウンロード連携(DOM直付け + toast)を削除 |
| packages/extension/src/components/commandHub/CommandHub.tsx | Button コンポーネントを廃止し、ブリッジ hook 呼び出しへ変更 |
| packages/extension/public/_locales/zh_CN/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/ru/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/pt_PT/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/pt_BR/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/ms/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/ko/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/ja/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/it/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/id/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/hi/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/fr/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/es/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/en/messages.json | 追加成功/失敗の文言キーを削除 |
| packages/extension/public/_locales/de/messages.json | 追加成功/失敗の文言キーを削除 |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
コードレビュー概要
🔴 重大な問題1. オリジン検証が旧 Hub URL を参照している可能性
const hubOrigin = new URL(HUB_URL).origin
もし新ハブからの postMessage を受け取る想定であれば、オリジン検証が常に失敗し、AddCommand / DeleteCommand が一切機能しない可能性があります。 🟠 バグ2. AddCommand 失敗時にもアナリティクスが送信される
Ipc.send(BgCommand.addCommand, { command })
.then(async (res) => {
const install_id = await getOrCreateClientId()
;(event.source as WindowProxy)?.postMessage(
{ action: "AddCommandAck", result: !!res, install_id },
...
)
await sendEvent( // ← res が false でも呼ばれる
ANALYTICS_EVENTS.COMMAND_HUB_ADD,
{ id },
SCREEN.COMMAND_HUB,
)
})
3.
|
Agent-Logs-Url: https://github.com/ujiro99/selection-command/sessions/18e06b32-4e15-4ae5-b730-1c9caebcb9d2 Co-authored-by: ujiro99 <677231+ujiro99@users.noreply.github.com>
# Conflicts: # packages/extension/src/hooks/useCommandHubBridge.ts
新しいSelection Commnad Hubのダウンロードボタンに合わせたダウンロードボタン押下時の処理を実装する