public V8Callback GetOrCreateCallback(IV8Plugin plugin, string memberName, CefV8Value callback, V8CallbackType callbackType)
        {
            V8Callback adapter = null;

            _callbacksByMemberName.AddOrUpdate(
                memberName,
                key =>
            {
                var disposeCallback = new Action <V8Callback>(cb => DisposeCallback(memberName, cb));
                adapter             = new V8Callback(plugin, callback, callbackType, disposeCallback);
                return(new List <V8Callback> {
                    adapter
                });
            },
                (key, list) =>
            {
                adapter = list.FirstOrDefault(c => c.CallbackFunction != null && c.CallbackFunction.IsSame(callback));
                if (adapter == null)
                {
                    var disposeCallback = new Action <V8Callback>(cb => DisposeCallback(memberName, cb));
                    adapter             = new V8Callback(plugin, callback, callbackType, disposeCallback);
                    list.Add(adapter);
                }

                return(list);
            });

            return(adapter);
        }
 public V8Callback(IV8Plugin plugin, CefV8Value callback, V8CallbackType callbackType, Action <V8Callback> disposeHandler = null)
 {
     _plugin          = plugin;
     CallbackFunction = callback;
     _callbackType    = callbackType;
     _disposeHandler  = disposeHandler;
     Identifier       = Guid.NewGuid();
 }
        /// <summary>
        /// Create a new V8 plugin adapter.
        /// </summary>
        /// <param name="pluginObject">
        /// The local or remote native plugin to adapt to V8.
        /// </param>
        /// <param name="v8HostObject">
        /// Optional - if supplied, the adapter will add the native methods and events to this
        /// existing object instead of creating a new one with a property accessor.
        /// </param>
        private V8PluginAdapter(IV8Plugin pluginObject, CefV8Value v8HostObject = null)
        {
            Plugin   = pluginObject;
            V8Object = v8HostObject;
            if (V8Object == null)
            {
                V8Object = CefV8Value.CreateObject(new PluginV8Accessor());
                V8Object.SetUserData(this);
            }

            // Create a single method handler configured to handle all methods on the plugin
            var methodHandler = new PluginMethodV8Handler(Plugin);

            foreach (var methodDescriptor in Plugin.Descriptor.Methods)
            {
                V8Object.SetValue(methodDescriptor.MethodName,
                                  CefV8Value.CreateFunction(methodDescriptor.MethodName, methodHandler),
                                  CefV8PropertyAttribute.None);
            }

            foreach (var eventName in Plugin.Descriptor.Events)
            {
                // For each event, create a child object exposed as a property named after the event
                // The child object is a syntactic placeholder for the addListener/removeListener/hasListener/hasListeners methods

                var eventObject  = CefV8Value.CreateObject(null);
                var eventHandler = new PluginEventV8Handler(Plugin, eventName);

                eventObject.SetValue(PluginEventV8Handler.MethodNameAddListener,
                                     CefV8Value.CreateFunction(PluginEventV8Handler.MethodNameAddListener, eventHandler),
                                     CefV8PropertyAttribute.None);
                eventObject.SetValue(PluginEventV8Handler.MethodNameRemoveListener,
                                     CefV8Value.CreateFunction(PluginEventV8Handler.MethodNameRemoveListener, eventHandler),
                                     CefV8PropertyAttribute.None);
                eventObject.SetValue(PluginEventV8Handler.MethodNameHasListener,
                                     CefV8Value.CreateFunction(PluginEventV8Handler.MethodNameHasListener, eventHandler),
                                     CefV8PropertyAttribute.None);
                eventObject.SetValue(PluginEventV8Handler.MethodNameHasListeners,
                                     CefV8Value.CreateFunction(PluginEventV8Handler.MethodNameHasListeners, eventHandler),
                                     CefV8PropertyAttribute.None);

                V8Object.SetValue(eventName, eventObject, CefV8PropertyAttribute.None);
            }
        }
 public PluginMethodV8Handler(IV8Plugin plugin)
 {
     _plugin = plugin;
 }
 public LocalV8Callback(IV8Plugin plugin)
     : base(plugin, null, V8CallbackType.FunctionCallback, null)
 {
 }
Ejemplo n.º 6
0
 public PluginEventV8Handler(IV8Plugin pluginObject, string eventName)
 {
     _plugin    = pluginObject;
     _eventName = eventName;
 }
 public static V8PluginAdapter Create(IV8Plugin pluginObject, CefV8Value v8HostObject)
 {
     return(new V8PluginAdapter(pluginObject, v8HostObject));
 }