private static bool ProcessXrayMessage(CefProcessMessage msg)
        {
            CefListValue args = msg.ArgumentList;
            var          sqi  = ScriptableRequestInfo.Get(args.GetInt(0));

            if (sqi is null)
            {
                return(true);
            }

            if (args.GetSize() == 2)
            {
                sqi.Complete(args.GetValue(1));
            }
            else
            {
                sqi.Complete(new CefNetRemoteException(args.GetString(1), args.GetString(2), args.GetString(3)));
            }
            return(true);
        }
        private static void ProcessXrayRequest(CefProcessMessageReceivedEventArgs e)
        {
            CefListValue args = e.Message.ArgumentList;

            CefProcessMessage message = new CefProcessMessage(XrayResponseKey);
            CefListValue      retArgs = message.ArgumentList;

            retArgs.SetSize(2);
            retArgs.SetValue(0, args.GetValue(0));

            CefValue   retval      = null;
            XrayAction queryAction = (XrayAction)args.GetInt(1);

            try
            {
                CefV8Context v8Context;
                XrayObject   target = null;

                if (queryAction == XrayAction.GetGlobal)
                {
                    v8Context = e.Frame.V8Context;
                }
                else
                {
                    target    = XrayHandle.FromCfxBinaryValue(args.GetBinary(2)).GetTarget(e.Frame);
                    v8Context = target?.Context ?? e.Frame.V8Context;
                }

                if (!v8Context.IsValid)
                {
                    throw new ObjectDeadException();
                }
                if (!v8Context.Enter())
                {
                    throw new ObjectDeadException();
                }
                try
                {
                    CefV8Value rv = null;
                    switch (queryAction)
                    {
                    case XrayAction.Get:
                        long corsRid = ScriptableObjectProvider.Get(v8Context, target, args, out rv);
                        if (corsRid != 0)
                        {
                            var xray = new XrayHandle();
                            xray.dataType = XrayDataType.CorsRedirect;
                            xray.iRaw     = corsRid;
                            retval        = new CefValue();
                            retval.SetBinary(xray.ToCfxBinaryValue());
                            retArgs.SetValue(1, retval);
                        }
                        break;

                    case XrayAction.Set:
                        ScriptableObjectProvider.Set(v8Context, target, args);
                        break;

                    case XrayAction.InvokeMember:
                        rv = ScriptableObjectProvider.InvokeMember(v8Context, target, args);
                        break;

                    case XrayAction.Invoke:
                        rv = ScriptableObjectProvider.Invoke(v8Context, target, args);
                        break;

                    case XrayAction.GetGlobal:
                        rv = v8Context.GetGlobal();
                        break;

                    default:
                        throw new NotSupportedException();
                    }
                    if (rv != null)
                    {
                        retval = ScriptableObjectProvider.CastCefV8ValueToCefValue(v8Context, rv, out bool isXray);
                        if (!isXray)
                        {
                            rv.Dispose();
                        }
                        retArgs.SetValue(1, retval);
                    }
                }
                finally
                {
                    v8Context.Exit();
                }
            }
            catch (AccessViolationException) { throw; }
            catch (OutOfMemoryException) { throw; }
            catch (Exception ex)
            {
                //File.AppendAllText("G:\\outlog.txt", ex.GetType().Name + ": " + ex.Message + "\r\n" + ex.StackTrace + "\r\n");
                retArgs.SetSize(4);
                retArgs.SetString(1, ex.Message);
                retArgs.SetString(2, ex.GetType().FullName);
                retArgs.SetString(3, ex.StackTrace);
            }



            //CfxValueType t = e.Message.ArgumentList.GetType(0);



            e.Frame.SendProcessMessage(CefProcessId.Browser, message);
            message.Dispose();
            retval?.Dispose();

            e.Handled = true;
        }
Exemple #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CefProcessMessageReceivedEventArgs"/> class.
 /// </summary>
 /// <param name="browser">The <see cref="CefBrowser"/> that triggered the event.</param>
 /// <param name="frame">The <see cref="CefFrame"/> that triggered the event.</param>
 /// <param name="sourceProcess">The type of a source process.</param>
 /// <param name="message">A received message.</param>
 public CefProcessMessageReceivedEventArgs(CefBrowser browser, CefFrame frame, CefProcessId sourceProcess, CefProcessMessage message)
 {
     this.Browser       = browser;
     this.Frame         = frame;
     this.SourceProcess = sourceProcess;
     this.Message       = message;
 }
Exemple #4
0
 /// <summary>
 /// Send a message to the specified |target_process|. Message delivery is not
 /// guaranteed in all cases (for example, if the browser is closing,
 /// navigating, or if the target process crashes). Send an ACK message back
 /// from the target process if confirmation is required.
 /// </summary>
 public unsafe virtual void SendProcessMessage(CefProcessId targetProcess, CefProcessMessage message)
 {
     NativeInstance->SendProcessMessage(targetProcess, (message != null) ? message.GetNativeInstance() : null);
     GC.KeepAlive(this);
 }
Exemple #5
0
 /// <summary>
 /// Returns a writable copy of this object.
 /// </summary>
 public unsafe virtual CefProcessMessage Copy()
 {
     return(SafeCall(CefProcessMessage.Wrap(CefProcessMessage.Create, NativeInstance->Copy())));
 }