protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { if (frame.IsMain) { LogManager.CefLog("-> Setting main context!"); Browser father = CefUtil.GetBrowserFromCef(browser); if (father != null) { if (!CefUtil.DISABLE_CEF) { father._mainContext = context; } LogManager.CefLog("-> Main context set!"); } } CefV8Value global = context.GetGlobal(); CefV8Value func = CefV8Value.CreateFunction("resourceCall", new V8Bridge(browser)); global.SetValue("resourceCall", func, CefV8PropertyAttribute.None); CefV8Value func2 = CefV8Value.CreateFunction("resourceEval", new V8Bridge(browser)); global.SetValue("resourceEval", func2, CefV8PropertyAttribute.None); base.OnContextCreated(browser, frame, context); }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { /*缓存数据库*/ string extensionCode = "var cachedb;" + "if(!cachedb)" + " cachedb={};"+ "(function() {" + " cachedb.Connect = function(dbName) {" + " native function Connect(dbName);"+ " return Connect(dbName);"+ " };" + " cachedb.Execute = function(commandText) {" + " native function Execute(commandText);"+ " return Execute(commandText);"+ " };" + " cachedb.Query = function(commandText) {" + " native function Query(commandText);"+ " return Query(commandText);"+ " };" + " cachedb.Close = function() {" + " native function Close();"+ " return Close();"+ " };" + "})();"; CefV8Handler ExtendsionHandler = new CwbJsExtendHandler(browser); CefRuntime.RegisterExtension("v8/cachedb", extensionCode, ExtendsionHandler); /*屏幕分辨率设置*/ int w = webBrowser.screenWidth; int h = webBrowser.screenHeight; if (w > 0 && h > 0) { string jscode = "Object.defineProperty(window.screen, 'height', {" + " get: function() {" + " return " + h + ";" + " }" + "});" + "Object.defineProperty(window.screen, 'width', {" + " get: function() {" + " return " + w + ";" + " }" + "});"; frame.ExecuteJavaScript(jscode, frame.Url, 0); } /*注册执行C#方法*/ CefV8Value globalValue = context.GetGlobal(); CefV8Handler callHandler = new CwbJsExtendHandler(browser); CefV8Value callMethod = CefV8Value.CreateFunction("CallCSharpMethod", callHandler); globalValue.SetValue("CallCSharpMethod", callMethod, CefV8PropertyAttribute.None); base.OnContextCreated(browser, frame, context); }
private static XrayHandle GetGlobalInternal(CefFrame frame) { if (!CefApi.CurrentlyOn(CefThreadId.Renderer)) { using (var callTask = new V8CallTask(() => GetGlobalInternal(frame))) { if (!CefApi.PostTask(CefThreadId.Renderer, callTask)) { throw new InvalidOperationException(); } return((XrayHandle)callTask.GetResult()); } } CefV8Context context = frame.V8Context; if (!context.Enter()) { throw new InvalidOperationException(); } try { CefV8Value globalObj = context.GetGlobal(); return((XrayHandle)CastCefV8ValueToDotnetType(context, globalObj, out bool isxray)); } finally { context.Exit(); } }
/// <summary> /// Call from CefRenderProcessHandler::OnContextCreated. Registers the /// JavaScripts functions with the new context. /// </summary> public void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { Helpers.RequireRendererThread(); // Do not keep any references to CefV8Value objects, otherwise // we should release all of them in OnContextReleased method (so we // can't rely on GC for this purpose). // Register function handlers with the 'window' object. using (var window = context.GetGlobal()) { var handler = new V8HandlerImpl(this, _config); CefV8PropertyAttribute attributes = CefV8PropertyAttribute.ReadOnly | CefV8PropertyAttribute.DontEnum | CefV8PropertyAttribute.DontDelete; // Add the query function. using (var queryFunc = CefV8Value.CreateFunction(_config.JSQueryFunction, handler)) { window.SetValue(_config.JSQueryFunction, queryFunc, attributes); } // Add the cancel function. using (var cancelFunc = CefV8Value.CreateFunction(_config.JSCancelFunction, handler)) { window.SetValue(_config.JSCancelFunction, cancelFunc, attributes); } } }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { CefV8Value cefV8Value = context.GetGlobal(); cefV8Value.SetValue("appName", CefV8Value.CreateString("CMCS.Monitor.Win"), CefV8PropertyAttribute.ReadOnly); base.OnContextCreated(browser, frame, context); }
/// <summary> /// Creates a "createPromise" function on the JS side. /// </summary> private CefPromiseFactory CreatePromiseFactory() { context.Enter(); context.GetFrame().ExecuteJavaScript(@" window.createPromise = function (fn) { return new Promise(fn); }; ", null, 1); var global = context.GetGlobal(); var promiseFactoryFn = global.GetValue("createPromise"); var promiseFactory = new CefPromiseFactory(promiseFactoryFn); context.Exit(); return(promiseFactory); }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { CefV8Value global = context.GetGlobal(); CefV8Value func = CefV8Value.CreateFunction("magic", new V8Handler()); global.SetValue("magic", func, CefV8PropertyAttribute.None); base.OnContextCreated(browser, frame, context); }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { foreach (var kvp in CefRuntimeEx.GetObjects()) { BindingHandler.Bind(kvp.Key, kvp.Value, context.GetGlobal()); } base.OnContextCreated(browser, frame, context); }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { var global = context.GetGlobal(); var extent = CefV8Value.CreateObject(null); global.SetValue("V8", extent, CefV8PropertyAttribute.None); base.OnContextCreated(browser, frame, context); }
private void InitializeContext(CefBrowser browser, CefFrame frame, CefV8Context context) { if (_pluginContext == null) { Logger.Error("Could not locate plugin context for V8. Browser {0} Frame {1}", browser.Identifier, frame.Identifier); return; } // TODO : Put in an optimization to not create the JS Object model if the current browser is a DEV TOOLS instance var window = context.GetGlobal(); foreach (var pluginId in _pluginContext.GetPluginIds()) { var pluginPath = pluginId.Split('.'); var pluginV8HostObject = window; var clashDetected = false; for (var pluginPathSectionIndex = 0; pluginPathSectionIndex < pluginPath.Length; pluginPathSectionIndex++) { var pathSection = pluginPath[pluginPathSectionIndex]; if (pluginPathSectionIndex == 0 && pathSection == "window") { // Fully scoped path - parent should stay as the root/global object until next section continue; } if (pluginV8HostObject.HasValue(pathSection)) { pluginV8HostObject = pluginV8HostObject.GetValue(pathSection); if (!pluginV8HostObject.IsObject) { // Most likely a clash of JS paths between plugins // TODO: warn that this current plugin could not be added clashDetected = true; break; } } else { var child = CefV8Value.CreateObject(null); pluginV8HostObject.SetValue(pathSection, child, CefV8PropertyAttribute.DontEnum | CefV8PropertyAttribute.DontDelete); pluginV8HostObject = child; } } if (clashDetected) { continue; } V8PluginAdapter.Create(_pluginContext.GetPluginById(pluginId), pluginV8HostObject); } }
protected unsafe override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { if (frame.IsMain) { _context.MainFrame.BindContext(context); } var obj = context.GetGlobal(); Cef.JSBindingContext.BindObjects(obj); _context.JSBindingContext.BindObjects(obj); obj.Dispose(); }
public static void RegisteredType(Type type, CefBrowser browser, CefFrame frame, CefV8Context context) { var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static); foreach (var method in methods) { var parames = method.GetParameters(); var function = new JSFunctionV8Handler(); function.JSFunction = (string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception) => { //有参数 if (parames != null && parames.Length > 0) { var agrs = new object[parames.Length]; for (int i = 0; i < parames.Length; i++) { object arg = null; if (i < arguments.Length) { arg = CefV8ValueConvert(arguments[i]); } var param = parames[i]; //获取value的值 if (arg == null) { continue; } //如果参数类型不对 if (arg.GetType() != param.ParameterType) { continue; } agrs[i] = arg; } method.Invoke(null, agrs); } else { //无参数 method.Invoke(null, null); } exception = null; returnValue = CefV8Value.CreateNull(); return(true); }; //绑定到context中去 context.GetGlobal().SetValue(method.Name, CefV8Value.CreateFunction(method.Name, function), CefV8PropertyAttribute.DontDelete | CefV8PropertyAttribute.ReadOnly); } }
internal static CefV8Value CastCefValueToCefV8Value(CefV8Context context, CefValue value, out bool isNew) { isNew = true; if (value is null) { return(CefV8Value.CreateNull()); } if (!value.IsValid) { throw new InvalidCastException(); } CefValueType valueType = value.Type; switch (valueType) { case CefValueType.String: return(new CefV8Value(value.GetString())); case CefValueType.Int: return(new CefV8Value(value.GetInt())); case CefValueType.Bool: return(new CefV8Value(value.GetBool())); case CefValueType.Null: return(CefV8Value.CreateNull()); case CefValueType.Double: return(new CefV8Value(value.GetDouble())); case CefValueType.Binary: CefBinaryValue v = value.GetBinary(); if (v.Size == 1) { return(CefV8Value.CreateUndefined()); } XrayHandle handle = XrayHandle.FromCfxBinaryValue(v); if (handle == XrayHandle.Zero) { return(context.GetGlobal()); } isNew = (handle.dataType != XrayDataType.Object && handle.dataType != XrayDataType.Function); return(handle.ToCefV8Value(context.Frame)); } throw new NotSupportedException(); }
protected override unsafe void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { if (frame.IsMain) { _context.MainFrame.BindContext(context); } var obj = context.GetGlobal(); Cef.JSBindingContext.BindObjects(obj); _context.JSBindingContext.BindObjects(obj); obj.Dispose(); }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { base.OnContextCreated(browser, frame, context); context.Enter(); //可在這裡面改V8引擎載入的js物件 var window = context.GetGlobal(); var computerName = CefV8Value.CreateString(Environment.MachineName); window.SetValue("computer_name", computerName, CefV8PropertyAttribute.DontDelete | CefV8PropertyAttribute.ReadOnly); context.Exit(); }
public bool IsPromise(CefV8Value v8Value, CefV8Context context) { using (new ContextHelper(context)) using (var global = context.GetGlobal()) using (var s = global.GetValue(HelperObjectName)) { var userData = s.GetUserData() as PromiseUserData; var isPromise = userData.IsPromise; using (var result = isPromise.ExecuteFunction(null, new[] { v8Value })) { return(result.GetBoolValue()); } } }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { if (frame.IsMain) { // Retrieve the context's window object and install the "cefReportDocumentSize" function // used to tell the node about the document size. using (var window = context.GetGlobal()) { var handler = new CustomCallbackHandler(browser, frame); var reportDocumentSizeFunc = CefV8Value.CreateFunction(CustomCallbackHandler.ReportDocumentSize, handler); window.SetValue(CustomCallbackHandler.ReportDocumentSize, reportDocumentSizeFunc, CefV8PropertyAttribute.None); } } base.OnContextCreated(browser, frame, context); }
public void Then(CefV8Value promise, CefV8Context context, Action <PromiseResult> continuation) { var id = pendingPromises.Save(context.GetFrame().Identifier, new PendingPromise { Continuation = continuation }); using (new ContextHelper(context)) using (var global = context.GetGlobal()) using (var s = global.GetValue(HelperObjectName)) { var userData = s.GetUserData() as PromiseUserData; var waitForPromise = userData.WaitForPromise; using (var idValue = CefV8Value.CreateString(id.ToString())) { waitForPromise.ExecuteFunctionWithContext(context, null, new[] { promise, idValue }).Dispose(); } } }
/// <summary> /// Call from CefRenderProcessHandler::OnContextCreated. Registers the /// JavaScripts functions with the new context. /// </summary> public void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { Helpers.RequireRendererThread(); // Register function handlers with the 'window' object. var window = context.GetGlobal(); var handler = new V8HandlerImpl(this, _config); CefV8PropertyAttribute attributes = CefV8PropertyAttribute.ReadOnly | CefV8PropertyAttribute.DontEnum | CefV8PropertyAttribute.DontDelete; // Add the query function. var queryFunc = CefV8Value.CreateFunction(_config.JSQueryFunction, handler); window.SetValue(_config.JSQueryFunction, queryFunc, attributes); // Add the cancel function. var cancelFunc = CefV8Value.CreateFunction(_config.JSCancelFunction, handler); window.SetValue(_config.JSCancelFunction, cancelFunc, attributes); }
/// <summary> /// The on context created. /// </summary> /// <param name="browser"> /// The browser. /// </param> /// <param name="frame"> /// The frame. /// </param> /// <param name="context"> /// The context. /// </param> protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { #region Initialize var global = context.GetGlobal(); #endregion #region Exposed CefV8Value exposed = CefV8Value.CreateObject(); global.SetValue("exposed", exposed, CefV8PropertyAttribute.None); #endregion #region Cef Assembly var extension = new CefAssembly(browser, frame, context); extension.CreateObject(global, new List <string>() { "mscorlib", "System", "System.Core" }); //extension.CreateObject(global, AppDomain.CurrentDomain.GetAssemblies().Where(s => //{ // if (s.GetName().Name.StartsWith("blis")) return true; // return false; //}) //.Select(s => s.GetName().Name).ToList()); #endregion #region Custom XHR var xhr = new xhrObject(browser, frame, context); global.SetValue("xHttpRequest", xhr.CreateObject(), CefV8PropertyAttribute.None); #endregion #region V8 Engine API var v8Engine = new V8EngineObject(browser, frame, context); global.SetValue("V8Engine", v8Engine.CreateObject(), CefV8PropertyAttribute.None); #endregion #region Database API var database = new DatabaseObject(browser, frame, context); global.SetValue("DB", database.CreateObject(), CefV8PropertyAttribute.None); #endregion #region Console API var console = new ConsoleObject(browser, frame, context); global.SetValue("Console", database.CreateObject(), CefV8PropertyAttribute.None); #endregion #region Window API var window = new WindowObject(browser, frame, context); global.SetValue("Window", window.CreateObject(), CefV8PropertyAttribute.None); #endregion #region Server API var server = new ServerObject(browser, frame, context, this); global.SetValue("Server", server.CreateObject(), CefV8PropertyAttribute.None); #endregion #region ChromeDevToosProtocol Object var chromeDevToolsProtocol = new ChromeDevToolsProtocol(browser, frame, context); global.SetValue("DevTools", chromeDevToolsProtocol.CreateObject(), CefV8PropertyAttribute.None); #endregion #region OnContextCreated MessageRouter.OnContextCreated(browser, frame, context); context.Dispose(); #endregion }
private static object InvokeScript(CefV8Context context, string memberName, params object[] args) { if (context == null) { throw new ArgumentNullException("context"); } if (!context.Enter()) { throw new CefException("Failed to enter V8 context."); } try { // TODO: this list can be private list of context, 'cause we can invoke only one function at one time List <CefV8Value> proxies = new List <CefV8Value>(16); // javascript 'this' object CefV8Value obj = null; CefV8Value target = context.GetGlobal(); proxies.Add(target); if (!memberName.Contains('.')) { obj = target; target = obj.GetValue(memberName); proxies.Add(target); } else { foreach (var member in memberName.Split('.')) { obj = target; target = obj.GetValue(member); // TODO: do analysis of target - if it is not an object - throw if (!target.IsObject) { throw new CefException("Argument 'memberName' must be member access expression to a function. Invalid object in path."); } proxies.Add(target); } } if (!target.IsFunction) { throw new ArgumentException("Argument 'memberName' must be member access expression to a function."); } CefV8Value[] v8Args; if (args.Length == 0) { v8Args = null; } else { v8Args = new CefV8Value[args.Length]; // TODO: InvokeScript core can be optimized by prevent recreating arrays for (var i = 0; i < args.Length; i++) { var value = CefConvert.ToV8Value(args[i]); v8Args[i] = value; } } var v8RetVal = target.ExecuteFunctionWithContext(context, obj, v8Args); // force destroing of proxies, to avoid unneccessary GC load (CLR and V8) foreach (var proxy in proxies) { proxy.Dispose(); } proxies.Clear(); // FIXME: not sure if exception CAN be null, this need to be checked if (v8RetVal.HasException) { var exception = v8RetVal.GetException(); throw new JavaScriptException(exception.GetMessage()); } //if (!string.IsNullOrEmpty(exception)) var result = CefConvert.ToObject(v8RetVal); v8RetVal.Dispose(); return(result); } finally { if (!context.Exit()) { throw new CefException("Failed to exit V8 context."); } } }
private static object InvokeScript(CefV8Context context, string memberName, params object[] args) { if (context == null) throw new ArgumentNullException("context"); if (!context.Enter()) throw new CefException("Failed to enter V8 context."); try { // TODO: this list can be private list of context, 'cause we can invoke only one function at one time List<CefV8Value> proxies = new List<CefV8Value>(16); // javascript 'this' object CefV8Value obj = null; CefV8Value target = context.GetGlobal(); proxies.Add(target); if (!memberName.Contains('.')) { obj = target; target = obj.GetValue(memberName); proxies.Add(target); } else { foreach (var member in memberName.Split('.')) { obj = target; target = obj.GetValue(member); // TODO: do analysis of target - if it is not an object - throw if (!target.IsObject) throw new CefException("Argument 'memberName' must be member access expression to a function. Invalid object in path."); proxies.Add(target); } } if (!target.IsFunction) throw new ArgumentException("Argument 'memberName' must be member access expression to a function."); CefV8Value[] v8Args; if (args.Length == 0) v8Args = null; else { v8Args = new CefV8Value[args.Length]; // TODO: InvokeScript core can be optimized by prevent recreating arrays for (var i = 0; i < args.Length; i++) { var value = CefConvert.ToV8Value(args[i]); v8Args[i] = value; } } var v8RetVal = target.ExecuteFunctionWithContext(context, obj, v8Args); // force destroing of proxies, to avoid unneccessary GC load (CLR and V8) foreach (var proxy in proxies) proxy.Dispose(); proxies.Clear(); // FIXME: not sure if exception CAN be null, this need to be checked if (v8RetVal.HasException) { var exception = v8RetVal.GetException(); throw new JavaScriptException(exception.GetMessage()); } //if (!string.IsNullOrEmpty(exception)) var result = CefConvert.ToObject(v8RetVal); v8RetVal.Dispose(); return result; } finally { if (!context.Exit()) throw new CefException("Failed to exit V8 context."); } }
public void OnContextCreated(CefRenderProcessHandler.OnContextCreatedArgs args) { //----------------------- //this is TEST CODE //----------------------- return; //eg "<html><head><script>function docload(){ console.log(test001()); console.log(test_myobj.myprop);console.log(test_myobj[12345]);}</script><body onload=\"docload()\"><h1>hello!</h1></body></html>" dbugRenderProcessLog.WriteLine("context_created1"); CefV8Context context = args.context(); dbugRenderProcessLog.WriteLine("context_cx1"); //global => window object CefV8Value cefV8Global = context.GetGlobal(); // Auto.CefV8Handler funcHandler = new Auto.CefV8Handler(Cef3Binder.MyCefJs_New_V8Handler(Test002)); CefV8Value func = Auto.CefV8Value.CreateFunction("test001", funcHandler); cefV8Global.SetValue("test001", func, cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_READONLY); //------- dbugRenderProcessLog.WriteLine("context_cx2"); dbugRenderProcessLog.WriteLine("context_cx3"); CefV8Accessor accessor = CefV8Accessor.New((id, argPtr) => { //-------------------------- //this shows the unsafe and low-level interface to native. //you can use a 'higher' level wrapper. //-------------------------- //from https://github.com/v8/v8/wiki/Embedder%27s-Guide //accessor callbacks are invoked when a specific object property is accessed by a script //Accessors //An accessor is a C++callback that calculates and returns a value when an object property is accessed by a JavaScript script. //Accessors are configured through an object template, using the SetAccessor method. //This method takes the name of the property with which it is associated and two callbacks to run when a script attempts to read or write the property. CefV8Accessor.GetArgs arg = new CefV8Accessor.GetArgs(argPtr); arg.retval(CefV8Value.CreateString("hello! from accessor").nativePtr); arg.myext_setRetValue(true);//finish the accessor! }); CefV8Interceptor intercepter = CefV8Interceptor.New((id, argPtr) => { //from https://github.com/v8/v8/wiki/Embedder%27s-Guide //interceptor callbacks are invoked when any object property is accessed by a script Accessors and interceptors are discussed later in this document. // // //Interceptors // You can also specify a callback for whenever a script accesses any object property. These are called interceptors. For efficiency, there are two types of interceptors: // named property interceptors - called when accessing properties with string names. An example of this, in a browser environment, is document.theFormName.elementName. // indexed property interceptors - called when accessing indexed properties. An example of this, in a browser environment, is document.forms.elements[0]. //-------------------------- //this shows the unsafe and low-level interface to native. //you can use a 'higher' level wrapper. //-------------------------- if ((id >> 16) != CefV8Interceptor._typeNAME) { return; } //-------------------------- int met_id = id & 0xffff; switch (met_id) { case CefV8Interceptor.MyCefV8Interceptor_Get_1: { //by name CefV8Interceptor.get_bynameArgs arg = new CefV8Interceptor.get_bynameArgs(argPtr); arg.retval(CefV8Value.CreateString("hello! from intercepter" + arg.name()).nativePtr); } break; case CefV8Interceptor.MyCefV8Interceptor_Get_2: { //by indexed property } break; } }); //-------- //The difference between accessors and interceptors is that interceptors handle all properties, //while accessors are associated with one specific property. //-------- // CefV8Accessor empty = new CefV8Accessor(); CefV8Interceptor empty_interceptor = new CefV8Interceptor(); CefV8Value cef_object = CefV8Value.CreateObject(accessor, empty_interceptor); //if you want to use accessor, your must set it with SetValue() like this cef_object.SetValue("myprop", cef_v8_accesscontrol_t.V8_ACCESS_CONTROL_DEFAULT, cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_NONE); // //set to global object cefV8Global.SetValue("test_myobj", cef_object, cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_READONLY); //------ //-------------- //------- //TEST 1: raw, low level interface //------- IntPtr ret = IntPtr.Zero; IntPtr exception = IntPtr.Zero; //string jscode = "(function(){ return function (){return 1.25;}})()"; string jscode = "(function(){ return function (){ console.log('hello-eval1'); return 1.25;}})()"; if (context.Eval(jscode, "", 1, ref ret, ref exception)) { dbugRenderProcessLog.WriteLine("eval success"); } else { dbugRenderProcessLog.WriteLine("eval fail"); } // using (CefV8Value cefv8_ret = new CefV8Value(ret)) using (CefV8Value cefv8_excep = new CefV8Value(exception)) { if (cefv8_ret.IsFunction()) { CefV8Value obj1 = new CefV8Value(); //empty CefV8ValueList args1 = CefV8ValueList.NewList(); CefV8Value innerFuncResult = cefv8_ret.ExecuteFunction(obj1, args1); Cef3Binder.MyCefDeletePtr(args1.nativePtr); double innerDouble = innerFuncResult.GetDoubleValue(); } else { double v8ret_double = cefv8_ret.GetDoubleValue(); } } //low-level example, TODO: make this to O-O style //------ var myfunc2 = MyJsFunc <double> .Create(context, "function(a00){ console.log(a00);}"); myfunc2.Invoke(101); //------ var myfunc3 = MyJsFunc <string> .Create(context, "function(a00){ console.log(a00);}"); myfunc3.Invoke("HELLOO!"); //------ // var myfunc4 = MyJsFunc <double, string> .Create(context, "function(a00,a02){ console.log(a00); console.log(a02);}"); myfunc4.Invoke(101, "hello_myfunc4"); //------ var myfunc5 = MyJsFunc <string, string> .Create(context, "function(a00,a02){ console.log(a00); console.log(a02);}"); myfunc5.Invoke("HELLOO!", "hello_myfunc5"); //------ var myfunc6 = MyJsFunc.Create(context, "function(){ document.title='hello1'; document.write('0'); return document; }"); var doc = myfunc6.Invoke(); CefV8Value docTitle = doc.GetValue("title"); string docTitleAsString = docTitle.GetStringValue(); CefV8Value docBody = doc.GetValue("body"); if (!docBody.IsNull()) { //get innerHTML property CefV8Value innerHtmlProp = docBody.GetValue("innerHTML"); if (innerHtmlProp.IsString()) { } //set innerHTML property docBody.SetValue("innerHTML", CefV8Value.CreateString("A_Z"), cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_NONE); } CefV8Value docWrite = doc.GetValue("write"); if (docWrite.IsFunction()) //try getting 'write' method of the document object { CefV8ValueList writeArgs = CefV8ValueList.NewList(); writeArgs.AddElement(CefV8Value.CreateString("Hello_FROM_WRITE")); docWrite.ExecuteFunction(doc, writeArgs); Cef3Binder.MyCefDeletePtr(writeArgs.nativePtr); } //------ //if we write() all //we need to get doc again doc = myfunc6.Invoke(); cefV8Global = context.GetGlobal(); //low-level example, TODO: make this to O-O style CefV8Value cefGlobal_addEventListener = cefV8Global.GetValue("addEventListener"); if (cefGlobal_addEventListener.IsFunction()) { MyCefCallback cefWindowOnLoad = (id, argsPtr) => { //arg as mouse event args CefV8Handler.ExecuteArgs args2 = new CefV8Handler.ExecuteArgs(argsPtr); CefV8ValueList argumentList = args2.arguments(); int argCount = argumentList.GetListCount(); }; _cefCallbackKeeper.Add(cefWindowOnLoad); var v8Handler = new CefV8Handler(Cef3Binder.MyCefJs_New_V8Handler(cefWindowOnLoad)); CefV8ValueList handleArgs = CefV8ValueList.NewList(); //"load" handleArgs.AddElement(CefV8Value.CreateString("load")); CefV8Value v8Loadhandler = CefV8Value.CreateFunction("mydocload", v8Handler); //"eventHandler" handleArgs.AddElement(v8Loadhandler); cefGlobal_addEventListener.ExecuteFunction(cefV8Global, handleArgs); Cef3Binder.MyCefDeletePtr(handleArgs.nativePtr); } //------ //low-level example, TODO: make this to O-O style CefV8Value doc_addEventListener = doc.GetValue("addEventListener"); if (doc_addEventListener.IsFunction()) { MyCefCallback mouseDownCallback = (id, argsPtr) => { //arg as mouse event args CefV8Handler.ExecuteArgs args2 = new CefV8Handler.ExecuteArgs(argsPtr); CefV8ValueList argumentList = args2.arguments(); int argCount = argumentList.GetListCount(); CefV8Value v8arg = argumentList.GetElement(0); //get button propery CefV8Value v8button = v8arg.GetValue("button"); if (v8button.IsInt()) { int button = v8button.GetIntValue(); } }; _cefCallbackKeeper.Add(mouseDownCallback); var v8Handler = new CefV8Handler(Cef3Binder.MyCefJs_New_V8Handler(mouseDownCallback)); CefV8ValueList handleArgs = CefV8ValueList.NewList(); //"load" handleArgs.AddElement(CefV8Value.CreateString("mousedown")); CefV8Value v8Loadhandler = CefV8Value.CreateFunction("mycallback", v8Handler); //"eventHandler" handleArgs.AddElement(v8Loadhandler); cefGlobal_addEventListener.ExecuteFunction(doc, handleArgs); Cef3Binder.MyCefDeletePtr(handleArgs.nativePtr); } dbugRenderProcessLog.WriteLine("context_created-pass"); }
private static CefV8Value GetSafeThisArg(CefV8Context context, XrayObject target) { return(target?.Value ?? context.GetGlobal()); }
protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context) { if (frame.IsMain) { // Retrieve the context's window object and install the "vvvvReportDocumentSize" function // used to tell the node about the document size as well as the "vvvvSend" function // used to tell the node about variables computed inside the frame. using (var window = context.GetGlobal()) { var handler = new CustomCallbackHandler(browser, frame); var reportDocumentSizeFunc = CefV8Value.CreateFunction(CustomCallbackHandler.ReportDocumentSize, handler); window.SetValue(CustomCallbackHandler.ReportDocumentSize, reportDocumentSizeFunc); window.SetValue("vvvvQuery", CefV8Value.CreateFunction("vvvvQuery", new DelegatingHandler((name, obj, args) => { const string argForm = "{ request: 'NAME', arguments: {}, onSuccess: function(response) {}, onError: function(error_message) {} }"; string invalidArg = $"vvvvQuery expects one argument of the form {argForm}"; if (args.Length != 1) { throw new Exception($"vvvvQuery expects one argument"); } var x = args[0]; if (x is null || !x.IsObject) { throw new Exception($"The argument must be of the form {argForm}"); } var requestValue = x.GetValue("request"); if (requestValue.IsUndefined) { throw new Exception($"The request entry is missing"); } if (!requestValue.IsString) { throw new Exception($"The request must be a string"); } var onSuccessValue = x.GetValue("onSuccess"); if (!onSuccessValue.IsUndefined && !onSuccessValue.IsFunction) { throw new Exception($"The onSuccess entry must be a function"); } var onErrorValue = x.GetValue("onError"); if (!onErrorValue.IsUndefined && !onErrorValue.IsFunction) { throw new Exception($"The onError entry must be a function"); } var request = requestValue.GetStringValue(); var id = queryCount++; if (queries.TryAdd((request, id), (context, onSuccessValue, onErrorValue))) { using var message = CefProcessMessage.Create("query-request"); message.Arguments.SetString(0, request); message.Arguments.SetInt(1, id); message.Arguments.SetValue(2, ToValue(x.GetValue("arguments"))); frame.SendProcessMessage(CefProcessId.Browser, message); } return(default);