"MV3 에서 toolbar surface 가 통합: icon 하나, badge 하나, popup 하나, API 하나. Lesson 1 이 chrome.action toolbox walk — 작고, 집중되고, 흥미로운 게 바뀔 때마다 tab 별로 repaint 가능."
모두를 다스리는 한 action
MV2 가 두 경쟁 개념 가졌어:
browser_action— 항상-visible toolbar icon. 대부분 extension 의 default UX.page_action— 현재 page 에 relevant 할 때만 나타나는 toolbar icon (bookmark star 떠올려).
MV3 가 둘 다 chrome.action 으로 통합. Toolbar 존재 원하는 모든 extension 이 manifest 에 "action" object 선언, Chrome 이 default 로 모든 tab 에 icon 표시. 옛 page-action behavior (특정 page 에서만 표시) 흉내 내려면 runtime 에 SW 에서 chrome.action.disable(tabId) / enable(tabId) 호출.
Manifest 선언
Minimum:
action.default_icon— toolbar 에 보이는 icon. Single string path 나 size 별 key 가진 object.action.default_title— hover 시 보이는 tooltip.action.default_popup— Chrome 이 click 시 여는 HTML file. SW 가chrome.action.onClicked통해 click 처리하게 하려면 생략.
Icon 은 16 / 32 / 48 / 128 pixel 변형. Chrome 이 display 밀도와 DevTools 설정 기반으로 맞는 거 고름. Chrome 이 single 이미지 scale 안 하고 올바르게 선택하도록 multi-key object 로 제공.
Runtime API
chrome.action 이 SW 에서 호출 가능한 작은 mutator 표면 노출:
setIcon({ tabId?, path })— icon 을 global 이나 tab 별로 override.setTitle({ tabId?, title })— tooltip 변경.setBadgeText({ tabId?, text })— 작은 색깔 badge text overlay 설정. ~4 자 max 권장.setBadgeBackgroundColor({ tabId?, color })— RGB 배열이나 hex string.setBadgeTextColor({ tabId?, color })— Chrome 115+.setPopup({ tabId?, popup })— click 시 여는 HTML 변경.disable(tabId?)/enable(tabId?)— icon 회색 처리 "이 page 에선 actionable 안 함" 시사.getUserSettings()— user 가 icon 을 toolbar 에 pin 했는지 (vs puzzle-piece menu 에 숨김) read.
주목: 모든 mutator 가 optional tabId 받음. tabId 있으면 → 그 tab 만. tabId 없으면 → override 안 받은 모든 tab 에 global default 적용.
Click behavior
User 가 icon 클릭 시 일어나는 두 mutually-exclusive 경로:
- Popup mode (
action.default_popup설정 시 default). Click 이 popup 열고;chrome.action.onClickedfire 안 함. - SW-handled mode (
default_popup없음). Click 이 SW 의chrome.action.onClickedfire; 뭘 할지 결정 — side panel 열기, script 실행, message 보내기.
Runtime 에 chrome.action.setPopup({ tabId, popup: '' }) (빈 popup string 이 그 tab 의 popup disable 하고 onClicked 재활성화) 통해 둘 사이 전환 가능.
Signal 로서의 badge
Badge 가 작아 — 대부분 browser scale 에서 ~4 자 max — 한 정보 명확하게 communicate:
- Count. 안 읽은 메시지, 오늘 저장한 clip, pending task.
- Status. Mode 나타내는 두 글자 ("ON" / "OFF", "REC" / "").
- Alert. 주목 필요할 때 빨간 느낌표.
빈 text (setBadgeText({ text: '' })) 가 badge clear. ClipDeck 이 오늘 clip count (Track 5 Lesson 5) 와 per-tab paused state 에 badge 사용 예정.
chrome.action.getUserSettings() 가 { isOnToolbar: boolean } 반환. False 면 icon 이 puzzle-piece menu 뒤 숨겨짐 — 첫 install 시 감지해 user 한테 pin 권유 유용. Pin 없이는 user 가 존재 잊음.