用于Cef扩展脚本的Javascript全局变量

时间:2016-03-02 11:44:32

标签: javascript c# google-chrome-extension chromium cefsharp

首先,我搜索了gitter和github讨论板和维基页面,但仍然没有动作..

所以我第一次问这个问题.....:

最后也可能是最好的事情是我尝试将对象暴露给javascript范围。 https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#Expose_dotNET

好的,这适用于字符串类型的对象。但我有一个复杂的对象,里面有几个字符串数组。

我想保留javascript变量,让我们在浏览器生命周期中将其称为var _myFilters值。

我知道关于cef扩展,我记得这句话:

  

Extensions Extensions就像窗口绑定,除了它们被加载   进入每个帧的上下文,一旦加载就无法修改。   加载扩展并尝试时,DOM不存在   在扩展加载期间访问DOM将导致崩溃。   使用CefRegisterExtension()函数注册扩展   哪个应该从   CefRenderProcessHandler :: OnWebKitInitialized()方法。

引自网站:https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration

所以我认为这是我可以创建全局javascript变量“_myFilters”的最佳位置。它应该可以在每个浏览器选项卡中访问,但我尝试了,并且看到它(请参阅:“_ myFilters”)在每次重新加载页面时丢失值。

注册对象是一个选项,但非常适合我复杂的javascript对象(_myFilters)..

browser.RegisterJsObject("bound", new BoundObject());

我试过但只适用于string,int等。

我打算公开一个“对象”(请参阅​​:_myFilters)数据类型,但这次浏览器崩溃了。

所以问题是:在浏览器loadstart,load end,onbrowse方法上执行javascript文件的文件中使用全局变量的最佳方法是什么?

ps:我想要这个,因为创建这个_myFilters对象是一项花费一些时间(大约3秒)的工作。我希望将其值放在我的全局值中,因此我可以在浏览器生命周期中使用它。

ps2:_myFilters的类型

enter image description here

1 个答案:

答案 0 :(得分:1)

  1. 如果您希望即使浏览器进程终止也可以存储您的变量,那么我建议您使用类似chrome.storage的存储API。

  2. 如果只需要在浏览器流程的整个过程中维护全局变量,我认为您可以在background page

    中设置变量
      

    它存在于您的扩展的生命周期中,并且一次只有一个活动的实例。

  3. 另一种选择是使用Event Pages。它与背景页面类似,只需在manifest.json中设置persistent false

      

    事件页面仅在需要时加载。当事件页面没有主动执行某些操作时,它将被卸载,释放内存和其他系统资源。

    然后,您还可以在事件页面中声明全局变量,在事件页面即将卸载时,使用chrome.storage.local.get()添加listen runtime.onSuspend来存储全局变量的状态。并且在加载事件页面时听取其他事件处理程序,这取决于您的需要,可能是browserAction.onClickedruntime.onMessage,使用chrome.storage.local.set()

    恢复全局变量状态