Esempio n. 1
0
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            if (frame.IsMain)
            {
                LogManager.CefLog("-> Setting main context!");

                Browser father = CefUtil.GetBrowserFromCef(browser);
                if (father != null)
                {
                    if (!CefUtil.DISABLE_CEF)
                    {
                        father._mainContext = context;
                    }
                    LogManager.CefLog("-> Main context set!");
                }
            }

            CefV8Value global = context.GetGlobal();

            CefV8Value func = CefV8Value.CreateFunction("resourceCall", new V8Bridge(browser));

            global.SetValue("resourceCall", func, CefV8PropertyAttribute.None);

            CefV8Value func2 = CefV8Value.CreateFunction("resourceEval", new V8Bridge(browser));

            global.SetValue("resourceEval", func2, CefV8PropertyAttribute.None);

            base.OnContextCreated(browser, frame, context);
        }
Esempio n. 2
0
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            /*缓存数据库*/
            string extensionCode =
                "var cachedb;" +
                "if(!cachedb)" +
                "	cachedb={};"+
                "(function() {" +
                " cachedb.Connect = function(dbName) {" +
                "	native function Connect(dbName);"+
                "	return Connect(dbName);"+
                " };" +

                " cachedb.Execute = function(commandText) {" +
                "	native function Execute(commandText);"+
                "	return Execute(commandText);"+
                " };" +

                " cachedb.Query = function(commandText) {" +
                "	native function Query(commandText);"+
                "	return Query(commandText);"+
                " };" +

                " cachedb.Close = function() {" +
                "	native function Close();"+
                "	return Close();"+
                " };" +

                "})();";
            CefV8Handler ExtendsionHandler = new CwbJsExtendHandler(browser);

            CefRuntime.RegisterExtension("v8/cachedb", extensionCode, ExtendsionHandler);

            /*屏幕分辨率设置*/
            int w = webBrowser.screenWidth;
            int h = webBrowser.screenHeight;

            if (w > 0 && h > 0)
            {
                string jscode =
                    "Object.defineProperty(window.screen, 'height', {" +
                    "    get: function() {" +
                    "        return " + h + ";" +
                    "    }" +
                    "});" +
                    "Object.defineProperty(window.screen, 'width', {" +
                    "    get: function() {" +
                    "        return " + w + ";" +
                    "    }" +
                    "});";
                frame.ExecuteJavaScript(jscode, frame.Url, 0);
            }
            /*注册执行C#方法*/
            CefV8Value   globalValue = context.GetGlobal();
            CefV8Handler callHandler = new CwbJsExtendHandler(browser);
            CefV8Value   callMethod  = CefV8Value.CreateFunction("CallCSharpMethod", callHandler);

            globalValue.SetValue("CallCSharpMethod", callMethod, CefV8PropertyAttribute.None);
            base.OnContextCreated(browser, frame, context);
        }
        private static XrayHandle GetGlobalInternal(CefFrame frame)
        {
            if (!CefApi.CurrentlyOn(CefThreadId.Renderer))
            {
                using (var callTask = new V8CallTask(() => GetGlobalInternal(frame)))
                {
                    if (!CefApi.PostTask(CefThreadId.Renderer, callTask))
                    {
                        throw new InvalidOperationException();
                    }
                    return((XrayHandle)callTask.GetResult());
                }
            }

            CefV8Context context = frame.V8Context;

            if (!context.Enter())
            {
                throw new InvalidOperationException();
            }
            try
            {
                CefV8Value globalObj = context.GetGlobal();
                return((XrayHandle)CastCefV8ValueToDotnetType(context, globalObj, out bool isxray));
            }
            finally
            {
                context.Exit();
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Call from CefRenderProcessHandler::OnContextCreated. Registers the
        /// JavaScripts functions with the new context.
        /// </summary>
        public void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            Helpers.RequireRendererThread();

            // Do not keep any references to CefV8Value objects, otherwise
            // we should release all of them in OnContextReleased method (so we
            // can't rely on GC for this purpose).

            // Register function handlers with the 'window' object.
            using (var window = context.GetGlobal())
            {
                var handler = new V8HandlerImpl(this, _config);
                CefV8PropertyAttribute attributes = CefV8PropertyAttribute.ReadOnly | CefV8PropertyAttribute.DontEnum | CefV8PropertyAttribute.DontDelete;

                // Add the query function.
                using (var queryFunc = CefV8Value.CreateFunction(_config.JSQueryFunction, handler))
                {
                    window.SetValue(_config.JSQueryFunction, queryFunc, attributes);
                }

                // Add the cancel function.
                using (var cancelFunc = CefV8Value.CreateFunction(_config.JSCancelFunction, handler))
                {
                    window.SetValue(_config.JSCancelFunction, cancelFunc, attributes);
                }
            }
        }
Esempio n. 5
0
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            CefV8Value cefV8Value = context.GetGlobal();

            cefV8Value.SetValue("appName", CefV8Value.CreateString("CMCS.Monitor.Win"), CefV8PropertyAttribute.ReadOnly);

            base.OnContextCreated(browser, frame, context);
        }
