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"]