262 lines
24 KiB
Markdown
262 lines
24 KiB
Markdown
# Video Downloader — 브라우저 기능 강화 계획서 (v2)
|
|
|
|
> **목표**: 이 앱에 내장된 WebView2 브라우저에 일반적인 데스크톱 브라우저의 **핵심 사용자 기능**을 심어, 단순 "영상 재생 → 감지" 용도를 넘어 **일상적으로 쓸 수 있는 브라우저**로 만든다.
|
|
>
|
|
> **작성일**: 2026-08-15 (v2 — 2차 심층 조사 반영) · **대상**: `Paca.App` (WPF + WebView2 1.0.4078.44)
|
|
>
|
|
> **조사 방법론**:
|
|
> - 1차(2026-08-13): Chrome/Firefox/Zen 3개 브라우저 단일 조사 → v1 초안
|
|
> - **2차(2026-08-15): 5개 전문 조사팀 병렬 심층 조사** — ① Chrome+Edge ② Firefox+Vivaldi ③ Zen+Arc ④ Brave+Opera+Safari+기타(Floorp/Orion/Sidekick/Comet) ⑤ **WebView2 API 검증팀(Microsoft Learn 팩트체크)**. 총 80여 회 웹 검색 + 공식 문서 직접 열람.
|
|
>
|
|
> **확장 계획**: 모바일 앱 + PC↔모바일 연동은 **`MOBILE_PLAN.md`** 로 분리 (2026-08-15, 4개 조사팀 심층 조사 기반 — MAUI 10 컴패니언 앱, LAN QR 페어링, Core 엔진 재사용 검증 포함). 멀티플랫폼 배포(Win/macOS/Linux/모바일)는 **`DEPLOYMENT_PLAN.md`** 로 분리.
|
|
|
|
---
|
|
|
|
## ⚠️ v1 → v2 주요 수정 사항 (2차 조사로 판명)
|
|
|
|
1. **페이지 내 검색은 네이티브 API로 가능** — v1은 "JS 주입으로 직접 구현"이라 판단했으나 **WebView2 1.0.3405.78부터 `CoreWebView2.Find`가 네이티브 제공**된다 (우리 버전 1.0.4078.44에 포함). `StartAsync(options)` + `FindNext()/FindPrevious()` + `MatchCount`/`ActiveMatchIndex` 이벤트. `SuppressDefaultFindDialog=true`로 자체 UI 구축. → **공수 대폭 감소, 탭 이전에도 독립 구현 가능**
|
|
2. **백그라운드 탭 절전도 네이티브** — `CoreWebView2.TrySuspendAsync()`/`Resume()` (WebView가 숨겨진 상태여야 함). Edge Sleeping Tabs와 1:1 대응.
|
|
3. **탭 오디오 표시/음소거 네이티브** — `IsDocumentPlayingAudio`/`IsMuted` + 변경 이벤트.
|
|
4. **다중 프로필이 하나의 환경에서 가능** — `CreateCoreWebView2ControllerOptions(ProfileName)` → 브라우저 프로세스 추가 없이 Firefox 컨테이너 탭 유사 격리. `CustomDataPartitionId`로 탭 단위 쿠키 격리도 가능.
|
|
5. **Arc 브라우저는 2025-05 개발 중단** (유지보수 모드) — 디자인 참고용으로만 차용.
|
|
6. **Edge Collections/Drop/사이드바는 2026년 폐지 예정** — 클론하지 않음. 살아남는 Edge 자산은 세로 탭·절전 탭·분할 화면·웹 캡처·몰입형 리더.
|
|
7. **WPF airspace 주의** — 표준 `WebView2`(HwndHost) 위에는 WPF 요소를 올릴 수 없음. `WebView2CompositionControl`은 DRM 영상 재생 불가(영상 앱엔 치명적) → **표준 컨트롤 유지, 크롬 UI는 WebView2 주변에 배치**하는 설계 원칙 확정.
|
|
|
|
---
|
|
|
|
## 0. 현재 상태 (AS-IS)
|
|
|
|
`MainWindow.xaml(.cs)` 단일 `WebView2` 인스턴스 기반:
|
|
|
|
| 영역 | 구현 여부 | 비고 |
|
|
|---|---|---|
|
|
| 주소창 + 이동 + 자동완성/제안 | ✅ | 히스토리 기반, 인라인 자동완성(Tab/→) |
|
|
| 뒤로/앞으로/새로고침/홈 | ✅ | 상태 동기화 |
|
|
| 북마크 / 히스토리 | ✅ | 플라이아웃, JSON 영속(500 캡) |
|
|
| InPrivate 모드 | ✅ | 재시작 적용 |
|
|
| 단축키 | ✅(일부) | Ctrl+L, F5/Ctrl+R, Esc, Alt+←/→, Ctrl+±/0 |
|
|
| 줌 | ✅ | 세션 한시적(사이트별 영속 아님) |
|
|
| 팝업 → 현재 WebView 라우팅 | ✅ | `NewWindowRequested` |
|
|
| 페이지 다운로드 → 저장 폴더 | ✅ | `DownloadStarting` |
|
|
| 영구 프로필 / 데이터 삭제 | ✅ | `%AppData%/Paca/webview` |
|
|
| 다크/라이트 테마, 보더리스 | ✅ | DWM 연동 |
|
|
| 우측 다운로드 패널(접기/폭) | ✅ | |
|
|
| DevTools, 미디어 자동 감지 | ✅ | HLS/DASH/직링크/소셜(yt-dlp) |
|
|
|
|
**결여**: 탭 · 페이지 내 검색 · 다운로드 매니저 UI · 검색엔진 · 북마크바 · 명령 팔레트 · 리더 모드 · 스크린샷 · 전체화면 · 사이트별 설정
|
|
|
|
---
|
|
|
|
## 1. WebView2 API 역량 매트릭스 (2차 조사 검증 완료)
|
|
|
|
> 우리 버전(1.0.4078.44) 기준. 구현 계획의 기술적 토대.
|
|
|
|
| 필요 기능 | 네이티브 API | 비고 |
|
|
|---|---|---|
|
|
| **페이지 내 검색** | `CoreWebView2.Find` → `StartAsync(CoreWebView2FindOptions)` / `FindNext()` / `FindPrevious()` / `Stop()`, `MatchCountChanged`·`ActiveMatchIndexChanged` 이벤트 | 대소문자·단어일치·전체 강조 옵션 내장. `SuppressDefaultFindDialog=true` 필수(자체 UI) |
|
|
| **다중 탭** | 공유 `CoreWebView2Environment` + N개 `WebView2` 컨트롤 | 인스턴스당 메모리 부담 → 절전과 짝꿍. 브라우저 프로세스 1개 공유 |
|
|
| **탭 절전** | `TrySuspendAsync()` / `Resume()` / `IsSuspended` / `MemoryUsageTargetLevel` | 숨겨진(비활성) 탭에서만 동작. 자동으로 Low 모드 진입 |
|
|
| **오디오** | `IsMuted`(읽기/쓰기) · `IsDocumentPlayingAudio` · 변경 이벤트 | 음량 조절은 불가(뮤트만). 초기화 전 뮤트 설정은 안 먹는 버그(#2120) |
|
|
| **컨테이너/프로필** | `CreateCoreWebView2ControllerOptions(ProfileName, IsInPrivateModeEnabled)`, `CoreWebView2Profile`, `CustomDataPartitionId` | 한 환경에서 여러 프로필 = 프로세스 추가 없이 쿠키/세션 격리 |
|
|
| **다운로드 관리** | `DownloadStarting` + `CoreWebView2DownloadOperation`: `Pause()/Resume()/Cancel()`, `BytesReceived`/`TotalBytesToReceive`/`State`/`InterruptReason`, 이벤트 3종 | 속도는 BytesReceived 델타로 자체 계산 |
|
|
| **팝업→새 탭** | `NewWindowRequested`: `e.NewWindow = 새탭.CoreWebView2`, `GetDeferral()` | 탭 생성이 비동기라 deferral 필수 |
|
|
| **줌** | `Controller.ZoomFactor` + `ZoomFactorChanged` | 컨트롤러(탭) 단위. **사이트별 영속은 WebView2이 보장 안 함** → 앱 설정에 도메인→배율 저장 후 `NavigationCompleted` 때 재적용 |
|
|
| **파비콘/제목** | `DocumentTitle(Changed)`, `FaviconUri(Changed)`, `GetFaviconAsync(Png)` | 탭 UI 재료 |
|
|
| **컨텍스트 메뉴** | `ContextMenuRequested` + `CreateContextMenuItem` | 기본 메뉴 항목 재구성 + 커스텀 항목(「이 링크의 영상 받기」 등) |
|
|
| **권한** | `PermissionRequested` + `Profile.SetPermissionStateAsync(kind, origin, state)` | 알림/카메라/마이크/자동재생 등 사이트별 영속 |
|
|
| **쿠키** | `CookieManager`(Profile 스코프) | |
|
|
| **인쇄/PDF** | `ShowPrintUI()`, `PrintAsync(settings)`, `PrintToPdfAsync(path)` | |
|
|
| **C#↔JS 브리지** | `PostWebMessageAsJson` ↔ `WebMessageReceived`, `AddScriptToExecuteOnDocumentCreatedAsync` | 리더 모드/부스트/요소 zap의 기반. CSP에 막히지 않음(단 Trusted Types DOM 싱크 주의) |
|
|
| **알림** | `NotificationReceived` (비영속 알림만, 호스트가 직접 표시) | 푸시(서비스워커) 알림은 미지원 |
|
|
| **스크린샷** | `CapturePreviewAsync`(뷰포트만) / CDP `Page.captureScreenshot`(`captureBeyondViewport:true`로 전체 페이지) | 전체 페이지 캡처는 CDP 경유 |
|
|
| **오류 페이지** | `IsBuiltInErrorPageEnabled=false` + 실패 시 `NavigateToString` | 재진입 가드 필요(#634) |
|
|
| **상태바 링크 미리보기** | `StatusBarText(Changed)` | 링크 호버 시 하단 표시 |
|
|
|
|
**자체 구현 필요** (네이티브 없음): 리더 모드(Readability.js 주입) · 검색엔진 로직(순수 호스트) · 히스토리/북마크 저장(이미 보유) · 명령 팔레트 · 탭 그룹/워크스페이스(UI 개념)
|
|
|
|
---
|
|
|
|
## 2. 조사 결과 종합 — 9개 브라우저의 차별 기능
|
|
|
|
### Chrome (표준의 척도)
|
|
탭 그룹(색+이름+접기, **저장된 그룹**), Memory Saver(유휴 탭 동결), **탭 검색 Ctrl+Shift+A**, `@tabs`/`@bookmarks`/`@history` 주소창 스코프 검색, 키워드 사이트 검색(`wiki`+Tab), Ctrl+Shift+T 복원, 다운로드 버블(진행 링), 사이트별 줌 영속, 빠른 닫힘. 2025+ : 세로 탭 추가, AI 탭 정리.
|
|
|
|
### Edge (WebView2의 친척 — 가장 직접 참고)
|
|
**세로 탭**(좌측 사이드바, 아이콘 레일 축소+호버 확장), **Sleeping Tabs**(30초~12h 설정, "zzz" 표시, 절약량 표시), **네이티브 분할 화면**, **웹 캡처**(영역/전체 페이지+주석, Ctrl+Shift+S), **몰입형 리더**(읽어주기 Ctrl+Shift+U, 문법 도구), 즐겨찾기바 "아이콘만" 모드, F4=주소창. (Collections/Drop/사이드바는 2026 폐지 — 미차용)
|
|
|
|
### Firefox
|
|
**Reader View(F9)** — 폰트/간격/테마(밝/어/세피아/대비) + **낭독(TTS)**; **Multi-Account Containers**(쿠키 격리 다중 로그인); **Enhanced Tracking Protection**(실드 아이콘, 3단계); HTTPS-Only; **빠른 찾기** `/`(즉시), `'`(링크만); **PiP**(자동 열림 옵션); 다운로드 패널(.part 재개).
|
|
|
|
### Vivaldi (커스터마이징의 왕)
|
|
**Quick Commands(F2)** — 전 브라우저 액션 명령 팔레트; **Tab Stacks**(드래그 스택, Compact/2단/아코디언 표시); **Tab Tiling**(수직/수평/그리드, Ctrl+F9/F8/F7); **Workspaces + 규칙**(URL 패턴→워크스페이스 자동 라우팅!); **북마크 닉네임**(`g 검색어`); **Speed Dial**(새 탭 썸네일 그리드); **Web Panels**(사이드바 고정 사이트); **Notes**(마크다운, "Add to Note"); **Page Actions**(CSS 필터: 흑백/반전/세피아/가리개); **Capture**(전체/영역); 주소창 진행 바, 파라미터 제거 복사, 마우스 제스처, 툴바 편집.
|
|
|
|
### Zen Browser (Firefox 포크, 활발)
|
|
**세로 탭 철학** + **Essentials**(전 워크스페이스 상시 아이콘 고정); **Workspaces**(탭 세트 분리); **Split View**(최대 4분할); **Glance**(Alt+클릭 링크 미리보기 플로팅, 닫기/탭으로/분할 버튼); **Compact Mode**(사이드바 숨김+엣지 호버 복원); **Boosts**(사이트별: 색 틴트/폰트/요소 zap/강제 다크); 핀 탭 닫으면 언로드(삭제 아님); Mods(CSS+JS 마켓).
|
|
|
|
### Arc (개발 중단 — 개념만 차용)
|
|
**Command Bar(Ctrl+T 스포트라이트)** — 탭/북마크/히스토리/명령/웹검색 통합; **Spaces**(테마별 공간); **Auto Archive**(미고정 탭 12h 후 아카이브, 닫기=아카이브, 검색 가능한 복구 목록); **Boosts**(슬라이더: 색/대비/밝기/채도/세피아/다크/줌 + CSS); **Peek**(Shift+클릭 미리보기); **Air Traffic Control**(도메인→Space 자동 라우팅); URL 바 **탭별 입력 초안 기억**.
|
|
|
|
### Brave
|
|
**Playlist** ★영상 앱에 최적 — 주소창 "미디어 추가" 버튼으로 페이지 영상/오디오를 재생목록에 저장, 백그라운드 재생, 광고 없는 재생, 오프라인 저장; Shields(사이트별 차단 슬라이더 + 차단 카운터); Speedreader(자동 리더).
|
|
|
|
### Opera
|
|
**Tab Islands**(같은 부모에서 연 탭 자동 그룹); **Video Popout**(호버 버튼→분리 플레이어); 사이드바 메신저; 무료 VPN; Speed Dial; Workspaces.
|
|
|
|
### Safari / 기타
|
|
Safari: Tab Groups + Reading List(오프라인 나중읽기), 컴팩트 탭바. Floorp: 멀티로우 탭. Orion: Lazy Load(포커스 시 로드). (Sidekick 2025 종료, Comet/Dia = AI 브라우저 흐름 참고)
|
|
|
|
---
|
|
|
|
## 3. 도입 기능 목록 (v2 — 재서열)
|
|
|
|
### 🏆 Tier 1 — 필수 (일반 브라우저의 기본기)
|
|
| # | 기능 | 근원 | 구현 경로 | 공수 |
|
|
|---|---|---|---|---|
|
|
| T1-1 | **탭 시스템** (생성/닫기/전환/Ctrl+Tab·1~9/드래그 정렬/복제) | 전 브라우저 | 공유 Environment + 탭당 WebView2 + `NewWindowRequested`→새 탭(deferral) | L |
|
|
| T1-2 | **닫은 탭 복원** Ctrl+Shift+T | 전 브라우저 | 닫힘 스택(인덱스+URL 보존) | S |
|
|
| T1-3 | **페이지 내 검색** Ctrl+F (일치 수 X/Y, 다음/이전, 대소문자) | 전 브라우저 | **네이티브 `CoreWebView2.Find`** + 자체 하단 바 | **S** ↓↓ |
|
|
| T1-4 | **검색엔진** (기본 엔진 선택 + 키워드 전환 `g `, `yt ` + `@북마크/@기록` 로컬 스코프) | Chrome/Vivaldi/Firefox | 순수 호스트 로직 + 제안 드롭다운 확장 | S~M |
|
|
| T1-5 | **다운로드 매니저 UI** (진행+속도, 일시정지/재개/취소, 폴더 열기, Ctrl+J) | Chrome 버블/Vivaldi 패널 | `CoreWebView2DownloadOperation` 풀 API + 앱 카드와 통합 뷰 | M |
|
|
| T1-6 | **북마크바** (주소창 아래, Ctrl+Shift+B, 아이콘만 모드) | Chrome/Edge | UI 행 | S |
|
|
| T1-7 | **사이트별 줌 영속** | 전 브라우저 | 도메인→배율 사전 저장 + `NavigationCompleted` 재적용 | S |
|
|
| T1-8 | **탭 오디오 표시 + 클릭 음소거** | Chrome/Edge | `IsDocumentPlayingAudio`/`IsMuted` 네이티브 | S |
|
|
| T1-9 | **강제 새로고침** Ctrl+Shift+R | 전 브라우저 | `Profile.ClearBrowsingDataAsync(DiskCache)` 후 Reload | S |
|
|
| T1-10 | **세션 복원** (시작 시 이전 탭 복구, 옵션) | Chrome/Firefox | 탭 URL 리스트 영속 | S |
|
|
| T1-11 | **전체화면 F11** + 비디오 전체화면 지원 | 전 브라우저 | `ContainsFullScreenElement` 이벤트 + 크롬 자동 숨김 | S |
|
|
|
|
### 🥈 Tier 2 — 강력 추천 (차별화 + 사용성 대폭 향상)
|
|
| # | 기능 | 근원 | 구현 경로 | 공수 |
|
|
|---|---|---|---|---|
|
|
| T2-1 | **명령 팔레트** (Ctrl+K: 탭/북마크/기록/액션/웹검색 통합) | Arc Command Bar / Vivaldi Quick Commands | 호스트 UI + 기존 데이터 재사용 | M |
|
|
| T2-2 | **탭 절전** (유휴 탭 자동 서스펜드, "zzz" 표시, 예외 사이트) | Edge Sleeping Tabs / Zen | `TrySuspendAsync`/`Resume` + 유휴 타이머 | M |
|
|
| T2-3 | **분할 화면** (2~4분할, 드래그 배치, 분할 닫기) | Zen Split / Edge / Vivaldi Tiling | Grid + GridSplitter + WebView2 복수 | M~L |
|
|
| T2-4 | **리더 모드** (F9, 본문 추출 + 폰트/테마) | Firefox/Zen | Readability.js 주입 + 스타일 오버레이 | M |
|
|
| T2-5 | **세로 탭 레이아웃** (좌측 사이드바, 축소 레일, 토글) | Edge/Zen | 탭 스트립 위치 전환 | M |
|
|
| T2-6 | **Glance 링크 미리보기** (Alt+클릭 → 플로팅 미리보기, 탭으로 승격 버튼) | Zen Glance / Arc Peek | 오버레이 WebView2 창 | M |
|
|
| T2-7 | **사이트별 Boost** (강제 다크 / 색 틴트 / 요소 zap / 줌 기억) | Zen·Arc Boosts | 도메인별 CSS 주입 `AddScriptToExecuteOnDocumentCreated` | M |
|
|
| T2-8 | **탭 검색** Ctrl+Shift+A (열린+최근 닫힘 탭 검색 점프) | Chrome/Edge | 호스트 UI | S |
|
|
| T2-9 | **스크린샷** (보이는 영역 / 전체 페이지, Ctrl+Shift+S) | Firefox/Edge/Vivaldi | `CapturePreviewAsync` / CDP `captureBeyondViewport` | S~M |
|
|
| T2-10 | **미디어 재생목록** ★영상 앱 핵심 — 감지된 영상을 재생목록에 쌓고 앱 내 재생/백그라운드 | Brave Playlist | 감지 파이프라인 + 내장 플레이어 컨트롤 | L |
|
|
| T2-11 | **탭 그룹** (색+이름, 접기, 도메인별 자동 그룹) | Chrome 탭 그룹 / Opera Islands | 탭 모델 확장 | M |
|
|
| T2-12 | **웹 캡처 → 다운로드 큐 연동** (우클릭 "이 링크 영상 받기") | 커스텀 | `ContextMenuRequested` 커스텀 항목 | S |
|
|
|
|
### 🥉 Tier 3 — 선택 (돋보이는 기능)
|
|
| # | 기능 | 근원 | 비고 |
|
|
|---|---|---|---|
|
|
| T3-1 | **워크스페이스** + **도메인 라우팅 규칙** ("youtube.com → 영상 공간") | Zen/Vivaldi 규칙/Arc ATC | 탭 세트 스왑 |
|
|
| T3-2 | **Auto-Archive 탭 수명주기** (닫기=아카이브, 캐던스 설정, 복구 패널) | Arc | 히스토리와 통합 |
|
|
| T3-3 | **컨테이너/다중 프로필** (탭별 쿠키 격리 다중 로그인) | Firefox/Zen | `ProfileName`/`CustomDataPartitionId` |
|
|
| T3-4 | **빠른 찾기** `/` · `'`(링크만) | Firefox | Find API 래핑 |
|
|
| T3-5 | **컨텍스트 메뉴 전면 커스터마이징** | — | `ContextMenuRequested` (T2-12 확장) |
|
|
| T3-6 | **Page Actions** (CSS 필터: 흑백/반전=다크/세피아/가리개) | Vivaldi | Boost와 통합 가능 |
|
|
| T3-7 | **PiP 영상 팝아웃** (호버 버튼 → 항상 위 창) | Firefox/Opera | Document PiP API or 별도 창 |
|
|
| T3-8 | **Speed Dial 새 탭 페이지** (썸네일 그리드) | Opera/Vivaldi | 내장 HTML |
|
|
| T3-9 | **읽어주기(TTS)** | Edge/Firefox | 리더 모드와 세트, Windows TTS |
|
|
| T3-10 | **인쇄/PDF** Ctrl+P / 소스보기 Ctrl+U | 전 브라우저 | `PrintToPdfAsync` 등 네이티브 |
|
|
| T3-11 | **권한 UI** (알림/카메라/마이크/자동재생 사이트별) | Chrome/Firefox | `PermissionRequested` |
|
|
| T3-12 | **노트 패널** (마크다운, "Add to Note") | Vivaldi/Arc | 후순위 |
|
|
| T3-13 | **컴팩트 모드** (크롬 전체 숨김, 엣지 호버 복원) | Zen/Arc | 전체화면과 통합 |
|
|
| T3-14 | **추적 방지 표시** (차단 카운터 실드) | Firefox/Brave | `WebResourceRequested` 필터 |
|
|
| T3-15 | **주소창 진행 바 + 파라미터 제거 복사** | Vivaldi | 소소한 완성도 |
|
|
|
|
**❌ 의도적 미차용**: 비밀번호 관리(자동저장 토글만), 실제 확장 프로그램 생태계, 클라우드 동기화, AI 사이드바(방향 불명확), Edge Collections/Drop(폐지), VPN/Tor(범위 외)
|
|
|
|
---
|
|
|
|
## 4. 구현 로드맵 (의존성 순, v2)
|
|
|
|
### Phase 0 — 즉효 퀵윈 (탭 이전 독립 구현 가능, 반나절~1일)
|
|
> 신규 발견: 네이티브 API 덕에 탭 대공사 없이 먼저 넣을 수 있는 것들.
|
|
- [x] **T1-3 페이지 내 검색** — `CoreWebView2.Find` + 하단 검색 바(Ctrl+F/F3/Esc). *가성비 1위로 승격*
|
|
- [x] **T1-4 검색엔진** — URL 판별 → 검색 URL 조합, 기본 엔진 설정(Google/Bing/DDG), `g ` 키워드
|
|
- [x] **T1-7 사이트별 줌 영속**
|
|
- [x] **T1-9 강제 새로고침**
|
|
- [x] **T1-11 전체화면 F11**
|
|
|
|
### Phase A — 탭 아키텍처 (대공사, 모든 탭 기능의 전제)
|
|
- [x] `Browser/TabViewModel` + `TabManager` 신규 — 공유 `CoreWebView2Environment`, 탭당 WebView2
|
|
- [x] 탭 스트립 UI(가로 우선, 세로는 T2-5) + 활성 탭만 Visible
|
|
- [x] 기존 로직 전면 리팩터: 주소창/네비/감지(`OnResponseReceived` 전 탭 구독→중계)/북마크/히스토리/DetectSocial → 활성 탭 대상
|
|
- [x] 단축키: Ctrl+T/W/Tab/1~9, Ctrl+Shift+T(T1-2 복원 스택)
|
|
- [x] `NewWindowRequested` → 새 탭(deferral 패턴) 교체
|
|
- [x] T1-8 오디오 표시/뮤트, T1-10 세션 복원
|
|
- ~~⚠️ 저장소가 git이 아님 → 착수 전 `git init` 필수~~ → git 전환 완료. 감지 회귀는 단위/E2E 테스트로 상시 검증.
|
|
|
|
### Phase B — 탭 보조 + 핵심 완성
|
|
- [x] **T1-5 다운로드 매니저** — 페이지 다운로드(`DownloadOperation`) + 영상 카드 통합 뷰, 속도/일시정지/재개
|
|
- [x] **T1-6 북마크바** (+아이콘만 모드)
|
|
- [x] **T2-2 탭 절전** — 유휴 타이머 → `TrySuspendAsync`, 재활성 `Resume`
|
|
- [x] **T2-8 탭 검색** Ctrl+Shift+A
|
|
- [x] **T2-12 우클릭 "이 링크 영상 받기"** — 컨텍스트 메뉴 커스텀 (다운로더 앱의 시그니처)
|
|
|
|
### Phase C — 차별화 (Zen/Arc/Vivaldi 영감)
|
|
- [x] **T2-1 명령 팔레트** Ctrl+K — 탭/북마크/기록/액션(다운로드·줌·테마·InPrivate)/웹검색
|
|
- [x] **T2-3 분할 화면** — 플레이어 + 다운로드 큐 용도
|
|
- [x] **T2-4 리더 모드** — Readability.js 번들
|
|
- [x] **T2-6 Glance** Alt+클릭 미리보기
|
|
- [x] **T2-7 Boost** — 강제 다크/틴트/요소 zap(사이트별 광고 제거)
|
|
- [x] **T2-9 스크린샷**, **T2-5 세로 탭**, **T2-11 탭 그룹**
|
|
|
|
### Phase D — 시그니처 + 정제
|
|
- [x] **T2-10 미디어 재생목록** ★ — 감지된 영상 → 재생목록 패널 → 내장 재생/백그라운드 (Brave Playlist 관점, 우리 앱의 정체성)
|
|
- [x] T3-1 워크스페이스+도메인 라우팅, T3-2 Auto-Archive, T3-3 컨테이너, T3-7 PiP, T3-8 Speed Dial 등 — T3-1~T3-15 전 항목 구현(`IMPLEMENTATION_AUDIT.md` §1 Phase D·E·3차 표)
|
|
|
|
---
|
|
|
|
## 5. 우선순위 TOP 5 (v2 — 공수 재평가 반영)
|
|
|
|
| 순위 | 기능 | 이유 |
|
|
|---|---|---|
|
|
| 1 | **Phase 0 전체** (검색·검색엔진·줌·F11) | 탭 없이도 즉시 체감. 특히 페이지 내 검색은 네이티브 API로 반나절. |
|
|
| 2 | **Phase A 탭** | 브라우저 정체성의 기반. 이후 모든 것의 전제. |
|
|
| 3 | **다운로드 매니저 (T1-5)** | 다운로더 앱인데 관리 UI 부재가 최대 모순. |
|
|
| 4 | **명령 팔레트 (T2-1)** | 모든 기능의 통합 입구 — 기능이 많아질수록 가치 증가. |
|
|
| 5 | **미디어 재생목록 (T2-10)** | Brave Playlist 관점 — "영상 다운로더 브라우저"의 시그니처 기능. |
|
|
|
|
---
|
|
|
|
## 6. 기술 노트 & 리스크 (2차 검증 반영)
|
|
|
|
- **airspace**: 표준 `WebView2`(HwndHost)는 최상위 렌더 → WPF 오버레이 불가. `WebView2CompositionControl`은 DRM 영상 실패 → **불가침 원칙: 크롬 UI는 WebView2를 덮지 않고 둘러싼다**. (Glance/커맨드 팔레트는 별도 창 or 여백 배치)
|
|
- **탭 메모리**: 인스턴스당 수십 MB. → 절전(T2-2)을 Phase B에 배치, 최대 탭 수 가드(옵션), Zen식 "핀 탭 닫으면 언로드" 채택 고려.
|
|
- **줌 영속**: WebView2이 사이트별 줌을 보장하지 않음(#2451/#3459) → 앱 설정 사전이 SSOT.
|
|
- **Find API**: 옵션 변경 시 재 Start. HTML/텍스트 문서만. `SuppressDefaultFindDialog=true`로 Edge 기본 바 차단.
|
|
- **뮤트 버그**: 첫 네비게이션 전 `IsMuted=true`는 무시될 수 있음(#2120) → 초기화 후 설정.
|
|
- **ClearBrowsingDataAsync 셧다운**: 앱 종료 중 호출 미완료 이슈(#3176) → 종료 경로에서 호출 금지.
|
|
- **Trusted Types**: 일부 사이트에서 `innerHTML` 주입이 막힘 → `textContent`/`createElement` 사용.
|
|
- **미디어 감지 다중화**: `WebResourceResponseReceived`를 탭마다 구독하되 `TabManager`가 출처 태깅 후 `DownloadManager.OnDetected` 중계 (카드에 탭 출처 표시).
|
|
|
|
---
|
|
|
|
## 7. 성공 기준 (완료 정의)
|
|
|
|
- [x] Ctrl+F 검색 바: 일치 수 표시, 다음/이전, Esc 닫기 동작
|
|
- [x] 주소창에 검색어 → 선택한 엔진으로 검색; `g `/`yt ` 키워드 전환 동작
|
|
- [x] 여러 탭 열기/전환/닫기, 각 탭 독립 네비게이션·감지, Ctrl+Shift+T 복원
|
|
- [x] 탭에서 오디오 재생 시 스피커 아이콘 + 클릭 뮤트
|
|
- [x] 사이트별 줌 재방문 시 유지
|
|
- [x] 다운로드 매니저에서 페이지 다운로드 일시정지/재개/취소 + 속도 표시
|
|
- [x] 북마크바 표시/숨김(Ctrl+Shift+B) + 원클릭 이동
|
|
- [x] 종료 시 탭 저장 → 시작 시 복원(옵션)
|
|
- [x] `dotnet build` 0 오류/0 경고(기존 알려진 경고 제외), 기존 미디어 감지·다운로드 회귀 없음 — 전체 테스트 GREEN 유지
|
|
|
|
---
|
|
|
|
## 출처 (2차 조사 핵심 링크)
|
|
|
|
**WebView2 API (Microsoft Learn)**:
|
|
- CoreWebView2.Find / CoreWebView2Find: learn.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.find
|
|
- 성능(서스펜션): learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/performance
|
|
- 멀티 프로필: learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/multi-profile-support
|
|
- 다운로드: …/corewebview2downloadoperation · 컨텍스트 메뉴: …/webview2/how-to/context-menus
|
|
- WPF 플랫폼(airspace/CompositionControl): …/webview2/platforms/wpf
|
|
|
|
**Chrome/Edge**: support.google.com/chrome/answer/157179 (단축키) · …/2391819 (탭 관리) · explore.microsoft.com/en-us/edge/features (vertical tabs·sleeping tabs·split screen·web capture) · support.microsoft.com/…/keyboard-shortcuts-in-microsoft-edge
|
|
|
|
**Firefox/Vivaldi**: support.mozilla.org (keyboard shortcuts·reader view·ETP·HTTPS-only·PiP·screenshots) · help.vivaldi.com (tab-stacks·tab-tiling·workspaces·address-field·quick-commands·web-panels·page-actions)
|
|
|
|
**Zen/Arc**: docs.zen-browser.app (workspaces·split-view·glance·compact-mode·urlbar·shortcuts) · resources.arc.net (Spaces·Auto-Archive·Boosts·Peek·Air Traffic Control·Command Bar)
|
|
|
|
**Brave/Opera/기타**: brave.com/playlist · brave.com/shields · opera.com/features (tab-islands·video-popout·workspaces) · docs.floorp.app · Apple Support (Safari tab groups·reading list)
|
|
|
|
**전체 원문 리포트**: 5개 조사팀 상세 보고서는 세션 에이전트 결과로 보존됨.
|