Проблемы с расширением Chrome - PullRequest
0 голосов
/ 03 марта 2011

Я написал расширение для Google Chrome, и у меня есть ошибка, мне нужна помощь в решении.я делаю выбор текста или ввод текста для поиска фотографий на flickr, а затем создаю вкладку результатов.Расширение работает в большинстве случаев.но иногда он создает пустую вкладку без результатов, и когда я повторяю тот же поиск, он отображает результаты.Я подумал, что это как-то связано с обменом сообщениями через html-файлы, может быть, это связано с тем, что они общаются.Я должен сказать, что я всегда получаю результаты от flickr, чтобы запрос / ответ с помощью flickr работал нормально.Иногда ошибка возникает, когда я играю с другими вкладками или что-то делаю на других вкладках, ожидая результатов.Не могли бы вы помочь мне выяснить, в чем здесь ошибка?

фоновый файл:

function searchSelection(info,tab){
var updated;
    if(info.selectionText==null){
        var value = prompt("Search Flickr", "Type in the value to search"); 
        updated=makeNewString(value);
    }
    else{
        updated=makeNewString(info.selectionText);
    }
    var resultHtml;
    var xhReq = new XMLHttpRequest();
    xhReq.open(
    "GET",
    "http://api.flickr.com/services/rest/?method=flickr.photos.search&text="+updated+
    "&api_key=a0a60c4e0ed00af8d70800b0987cae70&content_type=7&sort=relevance&per_page=500",
    true);
    xhReq.onreadystatechange = function () {

        if (xhReq.readyState == 4) {
            if (xhReq.status == 200) {
            chrome.tabs.executeScript(tab.id, {code:"document.body.style.cursor='auto';"});
                var photos = xhReq.responseXML.getElementsByTagName("photo");
                if(photos.length==0){
                    alert("No results found for this selection");
                    chrome.tabs.executeScript(tab.id, {code:"document.body.style.cursor='auto';"});
                    return;
                }
                var myJSPhotos=[];
                for(var i=0; i<photos.length; i++){
                    var data={"id":photos[i].getAttribute("id"),"owner":photos[i].getAttribute("owner"),
                                "secret":photos[i].getAttribute("secret"),"server":photos[i].getAttribute("server"),
                                "farm":photos[i].getAttribute("farm"),"title":photos[i].getAttribute("title")};
                    myJSPhotos[i]=data;
                }

                    chrome.tabs.create({"url":"results.html"},function(thistab){
                    var port= chrome.tabs.connect(thistab.id);
                    port.postMessage({photos:myJSPhotos});
                });

            }
        };
    };
    xhReq.send(null);
    chrome.tabs.executeScript(tab.id, {code:"document.body.style.cursor='wait';"});

}


var context="selection";
var id = chrome.contextMenus.create({"title": "search Flickr", "contexts":[context,'page'],"onclick":searchSelection});

результаты html: содержит только ссылку на файл js res.js

res.js:

chrome.extension.onConnect.addListener(function(port) {
  port.onMessage.addListener(function(msg) {
//*****//
    var photos=msg.photos;
    createPage(photos);

  });
});

Я должен упомянуть, что когда вкладка пуста, если я поставлю предупреждение в части //*****//, она не сработает.но когда я распечатываю photos.length на вкладке «Создать функцию обратного вызова», она выводит правильный результат.

1 Ответ

0 голосов
/ 04 марта 2011

Попробуйте установить "run_at":"document_start" для вашего res.js в манифесте.

Я думаю, что обратный вызов из chrome.tabs.create запускается сразу, не дожидаясь загрузки скриптов страницытак что вы можете попробовать что-то вроде этого:

//global vars
var createdTabId = null;
var myJSPhotos = null;

xhReq.onreadystatechange = function () {

    //assign myJSPhotos to a global var

    chrome.tabs.create({"url":"results.html"},function(thistab){
        createdTabId = thistab.id;
    });
}

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.status == "complete" && tab.id == createdTabId) {
        createdTabId = null;

        //now page is loaded and content scripts injected
        var port = chrome.tabs.connect(tab.id);
        port.postMessage({photos:myJSPhotos});

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