← ドキュメント一覧に戻る
シーケンス図
1. ミュートリスト同期フロー
sequenceDiagram
actor User as ユーザー
participant Popup as popup.js
participant Tab as 新しいタブ
participant CS as content.js
participant DOM as Zenn DOM
participant Storage as chrome.storage.local
User->>Popup: 「同期」ボタンをクリック
Popup->>Tab: chrome.tabs.create(/settings/mutes)
Tab->>CS: content script注入(document_idle)
CS->>CS: パス判定(/settings/mutes)
CS->>CS: 1秒待機
loop 最大20回リトライ(500ms間隔)
CS->>DOM: querySelectorAll('a[href^="/"]')
DOM-->>CS: リンク要素一覧
CS->>CS: /username 形式をフィルタ
CS->>CS: systemPathsを除外
end
CS->>Storage: set({ mutedUsers: [...] })
Storage-->>CS: 保存完了
CS->>DOM: 同期完了通知を表示
Note over DOM: 「✓ ミュートユーザー N人 を同期しました」
2. ミュートユーザー検出・警告フロー
sequenceDiagram
actor User as ユーザー
participant Browser as ブラウザ
participant CS as content.js
participant Storage as chrome.storage.local
participant Modal as 警告モーダル
User->>Browser: Zennの記事ページを開く
Browser->>CS: content script注入
CS->>CS: URLからユーザー名抽出
CS->>Storage: get(['mutedUsers'])
Storage-->>CS: ミュートリスト
CS->>CS: ユーザー名がリストに含まれるか判定
alt ミュート済み
CS->>Modal: モーダル生成・表示
Modal->>User: 「ミュート中のユーザーです」
alt 「戻る」クリック
User->>Modal: 戻るボタン
Modal->>Browser: history.back()
else 「トップページへ」クリック
User->>Modal: トップページへボタン
Modal->>Browser: location = zenn.dev
else 「このまま閲覧する」クリック
User->>Modal: 閲覧ボタン
Modal->>Modal: モーダル削除
else Escキー
User->>Modal: Escape
Modal->>Modal: モーダル削除
end
else ミュートしていない
CS->>CS: 何もしない
end
3. SPAページ遷移検知フロー
sequenceDiagram
participant DOM as Zenn DOM
participant Observer as MutationObserver
participant CS as content.js
CS->>Observer: observe(body, {childList, subtree})
Note over Observer: URL監視開始
loop DOM変更のたびに
DOM->>Observer: mutation callback
Observer->>Observer: location.href !== lastUrl ?
alt URLが変わった
Observer->>CS: 既存モーダル削除
Observer->>CS: 500ms後にmain()実行
CS->>CS: 新URLでミュートチェック
else URLが同じ
Observer->>Observer: スキップ
end
end