实现跨扩展消息传递在chrome扩展和应用程序
Implement cross extension message passing in chrome extension and app
我正试图根据这篇文章做chrome扩展和chrome应用程序之间的交叉扩展消息传递。但我不确定如何正确地做它。我使用后台js来接收和发送消息。但不知道它是否有效。实际上我想保存文件从chrome扩展,因为它不能做到我认为这可以工作。所以任何想法、建议或例子都是非常欢迎的。
就像这个问题一样,我已经考虑了很多选择。其中一个答案指出了这个例子。我发现这个例子工作得很好。我希望我可以使用这种机制来保存文件使用Chrome应用程序的文件系统API。
Chrome消息传递api只能传输json序列化值。如果文件很小,那么你可以在扩展中使用FileReader
读取文件内容,通过外部消息传递通道发送消息到Chrome应用程序,然后使用FileWriter
API保存数据。
当文件较大时,使用file.slice(start, end)
分块读取文件,然后使用与小文件相同的方法。
var app_id = '.... ID of app (32 lowercase a-p characters) ....';
var file = ...; // File or Blob object, e.g. from an <input type=file>
var fr = new FileReader();
fr.onload = function() {
var message = {
blob: fr.result,
filename: file.name,
filetype: file.type
};
chrome.runtime.sendMessage(app_id, message, function(result) {
if (chrome.runtime.lastError) {
// Handle error, e.g. app not installed
console.warn('Error: ' + chrome.runtime.lastError.message);
} else {
// Handle success
console.log('Reply from app: ', result);
}
});
};
fr.onerror = function() { /* handle error */ };
// file or sliced file.
fr.readAsText(file);
应用程序:
chrome.runtime.onMessageExternal.addListener(
function(message, sender, sendResponse) {
// TODO: Validate that sender.id is allowed to invoke the app!
// Do something, e.g. convert back to Blob and do whatever you want.
var blob = new Blob([message.blob], {type: message.filetype});
console.log('TODO: Do something with ' + message.filename + ':', blob);
// Do something, e.g. reply to message
sendResponse('Processed file');
// if you want to send a reply asynchronously, uncomment the next line.
// return true;
});
编辑:虽然下面的方法在理论上听起来不错,但它在实践中不起作用,因为为应用程序/扩展创建了一个单独的SharedWorker进程。
如果您想发送大文件(例如File
s),那么您可以实现以下操作:
- 扩展:创建
proxy.html
(content =<script src=proxy.js></script>
)。(请随意选择其他名称)。 - 扩展:Put
proxy.html
inweb_accessible_resources
. - App:绑定
window.onmessage
事件监听器这个事件监听器将接收来自你要在下一步中加载的帧的消息。 - App:加载
chrome-extension://[EXTENSIONID]/proxy.html
在你的应用程序内的一个框架。这个扩展ID可以硬编码(参见获取Chrome扩展ID开发)或通过外部扩展消息传递API交换(确保你验证源-硬编码ID将是最好的方式)。 - 扩展:当
proxy.html
加载时,检查location.ancestorOrigins[0] == 'chrome-extension://[APPID]'
是否加载,以避免安全漏洞。 - 扩展:当你想传递一个
File
或Blob
的应用程序,使用parent.postMessage(blob, 'chrome-extension://[APPID]');
- App:当它从扩展帧接收blob时,将其保存到通过
chrome.fileSystem
API获得的文件系统中。
最后一个要解决的任务是从扩展到扩展框架(proxy.html
)的文件,该扩展框架嵌入在应用程序中。这可以通过SharedWorker
完成,参见此示例答案(您可以跳过创建新框架的部分,因为扩展框架已经在前面的步骤之一中创建)。
请注意,目前(Chrome 35), File
s只能发送一个工作,由于一个错误。
相关文章:
- 通过chrome后台扩展或后台应用程序访问用户麦克风
- 访问可扩展QML应用程序中的列表视图索引
- 扩展成员应用程序,包括新的路线,现在没有任何渲染
- 如何显示带有Google Packaged应用程序或扩展程序的托盘图标
- Chrome扩展应用程序在安装后不会显示徽标图像
- 如何将 Backbonejs 用于大型可扩展应用程序
- 扩展 console.log() 的 javascript Web 应用程序的客户端日志记录
- 如何在Chrome OS或Chrome扩展程序的打包应用程序中启用摄像头和麦克风
- Chrome 扩展程序 / 应用程序设置 Javascript
- 为什么浏览器扩展程序比纯基于 Web 的应用程序更安全
- 如何将 Chrome 扩展程序转换为 Chrome 应用程序
- React(来自Facebook的应用程序框架)和react.js(JS的反应式扩展)之间有什么区别/相似之处
- 从chrome扩展向chrome应用程序发送消息
- 当不同的应用程序有焦点时,有没有一种方法,可能使用chrome扩展,让chrome在窗口中成为焦点
- 在应用商店中使用Apache Cordova MS VS扩展保护应用程序
- 在ios 8应用程序扩展javascript文件中使用jQuery
- 您应该在socket.io中手动批处理可扩展应用程序的数据包吗
- 可扩展应用程序的CORS问题
- 在chrome扩展应用程序中更改浏览器操作工具提示上的标题
- 不扩展应用程序模板 emberjs