Chrome扩展程序 – 检索Gmail的原始邮件
我正在为Chrome的扩展工作。 我希望parsing“原始”Gmail邮件的内容(当前查看的邮件)。
我熟悉编程方式在Chrome扩展中单击Gmail的“显示原始”button? 。 但是由于没有透露很多信息,所以很难理解。
我试图如下使用jQuery.load()
$(windows).load(function() { alert(GLOBALS); });
并将其放置在内容脚本中,但它也不起作用。 我使用的是Chrome的开发人员工具,它在调用alert(GLOBALS);
返回以下错误alert(GLOBALS);
Uncaught ReferenceError: GLOBALS is not defined
尽pipe在使用开发人员工具的控制台时,input到控制台GLOBALS
它将返回一个数组。 任何线索如何编程读取原始消息的内容? 或者如何从内容脚本访问GLOBALS?
内容脚本在孤立的环境中运行。 为了访问(页面window
)全局属性,你必须注入一个新的<script>
元素,或者使用事件侦听器来传递数据。
例如,在页面的上下文中注入一个<script>
元素。
例
contentscript.js (清单中的"run_at": "document_end"
):
var s = document.createElement('script'); s.src = chrome.extension.getURL('script.js'); (document.head||document.documentElement).appendChild(s); s.onload = function() { s.remove(); }; // Event listener document.addEventListener('RW759_connectExtension', function(e) { // e.detail contains the transferred data (can be anything, ranging // from JavaScript objects to strings). // Do something, for example: alert(e.detail); });
script.js
– 位于扩展目录中,这将被注入到页面本身:
setTimeout(function() { /* Example: Send data from the page to your Chrome extension */ document.dispatchEvent(new CustomEvent('RW759_connectExtension', { detail: GLOBALS // Some variable from Gmail. })); }, 0);
由于此文件是通过DOM内的chrome-extension:URL加载的,因此必须将“script.js”添加到清单文件的web_accessible_resources部分。 否则Chrome会拒绝加载脚本文件。
您应该在网页中尽可能less运行逻辑,并处理内容脚本中的大部分逻辑。 这有多个原因。 首先,页面中注入的任何脚本运行在与网页相同的上下文中,因此,网页可以(有意或无意)修改JavaScript / DOM方法,从而使扩展停止工作。 其次,内容脚本可以访问额外的function,例如Chrome的有限子集* API和跨networking请求(假设扩展已经声明了这些权限)。
Chrome扩展content_script和页面上的javascript之间进行通信的更现代的解决scheme是使用html5 postMessage API。 任何发送到“窗口”的消息都可以从网页上的JavaScript和扩展的content_script中看到。
扩展的content_script.js:
window.addEventListener('message', function(event) { console.log('content_script.js got message:', event); // check event.type and event.data }); setTimeout(function () { console.log('cs sending message'); window.postMessage({ type: 'content_script_type', text: 'Hello from content_script.js!'}, '*' /* targetOrigin: any */ ); }, 1000);
在网页上运行的JavaScript:
window.addEventListener('message', function(event) { console.log('page javascript got message:', event); }); setTimeout(function() { console.log('page javascript sending message'); window.postMessage({ type: 'page_js_type', text: "Hello from the page's javascript!"}, '*' /* targetOrigin: any */); }, 2000);
另请参阅http://developer.chrome.com/extensions/content_scripts.html#host-page-communication
有一个新的API网页安全通信,没有任何副作用(window.postMessage可以有其他听众!)的内容脚本。
“从网页中,使用runtime.sendMessage或runtime.connect API将消息发送到特定的应用程序或扩展”
// The ID of the extension we want to talk to. var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc"; // Make a simple request: chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url}, function(response) { if (!response.success) handleError(url); });
“从您的应用程序或扩展,您可以通过runtime.onMessageExternal或runtime.onConnectExternal API监听来自网页的消息,类似于跨扩展消息。只有网页可以启动连接。
(来自http://developer.chrome.com/extensions/messaging.html )这仍然只在铬的开发渠道,但似乎将在下一个版本左右。
不要问我这是如何工作,似乎高度混淆。 chrome.runtime是如何在网页上定义的? 如果脚本由于某种原因已经定义了该variables呢? 我也找不到铬错误报告来查看这个function的发展历史。
基于你的扩展的可访问的html页面,我有一个稍微不同的方法。
将您的页面添加到清单:
"web_accessible_resources": ["variables.html"]