前回からの続き

前回から引き続き、 popup画面 の説明を行います。


実際によくある使い方

現在のURLを表示

popup.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>

    <button id="showUrl">
      URL取得
    </button>

    <p id="result"></p>

    <script src="popup.js"></script>
  </body>
</html>

popup.js

document.getElementById("showUrl").addEventListener("click", async () => {
  const [tab] = await chrome.tabs.query({
    active: true,
    currentWindow: true
  });
  document.getElementById("result").textContent = tab.url;
});

manifest.json

{
  "manifest_version": 3,
  "name": "URL Display Extension",
  "version": "1.0.0",
  "description": "ブラウザ拡張(URL表示)のサンプル",
  "icons": {
    "16": "icons/icon16.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png"
  },
  "permissions": [
    "activeTab"
  ],
  "action": {
    "default_popup": "popup.html"
  }
}

※ permissions で定義されている activeTab は、現在ユーザーが操作しているタブへ一時的にアクセスするための権限です。今回のサンプルでは、現在表示中ページの URL を取得するために利用しています。

👉 登録して、動作させてみると、ボタン押下により、URL取得され表示されます。


popup は普通のHTMLページ?

基本的には正解です。

Popup 内では

  • HTML
  • CSS
  • JavaScript

が普通に使えます。

例えば:

<input>

<select>

<button>

<table>

などのタグが普通に利用できます。ただし、 普通のWebページとは違います。 (ここは重要です。)

👉 Popup は 特殊な拡張機能ページ です。

例えば、popup.js 内では、下記の様な拡張APIが利用できます。

  • chrome.storage
  • chrome.tabs

Popupのライフサイクル

初心者が最も驚くポイントです。

👉 Popupは常に存在しているわけではありません。

アイコンクリック
↓
popup生成
↓
表示
↓
閉じる
↓
popup破棄

という動作になります。

つまり、popup.js の中で、

let count = 0;

としても、

Popupを閉じると消えてしまいます。

その為、

  • 設定値
  • テーマ
  • 入力内容

などの状態を保存したい場合は、 chrome.storage.local を利用する必要があります。

※ なお、Popup内では localStorage や sessionStorage も利用できます。ただし、拡張機能では chrome.storage の利用が推奨されるため、設定情報などは chrome.storage.local に保存するのが一般的です。

”theme”という名前で、値”dark”を保存

await chrome.storage.local.set({
  theme: "dark"
});

次回開いた時、

const result = await chrome.storage.local.get("theme");

で取得できます。


Popup と Background の違い

この2つは、よく混同されます。

項目 Popup Background
画面 あり なし
ユーザー操作 あり なし
表示中のみ動作 ×
常時表示 × ×
UI作成 ×

Popup は、ユーザー操作で使用するものです。

Background は裏方処理を担当します。ただし Manifest V3 では Service Worker として実装されるため、必要な時だけ起動し、処理が終わると停止します。


Popup と Content Script の違い

これもよく混同されます。

Popup は、拡張機能の画面です。Content Script は、Webページ内で動く JavaScript で全くの別物です。

Popup
↓
ボタンクリック
↓
Content Scriptへ命令
↓
ページ書き換え

という構成がよく使用される為、popup と Content Script を同一視したり、PopupからページのDOMを直接操作できるのでは、といった勘違いがしばしば見受けられます。

例えば、popup.jsの中で、

document.querySelector("h1")

と書いた場合、ここでいう document は、現在開いているWebページではなく、 popup.html の document を示します。

👉 その為、ページの中身を操作したい場合は、 Content Script による操作が必要となります。

Content Scriptは、popup.js とは、まったく異なるスクリプトで、manifest.json でも、全く別に定義されます。


ファイル構成例

my-extension という、独自の拡張を作成する場合、 popup.html とpopup.js は、background.js や content.js と同列にありながら、全く異なるものとして存在します。

my-extension/
├─ manifest.json
├─ popup.html
├─ popup.js
├─ popup.css
├─ background.js
├─ content.js
└─ icons/

👉 拡張機能によっては、これらの全てのファイルが必要ではありませんが、各ファイルの役割を明確にし、各ファイル間が連携しあって、拡張機能を実現するという設計が重要になります。


まとめ

Popup は、ブラウザ拡張の「顔」となる画面です。

  • popup.html → 画面を作る
  • popup.js → 処理を書く
  • manifest.json → Popupを登録する

という役割になります。