Skip to content

Feat/update selector#359

Merged
ujiro99 merged 5 commits intomainfrom
feat/update-selector
Apr 7, 2026
Merged

Feat/update selector#359
ujiro99 merged 5 commits intomainfrom
feat/update-selector

Conversation

@ujiro99
Copy link
Copy Markdown
Owner

@ujiro99 ujiro99 commented Apr 6, 2026

No description provided.

# Conflicts:
#	packages/hub/src/data/analytics.json
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Hub 側の AI サービス向けセレクタ更新と、Extension 側の contenteditable 入力処理(legacyMode / Perplexity 特例)の整理を行うPRです。

Changes:

  • Claude の送信ボタン submitSelectors を更新
  • contenteditable への入力処理から Perplexity 向け legacyMode 分岐を削除し、inputContentEditable の legacyMode 実装を変更
  • analytics.json のイベントカウント更新

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
packages/hub/src/data/analytics.json ダウンロードイベントの集計値を更新
packages/hub/public/data/ai-services.json Claude の submitSelectors を更新
packages/extension/src/services/pageAction/dispatcher.ts contenteditable 入力で legacyMode を使わない呼び出しに変更
packages/extension/src/services/pageAction/backgroundDispatcher.ts contenteditable 入力で legacyMode を使わない呼び出しに変更
packages/extension/src/services/dom/inputUtils.ts inputContentEditable の legacyMode 分岐を簡略化し、InputEvent dispatch の位置を変更

Comment on lines +79 to +87
// Dispatch InputEvent to notify frameworks of the text change
const inputEvent = new InputEvent("input", {
inputType: "insertText",
data: value,
bubbles: true,
cancelable: false,
})
el.dispatchEvent(inputEvent)
}
Copy link

Copilot AI Apr 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • InputEvent(insertText) のdispatchが else ブランチ内に移動しており、legacyMode=true の場合は insertText の InputEvent を送らなくなっています(以前は常にdispatchされていました)。
  • execCommand が常に期待通り input イベントを発火するとは限らないため、React/Lexical等のフレームワークが変更を検知できない可能性があります。
  • legacyModeでも従来通り insertText の InputEvent をdispatchする(条件分岐の外に戻す、または legacyMode 側でも明示的にdispatchする)形にしてください。

Copilot uses AI. Check for mistakes.
@claude
Copy link
Copy Markdown

claude bot commented Apr 6, 2026

test comment

@claude
Copy link
Copy Markdown

claude bot commented Apr 6, 2026

コードレビュー PR#359 - 詳細は別途送付します

@claude
Copy link
Copy Markdown

claude bot commented Apr 6, 2026

コードレビュー

このPRは主に2つの変更を行っています:

  1. Perplexity.ai向けのレガシーモード(workaround)を削除し、inputContentEditable を整理
  2. Claude.aiの送信ボタンのCSSセレクターを更新

重要な指摘

1. legacyMode パラメータが事実上デッドコードになっている

  • packages/extension/src/services/dom/inputUtils.ts L23
  • packages/extension/src/services/pageAction/backgroundDispatcher.ts L229
  • packages/extension/src/services/pageAction/dispatcher.ts L283

Perplexity.aiの呼び出し元が削除されたことで、legacyMode = true を渡すコードが存在しなくなりました。パラメータ自体を削除すべきか、将来のために残すなら意図をJSDocに明記することを推奨します。

2. Claude.aiの送信ボタンセレクターが脆弱

  • packages/hub/public/data/ai-services.json L34

新しいセレクター _claude_1abo4_159 は CSS Modules が自動生成したハッシュ付きクラス名です。Claude.aiのフロントエンドがビルドされるたびに変わる可能性があります。旧セレクターにあった button[data-state='closed'] のような属性ベースのセレクターの方が安定しています。data-*aria-* 属性でボタンを特定できるなら、そちらを優先し、フォールバックとして複数のセレクターを持つ構成を推奨します。


注意事項

3. レガシーモードで InputEvent が発火されなくなった

  • packages/extension/src/services/dom/inputUtils.ts L79-86

変更後は InputEvent の発火が else(非レガシー)ブランチの中に移動したため、将来 legacyMode = true で呼び出した場合に InputEvent が発火されません。現在呼び出し箇所がないため実害はありませんが、再利用時にバグになり得ます。

4. レガシーモードでの複数行テキスト処理の動作変更

  • packages/extension/src/services/dom/inputUtils.ts L28-30

変更前はレガシーモードでも行分割と typeShiftEnter を挿入していましたが、変更後は execCommand に改行を含む文字列をそのまま渡しています。ブラウザによっては execCommand が改行を正しく処理しないことがあります。


良い点

  • legacyMode チェックをループの外に移動した点は可読性の向上として適切です
  • Perplexity.ai向けの特殊処理を削除したことでコードが整理されました
  • dispatcher.tstype union のインデント修正は一貫性があります
  • analytics.json の末尾改行追加は適切です

提案

  1. legacyMode パラメータの扱いを明確にする(不要なら削除、残すならJSDocに記載)
  2. Claude.aiセレクターを aria-*data-* 属性ベースに変更し、複数フォールバックを検討
  3. Perplexity.aiのレガシーモード削除後の動作確認結果をPR説明に記載してください

@codecov
Copy link
Copy Markdown

codecov bot commented Apr 7, 2026

Codecov Report

❌ Patch coverage is 80.76923% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 25.67%. Comparing base (7002c79) to head (f8ce23b).
⚠️ Report is 10 commits behind head on main.

Files with missing lines Patch % Lines
packages/extension/src/services/dom/inputUtils.ts 83.33% 4 Missing ⚠️
...es/extension/src/services/pageAction/dispatcher.ts 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #359      +/-   ##
==========================================
+ Coverage   25.66%   25.67%   +0.01%     
==========================================
  Files         309      309              
  Lines       31240    31237       -3     
  Branches     1547     1550       +3     
