【问题标题】:How to get JS Object in Chromium Embedded Framework (CEF)?如何在 Chromium Embedded Framework (CEF) 中获取 JS 对象?
【发布时间】:2013-01-09 13:49:02
【问题描述】:

是否可以使用 CEF API 获取现有对象引用?

例如,我使用 ExecuteJavaScript() 运行脚本

function foo()
{
    var self = this;
    self.value="some value";
}
var fooObj = new foo;

此脚本创建一个新变量fooObj。以后可以在 C++ 代码中获取对这个变量的引用并修改它的值吗?

【问题讨论】:

    标签: c++ chromium chromium-embedded


    【解决方案1】:

    您应该能够通过执行以下操作(未经测试)来获得它:

        auto context = AppGetBrowser()->GetMainFrame()->GetV8Context();
        CefRefPtr<CefV8Value> p = context->GetGlobal()->GetValue(CefString("fooObj"));
    

    您可能需要进入/退出上下文,具体取决于您在 C++ 中从何处调用它。此外,您可能需要实际将对象显式引用为“window.fooObj”,在这种情况下,您必须获取“window”的值,然后从中获取“fooObj”。

    (编辑 - 不小心发布得太早了) (编辑 2 - 更多)

    【讨论】:

    • 在字符串 cef_v8context_t* 上的 GetV8Context 上有一个断点 retval = struct->get_v8context(struct_);在 frame_ctocpp.cc 中。上下文之前的一切都很好。我正在尝试在 win32 回调函数中使用它。也许你有什么想法?
    • @SinnerSmile - 我已经有一段时间没有做它了,但是 IIRC 如果你从一个可疑的 JS 状态调用,你需要调用浏览器上的某种 EnterContext/ExitContext 东西...
    • 是的,但是我怎么能输入它,如果我什至无法获得上下文来输入...看来我需要使用 onContextCreated() OVERRIDE,这将在上下文时触发创建,并在那里做我肮脏的价值分配,只有假设,它是如何工作的,会尝试并希望这次我没有弄错。