示例#1
0
        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);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        /// <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);
     }
 }
示例#6
0
 public ChromiumFxDispatcher(CfrBrowser browser, CfrV8Context context, IWebSessionLogger logger)
 {
     _Logger    = logger;
     _Browser   = browser;
     _Context   = context;
     TaskRunner = _Context.TaskRunner;
 }
示例#7
0
 public ChromiumFxDispatcher(CfrBrowser browser, CfrV8Context context, IWebSessionLogger logger)
 {
     _Logger           = logger;
     _Browser          = browser;
     _Context          = context;
     TaskRunner        = _Context.TaskRunner;
     _CfrTask          = new CfrTask();
     _CfrTask.Execute += CfrTask_Execute;
 }
示例#8
0
        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);
            }
        }
示例#9
0
        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();
            }
        }
示例#10
0
        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.");
        }
示例#11
0
 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);
     }
 }