Слушатель в скрипте контента - PullRequest
6 голосов
/ 01 марта 2011

Позвольте мне объяснить мою проблему.В настоящее время я разрабатываю расширение Google Chrome, которое вставляет панель инструментов в виде iframe на каждую веб-страницу.

Проблема в том, что мне нужно в некоторых случаях скрыть панель инструментов, повторно отобразить ее и тому подобное.По сути, я думал поместить своего слушателя на мою фоновую страницу, но это бесполезно, потому что эта страница не может графически манипулировать объектом.Поэтому я планировал поместить этого слушателя в content_script (который может графически манипулировать объектом).Но вторая проблема заключается в том, что контент-скрипт напротив фоновой страницы выполняется не все время, а только один раз.

Поэтому я спрашиваю себя, возможно ли сделать контент-скрипт похожим нафоновую страницу, поместив в нее цикл или что-то в этом роде ...

Заранее спасибо.

Я пробовал это:

manifest.json

{   
    "background_page" : "background.html",
    "browser_action" :
    {
        "default_icon" : "images/extension.png"
        //"popup" : "activateToolbar.html"
    },
    "content_scripts": 
    [ {
          "all_frames": true,
          "css": ["css/yourtoolbar.css"],
          "js": ["js/jquery.js", "js/yourtoolbar.js", "js/listener.js"],
          "matches": ["http://*/*"],
          "run_at": "document_end"
    } ], 
    "permissions" : ["tabs", "unlimitedStorage", "http://*/*", "notifications"],    
    "name" : "YourToolbar",
    "version" : "1.1",
    "description" : "Make your own Toolbar"
}

toolbar.html

<!-- Close Button -->
            <a href="javascript:hideToolbar()"><input type="image" src="images/close.png" name="close" width="18" height="18"></a>

Tool.js

function hideToolbar()
{
    chrome.extension.sendRequest({action : "hideToolbar"});
    window.webkitNotifications.createHTMLNotification('instantMessage.html', 'Ask Show Menu').show();
}

listener.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
    if(request.action)
    {
        $('body').remove();
        console.log('Received Start');
        alert(request.action);
        console.log('Received End');
    }
    else
    {
        console.log('nothing');
        alert('Not For Me [listener.js]');
    }
});

background.js

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) 
{   
    if(request.newTab) 
    {
        // Create a new Tab
        chrome.tabs.create({url: request.newTab});
    }
    else if(request.newWindow)
    {
        // Create a new Window
        chrome.windows.create({url: request.newWindow});
    }
    else if(request.action)
    {       
        chrome.tabs.getAllInWindow(null, function(tabs) {
          $.each(tabs, function() {
            chrome.tabs.sendRequest(this.id, {"action":"hideToolbar"} );
          });
        });
    }
});

Но проблема в том, что addListener не блокировал выполнение и просто ничего не ловил ...

1 Ответ

6 голосов
/ 01 марта 2011

Чтобы отправить запрос с фоновой страницы на скрипт контента, вам нужно использовать chrome.tabs.sendRequest (не chrome.extension.sendRequest) и предоставить идентификатор вкладки.

В скрипте контента вам не нужно периодически создавать chrome.extension.onRequest.addListener, просто создайте его один раз, и он будет там постоянно.

EDIT

Чтобы отправить запрос из скрипта контента, вам нужно запустить chrome.extension.sendRequest и добавить chrome.extension.onRequest.addListener на фоновую страницу.

...