==========================================
+ Hits         8017     8020       +3     
+ Misses      23223    23217       -6     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@claude
Copy link
Copy Markdown

claude bot commented Apr 7, 2026

コードレビュー

PR全体を確認しました。主な変更点は以下の通りです:

  1. inputContentEditable のリファクタリング(legacyMode と通常モードの分離)
  2. perplexity.ai 固有の処理の削除
  3. Claude.ai のセレクター更新
  4. analytics データの更新

重要な指摘事項

1. legacyMode 時の InputEvent ディスパッチが削除された(潜在的バグ)

ファイル: packages/extension/src/services/dom/inputUtils.ts

変更前(元のコード)では、InputEvent は legacyMode / 通常モードに関わらず 常に ディスパッチされていました。

変更後では、InputEvent のディスパッチが else ブロック(通常モード)の中にのみ移動しており、legacyMode 時は InputEvent が発火されません

// 変更後(新コード)
} else {
  for (const [idx, val] of values.entries()) {
    // ... 通常モード処理 ...
  }

  // legacyMode 時にはここに到達しない
  const inputEvent = new InputEvent("input", { ... })
  el.dispatchEvent(inputEvent)
}

document.execCommand("insertText") は一部ブラウザ・フレームワークでネイティブの input イベントを自動発火しますが、すべての環境で保証されるわけではありません。legacyMode を使用するサイト(今後追加される可能性もある)で React 等のフレームワークが状態更新できなくなるリスクがあります。

提案: legacyMode のループ終了後にも InputEvent をディスパッチするか、両方のブランチ共通のコードとして関数末尾に残すことを検討してください。


2. legacyMode パラメーターが事実上デッドコードになっている

ファイル:

  • packages/extension/src/services/pageAction/backgroundDispatcher.ts(旧: 221–229行付近)
  • packages/extension/src/services/pageAction/dispatcher.ts(旧: 277–285行付近)

perplexity.ai 固有の処理が削除されたことで、inputContentEditablelegacyMode=true で呼び出す箇所がコードベース内に存在しなくなりました。legacyMode パラメーターはデフォルト値 false のまま残っており、テストでも false を渡していた記述が削除されています(backgroundDispatcher.test.ts の 922/966 行)。

提案: 今後 legacyMode を使う予定がないなら、パラメーターとその分岐ロジックをまるごと削除してコードをシンプルにしてください。将来的な拡張として残すなら、その旨をコメントで明示してください。


3. perplexity.ai の互換性対応が削除された理由が不明

ファイル:

  • packages/extension/src/services/pageAction/backgroundDispatcher.ts
  • packages/extension/src/services/pageAction/dispatcher.ts

以下のコメントとともに実装されていた perplexity.ai 固有の処理が削除されました:

// Legacy mode specifically for Perplexity.ai's contenteditable field.
// This is because it has some special handling that breaks the usual input simulation.

この処理は意図的なワークアラウンドだったはずです。削除の理由として考えられるのは:

  • perplexity.ai 側の実装が変更された
  • 通常モードで問題なく動作するようになった

提案: PR の説明にこの変更理由を記載することを推奨します(perplexity.ai での動作確認が取れているかどうかも含めて)。


4. ai-services.json のセレクターの安定性

ファイル: packages/hub/public/data/ai-services.json(32–35行付近)

変更後のセレクター:

"#main-content button._claude_1abo4_159",
"#main-content button.can-focus:has(svg[viewBox='0 0 256 256'])"
  • _claude_1abo4_159 は CSS Modules のハッシュ値であり、Claude.ai のビルド毎に変わる可能性があります。以前の Button_claude__c_hZy も同様でしたが、継続的なメンテナンスが必要です。
  • フォールバックの :has(svg[viewBox='0 0 256 256']) は viewBox の文字列が変わった際に壊れますが、セマンティックには改善されています。

提案: data-* 属性や aria-label など、ビルドに依存しないセレクターが利用可能であれば、そちらを優先することを検討してください(外部サービスのため難しい場合もあることは理解しています)。


5. analytics.json の eventCount 変更

ファイル: packages/hub/src/data/analytics.json(5行)

- "eventCount": 83
+ "eventCount": 29

イベント数が大幅に減少しています(83 → 29)。これがデータの修正なのか、リセットなのか、意図的な変更なのかが不明です。このファイルの変更は他のコード変更とは関連性が低いため、別の PR もしくはコメントで変更理由を説明することを推奨します。


軽微な指摘

ファイル: packages/extension/src/services/pageAction/dispatcher.ts(44–47行)

Click 型定義のインデントが変更されていますが、これは機能的な変更ではなくフォーマット変更です。意図的なものであれば問題ありませんが、コードレビューのノイズになるため、フォーマット変更は別の PR/コミットにまとめることを推奨します。


まとめ

項目 評価
コードの構造改善 legacyMode と通常モードの分離は読みやすさが向上している
潜在的バグ legacyMode 時の InputEvent 未発火(要確認)
デッドコード legacyMode パラメーターが未使用になっている
セレクターの脆弱性 CSS Modules ハッシュ依存は継続的メンテナンスが必要
ドキュメント perplexity.ai 削除の理由、analytics 変更の説明が欲しい

全体として変更量は少なく、方向性は理解できます。上記の点を確認・対応いただければ、よりロバストな実装になると思います。

@ujiro99 ujiro99 merged commit d7fa8de into main Apr 7, 2026
6 checks passed
@ujiro99 ujiro99 deleted the feat/update-selector branch April 7, 2026 00:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants