protected unsafe override void OnContextReleased(CefBrowser browser, CefFrame frame, CefV8Context context)
 {
     if (_context.MainFrame != null)
     {
         _context.MainFrame.UnbindV8Context();
     }
 }
 public CefUncaughtExceptionEventArgs(CefBrowser browser, CefFrame frame, CefV8Context context, CefV8Exception exception, CefV8StackTrace stackTrace)
 {
     this.browser = browser;
     this.frame = frame;
     this.context = context;
     this.exception = exception;
     this.stackTrace = stackTrace;
 }
Пример #3
0
        public void BindCurrentV8Context()
        {
            if (this.v8Context != null) throw new InvalidOperationException();

            var context = CefV8Context.GetCurrentContext();
            if (context == null) throw new InvalidOperationException();
            this.v8Context = context;
        }
Пример #4
0
        public void BindContext(CefV8Context v8Context)
        {
            if (this.v8Context != null)
                throw new InvalidOperationException();

            if (v8Context == null)
                throw new ArgumentNullException("v8Context");

            this.v8Context = v8Context;
        }
        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();
        }
Пример #6
0
        public void printToPDF(string path, CefPdfPrintSettings settings, CefPdfPrintCallback callback)
        {
            var _context = CefV8Context.GetCurrentContext();

            if (_context != null)
            {
                var _browser = _context.GetBrowser();
                if (_browser != null)
                {
                    var _host = _browser.GetHost();
                    if (_host != null)
                    {
                        _host.PrintToPdf(path, settings, callback);
                    }
                }
            }
        }
Пример #7
0
        internal static void OnContextReleased(CefV8Context context)
        {
            List <XrayObject> values;

            lock (XrayRoots)
            {
                XrayRoots.Remove(context, out values);
            }
            if (values == null)
            {
                return;
            }
            foreach (XrayObject obj in values)
            {
                obj.Dispose();
            }
        }
        /// <summary>
        /// Remove a JavaScript listener function from a native event.
        /// </summary>
        /// <param name="context">The current V8 JavaScript context.</param>
        /// <param name="eventName">The name of the event to detach the function from.</param>
        /// <param name="callback"> The function to detach from the event.</param>
        public void RemoveEventListener(CefV8Context context, string eventName, CefV8Value callback)
        {
            if (string.IsNullOrEmpty(eventName) || !Descriptor.Events.Contains(eventName))
            {
                throw new Exception("Unknown event name");
            }

            if (callback == null)
            {
                throw new Exception("Missing event listener");
            }

            var v8Callback = _retainedCallbacks.GetAndRemoveCallback(eventName, callback);

            // Execute the call through the router, so that the router keeps track of the call
            OnRemoveEventListener(context, eventName, v8Callback);
        }
Пример #9
0
        internal static CefV8Value CastDotnetTypeToCefV8Value(CefV8Context context, object value, out bool isNew)
        {
            isNew = true;

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

            if (value is V8Undefined)
            {
                return(CefV8Value.CreateUndefined());
            }

            switch (value)
            {
            case string v:
                return(new CefV8Value(v));

            case int v:
                return(new CefV8Value(v));

            case double v:
                return(new CefV8Value(v));

            case bool v:
                return(new CefV8Value(v));

            case DateTime v:
                return(new CefV8Value(v));

            case XrayHandle v:
                isNew = (v.dataType != XrayDataType.Object && v.dataType != XrayDataType.Function);
                return(v.ToCefV8Value(context.Frame));

            case ScriptableObject v:
                XrayHandle hv = (XrayHandle)v;
                isNew = (hv.dataType != XrayDataType.Object && hv.dataType != XrayDataType.Function);
                CefV8Value cv8 = hv.ToCefV8Value(context.Frame);
                GC.KeepAlive(v);
                return(cv8);
            }

            throw new NotImplementedException("Type: " + value.GetType().Name);
        }
