Chrome tab.create и tab.getSelected - PullRequest
       1

Chrome tab.create и tab.getSelected

1 голос
/ 28 апреля 2011

У меня проблемы с передачей сообщения с фоновой страницы в мой файл content_script.js. Я надеюсь, что кто-то может указать, где я не прав.

background.html

//in a function
function myFunction() {
    chrome.tabs.create({"url":"myurl","selected":true},function(tab){
    updateTab(tab.id);
    });
}

//update Created new tab
function updateTab(tabId){
    chrome.tabs.getSelected(null, function(tab) {
        makeRequest(tab.id);  
    });}
//make request
function makeRequest(tabId) {
    chrome.tabs.sendRequest(tabId, {greeting: "hello"}, function(response) {
        console.log(response.farewell); 
    });
}

content_script.js

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
    else
      sendResponse({}); // snub them.
  });

manifest.json

"permissions": [
        "tabs","notifications","http://*/*"
    ],
    "content_scripts": [
    {
        "matches": ["http://*/*","https://*/*"],
        "js": ["content_script.js"]
    }],

Моя проблема в том, что запрос из background.html никогда не передавался в content_script.js. Я думаю, что должны быть некоторые проблемы с последовательностью создания новой вкладки и выбора этой вкладки, но я не знаю, как это исправить. Благодаря.

EDIT: Вот что я сделал до сих пор.

background.html

chrome.browserAction.onClicked.addListener(function(tab) {
        var tabId = tab.id;
        chrome.tabs.getSelected(null, function(tab) {   
           validate(tab.url,tabId);
        });
    });
    function validate(url,tabId) {
        var filter = support(url);
        if(filter!=null) {
            getHTML(tabId,url,filter);
        }
        else{
            var notification = webkitNotifications.createHTMLNotification(
              'notification.html'  // html url - can be relative
            );
            notification.show();
            setTimeout(function(){
                notification.cancel();
            }, 10000);  //10 sec
        }
    }
function getHTML(tabId,url,filter) {
        console.log("request"); 
            chrome.tabs.sendRequest(tabId, {action:"getHTML"}, function(response) {     
            var html = response.html;
            console.log(html);
            var taburl = ("some thing on server");  
            chrome.tabs.create({"url":taburl,"selected":true}, function(tab){
                var tabId = tab.id;
                chrome.tabs.onUpdated.addListener(function(tabId, changeInfo){
                    if(changeInfo.status == "loading"){
                            console.log("loading");
                  }
                  if(changeInfo.status == "complete"){
                          chrome.tabs.onUpdated.    removeListene(arguments.callee);                    
                        updateTab(tabId,url,filter,html);

                  }
                });
              }); 
            });
    }
function updateTab(tabId,url,filter,html) {
        chrome.tabs.sendRequest(tabId, {action:"updateTab"}, function(response) {
                //submit form
            chrome.tabs.executeScript(tabId, {code: 'document.getElementById(\"hiddenbutton\").click();'});
        });
    }

content_script.js

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    var action = request.action;
    console.log(action);
    if(action == "getHTML") {
        var html = document.body.innerHTML;
        console.log(html);
        sendResponse({html:document.body.innerHTML});
    }
    else{
    //do update on page from server
    sendResponse({});
    }
});

Это работает, как я и ожидал, но есть некоторые моменты, которые я не понимаю, особенно удаление слушателя chrome.tabs.onUpdated.removeListene (arguments.callee); . Я надеюсь, что у кого-нибудь будет возможность посмотреть и исправить меня, если что-то не так. Спасибо.

1 Ответ

7 голосов
/ 28 апреля 2011

background.html можно упростить до:

//in a function
function myFunction() {
    chrome.tabs.create({"url":"myurl","selected":true}, function(tab){
        makeRequest(tab.id);
    });
}

//make request
function makeRequest(tabId) {
    chrome.tabs.sendRequest(tabId, {greeting: "hello"}, function(response) {
        console.log(response.farewell); 
    });
}

Если он по-прежнему не работает должным образом, это может быть связано с тем, что вкладка еще не загрузилась (log tab.status в обратном вызове chrome.tabs.create, чтобы проверить, верно ли это).Для этого есть два решения: либо вы добавляете прослушиватель в chrome.tabs.onUpdated при фильтрации по этому идентификатору вкладки, либо вы заставляете вкладку отправлять запрос вместо background.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...