public void Kill_WhenCalled_TerminatesProcess()
        {
            var startInfo = new ProcessStartInfo("timeout")
            {
                Arguments       = "1000", // seconds
                UseShellExecute = true,
                CreateNoWindow  = true,
                WindowStyle     = ProcessWindowStyle.Hidden
            };

            using (var exitedEvent = new ManualResetEventSlim(initialState: false))
                using (var pluginProcess = new PluginProcess(startInfo))
                {
                    pluginProcess.Exited += (object sender, IPluginProcess e) =>
                    {
                        exitedEvent.Set();
                    };

                    pluginProcess.Start();

                    pluginProcess.Kill();

                    exitedEvent.Wait();

                    Assert.NotNull(pluginProcess.ExitCode);
                }
        }
 private static void TestWithUnstartedProcess(Action <PluginProcess> verify)
 {
     using (var pluginProcess = new PluginProcess(new ProcessStartInfo()))
     {
         verify(pluginProcess);
     }
 }
Exemplo n.º 3
0
        public static JavaScriptPlugin CreateFromType(PluginProcess pluginProcess, Type type, bool isKernel)
        {
            if (type == null)
            {
                return(null);
            }

            var pluginAttr = type.GetCustomAttributes(typeof(JavaScriptPluginAttribute), true);

            if (pluginAttr.Length == 0)
            {
                return(null);
            }

            var pAttr = pluginAttr[0] as JavaScriptPluginAttribute;

            if (pAttr == null)
            {
                return(null);
            }

            if (isKernel &&
                ((pluginProcess == PluginProcess.Browser && !pAttr.IsBrowserSide) ||
                 (pluginProcess == PluginProcess.Renderer && pAttr.IsBrowserSide)))
            {
                return(null);
            }

            var plugin = new JavaScriptPlugin(pluginProcess, Activator.CreateInstance(type), pAttr);

            return(plugin.IsValid ? plugin : null);
        }
Exemplo n.º 4
0
        private JavaScriptPlugin(PluginProcess pluginProcess, object plugin, JavaScriptPluginAttribute pluginAttribute)
        {
            NativeObject    = plugin;
            _pluginId       = pluginAttribute.Name;
            _callbackThread = pluginAttribute.CallbackThread;

            if (string.IsNullOrEmpty(_pluginId))
            {
                _isDynamic = true;
                _pluginId  = Guid.NewGuid().ToString();
            }

            var pluginType = NativeObject.GetType();

            _methods = new ConcurrentDictionary <string, MethodInfo>(
                GetParagonMembers(pluginType.GetMethods));

            _events = new ConcurrentDictionary <string, JavaScriptEvent>(GetParagonMembers(pluginType.GetEvents)
                                                                         .Where(m => m.Value.EventHandlerType == typeof(JavaScriptPluginCallback))
                                                                         .ToDictionary(m => m.Key, m => new JavaScriptEvent(NativeObject, m.Value)));

            _properties = new ConcurrentDictionary <string, PropertyInfo>(GetParagonMembers(pluginType.GetProperties));

            if (_isDynamic)
            {
                var disposedEvent = pluginType
                                    .GetEvents(BindingFlags.Instance | BindingFlags.Public)
                                    .FirstOrDefault(e =>
                {
                    var a = e.GetCustomAttributes(typeof(JavaScriptDisposeAttribute), true);
                    return(a.Length > 0);
                });

                if (disposedEvent != null &&
                    disposedEvent.EventHandlerType == typeof(JavaScriptPluginCallback))
                {
                    _disposedEvent   = disposedEvent;
                    _disposedHandler = OnNativeObjectDisposed;
                    _disposedEvent.AddEventHandler(NativeObject, _disposedHandler);
                }
            }

            foreach (var nativeEvent in _events.Values)
            {
                nativeEvent.AttachToEvent();
            }

            Descriptor = new PluginDescriptor
            {
                PluginId = _pluginId,
                Methods  = _methods.Select(method => new MethodDescriptor
                {
                    MethodName           = method.Key,
                    HasCallbackParameter = HasCallbackParameter(method.Value),
                    IsVoid = method.Value.ReturnType == typeof(void)
                }).ToList(),
                Events = _events.Keys.ToList()
            };
        }
Exemplo n.º 5
0
 /// <nodoc />
 public void Kill()
 {
     if (PluginProcess != null && !PluginProcess.HasExited && !PluginProcess.WaitForExit(milliseconds: 1000))
     {
         PluginProcess.Kill();
         PluginProcess.WaitForExit(3000);
     }
 }
 private static void TestWithRunningProcess(Action <Process, PluginProcess> verify)
 {
     using (var process = Process.GetCurrentProcess())
         using (var pluginProcess = new PluginProcess())
         {
             verify(process, pluginProcess);
         }
 }
        private static void TestWithExitedProcess(Action <PluginProcess> verify)
        {
            ProcessStartInfo startInfo = CreateProcessStartInfo();

            using (var pluginProcess = new PluginProcess(startInfo))
            {
                pluginProcess.Start();

                pluginProcess.Kill();

                verify(pluginProcess);
            }
        }
Exemplo n.º 8
0
        public static JavaScriptPlugin CreateFromObject(PluginProcess pluginProcess, object plugin)
        {
            if (plugin == null)
            {
                return(null);
            }

            var type       = plugin.GetType();
            var pluginAttr = type.GetCustomAttributes(typeof(JavaScriptPluginAttribute), true);

            if (pluginAttr.Length == 0)
            {
                return(null);
            }

            return(new JavaScriptPlugin(pluginProcess, plugin, pluginAttr[0] as JavaScriptPluginAttribute));
        }
Exemplo n.º 9
0
        /// <nodoc />
        public void Dispose()
        {
            if (!m_disposed)
            {
                PluginClient.Dispose();

                if (PluginProcess != null)
                {
                    if (!PluginProcess.HasExited)
                    {
                        Kill();
                    }
                    PluginProcess.Exited -= HandleProcessExisted;
                    PluginProcess.Dispose();
                }
                else if (PluginTask != null && !PluginTask.IsCompleted)
                {
                    PluginTaskCancellationTokenSource.Cancel();
                }

                m_disposed = true;
            }
        }
        public void Exited_WhenProcessExits_Fires()
        {
            ProcessStartInfo startInfo = CreateProcessStartInfo();

            using (var exitedEvent = new ManualResetEventSlim(initialState: false))
                using (var pluginProcess = new PluginProcess(startInfo))
                {
                    IPluginProcess argument = null;

                    pluginProcess.Exited += (object sender, IPluginProcess e) =>
                    {
                        argument = e;

                        exitedEvent.Set();
                    };

                    pluginProcess.Start();

                    exitedEvent.Wait();

                    Assert.Same(pluginProcess, argument);
                }
        }
 public PluginManager(PluginProcess managerProcess)
 {
     _managerProcess = managerProcess;
 }