Пример #10
0
        protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
        {
            exception   = null;
            returnValue = null;
            string paramSampler = arguments[0].GetStringValue();

            switch (name)
            {
            //获取异常信息
            case "GetHitchs":
                //异常信息
                string machineCode = string.Empty;
                if (paramSampler == "#1")
                {
                    machineCode = GlobalVars.MachineCode_QZDZYJ_1;
                }
                else if (paramSampler == "#2")
                {
                    machineCode = GlobalVars.MachineCode_QZDZYJ_2;
                }
                equInfHitchs = CommonDAO.GetInstance().GetEquInfHitchsByTime(machineCode, DateTime.Now);
                returnValue  = CefV8Value.CreateString(Newtonsoft.Json.JsonConvert.SerializeObject(equInfHitchs.Select(a => new { MachineCode = a.MachineCode, HitchTime = a.HitchTime.ToString("yyyy-MM-dd HH:mm"), HitchDescribe = a.HitchDescribe })));
                break;

            case "OpenAutoMaker":
                CefProcessMessage OpenAutoMaker = CefProcessMessage.Create("OpenAutoMaker");
                int f = 0;
                foreach (CefV8Value item in arguments)
                {
                    CefValue model = CefValue.Create();
                    model.SetString(item.GetStringValue());
                    OpenAutoMaker.Arguments.SetValue(f, model);
                    f++;
                }

                CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, OpenAutoMaker);
                break;

            default:
                returnValue = null;
                break;
            }

            return(true);
        }
Пример #11
0
        /// <summary>
        /// create js func from userJsCode, userJsCode will be wraped with anonymous func before it is send to js
        /// </summary>
        /// <param name="ownerContext"></param>
        /// <param name="userJsCode"></param>
        /// <returns></returns>
        public static MyJsFunc Create(CefV8Context ownerContext, string userJsCode)
        {
            IntPtr v8JsFuncPtr;

            if (CreateFromJsCode(ownerContext,
                                 "(function(){ return " + userJsCode + "})()",
                                 out v8JsFuncPtr))
            {
                MyJsFunc func = new MyJsFunc();
                func._cefV8Func = new CefV8Value(v8JsFuncPtr);
                return(func);
            }
            else
            {
                //not success
                return(null);
            }
        }
Пример #12
0
        public double getZoomLevel()
        {
            var _context = CefV8Context.GetCurrentContext();

            if (_context != null)
            {
                var _browser = _context.GetBrowser();
                if (_browser != null)
                {
                    var _host = _browser.GetHost();
                    if (_host != null)
                    {
                        _host.GetZoomLevel();
                    }
                }
            }
            return(0);
        }
 /// <summary>
 /// Called by <see cref="OnBrowserCallbackInvokeReceived(PluginMessage,ResultData)"/>
 /// to invoke a V8 callback.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="info"></param>
 /// <param name="result"></param>
 private void InvokeV8Callback(CefV8Context context, RenderCallInfo info, ResultData result)
 {
     try
     {
         if (context != null && info.Callback != null)
         {
             info.Callback.Invoke(this, context, result, result.ErrorCode, result.Error);
         }
         if (!info.IsRetained)
         {
             info.Dispose();
         }
     }
     catch (Exception exception)
     {
         Logger.Error("InvokeV8Callback Failed: {0}", exception);
     }
 }
        private PluginMessage CreateMessage(
            CefV8Context context,
            PluginDescriptor targetPlugin,
            string memberName,
            IV8Callback callback)
        {
            var message = new PluginMessage
            {
                PluginId     = targetPlugin.PluginId,
                MemberName   = memberName,
                BrowserId    = context.GetBrowserId(),
                ContextId    = GetIdForContext(context, false),
                FrameId      = context.GetFrame().Identifier,
                V8CallbackId = callback != null ? callback.Identifier : Guid.Empty
            };

            return(message);
        }
        private Reko.Decompiler CreateRekoInstance(CefV8Context context)
        {
            var fsSvc    = new FileSystemServiceImpl();
            var listener = new ListenerService(context, eventListeners);
            var dfSvc    = new DecompiledFileService(fsSvc, listener);

            services.AddService(typeof(IFileSystemService), fsSvc);
            services.AddService(typeof(DecompilerEventListener), listener);
            var configSvc = RekoConfigurationService.Load(services, "reko/reko.config");

            services.AddService(typeof(IConfigurationService), configSvc);
            services.AddService(typeof(IDecompiledFileService), dfSvc);
            services.AddService(typeof(ITypeLibraryLoaderService), new TypeLibraryLoaderServiceImpl(services));
            services.AddService(typeof(IPluginLoaderService), new PluginLoaderService());
            var loader = new Reko.Loading.Loader(services);

            return(new Reko.Decompiler(loader, services));
        }
