2 minute read

Сделаем так, чтобы:

  1. В значке расширения (badge) отображалось текущее значение счётчика.
  2. Была всплывающая страница (popup.html) с кнопкой для отображения счётчика и сброса.

📂 Новая структура проекта:

/my-chrome-extension
|-- manifest.json
|-- background.js
|-- content.js
|-- popup.html
|-- popup.js
|-- styles.css (не обязательно, но можно добавить для оформления)
/icons/
|-- icon.png

📄 manifest.json (Обновлённый):

{
  "manifest_version": 3,
  "name": "Click Counter Extension",
  "version": "1.0",
  "description": "Считает количество нажатий на кнопку.",
  "permissions": ["storage", "activeTab", "scripting"],
  "background": {
    "service_worker": "background.js"
  },
  "host_permissions": ["<all_urls>"],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ],
  "commands": {
    "trigger_click": {
      "suggested_key": {
        "default": "Ctrl+Shift+Y",
        "mac": "Command+Shift+Y"
      },
      "description": "Нажать на кнопку через хоткей"
    }
  },
  "action": {
    "default_popup": "popup.html",
    "default_icon": "icons/icon.png"
  }
}

📄 background.js (Обновлённый):

async function updateBadge() {
    const result = await chrome.storage.local.get(['counter']);
    const count = result.counter || 0;
    chrome.action.setBadgeText({ text: count.toString() });
    chrome.action.setBadgeBackgroundColor({ color: "#4CAF50" });
}

chrome.runtime.onInstalled.addListener(() => {
    console.log("Расширение установлено!");
    updateBadge();  // Установить начальное значение badge
});

chrome.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
    if (message.type === "increment") {
        const result = await chrome.storage.local.get(['counter']);
        const count = (result.counter || 0) + 1;

        await chrome.storage.local.set({ counter: count });
        updateBadge();  // Обновить badge

        console.log(`Обновлённый счётчик: ${count}`);
        sendResponse({ counter: count });
    }
    return true;
});

chrome.commands.onCommand.addListener((command) => {
    if (command === "trigger_click") {
        chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
            if (tabs[0]) {
                chrome.tabs.sendMessage(tabs[0].id, { type: "trigger_click" });
            }
        });
    }
});

📄 content.js (Без изменений):

(function() {
    const button = document.createElement('button');
    button.innerText = "Нажми на меня";
    button.style.position = "fixed";
    button.style.bottom = "20px";
    button.style.right = "20px";
    button.style.zIndex = "1000";
    button.style.padding = "10px";
    button.style.fontSize = "14px";

    document.body.appendChild(button);

    function clickButton() {
        chrome.runtime.sendMessage({ type: "increment" }, (response) => {
            alert(`Обновлённый счётчик: ${response.counter}`);
        });
    }

    button.addEventListener('click', clickButton);

    chrome.runtime.onMessage.addListener((message) => {
        if (message.type === "trigger_click") {
            clickButton();
        }
    });
})();

📄 popup.html (Новое):

<!DOCTYPE html>
<html>
<head>
    <title>Click Counter</title>
    <style>
        body { font-family: Arial, sans-serif; width: 200px; padding: 10px; }
        button { margin-top: 10px; padding: 5px 10px; }
    </style>
</head>
<body>
    <div>
        <h2>Счётчик кликов</h2>
        <div>Текущее значение: <span id="counter">0</span></div>
        <button id="resetBtn">Сбросить</button>
    </div>
    <script src="popup.js"></script>
</body>
</html>

📄 popup.js (Новое):

document.addEventListener('DOMContentLoaded', async () => {
    const counterElement = document.getElementById('counter');
    const resetBtn = document.getElementById('resetBtn');

    // Загружаем текущее значение счётчика из хранилища
    const result = await chrome.storage.local.get(['counter']);
    counterElement.textContent = result.counter || 0;

    // Обработчик для кнопки сброса
    resetBtn.addEventListener('click', async () => {
        await chrome.storage.local.set({ counter: 0 });
        counterElement.textContent = 0;

        // Обновить badge
        chrome.action.setBadgeText({ text: '0' });
    });
});

🔍 Что изменилось и добавилось:

  1. 📌 Показ счётчика на иконке расширения (badge):
    • Используется chrome.action.setBadgeText() и chrome.action.setBadgeBackgroundColor() в background.js.
  2. 📌 Всплывающее окно (popup.html) с кнопкой сброса:
    • popup.js считывает значение из chrome.storage и обновляет его.
    • Можно легко сбросить счётчик и обновить значок badge.

📌 Как протестировать:

  1. 📁 Загрузить расширение на странице chrome://extensions/.
  2. Нажимай на кнопку на странице или используй хоткей (Ctrl+Shift+Y).
  3. Нажми на иконку расширения — отобразится окно с текущим значением счётчика и кнопкой сброса.
  4. Сбрось значение и посмотри, как badge тоже обновляется.