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; }
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(); }
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(); } }
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(); } } }