Пример #16
0
        protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
        {
            exception   = null;
            returnValue = null;
            string            param  = arguments.Length > 0 ? arguments[0].GetStringValue() : string.Empty;
            CefProcessMessage cefMsg = null;

            switch (name)
            {
            //  打开火车机械采样机监控界面
            case "OpenTrainMachinerySampler":
                //CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, CefProcessMessage.Create("OpenTrainMachinerySampler"));
                break;

            //  打开汽车入厂重车衡监控
            case "OpenTruckWeighter":
                CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, CefProcessMessage.Create("OpenTruckWeighter"));
                break;

            //  打开汽车机械采样机监控
            case "OpenTruckMachinerySampler":
                CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, CefProcessMessage.Create("OpenTruckMachinerySampler"));
                break;

            //  打开化验室监控
            case "OpenAssayManage":
                CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, CefProcessMessage.Create("OpenAssayManage"));
                break;

            //  打开实时视频预览
            case "OpenHikVideo":
                cefMsg = CefProcessMessage.Create("OpenHikVideo");
                cefMsg.Arguments.SetSize(1);
                cefMsg.Arguments.SetString(0, param);
                CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, cefMsg);
                break;

            default:
                returnValue = null;
                break;
            }

            return(true);
        }
 public void launchappindifferentoem(
     string oem,
     string abiValue,
     string vmname,
     string packageName,
     string actionWithRemainingInstances)
 {
     Logger.Info("Get Call from browser of launchappindifferentoem oem: " + oem + ", abiValue: " + abiValue + ", packageName: " + packageName + ", actionWithRemainingInstances: " + actionWithRemainingInstances);
     using (CefProcessMessage message = CefProcessMessage.Create("LaunchAppInDifferentOem"))
     {
         CefListValue arguments = message.Arguments;
         arguments.SetString(0, oem);
         arguments.SetString(1, abiValue);
         arguments.SetString(2, vmname);
         arguments.SetString(3, packageName);
         arguments.SetString(4, actionWithRemainingInstances);
         CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, message);
     }
 }
Пример #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();
                        }
                    }
        }
Пример #19
0
        /// <summary>
        /// Returns the number of queries currently pending for the specified |browser|
        /// and/or |context|. Either or both values may be empty.
        /// </summary>
        public int GetPendingCount(CefBrowser browser = null, CefV8Context context = null)
        {
            Helpers.RequireRendererThread();

            if (_browserRequestInfoMap.IsEmpty) return 0;

            if (context != null)
            {
                var contextId = GetIDForContext(context, false);
                if (contextId == CefMessageRouter.ReservedId)
                    return 0;  // Nothing associated with the specified context.

                int count = 0;
                BrowserRequestInfoMap.Visitor visitor = (int browserId, KeyValuePair<int, int> infoId, RequestInfo info, ref bool remove) =>
                {
                    if (infoId.Key == contextId) count++;
                    return true;
                };

                if (browser != null)
                {
                    // Count requests associated with the specified browser.
                    _browserRequestInfoMap.FindAll(browser.Identifier, visitor);
                }
                else
                {
                    // Count all requests for all browsers.
                    _browserRequestInfoMap.FindAll(visitor);
                }

                return count;
            }
            else if (browser != null)
            {
                return _browserRequestInfoMap.Count(browser.Identifier);
            }
            else
            {
                return _browserRequestInfoMap.Count();
            }

            return 0;
        }
Пример #20
0
        /// <summary>
        /// Run in context.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="action">The action.</param>
        /// <exception cref="System.ArgumentNullException">
        /// context
        /// or
        /// action
        /// </exception>
        public static void RunInContext(CefV8Context context, Action action)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (action == null)
            {
                throw new ArgumentNullException("action");
            }

            CefUtility.RunInContext <object>(context, () =>
            {
                action();

                return(null);
            });
        }
 public void installapp_google_popup(
     string appIcon,
     string appName,
     string apkUrl,
     string packageName,
     string source = "")
 {
     Logger.Info("Get Call from browser of Install App from googleplay in popup :" + appName);
     using (CefProcessMessage message = CefProcessMessage.Create("InstallAppGooglePlayPopup"))
     {
         CefListValue arguments = message.Arguments;
         arguments.SetString(0, appIcon);
         arguments.SetString(1, appName);
         arguments.SetString(2, apkUrl);
         arguments.SetString(3, packageName);
         arguments.SetString(4, source);
         CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, message);
     }
 }
Пример #22
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);
        }
Пример #23
0
        private CefV8Value DontMeetRequirements(CefV8Context context, CefV8Value callback)
        {
            var msg = JsonMapper.ToJson(new StatusHelper("Error", "Arguments do not meet function requirement"));

            if (callback != null)
            {
                var runner = CefTaskRunner.GetForCurrentThread();
                new Task(() =>
                {
                    context.Enter();
                    runner.PostTask(new CallbackTask(context, callback, msg));
                    context.Exit();
                }).Start();
                return(CefV8Value.CreateNull());
            }
            else
            {
                return(CefV8Value.CreateString(msg));
            }
        }
        public void ContextCreated(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            Logger.Info("ContextCreated Browser {0} Frame {1}", browser.Identifier, frame.Identifier);

            if (!EnsureOnRendererThread())
            {
                return;
            }

            try
            {
                CreateIdForContext(context);

                InitializeContext(browser, frame, context);
            }
            catch (Exception exception)
            {
                Logger.Info("ContextCreated Failed Browser {0} Frame {1}: {2}", browser.Identifier, frame.Identifier, exception);
            }
        }
        protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
        {
            exception   = null;
            returnValue = null;

            switch (name)
            {
            // 道闸1升杆
            case "Gate1Up":
                commonDAO.SendAppRemoteControlCmd(MonitorCommon.GetInstance().GetTruckWeighterMachineCodeBySelected(arguments[0].GetStringValue()), "控制道闸", "Gate1Up");
                break;

            // 道闸1降杆
            case "Gate1Down":
                commonDAO.SendAppRemoteControlCmd(MonitorCommon.GetInstance().GetTruckWeighterMachineCodeBySelected(arguments[0].GetStringValue()), "控制道闸", "Gate1Down");
                break;

            // 道闸2升杆
            case "Gate2Up":
                commonDAO.SendAppRemoteControlCmd(MonitorCommon.GetInstance().GetTruckWeighterMachineCodeBySelected(arguments[0].GetStringValue()), "控制道闸", "Gate2Up");
                break;

            // 道闸2降杆
            case "Gate2Down":
                commonDAO.SendAppRemoteControlCmd(MonitorCommon.GetInstance().GetTruckWeighterMachineCodeBySelected(arguments[0].GetStringValue()), "控制道闸", "Gate2Down");
                break;

            case "ChangeSelected":
                CefProcessMessage cefMsg = CefProcessMessage.Create("TruckWeighterChangeSelected");
                cefMsg.Arguments.SetSize(0);
                cefMsg.Arguments.SetString(0, arguments[0].GetStringValue());
                CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, cefMsg);
                break;

            default:
                returnValue = null;
                break;
            }

            return(true);
        }
Пример #26
0
        internal static CefV8Value InvokeMember(CefV8Context context, XrayObject target, CefListValue args)
        {
            CefV8Value thisArg = GetSafeThisArg(context, target);
            CefV8Value func    = thisArg.GetValue(args.GetString(3));

            if (!func.IsFunction)
            {
                func.Dispose();
                throw new MissingMethodException();
            }

            int size     = (int)(args.GetSize() - 4);
            var xraylist = new List <int>(size);
            var fnArgs   = new CefV8Value[size];

            try
            {
                for (int i = 0; i < fnArgs.Length; i++)
                {
                    int index = (i + 4);
                    fnArgs[i] = CastCefValueToCefV8Value(context, args.GetValue(index), out bool isNew);
                    if (!isNew)
                    {
                        xraylist.Add(index);
                    }
                }
                return(func.ExecuteFunction(thisArg, fnArgs));
            }
            finally
            {
                func.Dispose();
                for (int i = 0; i < fnArgs.Length; i++)
                {
                    if (!xraylist.Contains(i))
                    {
                        fnArgs[i].Dispose();
                    }
                }
            }
        }
 public string installapp(
     string appIcon,
     string appName,
     string apkUrl,
     string packageName,
     string timestamp = "",
     string source    = "")
 {
     Logger.Info("Get Call from browser of Install App :" + appName);
     using (CefProcessMessage message = CefProcessMessage.Create("InstallApp"))
     {
         CefListValue arguments = message.Arguments;
         arguments.SetString(0, appIcon);
         arguments.SetString(1, appName);
         arguments.SetString(2, apkUrl);
         arguments.SetString(3, packageName);
         arguments.SetString(4, timestamp);
         arguments.SetString(5, source);
         CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, message);
         return("true");
     }
 }
Пример #28
0
        private Guid?AddCallback(CefV8Value callbackFunction, CefV8Context context)
        {
            if (callbackFunction != null)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("context");
                }

                if (!callbackFunction.IsFunction)
                {
                    throw new ArgumentException("Not a function.", "callbackFunction");
                }

                var callback = new JavascriptFunction(callbackFunction, context);
                Callbacks.Add(callback.Id, callback);

                return(callback.Id);
            }

            return(null);
        }
        /// <summary>
        /// Add a local V8 callback to a local event as a listener.
        /// </summary>
        /// <param name="context">
        /// The current V8 context that is adding the listener.
        /// </param>
        /// <param name="targetPlugin">
        /// The local plugin that owns the event.
        /// </param>
        /// <param name="eventName">
        /// The name of the event to attach to.
        /// </param>
        /// <param name="callback">
        /// The callback to V8 to invoke when the event is raised.
        /// </param>
        public void AddEventListener(CefV8Context context, JavaScriptPlugin targetPlugin, string eventName, IV8Callback callback)
        {
            Logger.Info("AddEventListener Local Plugin {0} Event {1}", targetPlugin.Descriptor.PluginId, eventName);

            if (!EnsureOnRendererThread())
            {
                return;
            }

            if (!targetPlugin.IsValid)
            {
                Logger.Warn("AddEventListener Local Plugin {0} is invalid", targetPlugin.Descriptor.PluginId);
                if (callback != null)
                {
                    callback.Invoke(this, context, null, CallInfo.ErrorCodeCallCanceled, CallInfo.ErrorCallCanceled);
                }
                return;
            }

            var addListenerMessage = CreateMessage(context, targetPlugin.Descriptor, eventName, callback);

            addListenerMessage.MessageId   = callback.Identifier;
            addListenerMessage.MessageType = PluginMessageType.AddListener;

            // Add the call info into the pending calls for the browser
            var info = AddLocalCallback(addListenerMessage, callback, null);

            try
            {
                targetPlugin.AddEventListener(eventName, info);
            }
            catch (Exception ex)
            {
                // Remove listener from calls cache
                _pendingCallbacks.Remove(info);
                info.Dispose();
                Logger.Error("AddEventListener Failed Local Plugin {0} Event {1}: {2}", targetPlugin.Descriptor.PluginId, eventName, ex);
            }
        }
