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; }
/// <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; }
/// <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); }
/// <summary> /// Returns a writable copy of this object. /// </summary> public unsafe virtual CefProcessMessage Copy() { return(SafeCall(CefProcessMessage.Wrap(CefProcessMessage.Create, NativeInstance->Copy()))); }