public Task <JavaScriptExecutionResult> ExecuteFunctionAsync(CefFrame frame, JavaScriptValue[] arguments = null) { CheckIsRendererFunction(); var tsc = new TaskCompletionSource <JavaScriptExecutionResult>(); if (JavaScriptObjectRepository.JavaScriptExecutionTasks.TryAdd(new Tuple <int, long>(tsc.GetHashCode(), frame.Identifier), tsc)) { var jsvalue = arguments == null?JavaScriptValue.CreateArray() : arguments.ToJSValue(); var message = BridgeMessage.Create(JavaScriptCommunicationBridge.EVALUATE_JS_CALLBACK); message.Arguments.Add(MessageValue.CreateInt(tsc.GetHashCode())); message.Arguments.Add(MessageValue.CreateInt(JSFunctionDescriber.Id)); message.Arguments.Add(MessageValue.CreateString(jsvalue.ToDefinition())); JavaScriptCommunicationBridge.SendProcessMessage(CefProcessId.Renderer, frame, message); return(tsc.Task); } throw new InvalidOperationException("Same function already exists."); }