Пример #30
0
        public bool Execute(string name, ICefV8Value obj, ICefV8Value[] arguments, out ICefV8Value returnValue,
                            out string exception)
        {
            returnValue = null;
            exception   = null;

            long frameId = 0;

            using (var context = CefV8Context.GetCurrentContext())
            {
                frameId = context.GetFrame().Identifier;
            }
            var executionId = functionCallRegistry.Save(frameId, out var promise);

            returnValue = promise.Object;

            var message = new RpcResponse <ICefValue>
            {
                MethodExecution = new MethodExecution <ICefValue>
                {
                    ExecutionId = executionId,
                    MethodId    = descriptor.Id,
                    ObjectId    = objectId,
                    Parameters  = arguments.Select(a => v8Serializer.Serialize(a)).ToArray()
                }
            };

            using (var context = CefV8Context.GetCurrentContext())
            {
                var msg        = CefProcessMessage.Create(Messages.RpcResponseMessage);
                var serialized = v8Serializer.Serialize(message);
                msg.Arguments.SetValue(0, serialized.Copy());

                context.GetBrowser().SendProcessMessage(CefProcessId.Browser, msg);
            }

            return(true);
        }
Пример #31
0
        public CefV8Value OnBindingRequire(CefV8Value cefV8Value)
        {
            using (var context = CefV8Context.GetCurrentContext())
                using (var frame = context.GetFrame())
                {
                    var frameId          = frame.Identifier;
                    var frameObjectCache = objectCache[frameId];

                    var id = dynamicObjectPromiseRegistry.Save(frameId, out var promise);

                    var objectName = cefV8Value.GetStringValue();
                    if (!frameObjectCache.TryGetValue(objectName, out var cached))
                    {
                        if (objectDescriptorCache.TryGetValue(objectName, out var descriptor))
                        {
                            CreateV8Value(descriptor, dynamicObjectPromiseRegistry.Get(id));
                        }
                        else
                        {
                            var response = new RpcResponse <CefValue>
                            {
                                DynamicObjectRequest = new DynamicObjectRequest
                                {
                                    ExecutionId = id,
                                    Name        = objectName
                                }
                            };

                            SendResponse(response);
                        }
                    }
                    else
                    {
                        dynamicObjectPromiseRegistry.Get(id).Resolve(cached);
                    }
                    return(promise.Object);
                }
        }
 public string isBTVInstalled()
 {
     if (!BTVManager.IsBTVInstalled())
     {
         using (CefProcessMessage message = CefProcessMessage.Create("DownloadBTV"))
         {
             CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, message);
             return("false");
         }
     }
     else
     {
         if (BTVManager.IsDirectXComponentsInstalled())
         {
             return("true");
         }
         using (CefProcessMessage message = CefProcessMessage.Create("DownloadDirectX"))
         {
             CefV8Context.GetCurrentContext().GetBrowser().SendProcessMessage(CefProcessId.Browser, message);
             return("false");
         }
     }
 }
