V8 wiki



描述
V8是Google的开源JavaScript引擎。
V8是用C++编写的,在谷歌的开源浏览器Google Chrome中使用。
V8实现ECMA-262第5版中指定的ECMASScript,并运行在Windows(XP或更新版本)、Mac OS X(10.5或更新版本)和使用IA-32、x64或ARM处理器的Linux系统上。

编译:https://www.aldeid.com/wiki/V8

————————-

在其他工程中使用V8:https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration
(下为机器翻译+简单人工润色)

导言
Chrome和CEF使用V8 JavaScript引擎实现内部JavaScript(JS)。浏览器中的每个框架都有自己的JS上下文,为在该框架中执行的JS代码提供范围和安全性(有关更多信息,请参见“使用上下文”一节)。CEF为客户端应用程序中的集成提供了大量的JS特性。
对于CEF 3,Blink(WebKit)和JS执行在单独的呈现程序进程中运行。呈现程序进程中的主线程被标识为TID_renderer,所有V8执行都必须在该线程上执行。与JS执行相关的回调通过CefRenderProcessHandler接口公开。当初始化新的呈现程序进程时,通过CefApp::GetRenderProcessHandler()检索该接口。

应该使用异步回调来设计在浏览器和呈现程序进程之间进行通信的JSAPI。有关更多信息,请参见GeneralUsagewiki页面的“异步JavaScript绑定”部分。

执行JavaScript
从客户机应用程序执行JS的最简单方法是使用CefFrame::ExecuteJavaScript()函数。
该函数在浏览器进程和render程序进程中都可用,并且可以在JS上下文之外安全地使用。

CefRefPtr<CefBrowser> browser = ...;
CefRefPtr<CefFrame> frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('ExecuteJavaScript works!');",
    frame->GetURL(), 0);

上面的示例将执行alert(‘ExecuteJavaScriptWorks!’);在浏览器的主框架中执行。
可以使用ExecuteJavaScript()函数与框架的JS上下文中的函数和变量进行交互。
为了将值从JS返回到客户机应用程序,请考虑使用窗口绑定或扩展。

窗口绑定。
窗口绑定允许客户端应用程序将值附加到框架的窗口对象。
窗口绑定使用CefRenderProcessHandler::OnContextCreated()方法实现。

void MyRenderProcessHandler::OnContextCreated(
    CefRefPtr<CefBrowser> browser,
    CefRefPtr<CefFrame> frame,
    CefRefPtr<CefV8Context> context) {
  // Retrieve the context's window object.
  CefRefPtr<CefV8Value> object = context->GetGlobal();

  // Create a new V8 string value. See the "Basic JS Types" section below.
  CefRefPtr<CefV8Value> str = CefV8Value::CreateString("My Value!");

  // Add the string to the window object as "window.myval". See the "JS Objects" section below.
  object->SetValue("myval", str, V8_PROPERTY_ATTRIBUTE_NONE);
}

然后,框架中的JavaScript可以与窗口绑定交互。

<script language="JavaScript">
alert(window.myval); // Shows an alert box with "My Value!"
</script>

每次重新加载框架时,都会重新加载窗口绑定,从而使客户端应用程序有机会在必要时更改绑定。
例如,可以通过修改绑定到该帧的窗口对象的值,让不同的帧访问客户端应用程序中的不同功能。

扩展
扩展类似于窗口绑定,只是它们被加载到每个帧的上下文中,并且一旦加载就不能修改。
当加载扩展时,DOM不存在,并且在扩展加载期间试图访问DOM将导致崩溃。
扩展是使用应当从CefRenderProcessHandler::OnWebKitInitialized()方法调用的CefRegisterExtension()函数注册的。

void MyRenderProcessHandler::OnWebKitInitialized() {
  // Define the extension contents.
  std::string extensionCode =
    "var test;"
    "if (!test)"
    "  test = {};"
    "(function() {"
    "  test.myval = 'My Value!';"
    "})();";

  // Register the extension.
  CefRegisterExtension("v8/test", extensionCode, NULL);
}

ExtensionCode表示的字符串可以是任何有效的JS代码。
然后,框架中的JS可以与扩展代码交互。

<script language="JavaScript">
alert(test.myval); // Shows an alert box with "My Value!"
</script>

基本JS类型。
CEF支持创建基本的JS数据类型,包括未定义的、NULL、bool、int、Double、Date和String。
这些类型是使用CefV8Value::Create*()静态方法创建的。
例如,要创建一个新的JS字符串值,可以使用CreateString()方法。

CefRefPtr<CefV8Value> str = CefV8Value::CreateString("My Value!");

基本值类型可以随时创建,并且最初不与特定上下文关联(有关更多信息,请参见“使用上下文”一节)。
要测试值类型,请使用is*()方法。

CefRefPtr<CefV8Value> val = ...;
if (val.IsString()) {
  // The value is a string.
}

要检索该值,请使用get*value()方法。

CefString strVal = val.GetStringValue();
Sunday, July 15, 2018 by blast