private void OnInvokeFunction(CefBrowser browser, PluginMessage pluginMessage, JavaScriptPlugin handler) { var methodDescriptor = handler.Descriptor.Methods.Find(descriptor => descriptor.MethodName == pluginMessage.MemberName); IJavaScriptPluginCallback returnCallback = null; BrowserCallInfo parameterCallback = null; if (pluginMessage.V8CallbackId != Guid.Empty) { if (methodDescriptor.HasCallbackParameter) { // Create a second stored callback info which represents the V8 callback function itself // rather than the method that is being invoked now. This allows the callback function // to be passed to and invoked by multiple native methods that accept a callback parameter. parameterCallback = _pendingCallbacks.Get(pluginMessage.V8CallbackId); if (parameterCallback == null) { var parameterCallbackMessage = new PluginMessage { MessageId = pluginMessage.V8CallbackId, MessageType = PluginMessageType.ParameterCallback, PluginId = string.Empty, MemberName = string.Empty, BrowserId = pluginMessage.BrowserId, ContextId = pluginMessage.ContextId, FrameId = pluginMessage.FrameId, V8CallbackId = Guid.Empty }; parameterCallback = CreateAndAddCall(browser.Clone(), parameterCallbackMessage, null, null); } } var returnCallInfo = CreateAndAddCall(browser, pluginMessage, handler, parameterCallback); if (!handler.IsValid) { RemoveAndCancelCall(returnCallInfo); return; } returnCallback = returnCallInfo; } JArray callArgs = null; if (!string.IsNullOrEmpty(pluginMessage.Data)) { callArgs = JArray.Parse(pluginMessage.Data); } handler.InvokeFunction( _pluginManager, pluginMessage.BrowserId, pluginMessage.FrameId, pluginMessage.ContextId, pluginMessage.MemberName, new JArrayJavaScriptParameters(callArgs), returnCallback); }
protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message) { if (browser != null) { // Clone the browser as CEFGlue will dispose the reference passed to this function when it returns browser = browser.Clone(); } // Use local variable to guard against client being disposed on different thread (assignment is atomic) var core = _core; return(core != null && core.OnProcessMessageReceived(browser, message)); }