/// <summary> /// Calls the function. /// </summary> /// <param name="name">The name.</param> /// <exception cref="System.ArgumentNullException">name</exception> internal void CallFunction(string name) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } MessageUtility.SendMessage(CefBrowser, "callFunction", null, new CallFunction { Name = name, Data = Undefined.Value }); }
/// <summary> /// Calls the function asynchronous. /// </summary> /// <param name="name">The name.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">name</exception> internal Task <JToken> CallFunctionAsync(string name) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } var callbackId = Guid.NewGuid(); var taskCompletionSource = new TaskCompletionSource <JToken>(); WaitingCallFunction.TryAdd(callbackId, taskCompletionSource); MessageUtility.SendMessage(CefProcessId.Renderer, CefBrowser, "callFunction", new CallFunction { Name = name, Data = Value.Undefined, CallbackId = callbackId }); return(taskCompletionSource.Task); }
private void ProcessMessageCallFunction(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage processMessage) { var callFunction = MessageUtility.DeserializeMessage <CallFunction>(processMessage); if (!Functions.ContainsKey(callFunction.Name)) { throw new InvalidOperationException(string.Format("Function '{0}' not found.", callFunction.Name)); } JToken returnValue = null; if (callFunction.Data != Value.Undefined) { returnValue = Functions[callFunction.Name].Execute(callFunction.Data); } else { returnValue = Functions[callFunction.Name].Execute(); } MessageUtility.SendMessage(CefProcessId.Browser, CefBrowser, "callFunctionResult", new CallFunctionResult { Result = returnValue, CallbackId = callFunction.CallbackId }); }
private void JavascriptFunctionNative(CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue) { if (arguments == null) { throw new ArgumentNullException("arguments"); } if (arguments.Length < 2 || !arguments[0].IsString || !arguments[1].IsString || arguments.Length > 2 && !arguments[2].IsFunction) { throw new ArgumentException("Invalid arguments.", "arguments"); } returnValue = null; var functionName = arguments[0].GetStringValue(); var jsonData = arguments[1].GetStringValue(); var callbackFunction = arguments.Length > 2 && arguments[2].IsFunction ? arguments[2] : null; var callbackId = AddCallback(callbackFunction, CefV8Context.GetCurrentContext()); MessageUtility.SendMessage(CefProcessId.Browser, CefBrowser, "native", new CallNative { Name = functionName, Json = jsonData, CallbackId = callbackId }); }
public bool ProcessMessage(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage processMessage) { if (processMessage.Name == "native") { var message = MessageUtility.DeserializeMessage <CallNative>(processMessage); BaseMainApplication.Current.InvokeOnMainAsync(() => { var returnData = (object)null; var exception = (Exception)null; // native found if (ProcessMessages.ContainsKey(message.Data.Name)) { try { returnData = ProcessMessages[message.Data.Name](message.Data.Json); } catch (Exception e) { exception = e; returnData = null; } } else { exception = new NativeNotFoundException(message.Data.Name); } // callback if (message.CallbackId != null) { var nativeResponse = new NativeResponse(); if (exception != null) { nativeResponse.Exception = ExceptionUtility.CreateJavascriptException(exception); nativeResponse.Type = NativeResponseType.Exception; nativeResponse.Value = null; } else { if (returnData == Undefined.Value) { nativeResponse.Exception = null; nativeResponse.Type = NativeResponseType.Undefined; nativeResponse.Value = null; } else { nativeResponse.Exception = null; nativeResponse.Type = NativeResponseType.Value; nativeResponse.Value = returnData; } } var returnJson = JsonUtility.SerializeToJson(nativeResponse); MessageUtility.SendMessage(browser, "native", message.CallbackId, returnJson); } }).ContinueWith(t => { GeneralLog.Error("Native call exception.", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted); return(true); } return(false); }
private void ProcessMessageNative(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage processMessage) { var callNative = MessageUtility.DeserializeMessage <CallNative>(processMessage); Application.Current.InvokeOnMainAsync(() => { object returnData = null; Exception exception = null; NativeFunctionDelegate handler; NativeFunctionDelegates.TryGetValue(callNative.Name, out handler); // function call if (handler != null) { try { returnData = handler(callNative.Json); } catch (Exception e) { exception = e; } } else { exception = new NativeNotFoundException(callNative.Name); } // callback if (callNative.CallbackId != null) { var nativeResponse = new NativeResponse(); if (exception != null) { nativeResponse.Exception = ExceptionUtility.CreateJavascriptException(exception); nativeResponse.Type = NativeResponseType.Exception; nativeResponse.Value = null; } else { if (returnData == Value.Undefined) { nativeResponse.Exception = null; nativeResponse.Type = NativeResponseType.Undefined; nativeResponse.Value = null; } else { nativeResponse.Exception = null; nativeResponse.Type = NativeResponseType.Value; nativeResponse.Value = returnData; } } var returnJson = JsonUtility.SerializeToJson(nativeResponse); MessageUtility.SendMessage(CefProcessId.Renderer, browser, "native", new CallNativeResult { JsonResult = returnJson, CallbackId = callNative.CallbackId }); } }).ContinueWith(t => { Logger.Error("Native call exception.", t.Exception); }, TaskContinuationOptions.OnlyOnFaulted); }
protected override void SyncPropertyInternal(string name, object value) { MessageUtility.SendMessage(CefProcessId.Browser, CefBrowser, "syncProperty", new SyncProperty { Name = name, Value = value }); }
private void SyncPropertyWithSendMessage(string name, object value) { MessageUtility.SendMessage(CefProcessId.Renderer, Window.CefBrowser, "syncProperty", new SyncProperty { Name = name, Value = value }); }
/// <summary> /// Sends the request to the browser process. /// </summary> /// <param name="name"></param> /// <param name="obj"></param> /// <param name="arguments"></param> /// <param name="returnValue"></param> /// <param name="exception"></param> /// <returns></returns> protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception) { if (arguments == null) { throw new ArgumentNullException("arguments"); } returnValue = null; exception = null; // native if (name == "native") { var functionName = arguments[0].GetStringValue(); var jsonData = arguments[1].GetStringValue(); var callbackFunction = arguments.Length > 2 && arguments[2].IsFunction ? arguments[2] : null; var callbackId = AddCallback(callbackFunction, CefV8Context.GetCurrentContext()); MessageUtility.SendMessage(CefBrowser, "native", callbackId, new CallNative { Name = functionName, Json = jsonData }); return(true); } // register function else if (name == "registerFunction") { var functionName = arguments[0].GetStringValue(); var function = arguments[1]; if (!Functions.ContainsKey(functionName)) { Functions.Add(functionName, new JavascriptFunction(function, CefV8Context.GetCurrentContext())); } else { exception = string.Format("Function '{0}' is already registered.", functionName); } return(true); } // load internal script else if (name == "loadInternalScript") { if (arguments.Length > 0 && arguments[0].IsString) { var scriptName = "Scripts/" + arguments[0].GetStringValue(); if (ResourceUtility.ResourceExists(scriptName)) { CefV8Value evalReturnValue = null; CefV8Exception evalException = null; string script = ResourceUtility.GetResourceAsString(scriptName); var context = CefV8Context.GetCurrentContext(); if (!context.TryEval(script, out evalReturnValue, out evalException)) { exception = string.Format("Exception: {0}.", JsonConvert.SerializeObject(exception)); } } else { exception = "Script not found."; } } else { exception = "Missing script name."; } return(true); } return(false); }