Esempio n. 6
0
        /// <summary>
        /// Creates a "createPromise" function on the JS side.
        /// </summary>
        private CefPromiseFactory CreatePromiseFactory()
        {
            context.Enter();
            context.GetFrame().ExecuteJavaScript(@"
                window.createPromise = function (fn) {
                    return new Promise(fn);
                };
                ", null, 1);

            var global           = context.GetGlobal();
            var promiseFactoryFn = global.GetValue("createPromise");

            var promiseFactory = new CefPromiseFactory(promiseFactoryFn);

            context.Exit();
            return(promiseFactory);
        }
    protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
    {
        CefV8Value global = context.GetGlobal();
        CefV8Value func   = CefV8Value.CreateFunction("magic", new V8Handler());

        global.SetValue("magic", func, CefV8PropertyAttribute.None);
        base.OnContextCreated(browser, frame, context);
    }
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            foreach (var kvp in CefRuntimeEx.GetObjects())
            {
                BindingHandler.Bind(kvp.Key, kvp.Value, context.GetGlobal());
            }

            base.OnContextCreated(browser, frame, context);
        }
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            var global = context.GetGlobal();

            var extent = CefV8Value.CreateObject(null);

            global.SetValue("V8", extent, CefV8PropertyAttribute.None);

            base.OnContextCreated(browser, frame, context);
        }
        private void InitializeContext(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            if (_pluginContext == null)
            {
                Logger.Error("Could not locate plugin context for V8. Browser {0} Frame {1}", browser.Identifier, frame.Identifier);
                return;
            }

            // TODO : Put in an optimization to not create the JS Object model if the current browser is a DEV TOOLS instance
            var window = context.GetGlobal();

            foreach (var pluginId in _pluginContext.GetPluginIds())
            {
                var pluginPath = pluginId.Split('.');

                var pluginV8HostObject = window;
                var clashDetected      = false;
                for (var pluginPathSectionIndex = 0; pluginPathSectionIndex < pluginPath.Length; pluginPathSectionIndex++)
                {
                    var pathSection = pluginPath[pluginPathSectionIndex];
                    if (pluginPathSectionIndex == 0 && pathSection == "window")
                    {
                        // Fully scoped path - parent should stay as the root/global object until next section
                        continue;
                    }

                    if (pluginV8HostObject.HasValue(pathSection))
                    {
                        pluginV8HostObject = pluginV8HostObject.GetValue(pathSection);
                        if (!pluginV8HostObject.IsObject)
                        {
                            // Most likely a clash of JS paths between plugins
                            // TODO: warn that this current plugin could not be added
                            clashDetected = true;
                            break;
                        }
                    }
                    else
                    {
                        var child = CefV8Value.CreateObject(null);
                        pluginV8HostObject.SetValue(pathSection, child,
                                                    CefV8PropertyAttribute.DontEnum |
                                                    CefV8PropertyAttribute.DontDelete);
                        pluginV8HostObject = child;
                    }
                }
                if (clashDetected)
                {
                    continue;
                }

                V8PluginAdapter.Create(_pluginContext.GetPluginById(pluginId), pluginV8HostObject);
            }
        }
        protected unsafe override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            if (frame.IsMain)
            {
                _context.MainFrame.BindContext(context);
            }

            var obj = context.GetGlobal();
            Cef.JSBindingContext.BindObjects(obj);
            _context.JSBindingContext.BindObjects(obj);
            obj.Dispose();
        }
Esempio n. 12
0
        public static void RegisteredType(Type type, CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static);

            foreach (var method in methods)
            {
                var parames = method.GetParameters();

                var function = new JSFunctionV8Handler();
                function.JSFunction = (string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception) =>
                {
                    //有参数
                    if (parames != null && parames.Length > 0)
                    {
                        var agrs = new object[parames.Length];
                        for (int i = 0; i < parames.Length; i++)
                        {
                            object arg = null;
                            if (i < arguments.Length)
                            {
                                arg = CefV8ValueConvert(arguments[i]);
                            }

                            var param = parames[i];

                            //获取value的值
                            if (arg == null)
                            {
                                continue;
                            }
                            //如果参数类型不对
                            if (arg.GetType() != param.ParameterType)
                            {
                                continue;
                            }
                            agrs[i] = arg;
                        }
                        method.Invoke(null, agrs);
                    }
                    else
                    {
                        //无参数
                        method.Invoke(null, null);
                    }
                    exception   = null;
                    returnValue = CefV8Value.CreateNull();
                    return(true);
                };

                //绑定到context中去
                context.GetGlobal().SetValue(method.Name, CefV8Value.CreateFunction(method.Name, function), CefV8PropertyAttribute.DontDelete | CefV8PropertyAttribute.ReadOnly);
            }
        }
Esempio n. 13
0
        internal static CefV8Value CastCefValueToCefV8Value(CefV8Context context, CefValue value, out bool isNew)
        {
            isNew = true;

            if (value is null)
            {
                return(CefV8Value.CreateNull());
            }

            if (!value.IsValid)
            {
                throw new InvalidCastException();
            }

            CefValueType valueType = value.Type;

            switch (valueType)
            {
            case CefValueType.String:
                return(new CefV8Value(value.GetString()));

            case CefValueType.Int:
                return(new CefV8Value(value.GetInt()));

            case CefValueType.Bool:
                return(new CefV8Value(value.GetBool()));

            case CefValueType.Null:
                return(CefV8Value.CreateNull());

            case CefValueType.Double:
                return(new CefV8Value(value.GetDouble()));

            case CefValueType.Binary:
                CefBinaryValue v = value.GetBinary();
                if (v.Size == 1)
                {
                    return(CefV8Value.CreateUndefined());
                }

                XrayHandle handle = XrayHandle.FromCfxBinaryValue(v);
                if (handle == XrayHandle.Zero)
                {
                    return(context.GetGlobal());
                }

                isNew = (handle.dataType != XrayDataType.Object && handle.dataType != XrayDataType.Function);
                return(handle.ToCefV8Value(context.Frame));
            }

            throw new NotSupportedException();
        }
        protected override unsafe void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            if (frame.IsMain)
            {
                _context.MainFrame.BindContext(context);
            }

            var obj = context.GetGlobal();

            Cef.JSBindingContext.BindObjects(obj);
            _context.JSBindingContext.BindObjects(obj);
            obj.Dispose();
        }
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            base.OnContextCreated(browser, frame, context);

            context.Enter();

            //可在這裡面改V8引擎載入的js物件
            var window       = context.GetGlobal();
            var computerName = CefV8Value.CreateString(Environment.MachineName);

            window.SetValue("computer_name", computerName, CefV8PropertyAttribute.DontDelete | CefV8PropertyAttribute.ReadOnly);

            context.Exit();
        }
Esempio n. 16
0
 public bool IsPromise(CefV8Value v8Value, CefV8Context context)
 {
     using (new ContextHelper(context))
         using (var global = context.GetGlobal())
             using (var s = global.GetValue(HelperObjectName))
             {
                 var userData  = s.GetUserData() as PromiseUserData;
                 var isPromise = userData.IsPromise;
                 using (var result = isPromise.ExecuteFunction(null, new[] { v8Value }))
                 {
                     return(result.GetBoolValue());
                 }
             }
 }
Esempio n. 17
0
 protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
 {
     if (frame.IsMain)
     {
         // Retrieve the context's window object and install the "cefReportDocumentSize" function
         // used to tell the node about the document size.
         using (var window = context.GetGlobal())
         {
             var handler = new CustomCallbackHandler(browser, frame);
             var reportDocumentSizeFunc = CefV8Value.CreateFunction(CustomCallbackHandler.ReportDocumentSize, handler);
             window.SetValue(CustomCallbackHandler.ReportDocumentSize, reportDocumentSizeFunc, CefV8PropertyAttribute.None);
         }
     }
     base.OnContextCreated(browser, frame, context);
 }
Esempio n. 18
0
        public void Then(CefV8Value promise, CefV8Context context, Action <PromiseResult> continuation)
        {
            var id = pendingPromises.Save(context.GetFrame().Identifier, new PendingPromise
            {
                Continuation = continuation
            });

            using (new ContextHelper(context))
                using (var global = context.GetGlobal())
                    using (var s = global.GetValue(HelperObjectName))
                    {
                        var userData       = s.GetUserData() as PromiseUserData;
                        var waitForPromise = userData.WaitForPromise;
                        using (var idValue = CefV8Value.CreateString(id.ToString()))
                        {
                            waitForPromise.ExecuteFunctionWithContext(context, null, new[] { promise, idValue }).Dispose();
                        }
                    }
        }
