Обнаружение нажатия кнопки в форме browser_action расширения Google Chrome

Как можно так просто сделать так просто?

Все, что я хочу сделать, это нажать кнопку browser_action моего расширения, открыть форму с несколькими настройками, а затем нажать кнопку в форме, чтобы начать процесс.

Я не могу на всю жизнь получить нажатие кнопки в фоновом режиме для работы.

Я попытался получить пример http://developer.chrome.com/extensions/contentSecurityPolicy.html#H2-3 для работы, но это не так. Есть ли разница между правилами для браузера и фоном? Вот почему мой слушатель событий не стреляет?

Может ли кто-нибудь предоставить рабочий пример, пожалуйста?

manifest.json:

{
    "name": "Convert",
    "version": "0.1",
    "description": "Converts the current page",
    "browser_action": {
        "default_icon": "exticon.png",
        "default_popup": "background.html"
    },
    "content_scripts": [{
        "matches": ["*://*/*"],
        "js": ["contentscript_static.js"]
    }],
    "permissions": [
        "tabs", "http://*/*", "https://*/*"
    ]
}

background.html:

<html>
    <head>
        <title>Converter</title>
        <script src="background.js"/>
        <script>
        // Initialize the localStorage
        if (null == localStorage["htmlImport"])
           localStorage["htmlImport"] = false;

        // Called when the user clicks on the browser action icon.
        chrome.browserAction.onClicked.addListener(function(tab) {
            console.log('in listener');
                 // execute the content script
                 chrome.tabs.executeScript(null, 
                    {
                       file: "contentscript.js",
                       allFrames: true   // It doesn't work before 4.0.266.0.
                    });
              });

        // Listen to the requests from the content script
        chrome.extension.onRequest.addListener(
              function(request, sender, sendResponse)
              {
                 switch (request.name)
                 {
                    case "getPreferences":
                       sendResponse(
                          {
                             prefIgnoreLinks : localStorage["htmlImport"]
                          });
                       break;

                    case "PressShortcut":
                       sendResponse({});  // don't response.

                       // execute the content script
                       chrome.tabs.executeScript(null, 
                          {
                             file: "contentscript.js",
                             allFrames: true   // It doesn't work before 4.0.266.0.
                          });

                       break;

                    default:
                       sendResponse({});  // don't response.
                       break;
                 }
              });


        </script>
    </head>
    <body style='min-width:250px;'>
        Link depth: <input type='text' name='depth' value='3'/><br/>
        <input type='checkbox' name='changedomain'>Include external domains</input><br/>
        <button id='beginConvert'>Convert</button>
    </body>
</html>

background.js:

function awesome() {
  // Do something awesome!
  console.log('awesome')
}
function totallyAwesome() {
  // do something TOTALLY awesome!
  console.log('totallyAwesome')
}

function awesomeTask() {
  awesome();
  totallyAwesome();
}

function clickHandler(e) {
  setTimeout(awesomeTask, 1000);
}
// Add event listeners once the DOM has fully loaded by listening for the
// `DOMContentLoaded` event on the document, and adding your listeners to
// specific elements when it triggers.
//document.addEventListener('DOMContentLoaded', function () {
//  document.querySelector('button').addEventListener('click', clickHandler);
//});

// Add event listeners once the DOM has fully loaded by listening for the
// DOMContentLoaded event on the document, and adding your listeners to
// specific elements when it triggers.
document.addEventListener('DOMContentLoaded', function () {
//  console.log('event listener for button connected to beginConversion()');
    //document.querySelector('button').addEventListener('click', beginConversion);
    document.getElementById('beginConvert').addEventListener('click', clickHandler);
});

Ответ 1

Ваша цель

  • Нажмите кнопку расширения
  • Открывается всплывающее окно расширения с элементами управления.
  • Выполнить script на текущей вкладке на основе элементов управления во всплывающем окне

Советы

  • Подумайте о фоновой странице в качестве концентратора. Он принимает входящие запросы из разных сценариев в вашем расширении Chrome, имеет повышенные права на выполнение таких действий, как междоменные запросы (если они определены в манифесте) и т.д.
  • Вы должны использовать манифест версии 2, поскольку версия 1 устарела.
  • Манифест версии 2 не позволяет встроенные скрипты, поэтому все скрипты должны быть загружены как их собственный файл.

Пример

manifest.json

{
    "name": "Stackoverflow Popup Example",
    "manifest_version": 2,
    "version": "0.1",
    "description": "Run process on page activated by click in extension popup",
    "browser_action": {
        "default_popup": "popup.html"
    },
    "background": {
        "scripts": ["background.js"]
    },
    "permissions": [
        "tabs", "http://*/*", "https://*/*"
    ]
}

background.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        switch (request.directive) {
        case "popup-click":
            // execute the content script
            chrome.tabs.executeScript(null, { // defaults to the current tab
                file: "contentscript.js", // script to inject into page and run in sandbox
                allFrames: true // This injects script into iframes in the page and doesn't work before 4.0.266.0.
            });
            sendResponse({}); // sending back empty response to sender
            break;
        default:
            // helps debug when request directive doesn't match
            alert("Unmatched request of '" + request + "' from script to background.js from " + sender);
        }
    }
);

popup.html

<html>
    <head>
        <script src="popup.js"></script>
        <style type="text/css" media="screen">
            body { min-width:250px; text-align: center; }
            #click-me { font-size: 20px; }
        </style>
    </head>
    <body>
        <button id='click-me'>Click Me!</button>
    </body>
</html>

popup.js

function clickHandler(e) {
    chrome.runtime.sendMessage({directive: "popup-click"}, function(response) {
        this.close(); // close the popup when the background finishes processing request
    });
}

document.addEventListener('DOMContentLoaded', function () {
    document.getElementById('click-me').addEventListener('click', clickHandler);
})

contentscript.js

console.log("chrome extension party!");

Пример выполнения скриншотов

Нажатие кнопки расширения с открытием браузера на exampley.com

Clicking extension button with browser window opened to exampley.com

После нажатия "Click Me!" в раскрывающемся списке

After clicking 'Click Me!' button in extension popup


Примеры файлов в zip

http://mikegrace.s3.amazonaws.com/stackoverflow/detect-button-click.zip

Ответ 2

Предыдущий ответ больше не работает, и мне потребовалось несколько часов, чтобы понять, как управлять работой. Я надеюсь, что это может заставить вас двигаться быстрее, чем меня.

Первый, вы последний метод в этой странице (внизу страницы) и он асинхронный, поэтому не забудьте дать ему обратный вызов. Код, который вам нужен, это smtg:

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.query({'active': true}, getActiveTabCallback);
});

Второй, вам нужно понять одно, что заняло у меня некоторое время: если вы не используете фоновый html-страницу, вы не сможете увидеть какой-либо console.log в главном окне Chrome, Вам нужно перейти на страницу расширения (chrome://extensions) и нажать на ссылку расширения background page (да, у вас нет фоновой страницы, но Chrome дает вам фальшивый). Этот тип расширения (основанный на событиях) должен иметь manifest.json, содержащий smtg, как это:

"background": {
    "scripts": ["background.js"],
    "persistent": false
},

Привет!