private void HandleJavascriptContextCreated(CefFrame frame) { if (isDisposing) { return; } ExecuteWithAsyncErrorHandling(() => { if (UrlHelper.IsChromeInternalUrl(frame.Url)) { return; } lock (JsExecutors) { if (isDisposing) { return; } var frameName = frame.Name; if (this.IsMainFrame(frameName)) { // when a new main frame in created, dispose all running executors -> since they should not be valid anymore // all child iframes were gone DisposeJavascriptExecutors(JsExecutors.Where(je => !je.Value.IsValid).Select(je => je.Key).ToArray()); } var jsExecutor = GetJavascriptExecutor(frameName); jsExecutor?.StartFlush(frame); JavascriptContextCreated?.Invoke(frameName); } }); }
private void DisposeJavascriptExecutors(string[] executorsKeys) { foreach (var executorKey in executorsKeys) { var indexedExecutorKey = executorKey ?? ""; if (JsExecutors.TryGetValue(indexedExecutorKey, out var executor)) { executor.Dispose(); JsExecutors.Remove(indexedExecutorKey); } } }
private JavascriptExecutor GetJavascriptExecutor(string frameName) { if (isDisposing) { return(null); } lock (JsExecutors) { if (isDisposing) { return(null); } var frameNameForIndex = frameName ?? ""; if (!JsExecutors.TryGetValue(frameNameForIndex, out var jsExecutor)) { jsExecutor = new JavascriptExecutor(this, this.GetFrame(frameName)); JsExecutors.Add(frameNameForIndex, jsExecutor); } return(jsExecutor); } }