Пример #33
0
        /// <summary>
        /// create
        /// </summary>
        /// <param name="userJsCode"></param>
        /// <returns></returns>
        protected static bool CreateFromJsCode(CefV8Context ownerContext,
                                               string userJsCode,
                                               out IntPtr nativeFunc)
        {
            IntPtr ret       = IntPtr.Zero;
            IntPtr exception = IntPtr.Zero;

            //eval in js side

            if (ownerContext.Eval(userJsCode, "", 1, ref ret, ref exception))
            {
                nativeFunc = ret;
                return(true);
            }
            else
            {
                //dispose
                nativeFunc = IntPtr.Zero;
                CefV8Exception v8Exception = new CefV8Exception(exception);
                v8Exception.Dispose();
                return(false);
            }
        }
        public ChromeDevToolsProtocol(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            try
            {
                configuration = Extension.GetConfiguration();
                var _req = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:" + configuration.RemoteDebuggingPort + "/json/protocol");
                var _rsp = (HttpWebResponse)_req.GetResponse();
                if (_rsp.StatusCode == HttpStatusCode.OK)
                {
                    var jsProtocolJson = new StreamReader(_rsp.GetResponseStream()).ReadToEnd();
                    if (!string.IsNullOrEmpty(jsProtocolJson))
                    {
                        protocol = JsonMapper.ToObject(jsProtocolJson);

                        _req = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:" + configuration.RemoteDebuggingPort + "/json");
                        _rsp = (HttpWebResponse)_req.GetResponse();
                        if (_rsp.StatusCode == HttpStatusCode.OK)
                        {
                            var jsJson = new StreamReader(_rsp.GetResponseStream()).ReadToEnd();
                            if (!string.IsNullOrEmpty(jsJson))
                            {
                                var settings = JsonMapper.ToObject(jsJson);
                                this.DevToolsSockets = new ObservableCollection <DevToolsSocket>();
                                foreach (JsonData setting in settings)
                                {
                                    if (frame.Url == (string)setting["url"])// && frame.Url != "chrome-devtools://devtools/inspector.html"
                                    {
                                        this.DevToolsSockets.Add(new DevToolsSocket(frame.Url, (string)setting["webSocketDebuggerUrl"], this.DevToolsSockets));
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex) { Log.Trace(ex.Message, ex.StackTrace, true); }
        }
        /// <summary>
        /// Handle execution of the function identified by |name|. |object| is the
        /// receiver ('this' object) of the function. |arguments| is the list of
        /// arguments passed to the function. If execution succeeds set |retval| to the
        /// function return value. If execution fails set |exception| to the exception
        /// that will be thrown. Return true if execution was handled.
        /// </summary>
        /// <param name="name">The name of the function to execute.</param>
        /// <param name="obj">The receiver ('this' object) of the function.</param>
        /// <param name="arguments">The list of arguments passed to the function</param>
        /// <param name="returnValue">If execution succeeds set |retval| to the function return value.</param>
        /// <param name="exception">If execution fails set |exception| to the exception that will be thrown.</param>
        /// <returns>Return true if execution was handled.</returns>
        protected override bool Execute(string name, CefV8Value obj, CefV8Value[] arguments, out CefV8Value returnValue, out string exception)
        {
            exception   = null;
            returnValue = null;

            try
            {
                if (!string.IsNullOrEmpty(name))
                {
                    var methodDescriptor = _plugin.Descriptor.Methods.Find(descriptor => descriptor.MethodName == name);
                    if (methodDescriptor == null)
                    {
                        Logger.Error("Plugin method {0} {1} not found", _plugin.Descriptor.PluginId, name);
                        return(false);
                    }

                    var context = CefV8Context.GetCurrentContext();

                    var v8Callback = arguments != null && arguments.Length != 0 && arguments[arguments.Length - 1].IsFunction
                        ? arguments[arguments.Length - 1]
                        : null;
                    var parameters = v8Callback != null?arguments.Take(arguments.Length - 1).ToArray() : arguments;

                    _plugin.ExecuteFunction(context, name, parameters, v8Callback, out returnValue, out exception);
                    return(true);
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Execution of plugin method {0} {1} failed: {2}", _plugin.Descriptor.PluginId, name, ex);
                exception = ex.Message;
            }

            returnValue = CefV8Value.CreateUndefined();

            return(false);
        }
        /// <summary>
        /// Add a local V8 callback to a remote event as a listener.
        /// </summary>
        /// <param name="context">
        /// The current V8 context that is adding the listener.
        /// </param>
        /// <param name="targetPlugin">
        /// The remote plugin that owns the event.
        /// </param>
        /// <param name="eventName">
        /// The name of the event to attach to.
        /// </param>
        /// <param name="callback">
        /// The callback to V8 to invoke when the remote event is raised.
        /// </param>
        public void AddEventListener(CefV8Context context, PluginDescriptor targetPlugin, string eventName, IV8Callback callback)
        {
            Logger.Info("AddEventListener Remote Plugin {0} Event {1}", targetPlugin.PluginId, eventName);

            if (!EnsureOnRendererThread())
            {
                return;
            }

            var addListenerMessage = CreateMessage(context, targetPlugin, eventName, callback);

            // Use identifier from callback as ID for listener message.
            // When remote event fired, renderer will receive an EventFired message with this same ID as its MessageId.
            addListenerMessage.MessageId   = callback.Identifier;
            addListenerMessage.MessageType = PluginMessageType.AddListener;
            addListenerMessage.Data        = string.Empty;

            // Add the call info into the pending calls for the browser
            var info = AddRemoteCallback(addListenerMessage, callback);

            // Send the request message to the browser
            try
            {
                using (var browser = context.GetBrowser())
                {
                    SendMessage(browser, addListenerMessage);
                }
            }
            catch (Exception ex)
            {
                // If the request could not be sent, remove the call from the list
                _pendingCallbacks.Remove(info);
                info.Dispose();
                Logger.Error("AddEventListener Failed Remote Plugin {0} Event {1}: {2}", targetPlugin.PluginId, eventName, ex);
            }
        }
Пример #37
0
 public void UnbindV8Context()
 {
     if (this.v8Context != null)
     {
         this.v8Context.Dispose();
         this.v8Context = null;
     }
 }
Пример #38
0
 internal void OnUncaughtException(CefBrowser browser, CefFrame frame, CefV8Context context, CefV8Exception exception, CefV8StackTrace stackTrace)
 {
     var handler = this.UncaughtException;
     if (handler != null)
     {
         handler(this, new CefUncaughtExceptionEventArgs(browser, frame, context, exception, stackTrace));
     }
 }
Пример #39
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);
        }
Пример #40
0
 // Don't create the context ID until it's actually needed.
 private int GetIDForContext(CefV8Context context)
 {
     if (_contextId == CefMessageRouter.ReservedId)
         _contextId = _router.CreateIDForContext(context);
     return _contextId;
 }
Пример #41
0
        // Retrieves the existing ID value associated with the specified |context|.
        // If |remove| is true the context will also be removed from the map.
        private int GetIDForContext(CefV8Context context, bool remove)
        {
            Helpers.RequireRendererThread();

            int contextId = CefMessageRouter.ReservedId;
            int? removeContextId = null;
            foreach (var kv in _contextMap)
            {
                if (kv.Value.IsSame(context))
                {
                    contextId = kv.Key;
                    if (remove)
                    {
                        removeContextId = contextId;
                    }
                    break;
                }
            }

            if (removeContextId.HasValue) _contextMap.Remove(removeContextId.Value);

            return contextId;
        }
Пример #42
0
        /// <summary>
        /// Call from CefRenderProcessHandler::OnContextReleased. Any pending queries
        /// associated with the released context will be canceled and
        /// Handler::OnQueryCanceled will be called in the browser process.
        /// </summary>
        public void OnContextReleased(CefBrowser browser, CefFrame frame, CefV8Context context)
        {
            Helpers.RequireRendererThread();

            // Get the context ID and remove the context from the map.
            var contextId = GetIDForContext(context, true);
            if (contextId != CefMessageRouter.ReservedId)
            {
                // Cancel all pending requests for the context.
                SendCancel(browser, frame.Identifier, contextId, CefMessageRouter.ReservedId);
            }
        }
 protected override void OnUncaughtException(CefBrowser browser, CefFrame frame, CefV8Context context, CefV8Exception exception, CefV8StackTrace stackTrace)
 {
     _context.OnUncaughtException(browser, frame, context, exception, stackTrace);
 }
Пример #44
0
        private int CreateIDForContext(CefV8Context context)
        {
            Helpers.RequireRendererThread();

            // The context should not already have an associated ID.
            Debug.Assert(GetIDForContext(context, false) == CefMessageRouter.ReservedId);

            var contextId = _contextIdGenerator.GetNextId();
            _contextMap.Add(contextId, context);
            return contextId;
        }
        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.");
            }
        }