public void ExecuteScript(string frameName, string script) { CefFrame frame = _browser?.GetFrame(frameName); if (frame == null) { Logger.Instance.Log.Error($"Frame {frameName} does not exist."); return; } frame.ExecuteJavaScript(script, null, 0); }
/// <inheritdoc/> public object ExecuteScript(string frameName, string script) { var frame = _browser?.GetFrame(frameName); if (frame is null) { Logger.Instance.Log.LogWarning("Frame {frameName} does not exist.", frameName); return(string.Empty); } frame.ExecuteJavaScript(script, string.Empty, 0); return(string.Empty); }
// Returns the new request ID. private int SendQuery(CefBrowser browser, long frameId, int contextId, string request, bool persistent, CefV8Value successCallback, CefV8Value failureCallback) { Helpers.RequireRendererThread(); var requestId = _requestIdGenerator.GetNextId(); var info = new RequestInfo { Persistent = persistent, SuccessCallback = successCallback, FailureCallback = failureCallback, }; _browserRequestInfoMap.Add(browser.Identifier, new KeyValuePair <int, int>(contextId, requestId), info); var message = CefProcessMessage.Create(_queryMessageName); var args = message.Arguments; args.SetInt(0, Helpers.Int64GetLow(frameId)); args.SetInt(1, Helpers.Int64GetHigh(frameId)); args.SetInt(2, contextId); args.SetInt(3, requestId); args.SetString(4, request); args.SetBool(5, persistent); CefFrame frame = browser.GetFrame(frameId); frame?.SendProcessMessage(CefProcessId.Browser, message); args.Dispose(); message.Dispose(); return(requestId); }
private void HandleDomRequest(CefBrowser browser, CefProcessId sourceProcess, long frameIdentifier) { var scheduler = GetTaskScheduler(CefThreadId.Renderer); Task.Factory.StartNew( () => { var frame = browser.GetFrame(frameIdentifier); if (frame != null) { var visitor = new DomVisitor(); frame.VisitDom(visitor); var response = CefProcessMessage.Create("dom-response"); response.SetFrameIdentifier(frame.Identifier); if (visitor.Result != null) { response.Arguments.SetBool(2, true); response.Arguments.SetString(3, visitor.Result.ToString()); } else { response.Arguments.SetBool(2, false); response.Arguments.SetString(3, visitor.Exception.ToString()); } browser.SendProcessMessage(sourceProcess, response); } }, CancellationToken.None, TaskCreationOptions.None, scheduler); }
protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message) { long identifier; CefFrame frame; switch (message.Name) { case "dom-response": identifier = message.GetFrameIdentifier(); frame = browser.GetFrame(identifier); if (frame != null) { var arguments = message.Arguments; var success = arguments.GetBool(2); var s = arguments.GetString(3); if (success) { var dom = XDocument.Parse(s); FRenderer.OnUpdateDom(dom); } else { FRenderer.OnUpdateDom(s); } } return(true); case "document-size-response": identifier = message.GetFrameIdentifier(); frame = browser.GetFrame(identifier); if (frame != null) { var arguments = message.Arguments; var width = arguments.GetInt(2); var height = arguments.GetInt(3); FRenderer.OnDocumentSize(frame, width, height); } return(true); default: break; } return(base.OnProcessMessageReceived(browser, sourceProcess, message)); }
// If |requestId| is kReservedId all requests associated with |contextId| // will be canceled, otherwise only the specified |requestId| will be // canceled. Returns true if any request was canceled. private bool SendCancel(CefBrowser browser, long frameId, int contextId, int requestId) { Helpers.RequireRendererThread(); var browserId = browser.Identifier; int cancelCount = 0; if (requestId != CefMessageRouter.ReservedId) { // Cancel a single request. bool removed = false; var info = GetRequestInfo(browserId, contextId, requestId, true, ref removed); if (info != null) { Debug.Assert(removed); info.Dispose(); cancelCount = 1; } } else { // Cancel all requests with the specified context ID. BrowserRequestInfoMap.Visitor visitor = (int vBrowserId, KeyValuePair <int, int> vInfoId, RequestInfo vInfo, ref bool vRemove) => { if (vInfoId.Key == contextId) { vRemove = true; vInfo.Dispose(); cancelCount++; } return(true); }; _browserRequestInfoMap.FindAll(browserId, visitor); } if (cancelCount > 0) { var message = CefProcessMessage.Create(_cancelMessageName); var args = message.Arguments; args.SetInt(0, contextId); args.SetInt(1, requestId); var frame = browser.GetFrame(frameId); if (frame.IsValid) { frame.SendProcessMessage(CefProcessId.Browser, message); } return(true); } return(false); }
private CefFrame GetFrameByName(CefBrowser browser, string frameName) { CefFrame frame = null; if (frameName == null) { frame = browser.GetMainFrame(); } else { frame = browser.GetFrame(frameName); } return(frame); }
private void HandleDocumentSizeRequest(CefBrowser browser, CefProcessId sourceProcess, long frameIdentifier) { var scheduler = GetTaskScheduler(CefThreadId.Renderer); Task.Factory.StartNew( () => { var frame = browser.GetFrame(frameIdentifier); if (frame != null) { var js = new StringBuilder(); js.AppendLine("var body = document.body;"); js.AppendLine("var width = body.scrollWidth;"); js.AppendLine("var height = body.scrollHeight;"); js.AppendLine(string.Format("window.{0}(width, height);", CustomCallbackHandler.ReportDocumentSize)); frame.ExecuteJavaScript(js.ToString(), string.Empty, 0); } }, CancellationToken.None, TaskCreationOptions.None, scheduler); }
/// <summary> /// Call from CefClient::OnProcessMessageReceived. Returns true if the message /// is handled by this router or false otherwise. /// </summary> public bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message) { Helpers.RequireUIThread(); var messageName = message.Name; if (messageName == _queryMessageName) { var args = message.Arguments; Debug.Assert(args.Count == 6); var frameId = Helpers.Int64Set(args.GetInt(0), args.GetInt(1)); var contextId = args.GetInt(2); var requestId = args.GetInt(3); var request = args.GetString(4); var persistent = args.GetBool(5); if (_handlerSet.Count == 0) { // No handlers so cancel the query. CancelUnhandledQuery(browser, contextId, requestId); return(true); } var browserId = browser.Identifier; var queryId = _queryIdGenerator.GetNextId(); var frame = browser.GetFrame(frameId); var callback = new Callback(this, browserId, queryId, persistent); // Make a copy of the handler list in case the user adds or removes a // handler while we're iterating. var handlers = _handlerSet.ToArray(); var handled = false; Handler handler = null; foreach (var x in handlers) { handled = x.OnQuery(browser, frame, queryId, request, persistent, callback); if (handled) { handler = x; break; } } // If the query isn't handled nothing should be keeping a reference to // the callback. // DCHECK(handled || callback->GetRefCt() == 1); // Debug.Assert(handled && handler != null); // We don't need this assertion, in GC environment. // There is client responsibility to do not reference callback, if request is not handled. if (handled) { // Persist the query information until the callback executes. // It's safe to do this here because the callback will execute // asynchronously. var info = new QueryInfo { Browser = browser, FrameId = frameId, ContextId = contextId, RequestId = requestId, Persistent = persistent, Callback = callback, Handler = handler, }; _browserQueryInfoMap.Add(browserId, queryId, info); } else { // Invalidate the callback. callback.Detach(); // No one chose to handle the query so cancel it. CancelUnhandledQuery(browser, contextId, requestId); } return(true); } else if (messageName == _cancelMessageName) { var args = message.Arguments; Debug.Assert(args.Count == 2); var browserId = browser.Identifier; var contextId = args.GetInt(0); var requestId = args.GetInt(1); CancelPendingRequest(browserId, contextId, requestId); return(true); } return(false); }
/// <summary> /// Call from CefClient::OnProcessMessageReceived. Returns true if the message /// is handled by this router or false otherwise. /// </summary> public bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message) { Helpers.RequireUIThread(); var messageName = message.Name; if (messageName == _queryMessageName) { var args = message.Arguments; Debug.Assert(args.Count == 6); var frameId = Helpers.Int64Set(args.GetInt(0), args.GetInt(1)); var contextId = args.GetInt(2); var requestId = args.GetInt(3); var request = args.GetString(4); var persistent = args.GetBool(5); if (_handlerSet.Count == 0) { // No handlers so cancel the query. CancelUnhandledQuery(browser, contextId, requestId); return true; } var browserId = browser.Identifier; var queryId = _queryIdGenerator.GetNextId(); var frame = browser.GetFrame(frameId); var callback = new Callback(this, browserId, queryId, persistent); // Make a copy of the handler list in case the user adds or removes a // handler while we're iterating. var handlers = _handlerSet.ToArray(); var handled = false; Handler handler = null; foreach (var x in handlers) { handled = x.OnQuery(browser, frame, queryId, request, persistent, callback); if (handled) { handler = x; break; } } // If the query isn't handled nothing should be keeping a reference to // the callback. // DCHECK(handled || callback->GetRefCt() == 1); // Debug.Assert(handled && handler != null); // We don't need this assertion, in GC environment. // There is client responsibility to do not reference callback, if request is not handled. if (handled) { // Persist the query information until the callback executes. // It's safe to do this here because the callback will execute // asynchronously. var info = new QueryInfo { Browser = browser, FrameId = frameId, ContextId = contextId, RequestId = requestId, Persistent = persistent, Callback = callback, Handler = handler, }; _browserQueryInfoMap.Add(browserId, queryId, info); } else { // Invalidate the callback. callback.Detach(); // No one chose to handle the query so cancel it. CancelUnhandledQuery(browser, contextId, requestId); } return true; } else if (messageName == _cancelMessageName) { var args = message.Arguments; Debug.Assert(args.Count == 2); var browserId = browser.Identifier; var contextId = args.GetInt(0); var requestId = args.GetInt(1); CancelPendingRequest(browserId, contextId, requestId); return true; } return false; }
protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message) { string[] items = message.Name.Split(new char[] { '|' }); if (items.Length == 0) { return(false); } switch (items[0]) { case "GetElementValue": { string elementID = items[1]; long[] frameIDs = browser.GetFrameIdentifiers(); foreach (long frameID in frameIDs) { CefFrame frame = browser.GetFrame(frameID); if (frame == null) { continue; } frame.VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsGetElementValue, elementID)); } browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsGetElementValue, elementID)); return(true); } case "SetElementValue": { string elementID = items[1]; string elementValue = items[2]; long[] frameIDs = browser.GetFrameIdentifiers(); foreach (long frameID in frameIDs) { CefFrame frame = browser.GetFrame(frameID); if (frame == null) { continue; } frame.VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsGetElementValue, elementID, elementValue)); } browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsSetElementValue, elementID, elementValue)); return(true); } case "EvaluateScript": { CefV8Value value = CefV8Value.CreateString("t"); CefV8Exception exp; browser.GetMainFrame().V8Context.TryEval(items[1], out value, out exp); Global.JsEvaResult = null; if (value.IsString) { Global.JsEvaResult = value.GetStringValue(); } if (value.IsInt) { Global.JsEvaResult = value.GetIntValue(); } if (value.IsDouble) { Global.JsEvaResult = value.GetDoubleValue(); } if (value.IsBool) { Global.JsEvaResult = value.GetBoolValue(); } if (value.IsDate) { Global.JsEvaResult = value.GetDateValue(); } Global.flag = true; return(true); } case "AppendListener": { CwbBusinStyle cbStyle = CwbBusinStyle.bsAddElementEvent; if (items.Length > 2) { cbStyle = CwbBusinStyle.bsAttachElementEvent; } string elementID = items[1]; long[] frameIDs = browser.GetFrameIdentifiers(); foreach (long frameID in frameIDs) { CefFrame frame = browser.GetFrame(frameID); if (frame == null) { continue; } frame.VisitDom(new CwbDOMVisitor(browser, cbStyle, webBrowser.getEventListener(elementID))); } browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, cbStyle, webBrowser.getEventListener(elementID))); return(true); } case "GetDocument": { browser.GetMainFrame().VisitDom(new CwbDOMVisitor(browser, CwbBusinStyle.bsVisitDocument, "")); return(true); } } return(false); }