public bool EvaluateJavascript(string code, JSInvokeMode invokeMode, Action <CfrV8Value, CfrV8Exception> callback) { var rb = remoteBrowser; if (rb == null) { return(false); } try { var ctx = rb.CreateRemoteCallContext(); ctx.Enter(); try { var taskRunner = CfrTaskRunner.GetForThread(CfxThreadId.Renderer); var task = new EvaluateTask(this, code, invokeMode, callback); taskRunner.PostTask(task); return(true); } finally { ctx.Exit(); } } catch (CfxRemotingException) { return(false); } }
bool BindFunctions(string objName, string[] funcNames) { if (remoteBrowser == null) { return(false); } try { var ctx = remoteBrowser.CreateRemoteCallContext(); ctx.Enter(); try { // if (v8Handler != null) v8Handler.Dispose(); // unbind v8Handler = new CfrV8Handler(); v8Handler.Execute += new CfrV8HandlerExecuteEventHandler(JavascriptCallback); CfrTaskRunner.GetForThread(CfxThreadId.Renderer).PostTask(new BindFunctionsTask(remoteBrowser, objName, funcNames, v8Handler)); return(true); } finally { ctx.Exit(); } } catch (System.IO.IOException) { return(false); } }
public bool RegisterToGlobal(string name, Action <CfrV8Value> action) { var rb = remoteBrowser; if (rb == null) { return(false); } try { var ctx = rb.CreateRemoteCallContext(); ctx.Enter(); try { var taskRunner = CfrTaskRunner.GetForThread(CfxThreadId.Renderer); var task = new RegisterTask(this, name, JSInvokeMode.Inherit, action); taskRunner.PostTask(task); return(true); } finally { ctx.Exit(); } } catch (CfxRemotingException) { return(false); } }
/// <summary> /// Visit the DOM in the remote browser's main frame. /// Returns false if the remote browser is currently unavailable. /// If this function returns false, then |callback| will not be called. Otherwise, /// |callback| will be called according to the InvokeMode setting. /// /// The document object passed to the callback represents a snapshot /// of the DOM at the time the callback is executed. /// DOM objects are only valid for the scope of the callback. Do not /// keep references to or attempt to access any DOM objects outside the scope /// of the callback. /// Use with care: /// The callback may never be called if the render process gets killed prematurely. /// Do not keep a reference to the remote DOM or remote browser object after returning from the callback. /// Do not block the callback since it blocks the renderer thread. /// </summary> /// <param name="callback"></param> /// <returns></returns> public bool VisitDom(Action <CfrDomDocument, CfrBrowser> callback) { var rb = remoteBrowser; if (rb == null) { return(false); } try { var ctx = rb.CreateRemoteCallContext(); ctx.Enter(); try { var taskRunner = CfrTaskRunner.GetForThread(CfxThreadId.Renderer); var task = new VisitDomTask(this, callback); taskRunner.PostTask(task); return(true); } finally { ctx.Exit(); } } catch (CfxRemotingException) { return(false); } }
bool EvaluateJavascript(string code, Action <CfrV8Value, CfrV8Exception> callback) { if (remoteBrowser == null) { return(false); } try { var ctx = remoteBrowser.CreateRemoteCallContext(); ctx.Enter(); try { CfrTaskRunner.GetForThread(CfxThreadId.Renderer).PostTask(new EvaluateTask(remoteBrowser, code, callback)); return(true); } finally { ctx.Exit(); } } catch (System.IO.IOException) { return(false); } }
public ChromiumFxDispatcher(CfrBrowser browser, CfrV8Context context, IWebSessionLogger logger) { _Logger = logger; _Browser = browser; _Context = context; TaskRunner = _Context.TaskRunner; }
public ChromiumFxDispatcher(CfrBrowser browser, CfrV8Context context, IWebSessionLogger logger) { _Logger = logger; _Browser = browser; _Context = context; TaskRunner = _Context.TaskRunner; _CfrTask = new CfrTask(); _CfrTask.Execute += CfrTask_Execute; }
public bool BindObject(JsBinding binding) { if (Closed) { return(false); } if (RemoteBrowser == null) { return(false); } try { var jsBinding = binding; if (JsBindings.ContainsKey(binding.Name)) { jsBinding = JsBindings[binding.Name]; jsBinding.MigrateFunctions(binding); } else { JsBindings.Add(binding.Name, binding); } var remoteCallContext = RemoteBrowser.CreateRemoteCallContext(); remoteCallContext.Enter(); try { V8Handler = new CfrV8Handler(); jsBinding.Bind(this, V8Handler); var taskrunner = CfrTaskRunner.GetForThread((CfxThreadId)6); if (taskrunner == null) { LogError("Unsuccessful Binding, TaskRunner is null"); remoteCallContext.Exit(); return(false); } taskrunner.PostTask(new BindFunctionsTask(RemoteBrowser, jsBinding.Name, jsBinding.Functions.Keys.ToArray(), V8Handler)); remoteCallContext.Exit(); return(true); } catch (Exception ex) { remoteCallContext.Exit(); LogError(ex.Message); VvvvLogger?.Log(ex); return(false); } } catch (Exception ex) { LogError(ex.Message); VvvvLogger?.Log(ex); return(false); } }
void CfrTaskStressTest() { if (remoteBrowser == null) { return; } var ctx = remoteBrowser.CreateRemoteCallContext(); ctx.Enter(); try { int taskExecutionCounter = 0; for (int i = 0; i < 10000; ++i) { var task = new CfrTask(); task.Execute += (s, e1) => { ++taskExecutionCounter; if (taskExecutionCounter % 1000 == 0) { LogWriteLine($"CfrTask stress test: {taskExecutionCounter}/10000 tasks executed."); } }; if (i % 2 == 0) { CfrRuntime.PostTask(CfxThreadId.Renderer, task); } else { var tr = CfrTaskRunner.GetForThread(CfxThreadId.Renderer); tr.PostTask(task); } if (i % 1000 == 0) { LogWriteLine($"CfrTask stress test: {i}/10000 tasks posted."); } } } catch { LogWriteLine($"CfrTask stress test: Exception cought, aborting."); } finally { ctx.Exit(); } }
private void AsyncTestFunctionCallback(CfrV8Value function, CfrV8Context v8Context) { LogWriteLine("AsyncTestFunctionCallback: sleep 2 secs, don't browse away..."); Thread.Sleep(2000); var rpcContext = function.CreateRemoteCallContext(); rpcContext.Enter(); // since v8 values can only be accessed from the thread on which they are created, the task // has to be posted for execution on the remote renderer thread (see CfxV8Value summary) var task = new CfrTask(); string result = null; task.Execute += (s, e) => { v8Context.Enter(); LogWriteLine("AsyncTestFunctionCallback -> task.Execute: function.FunctionName = " + function.FunctionName); var args = new CfrV8Value[] { "This is the alert text." }; var retval = function.ExecuteFunction(null, args); result = retval.StringValue; v8Context.Exit(); // release the waiting thread. lock (task) { Monitor.PulseAll(task); } }; // wait until the return value is available. lock (task) { CfrTaskRunner.GetForThread(CfxThreadId.Renderer).PostTask(task); Monitor.Wait(task); } rpcContext.Exit(); LogWriteLine("AsyncTestFunctionCallback: result from callback = " + result); LogWriteLine("AsyncTestFunctionCallback: done."); }
public bool EvaluateJavascript(string code, Action <CfrV8Value, CfrV8Exception> callback) { if (Closed) { return(false); } if (RemoteBrowser == null) { return(false); } try { var remoteCallContext = RemoteBrowser.CreateRemoteCallContext(); remoteCallContext.Enter(); try { var taskrunner = CfrTaskRunner.GetForThread((CfxThreadId)6); if (taskrunner == null) { LogError("Not evaluating javascript, TaskRunner is null, wrong CEF thread ID?"); return(false); } taskrunner.PostTask(new EvaluateTask(RemoteBrowser, code, callback)); return(true); } finally { remoteCallContext.Exit(); } } catch (IOException ex) { LogError(ex.Message); VvvvLogger?.Log(ex); return(false); } }