# 📉 TradingView 快適化 v1.2.0

TradingView（`tradingview.com`）のうっとうしい要素をまとめて消す Chrome 拡張機能です。

| 機能 | 内容 |
|---|---|
| 離脱確認カット | タブを閉じる／リロード時の「このサイトを離れますか？ 行った変更が保存されない可能性があります。」（`beforeunload`）を出さない |
| チャート内広告の非表示 | チャート左下の広告バナー（「広告」ラベル付き・NISA 等）、GPT 広告スロット、無料プランのアップグレード誘導ポップアップを消す |

権限（`permissions`）なし・通信なし。`tradingview.com` 以外のサイトには一切影響しません。

---

## インストール手順

1. `tradingview-tweaks` フォルダを**消さない場所**に置く
2. Chrome で `chrome://extensions` を開く
3. 右上の「デベロッパー モード」をオン
4. 「パッケージ化されていない拡張機能を読み込む」→ `tradingview-tweaks` フォルダを選択
5. 開いている TradingView タブをリロード

> すでに読み込み済みの場合は、`chrome://extensions` で「更新（リロード）」を押してから TradingView をリロード。

---

## 動作の仕組み

`*://*.tradingview.com/*` の全フレームで、`document_start`（ページ本体の JS より先）に動きます。

**離脱確認（`page.js` / MAIN ワールド）**

`page.js` は 2 経路で読み込む（二重実行はガードで無効化）:
- (a) manifest の `content_scripts`（`world: "MAIN"`, `document_start`）… ページ CSP の影響を受けず必ず実行される
- (b) `content.js` が `<script>` タグで注入 … (a) が万一遅れたときの保険

タイミングに依存しないよう 3 段構え:

1. **未来対策**: これから登録される `addEventListener('beforeunload' / 'unload', ...)` と
   `window.onbeforeunload` / `window.onunload` を握りつぶす
2. **過去対策**: すでに登録済みのハンドラが動いても、`beforeunload` 時の
   `preventDefault()` と `returnValue` の設定を無効化する（`BeforeUnloadEvent.prototype` を書き換え）
3. **保険**: 常に最後尾の `beforeunload` リスナーとして居座り `returnValue` をクリア

※ `unload` も対象なのは、TradingView が Permissions-Policy で `unload` を禁止しており、
ページ側の登録が拡張のエラー欄に警告として出続けるため（実害なし・ノイズ抑制）

**広告（`hide-ads.css` ＋ `content.js`）**

- CSS を `document_start` で注入し、広告要素を最初から非表示に
  - `#charting-ad` とそれを含む `[role="log"]` リージョン
  - `div[id^="div-gpt-ad"]` / `ins.adsbygoogle`（Google 広告スロット）
  - `article[class*="trial-notification-"]`（アップグレード誘導）
- さらに MutationObserver で、後から差し込まれた広告要素の DOM も除去

---

## 注意点

- 「保存されていない変更」がある状態でも警告なく閉じます。チャートの保存は自分で忘れずに
- TradingView 側の実装（クラス名・id）が変わると効かなくなる場合があります。そのときは `hide-ads.css` / `content.js` / `page.js` のセレクタを調整してください
- 広告ブロック検出のモーダルが出る場合は、`content.js` に検出モーダルの除去処理を足すことで対応できます（現状は未実装）

---

## ファイル構成

```
tradingview-tweaks/
├── manifest.json                拡張機能の定義
├── page.js                      beforeunload / unload の無効化（MAIN ワールド・2経路で読み込み）
├── content.js                   page.js の注入（保険）＋ 広告 DOM 除去（ISOLATED ワールド）
├── hide-ads.css                 広告非表示スタイル
├── icon16 / icon48 / icon128    アイコン
└── README.md                    このファイル
```
