Esempio n. 1
0
        public RemoteV8Plugin(IV8PluginRouter router, IPluginContext pluginContext, PluginDescriptor remoteObjectDescriptor)
            : base(pluginContext, remoteObjectDescriptor)
        {
            if (router == null)
            {
                throw new ArgumentNullException("router");
            }

            _router = router;
        }
        public virtual void Invoke(IV8PluginRouter router, CefV8Context context, object result, int errorCode, string error)
        {
            if (CallbackFunction == null)
            {
                throw new ObjectDisposedException("_callback");
            }

            // Have to enter the context in order to be able to create object/array/function/date V8 instances
            context.Enter();
            try
            {
                var args = new List <CefV8Value>();
                switch (_callbackType)
                {
                case V8CallbackType.ParameterCallback:
                case V8CallbackType.EventListener:
                {
                    var remoteResult = result as ResultData;
                    var localArray   = result as object[];

                    if (remoteResult != null)
                    {
                        if (remoteResult.Items != null)
                        {
                            args.AddRange(remoteResult.Items.Select(item => ToCefV8Value(router, item)));
                        }
                    }
                    else if (localArray != null)
                    {
                        args.AddRange(localArray.Select(item => ToCefV8Value(router, item)));
                    }

                    break;
                }

                case V8CallbackType.FunctionCallback:
                {
                    args.Add(ToCefV8Value(router, result));
                    args.Add(CefV8Value.CreateInt(errorCode));
                    args.Add(CefV8Value.CreateString(error));
                    break;
                }
                }
                var functionResult = CallbackFunction.ExecuteFunction(null, args.ToArray());
                if (functionResult == null && CallbackFunction.HasException)
                {
                    var exception = CallbackFunction.GetException();
                    Logger.Error("Error executing callback: ", exception.Message);
                }
            }
            finally
            {
                context.Exit();
            }
        }
        public LocalV8Plugin(IV8PluginRouter router, IPluginContext pluginContext, JavaScriptPlugin plugin)
            : base(pluginContext, plugin.Descriptor)
        {
            if (router == null)
            {
                throw new ArgumentNullException("router");
            }

            _router = router;
            _plugin = plugin;
        }
        /// <summary>
        /// Create an adapter for a local (in-process) plugin.
        /// </summary>
        /// <param name="router"></param>
        /// <param name="pluginContext"></param>
        /// <param name="jsPlugin"></param>
        /// <returns></returns>
        public static V8PluginAdapter CreateLocal(IV8PluginRouter router, IPluginContext pluginContext, JavaScriptPlugin jsPlugin)
        {
            if (jsPlugin == null)
            {
                return(null);
            }

            var plugin        = new LocalV8Plugin(router, pluginContext, jsPlugin);
            var pluginAdapter = new V8PluginAdapter(plugin);

            return(pluginAdapter);
        }
 public override void Invoke(IV8PluginRouter router, CefV8Context context, object result, int errorCode, string error)
 {
     // No need to enter context, since we are executing synchronously
     try
     {
         Result = this.ToCefV8Value(router, result);
         Error  = error;
     }
     catch (Exception ex)
     {
         Error = ex.Message;
     }
 }
        /// <summary>
        /// Create an adapter for a remote (out-of-process) plugin.
        /// </summary>
        /// <param name="router"></param>
        /// <param name="pluginContext"></param>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        public static V8PluginAdapter CreateRemote(IV8PluginRouter router, IPluginContext pluginContext, PluginDescriptor descriptor)
        {
            V8PluginAdapter adapter;

            if (!RemotePluginAdapterCache.TryGetValue(descriptor.PluginId, out adapter))
            {
                lock (RemotePluginAdapterCache)
                {
                    if (!RemotePluginAdapterCache.TryGetValue(descriptor.PluginId, out adapter))
                    {
                        var plugin = new RemoteV8Plugin(router, pluginContext, descriptor);
                        adapter = new V8PluginAdapter(plugin);
                        RemotePluginAdapterCache.Add(descriptor.PluginId, adapter);
                    }
                }
            }

            return(adapter);
        }
 public PluginContext(IV8PluginRouter router, Guid pluginContextId)
 {
     _router        = router;
     _pluginManager = new PluginManager(PluginProcess.Renderer);
 }
        protected CefV8Value ToCefV8Value(IV8PluginRouter router, object result)
        {
            if (result == null)
            {
                return(CefV8Value.CreateNull());
            }

            // VALUES FROM REMOTE PLUGINS
            var remoteResult = result as ResultData;

            if (remoteResult != null)
            {
                switch (remoteResult.DataType)
                {
                case ResultDataType.Scalar:
                    if (remoteResult.Items != null && remoteResult.Items.Count != 0)
                    {
                        return(ToCefV8Value(router, remoteResult.Items[0]));
                    }
                    return(CefV8Value.CreateNull());

                case ResultDataType.Array:
                {
                    var cefArray = CefV8Value.CreateArray(remoteResult.Items.Count);
                    if (remoteResult.Items != null)
                    {
                        for (var resultIndex = 0; resultIndex < remoteResult.Items.Count; ++resultIndex)
                        {
                            var cefValue = ToCefV8Value(router, remoteResult.Items[resultIndex]);
                            cefArray.SetValue(resultIndex, cefValue);
                        }
                    }
                    return(cefArray);
                }

                case ResultDataType.Dictionary:
                {
                    var cefObject = CefV8Value.CreateObject(null);
                    if (remoteResult.Items != null)
                    {
                        foreach (var dictionaryItem in remoteResult.Items)
                        {
                            if (string.IsNullOrEmpty(dictionaryItem.Name))
                            {
                                continue;
                            }
                            var cefValue = ToCefV8Value(router, dictionaryItem);
                            cefObject.SetValue(dictionaryItem.Name, cefValue, CefV8PropertyAttribute.None);
                        }
                    }
                    return(cefObject);
                }
                }
            }
            var resultItem = result as ResultItem;

            if (resultItem != null)
            {
                return(ToCefV8Value(router, (object)resultItem.DynamicPlugin ?? resultItem.PlainData));
            }
            var pluginObjectDescriptor = result as PluginDescriptor;

            if (pluginObjectDescriptor != null)
            {
                return(V8PluginAdapter.CreateRemote(router, _plugin.PluginContext, pluginObjectDescriptor).V8Object);
            }

            // VALUES FROM REMOTE OR LOCAL PLUGINS
            var plainData = result as JToken;

            if (plainData != null)
            {
                return(CefJsonValueConverter.ToCef(plainData));
            }

            // VALUES FROM LOCAL PLUGINS
            var localArray = result as object[];

            if (localArray != null)
            {
                var cefArray = CefV8Value.CreateArray(localArray.Length);
                for (var resultIndex = 0; resultIndex < localArray.Length; ++resultIndex)
                {
                    var cefValue = ToCefV8Value(router, localArray[resultIndex]);
                    cefArray.SetValue(resultIndex, cefValue);
                }
                return(cefArray);
            }
            var localPlugin = result as JavaScriptPlugin;

            if (localPlugin != null)
            {
                return(V8PluginAdapter.CreateLocal(router, _plugin.PluginContext, localPlugin).V8Object);
            }
            if (JavaScriptPlugin.IsDynamicPlugin(result))
            {
                var dynPlugin = JavaScriptPlugin.CreateFromObject(PluginProcess.Renderer, result);
                _plugin.PluginContext.PluginManager.AddLocalPlugin(dynPlugin);
                return(V8PluginAdapter.CreateLocal(router, _plugin.PluginContext, dynPlugin).V8Object);
            }

            // local C# POCO
            return(CefNativeValueConverter.ToCef(result));
        }