Esempio n. 19
0
        /// <summary>
        /// Call from CefRenderProcessHandler::OnContextCreated. Registers the
        /// JavaScripts functions with the new context.
        /// </summary>
        public void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            Helpers.RequireRendererThread();

            // Register function handlers with the 'window' object.
            var window = context.GetGlobal();

            var handler = new V8HandlerImpl(this, _config);
            CefV8PropertyAttribute attributes = CefV8PropertyAttribute.ReadOnly | CefV8PropertyAttribute.DontEnum | CefV8PropertyAttribute.DontDelete;

            // Add the query function.
            var queryFunc = CefV8Value.CreateFunction(_config.JSQueryFunction, handler);

            window.SetValue(_config.JSQueryFunction, queryFunc, attributes);

            // Add the cancel function.
            var cancelFunc = CefV8Value.CreateFunction(_config.JSCancelFunction, handler);

            window.SetValue(_config.JSCancelFunction, cancelFunc, attributes);
        }
Esempio n. 20
0
        /// <summary>
        /// The on context created.
        /// </summary>
        /// <param name="browser">
        /// The browser.
        /// </param>
        /// <param name="frame">
        /// The frame.
        /// </param>
        /// <param name="context">
        /// The context.
        /// </param>
        protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            #region Initialize
            var global = context.GetGlobal();
            #endregion

            #region Exposed
            CefV8Value exposed = CefV8Value.CreateObject();
            global.SetValue("exposed", exposed, CefV8PropertyAttribute.None);
            #endregion

            #region Cef Assembly
            var extension = new CefAssembly(browser, frame, context);
            extension.CreateObject(global, new List <string>()
            {
                "mscorlib", "System", "System.Core"
            });
            //extension.CreateObject(global, AppDomain.CurrentDomain.GetAssemblies().Where(s =>
            //{
            //    if (s.GetName().Name.StartsWith("blis")) return true;
            //    return false;
            //})
            //.Select(s => s.GetName().Name).ToList());
            #endregion

            #region Custom XHR
            var xhr = new xhrObject(browser, frame, context);
            global.SetValue("xHttpRequest", xhr.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region V8 Engine API
            var v8Engine = new V8EngineObject(browser, frame, context);
            global.SetValue("V8Engine", v8Engine.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region Database API
            var database = new DatabaseObject(browser, frame, context);
            global.SetValue("DB", database.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region Console API
            var console = new ConsoleObject(browser, frame, context);
            global.SetValue("Console", database.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region Window API
            var window = new WindowObject(browser, frame, context);
            global.SetValue("Window", window.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region Server API
            var server = new ServerObject(browser, frame, context, this);
            global.SetValue("Server", server.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region ChromeDevToosProtocol Object
            var chromeDevToolsProtocol = new ChromeDevToolsProtocol(browser, frame, context);
            global.SetValue("DevTools", chromeDevToolsProtocol.CreateObject(), CefV8PropertyAttribute.None);
            #endregion

            #region OnContextCreated
            MessageRouter.OnContextCreated(browser, frame, context);
            context.Dispose();
            #endregion
        }
Esempio n. 21
0
        private static object InvokeScript(CefV8Context context, string memberName, params object[] args)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (!context.Enter())
            {
                throw new CefException("Failed to enter V8 context.");
            }
            try
            {
                // TODO: this list can be private list of context, 'cause we can invoke only one function at one time
                List <CefV8Value> proxies = new List <CefV8Value>(16);

                // javascript 'this' object
                CefV8Value obj = null;

                CefV8Value target = context.GetGlobal();
                proxies.Add(target);
                if (!memberName.Contains('.'))
                {
                    obj    = target;
                    target = obj.GetValue(memberName);
                    proxies.Add(target);
                }
                else
                {
                    foreach (var member in memberName.Split('.'))
                    {
                        obj    = target;
                        target = obj.GetValue(member); // TODO: do analysis of target - if it is not an object - throw
                        if (!target.IsObject)
                        {
                            throw new CefException("Argument 'memberName' must be member access expression to a function. Invalid object in path.");
                        }
                        proxies.Add(target);
                    }
                }
                if (!target.IsFunction)
                {
                    throw new ArgumentException("Argument 'memberName' must be member access expression to a function.");
                }

                CefV8Value[] v8Args;

                if (args.Length == 0)
                {
                    v8Args = null;
                }
                else
                {
                    v8Args = new CefV8Value[args.Length]; // TODO: InvokeScript core can be optimized by prevent recreating arrays
                    for (var i = 0; i < args.Length; i++)
                    {
                        var value = CefConvert.ToV8Value(args[i]);
                        v8Args[i] = value;
                    }
                }

                var v8RetVal = target.ExecuteFunctionWithContext(context, obj, v8Args);

                // force destroing of proxies, to avoid unneccessary GC load (CLR and V8)
                foreach (var proxy in proxies)
                {
                    proxy.Dispose();
                }

                proxies.Clear();

                // FIXME: not sure if exception CAN be null, this need to be checked
                if (v8RetVal.HasException)
                {
                    var exception = v8RetVal.GetException();
                    throw new JavaScriptException(exception.GetMessage());
                }

                //if (!string.IsNullOrEmpty(exception))


                var result = CefConvert.ToObject(v8RetVal);
                v8RetVal.Dispose();
                return(result);
            }
            finally
            {
                if (!context.Exit())
                {
                    throw new CefException("Failed to exit V8 context.");
                }
            }
        }
        private static object InvokeScript(CefV8Context context, string memberName, params object[] args)
        {
            if (context == null) throw new ArgumentNullException("context");

            if (!context.Enter()) throw new CefException("Failed to enter V8 context.");
            try
            {
                // TODO: this list can be private list of context, 'cause we can invoke only one function at one time
                List<CefV8Value> proxies = new List<CefV8Value>(16);

                // javascript 'this' object
                CefV8Value obj = null;

                CefV8Value target = context.GetGlobal();
                proxies.Add(target);
                if (!memberName.Contains('.'))
                {
                    obj = target;
                    target = obj.GetValue(memberName);
                    proxies.Add(target);
                }
                else
                {
                    foreach (var member in memberName.Split('.'))
                    {
                        obj = target;
                        target = obj.GetValue(member); // TODO: do analysis of target - if it is not an object - throw
                        if (!target.IsObject) throw new CefException("Argument 'memberName' must be member access expression to a function. Invalid object in path.");
                        proxies.Add(target);
                    }
                }
                if (!target.IsFunction) throw new ArgumentException("Argument 'memberName' must be member access expression to a function.");

                CefV8Value[] v8Args;

                if (args.Length == 0) v8Args = null;
                else
                {
                    v8Args = new CefV8Value[args.Length]; // TODO: InvokeScript core can be optimized by prevent recreating arrays
                    for (var i = 0; i < args.Length; i++)
                    {
                        var value = CefConvert.ToV8Value(args[i]);
                        v8Args[i] = value;
                    }
                }

                var v8RetVal = target.ExecuteFunctionWithContext(context, obj, v8Args);

                // force destroing of proxies, to avoid unneccessary GC load (CLR and V8)
                foreach (var proxy in proxies)
                    proxy.Dispose();

                proxies.Clear();

                // FIXME: not sure if exception CAN be null, this need to be checked
                if (v8RetVal.HasException)
                {
                    var exception = v8RetVal.GetException();
                    throw new JavaScriptException(exception.GetMessage());
                }

                //if (!string.IsNullOrEmpty(exception))

                var result = CefConvert.ToObject(v8RetVal);
                v8RetVal.Dispose();
                return result;
            }
            finally
            {
                if (!context.Exit()) throw new CefException("Failed to exit V8 context.");
            }
        }
Esempio n. 23
0
        public void OnContextCreated(CefRenderProcessHandler.OnContextCreatedArgs args)
        {
            //-----------------------
            //this is TEST CODE
            //-----------------------
            return;

            //eg  "<html><head><script>function docload(){ console.log(test001()); console.log(test_myobj.myprop);console.log(test_myobj[12345]);}</script><body onload=\"docload()\"><h1>hello!</h1></body></html>"

            dbugRenderProcessLog.WriteLine("context_created1");
            CefV8Context context = args.context();

            dbugRenderProcessLog.WriteLine("context_cx1");
            //global => window object
            CefV8Value cefV8Global = context.GetGlobal();

            //
            Auto.CefV8Handler funcHandler = new Auto.CefV8Handler(Cef3Binder.MyCefJs_New_V8Handler(Test002));
            CefV8Value        func        = Auto.CefV8Value.CreateFunction("test001", funcHandler);

            cefV8Global.SetValue("test001", func, cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_READONLY);
            //-------

            dbugRenderProcessLog.WriteLine("context_cx2");


            dbugRenderProcessLog.WriteLine("context_cx3");
            CefV8Accessor accessor = CefV8Accessor.New((id, argPtr) =>
            {
                //--------------------------
                //this shows the unsafe and low-level interface to native.
                //you can use a 'higher' level wrapper.
                //--------------------------

                //from https://github.com/v8/v8/wiki/Embedder%27s-Guide
                //accessor callbacks are invoked when a specific object property is accessed by a script
                //Accessors
                //An accessor is a C++callback that calculates and returns a value when an object property is accessed by a JavaScript script.
                //Accessors are configured through an object template, using the SetAccessor method.
                //This method takes the name of the property with which it is associated and two callbacks to run when a script attempts to read or write the property.

                CefV8Accessor.GetArgs arg = new CefV8Accessor.GetArgs(argPtr);
                arg.retval(CefV8Value.CreateString("hello! from accessor").nativePtr);
                arg.myext_setRetValue(true);//finish the accessor!
            });

            CefV8Interceptor intercepter = CefV8Interceptor.New((id, argPtr) =>
            {
                //from https://github.com/v8/v8/wiki/Embedder%27s-Guide
                //interceptor callbacks are invoked when any object property is accessed by a script Accessors and interceptors are discussed later in this document.
                //
                //
                //Interceptors
                //  You can also specify a callback for whenever a script accesses any object property. These are called interceptors. For efficiency, there are two types of interceptors:
                //  named property interceptors - called when accessing properties with string names. An example of this, in a browser environment, is document.theFormName.elementName.
                //  indexed property interceptors - called when accessing indexed properties. An example of this, in a browser environment, is document.forms.elements[0].

                //--------------------------
                //this shows the unsafe and low-level interface to native.
                //you can use a 'higher' level wrapper.
                //--------------------------


                if ((id >> 16) != CefV8Interceptor._typeNAME)
                {
                    return;
                }
                //--------------------------
                int met_id = id & 0xffff;
                switch (met_id)
                {
                case CefV8Interceptor.MyCefV8Interceptor_Get_1:
                    {
                        //by name
                        CefV8Interceptor.get_bynameArgs arg = new CefV8Interceptor.get_bynameArgs(argPtr);
                        arg.retval(CefV8Value.CreateString("hello! from intercepter" + arg.name()).nativePtr);
                    }
                    break;

                case CefV8Interceptor.MyCefV8Interceptor_Get_2:
                    {
                        //by indexed property
                    }
                    break;
                }
            });
            //--------
            //The difference between accessors and interceptors is that interceptors handle all properties,
            //while accessors are associated with one specific property.
            //--------
            //
            CefV8Accessor    empty             = new CefV8Accessor();
            CefV8Interceptor empty_interceptor = new CefV8Interceptor();
            CefV8Value       cef_object        = CefV8Value.CreateObject(accessor, empty_interceptor);

            //if you want to use accessor, your must set it with SetValue() like this
            cef_object.SetValue("myprop", cef_v8_accesscontrol_t.V8_ACCESS_CONTROL_DEFAULT, cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_NONE);

            //
            //set to global object
            cefV8Global.SetValue("test_myobj", cef_object, cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_READONLY);
            //------

            //--------------

            //-------
            //TEST 1: raw, low level interface
            //-------
            IntPtr ret       = IntPtr.Zero;
            IntPtr exception = IntPtr.Zero;
            //string jscode = "(function(){ return function (){return 1.25;}})()";
            string jscode = "(function(){ return function (){ console.log('hello-eval1'); return 1.25;}})()";

            if (context.Eval(jscode, "", 1, ref ret, ref exception))
            {
                dbugRenderProcessLog.WriteLine("eval success");
            }
            else
            {
                dbugRenderProcessLog.WriteLine("eval fail");
            }
            //
            using (CefV8Value cefv8_ret = new CefV8Value(ret))
                using (CefV8Value cefv8_excep = new CefV8Value(exception))
                {
                    if (cefv8_ret.IsFunction())
                    {
                        CefV8Value     obj1            = new CefV8Value(); //empty
                        CefV8ValueList args1           = CefV8ValueList.NewList();
                        CefV8Value     innerFuncResult = cefv8_ret.ExecuteFunction(obj1, args1);
                        Cef3Binder.MyCefDeletePtr(args1.nativePtr);


                        double innerDouble = innerFuncResult.GetDoubleValue();
                    }
                    else
                    {
                        double v8ret_double = cefv8_ret.GetDoubleValue();
                    }
                }


            //low-level example, TODO: make this to O-O style
            //------
            var myfunc2 = MyJsFunc <double> .Create(context,
                                                    "function(a00){ console.log(a00);}");

            myfunc2.Invoke(101);
            //------
            var myfunc3 = MyJsFunc <string> .Create(context,
                                                    "function(a00){ console.log(a00);}");

            myfunc3.Invoke("HELLOO!");
            //------
            //
            var myfunc4 = MyJsFunc <double, string> .Create(context,
                                                            "function(a00,a02){ console.log(a00); console.log(a02);}");

            myfunc4.Invoke(101, "hello_myfunc4");
            //------
            var myfunc5 = MyJsFunc <string, string> .Create(context,
                                                            "function(a00,a02){ console.log(a00); console.log(a02);}");

            myfunc5.Invoke("HELLOO!", "hello_myfunc5");
            //------
            var myfunc6 = MyJsFunc.Create(context,
                                          "function(){ document.title='hello1'; document.write('0'); return document; }");
            var        doc              = myfunc6.Invoke();
            CefV8Value docTitle         = doc.GetValue("title");
            string     docTitleAsString = docTitle.GetStringValue();
            CefV8Value docBody          = doc.GetValue("body");

            if (!docBody.IsNull())
            {
                //get innerHTML property
                CefV8Value innerHtmlProp = docBody.GetValue("innerHTML");
                if (innerHtmlProp.IsString())
                {
                }
                //set innerHTML property
                docBody.SetValue("innerHTML", CefV8Value.CreateString("A_Z"), cef_v8_propertyattribute_t.V8_PROPERTY_ATTRIBUTE_NONE);
            }

            CefV8Value docWrite = doc.GetValue("write");

            if (docWrite.IsFunction()) //try getting 'write' method of the document object
            {
                CefV8ValueList writeArgs = CefV8ValueList.NewList();
                writeArgs.AddElement(CefV8Value.CreateString("Hello_FROM_WRITE"));
                docWrite.ExecuteFunction(doc, writeArgs);
                Cef3Binder.MyCefDeletePtr(writeArgs.nativePtr);
            }
            //------
            //if we write() all
            //we need to get doc again
            doc         = myfunc6.Invoke();
            cefV8Global = context.GetGlobal();

            //low-level example, TODO: make this to O-O style
            CefV8Value cefGlobal_addEventListener = cefV8Global.GetValue("addEventListener");

            if (cefGlobal_addEventListener.IsFunction())
            {
                MyCefCallback cefWindowOnLoad = (id, argsPtr) =>
                {
                    //arg as mouse event args
                    CefV8Handler.ExecuteArgs args2        = new CefV8Handler.ExecuteArgs(argsPtr);
                    CefV8ValueList           argumentList = args2.arguments();
                    int argCount = argumentList.GetListCount();
                };
                _cefCallbackKeeper.Add(cefWindowOnLoad);
                var            v8Handler  = new CefV8Handler(Cef3Binder.MyCefJs_New_V8Handler(cefWindowOnLoad));
                CefV8ValueList handleArgs = CefV8ValueList.NewList();
                //"load"
                handleArgs.AddElement(CefV8Value.CreateString("load"));
                CefV8Value v8Loadhandler = CefV8Value.CreateFunction("mydocload", v8Handler);
                //"eventHandler"
                handleArgs.AddElement(v8Loadhandler);
                cefGlobal_addEventListener.ExecuteFunction(cefV8Global, handleArgs);
                Cef3Binder.MyCefDeletePtr(handleArgs.nativePtr);
            }
            //------
            //low-level example, TODO: make this to O-O style
            CefV8Value doc_addEventListener = doc.GetValue("addEventListener");

            if (doc_addEventListener.IsFunction())
            {
                MyCefCallback mouseDownCallback = (id, argsPtr) =>
                {
                    //arg as mouse event args
                    CefV8Handler.ExecuteArgs args2        = new CefV8Handler.ExecuteArgs(argsPtr);
                    CefV8ValueList           argumentList = args2.arguments();
                    int        argCount = argumentList.GetListCount();
                    CefV8Value v8arg    = argumentList.GetElement(0);
                    //get button propery
                    CefV8Value v8button = v8arg.GetValue("button");
                    if (v8button.IsInt())
                    {
                        int button = v8button.GetIntValue();
                    }
                };
                _cefCallbackKeeper.Add(mouseDownCallback);
                var            v8Handler  = new CefV8Handler(Cef3Binder.MyCefJs_New_V8Handler(mouseDownCallback));
                CefV8ValueList handleArgs = CefV8ValueList.NewList();
                //"load"
                handleArgs.AddElement(CefV8Value.CreateString("mousedown"));
                CefV8Value v8Loadhandler = CefV8Value.CreateFunction("mycallback", v8Handler);
                //"eventHandler"
                handleArgs.AddElement(v8Loadhandler);
                cefGlobal_addEventListener.ExecuteFunction(doc, handleArgs);
                Cef3Binder.MyCefDeletePtr(handleArgs.nativePtr);
            }



            dbugRenderProcessLog.WriteLine("context_created-pass");
        }
Esempio n. 24
0
 private static CefV8Value GetSafeThisArg(CefV8Context context, XrayObject target)
 {
     return(target?.Value ?? context.GetGlobal());
 }
Esempio n. 25
0
        /// <summary>
        /// Call from CefRenderProcessHandler::OnContextCreated. Registers the
        /// JavaScripts functions with the new context.
        /// </summary>
        public void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            Helpers.RequireRendererThread();

            // Register function handlers with the 'window' object.
            var window = context.GetGlobal();

            var handler = new V8HandlerImpl(this, _config);
            CefV8PropertyAttribute attributes = CefV8PropertyAttribute.ReadOnly | CefV8PropertyAttribute.DontEnum | CefV8PropertyAttribute.DontDelete;

            // Add the query function.
            var queryFunc = CefV8Value.CreateFunction(_config.JSQueryFunction, handler);
            window.SetValue(_config.JSQueryFunction, queryFunc, attributes);

            // Add the cancel function.
            var cancelFunc = CefV8Value.CreateFunction(_config.JSCancelFunction, handler);
            window.SetValue(_config.JSCancelFunction, cancelFunc, attributes);
        }
Esempio n. 26
0
            protected override void OnContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
            {
                if (frame.IsMain)
                {
                    // Retrieve the context's window object and install the "vvvvReportDocumentSize" function
                    // used to tell the node about the document size as well as the "vvvvSend" function
                    // used to tell the node about variables computed inside the frame.
                    using (var window = context.GetGlobal())
                    {
                        var handler = new CustomCallbackHandler(browser, frame);
                        var reportDocumentSizeFunc = CefV8Value.CreateFunction(CustomCallbackHandler.ReportDocumentSize, handler);
                        window.SetValue(CustomCallbackHandler.ReportDocumentSize, reportDocumentSizeFunc);


                        window.SetValue("vvvvQuery", CefV8Value.CreateFunction("vvvvQuery", new DelegatingHandler((name, obj, args) =>
                        {
                            const string argForm = "{ request: 'NAME', arguments: {}, onSuccess: function(response) {}, onError: function(error_message) {} }";
                            string invalidArg    = $"vvvvQuery expects one argument of the form {argForm}";

                            if (args.Length != 1)
                            {
                                throw new Exception($"vvvvQuery expects one argument");
                            }

                            var x = args[0];
                            if (x is null || !x.IsObject)
                            {
                                throw new Exception($"The argument must be of the form {argForm}");
                            }

                            var requestValue = x.GetValue("request");
                            if (requestValue.IsUndefined)
                            {
                                throw new Exception($"The request entry is missing");
                            }
                            if (!requestValue.IsString)
                            {
                                throw new Exception($"The request must be a string");
                            }

                            var onSuccessValue = x.GetValue("onSuccess");
                            if (!onSuccessValue.IsUndefined && !onSuccessValue.IsFunction)
                            {
                                throw new Exception($"The onSuccess entry must be a function");
                            }

                            var onErrorValue = x.GetValue("onError");
                            if (!onErrorValue.IsUndefined && !onErrorValue.IsFunction)
                            {
                                throw new Exception($"The onError entry must be a function");
                            }

                            var request = requestValue.GetStringValue();
                            var id      = queryCount++;

                            if (queries.TryAdd((request, id), (context, onSuccessValue, onErrorValue)))
                            {
                                using var message = CefProcessMessage.Create("query-request");
                                message.Arguments.SetString(0, request);
                                message.Arguments.SetInt(1, id);
                                message.Arguments.SetValue(2, ToValue(x.GetValue("arguments")));
                                frame.SendProcessMessage(CefProcessId.Browser, message);
                            }

                            return(default);