private void InnerFlushScripts() {
                ScriptTask scriptToEvaluate = null;
                var scriptsToExecute = new List<ScriptTask>();

                do {
                    var scriptTask = PendingScripts.Take(FlushTaskCancelationToken.Token);
                    if (scriptTask.Evaluate == null) {
                        scriptsToExecute.Add(scriptTask);
                    } else { 
                        scriptToEvaluate = scriptTask;
                        break; // this script result needs to be handled separately
                    }
                } while (PendingScripts.Count > 0);

                if (scriptsToExecute.Count > 0) {
                    var script = string.Join(";" + Environment.NewLine, scriptsToExecute.Select(s => s.Script));
                    if (frame.IsValid) {
                        var frameName = frame.Name;
                        try {
                            var task = OwnerWebView.chromium.EvaluateJavaScript<object>(WrapScriptWithErrorHandling(script));
                            var timeout = OwnerWebView.DefaultScriptsExecutionTimeout ?? DefaultTimeout;
                            task.Wait((int)timeout.TotalMilliseconds, FlushTaskCancelationToken.Token);
                        } catch (Exception e) {
                            var evaluatedScriptFunctions = scriptsToExecute.Select(s => s.FunctionName);
                            OwnerWebView.ForwardUnhandledAsyncException(ParseException(e, evaluatedScriptFunctions), frameName);
                        }
                    }
                }

                if (scriptToEvaluate != null) {
                    scriptToEvaluate.Evaluate();
                }
            }
            private ScriptTask QueueScript(string script, string functionName = null, Action evaluate = null) {
                if (OwnerWebView.isDisposing) {
                    return null;
                }

                var scriptTask = new ScriptTask(script, functionName, evaluate);
                PendingScripts.Add(scriptTask);
                return scriptTask;
            }
Ejemplo n.º 3
0
            private ScriptTask QueueScript(string script, string functionName = null, TimeSpan?timeout = default(TimeSpan?), bool awaitable = false)
            {
                if (OwnerWebView.isDisposing)
                {
                    return(null);
                }
                var scriptTask = new ScriptTask(script, functionName, timeout, awaitable);

                PendingScripts.Add(scriptTask);
                return(scriptTask);
            }
            private ScriptTask QueueScript(string script, string functionName = null, Action <string> evaluate = null)
            {
                lock (FlushTaskCancelationToken) {
                    if (FlushTaskCancelationToken.IsCancellationRequested)
                    {
                        return(null);
                    }

                    var scriptTask = new ScriptTask(script, functionName, evaluate);
                    PendingScripts.Add(scriptTask);
                    return(scriptTask);
                }
            }
            private void StopFlush()
            {
#if DEBUG
                System.Diagnostics.Debug.WriteLine($"{nameof(StopFlush)} ('{Id}')");
#endif
                lock (FlushTaskCancelationToken) {
                    if (FlushTaskCancelationToken.IsCancellationRequested)
                    {
                        return;
                    }
                    FlushTaskCancelationToken.Cancel();
                    PendingScripts.CompleteAdding();
                }
            }
            private void StopFlush() {
                lock (FlushTaskCancelationToken) {
                    if (FlushTaskCancelationToken.IsCancellationRequested) {
                        return;
                    }
                    FlushTaskCancelationToken.Cancel();
                }
                if (isFlushRunning) {
                    StoppedFlushHandle.WaitOne();
                }

                PendingScripts.Dispose();
                FlushTaskCancelationToken.Dispose();
            }
Ejemplo n.º 7
0
            private void StopFlush()
            {
                lock (FlushTaskCancelationToken) {
                    if (FlushTaskCancelationToken.IsCancellationRequested)
                    {
                        return;
                    }
                    FlushTaskCancelationToken.Cancel();
                }
                if (isFlushRunning)
                {
                    StoppedFlushHandle.WaitOne();
                }

                // signal any pending js evaluations
                foreach (var pendingScript in PendingScripts.ToArray())
                {
                    pendingScript.WaitHandle?.Set();
                }

                PendingScripts.Dispose();
                FlushTaskCancelationToken.Dispose();
            }
 private void InnerFlushScripts()
 {
     try {
         var scriptsToExecute = new List <ScriptTask>();
         foreach (var scriptTask in PendingScripts.GetConsumingEnumerable())
         {
             if (scriptTask.Evaluate == null)
             {
                 scriptsToExecute.Add(scriptTask);
             }
             if ((PendingScripts.Count == 0 || scriptTask.Evaluate != null) && scriptsToExecute.Count > 0)
             {
                 BulkExecuteScripts(scriptsToExecute);
                 scriptsToExecute.Clear();
             }
             scriptTask.Evaluate?.Invoke(scriptTask.Script);
         }
     } catch (OperationCanceledException) {
         // stop
     } finally {
         PendingScripts.Dispose();
         FlushTaskCancelationToken.Dispose();
     }
 }
Ejemplo n.º 9
0
            private void InnerFlushScripts()
            {
                ScriptTask scriptToEvaluate = null;
                var        scriptsToExecute = new List <ScriptTask>();

                do
                {
                    var scriptTask = PendingScripts.Take(FlushTaskCancelationToken.Token);
                    if (scriptTask.WaitHandle == null)
                    {
                        scriptsToExecute.Add(scriptTask);
                    }
                    else
                    {
                        scriptToEvaluate = scriptTask;
                        break; // this script result needs to be handled separately
                    }
                } while (PendingScripts.Count > 0);

                if (scriptsToExecute.Count > 0)
                {
                    var script = string.Join(";" + Environment.NewLine, scriptsToExecute.Select(s => s.Script));
                    if (frame.IsValid)
                    {
                        var frameName = frame.Name;
                        var task      = frame.EvaluateScriptAsync(
                            WrapScriptWithErrorHandling(script),
                            timeout: OwnerWebView.DefaultScriptsExecutionTimeout);
                        task.Wait(FlushTaskCancelationToken.Token);
                        var response = task.Result;
                        if (!response.Success)
                        {
                            var evaluatedScriptFunctions = scriptsToExecute.Select(s => s.FunctionName);
                            OwnerWebView.ExecuteWithAsyncErrorHandlingOnFrame(() => throw ParseResponseException(response, evaluatedScriptFunctions), frameName);
                        }
                    }
                }

                if (scriptToEvaluate != null)
                {
                    // evaluate and signal waiting thread
                    Task <JavascriptResponse> task = null;
                    var script  = scriptToEvaluate.Script;
                    var timeout = scriptToEvaluate.Timeout ?? OwnerWebView.DefaultScriptsExecutionTimeout;
                    try {
                        if (frame.IsValid)
                        {
                            task = frame.EvaluateScriptAsync(script, timeout: timeout);
                            task.Wait(FlushTaskCancelationToken.Token);
                            scriptToEvaluate.Result = task.Result;
                        }
                    } catch (Exception e) {
                        if (task?.IsCanceled == true)
                        {
                            // timeout
                            scriptToEvaluate.Exception = new JavascriptException("Timeout", (timeout.HasValue ? $"More than {timeout.Value.TotalMilliseconds}ms elapsed" : "Timeout ocurred") + $" evaluating the script: '{script}'");
                        }
                        else
                        {
                            scriptToEvaluate.Exception = e;
                        }
                    } finally {
                        scriptToEvaluate.WaitHandle.Set();
                    }
                }
            }