2016-12-09 2 views
0

Недавно я обновил Chrome до версии 55.0.2883.75. Я использую собственный разработанный Chrome-плагин для анализа моих HTML-файлов, в которых я использую chrome.tabs.executescript для получения данных с фоновой HTML-страницы. Итак, когда я выполняю chrome.extension.onRequest, я сохраняю анализируемые данные фоновой страницы в глобальную переменную и получаю доступ к ней в функции обратного вызова chrome.tabs.executescript и обрабатываю ее.Не удалось получить доступ к глобальным переменным в chrome.tabs.executescript в Chrome версии 55

Это работало нормально, пока я не обновляюсь до версии 55.0.2883.75. Как получить доступ к глобальным переменным в новой версии?

Мой код ниже:

Шаг 1:

chrome.extension.onRequest.addListener(
    function (request, sender, sendResponse) { 
     parser = new DOMParser(); 
     htmlDoc = parser.parseFromString(request.content, "text/html"); 

     //outputJson is a global variable which is Populated here 
     outputJson = parseMyPage(outputJson, htmlDoc); 


    }); 

Шаг 2:

chrome.tabs.getSelected(null, function (tab) { 
    // Now inject a script onto the page 
    chrome.tabs.executeScript(tab.id,{ 
     code: "chrome.extension.sendRequest({content: document.body.innerHTML}, function(response) { console.log('success'); });" 
    }, function() { 

     //my code to access global variables 
if (outputJson && null != outputJson) { 
    // other stuff 
} 

    }); 
}); 
+0

Что вы укажете в [различных соответствующих консолях для расширения] (http://stackoverflow.com/a/38920982/3773011) при загрузке и выполнении расширения? – Makyen

+0

Наличие * manifest.json * поможет здесь, поэтому нам не нужно создавать его для тестирования. – Makyen

+0

Пожалуйста, отредактируйте вопрос по теме: включите ** полный ** [mcve], который * дублирует проблему *. Включая * манифест.json *, некоторые из сценариев background/content/popup/HTML. Вопросы, требующие помощи по отладке («** почему этот код не работает? **)) должны включать: ► желаемое поведение, ► конкретную проблему или ошибку * и * самый короткий код, необходимый для его воспроизведения ** в вопросе сам**. Вопросы без четкого описания проблемы не полезны другим читателям. Смотрите: «** Как создать [mcve] **», [о каких темах я могу спросить здесь?] (Http://stackoverflow.com/help/on-topic) и [ask]. – Makyen

ответ

1

Путь ваш код разработан, вы полагаетесь на порядок, в котором два асинхронных блоков кода: extension.onRequest событие и обратный вызов для tabs.executeScript(). Для вашего кода требуется, чтобы событие extension.onRequest срабатывало перед выполнением обратного вызова tabs.executeScript(). Нет никакой гарантии, что это будет порядок, в котором они происходят. Если это выпущенное расширение, вполне возможно, что на компьютерах пользователей это зависело, в зависимости от их конфигурации. Также возможно, что код в Chrome до Chrome 55 привел к тому, что событие и обратный вызов всегда происходили в том порядке, в котором вы нуждались.

Решение состоит в том, чтобы переписать это, чтобы не требовать какого-либо конкретного порядка выполнения этих асинхронных кодовых блоков. К счастью, есть способ сделать это и одновременно уменьшить сложность.

Вы можете перенести необходимую информацию из сценария содержимого в фоновый скрипт непосредственно в обратный вызов tabs.executeScript(), без необходимости явно передавать сообщение. Значение исполняемого скрипта передается обратному вызову в массиве, содержащем одну запись для каждого кадра, в который был введен сценарий. Это очень удобно использовать для передачи данных из сценария контента в обратный вызов tabs.executeScript(). Очевидно, вы можете отправить только одно значение для каждого кадра.

Следующий код должен делать то, что вы желаете. Я отредактировал этот код из вашего кода в этом Вопросе и моем answer here. Хотя код в этом ответе полностью протестирован, тот факт, что я редактировал это только в пределах этого ответа означает, что некоторые ошибки могут закрались:

chrome.tabs.getSelected(null, function (tab) { 
    // Now inject a script onto the page 
    chrome.tabs.executeScript(tab.id,{ 
     code: "document.body.innerHTML;" 
    }, function (results) { 
     parser = new DOMParser(); 
     htmlDoc = parser.parseFromString(results[0], "text/html"); 
     //outputJson is a global variable which is Populated here 
     outputJson = parseMyPage(outputJson, htmlDoc); 
     //my code to access global variables 
     if (outputJson && null != outputJson) { 
      // other stuff 
     } 
    }); 
}); 

  1. extension.sendRequest() и extension.onRequest устарели, так как Chrome 33 Вы должны заменить их в любом месте, где вы используете их, с runtime.sendmessage() и runtime.onMessage.
+0

Это решение работает Makyen !!! Я думаю, что теперь нет необходимости в extension.sendRequest() и extension.onRequest(), потому что весь код обрабатывается в обратном вызове chrome.tabs.executeScript(). Я прав? – Ricks

+0

@ Рики: Да, это правильно. Если в обратном вызове для 'tabs.executeScript()' все, что вам требуется от скрипта содержимого, возвращается, то нет необходимости в других типах связи. – Makyen