Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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);
    }
Ejemplo n.º 3
0
        // 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);
        }
Ejemplo n.º 4
0
            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);
            }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        // 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);
        }
Ejemplo n.º 7
0
        private CefFrame GetFrameByName(CefBrowser browser, string frameName)
        {
            CefFrame frame = null;

            if (frameName == null)
            {
                frame = browser.GetMainFrame();
            }
            else
            {
                frame = browser.GetFrame(frameName);
            }

            return(frame);
        }
Ejemplo n.º 8
0
            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);
        }
Ejemplo n.º 10
0
        /// <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;
        }
Ejemplo n.º 11
0
        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);
        }