2016-04-17 3 views
5

Я разрабатываю расширение Chrome для работы, и одна из вещей, которую ему нужно сделать, это прочитать (только читать, а не изменять) объект, который мы отправляем обратно на веб-сайт после того, как он делает асинхронный запрос на наших серверах. В основном мне нужно прочитать объект window.<our object name> и получить то, что там.Как получить доступ ко всем объектам Windows из расширения Chrome?

Теперь я знаю, что это возможно, потому что я сделал это в сценарии Tampermonkey, который я написал. Я был в состоянии console.log(window.<our object name>), и он вошел.

Tampermonkey - это расширение Chrome, поэтому нет причин, по которым он может получить доступ к чему-то, а другое расширение не может.

Но когда я пытаюсь получить доступ к этому объекту, как из сценариев контента, так и из введенного кода, я ничего не получаю. Когда я получаю только объект window, он появляется только частично, как если бы расширение было слепым к некоторым его частям. Но если я нахожусь в консоли на странице, и я звоню window, я получаю полный объект окна обратно. Бешенство.

Так что если скрипты содержимого не работают, а вложенные скрипты не работают, и нет никаких причин, по которым всплывающие скрипты будут полезны здесь, как это сделать?

Большое спасибо!

UPDATE: В соответствии с просьбой, вот manifest.json (я взял пример page_redder и отработаны, что, чтобы убедиться, что я не делал каких-либо странные ошибки):

{ 
    "name": "Page Redder", 
    "description": "Make the current page red", 
    "version": "2.0", 
    "permissions": [ 
    "activeTab" 
    ], 
    "background": { 
    "scripts": ["background.js"], 
    "persistent": false 
    }, 
    "browser_action": { 
    "default_title": "get my object" 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["<all_urls>"], 
     "js": ["content.js"] 
    } 
    ], 
    "manifest_version": 2 
} 

А вот содержание. ЯШ:

var getWindow = window.setTimeout(function() { console.log("From content script: " + window.<OBJECT NAME>); }, 5000); 

А вот background.js:

// Copyright (c) 2011 The Chromium Authors. All rights reserved. 
// Use of this source code is governed by a BSD-style license that can be 
// found in the LICENSE file.  

// Called when the user clicks on the browser action. 
chrome.browserAction.onClicked.addListener(function(tab) { 
    // No tabs or host permissions needed! 
    chrome.tabs.executeScript({ 
    code: 'console.log("From injected script:" + window.<OBJECT NAME>);' 
    }); 
}); 

При запуске, я получаю:

Из содержания сценария не определен Из закачиваемого сценария: не определен

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

+0

Можете ли вы включить 'javascript',' manifest.json' в Вопрос? – guest271314

+0

Да, определенно. Готово. – StormShadow

+0

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

ответ

-2

Согласно документации в https://developer.chrome.com/extensions/content_scripts

Однако сценарии содержания имеют некоторые ограничения. Они не могут:

  • Использовать переменные или функции, определенные веб-страницами или другими сценариями контента.

Таким образом, вы можете получить доступ к общим переменным окна из скрипта содержимого, но не переменные, созданные из JavaScript в веб-страницы, другой сценарий контента или, как в вашем случае, объект вы отправили на сайт.

+0

Видимо, вы можете, потому что Tampermonkey делает это. Мне просто нужно выяснить, как это сделать. – StormShadow

+0

это не отвечает на вопрос, так как его не рассматривают впрыскиваемые сценарии, в которых op упоминает –

0

Интересный вопрос.Вот быстрый и, вероятно, неполный ответ:

  • каждая вкладка имеет свой собственный отдельный window объект
  • background.js также имеет свою собственную
  • сценарии содержания немного сложнее в том, что в то время как они номинально живут внутри страницы , они на самом деле держать на почтительном расстоянии: см isolated worlds
  • Я не знаком с chrome.tabs.executeScript, но почему-то я would'nt доверять ему ничего, кроме основ

Один подход может быть следующим:

Откройте соответствующую страницу из фонового сценария с chrome.tabs.create: отсюда Backgound будет иметь полный контроль и доминирование над указанной вкладки и window, document и your_object в нем. Также будет проще обрабатывать асинхронную сторону вещи: вы научитесь любить callbacks.

В зависимости от того, что требуется относительно UX, другой вариант будет обрабатывать запрос асинхронной, и принести your_object, полностью в background.js

Один последний намек: расширений, загруженные из магазина только заархивированные файлы в вашем Профиль Chrome. Найдите tapermonkey.crx или что-нибудь еще, разархивируйте его и прочитайте источники, чтобы выяснить, что он делает.

И о, полагаясь на таймаут для обработки асинхронности, привязан к случайным результатам.

+0

На самом деле? Я попробую это – StormShadow

0

Су, это своего рода хакерство, но я смог это сделать, и это сработало.

Чтобы получить доступ ко всем доступным хосту window, я должен был создать script элемент, поместить весь код, я хотел туда, и добавить document.body.appendChild(script) для его работы.

Не самый сексуальный способ делать что-то, но он выполнит свою работу для небольших задач.

Смежные вопросы