Lenr
Lenr

Reputation: 45

Detecting an URL change with CefSharp

I'm creating a software that uses CefSharp 73.1.130. I need to make some check when the URL changes or at least when the page is loading.

I've already tried a lot of things such as :

browser.RenderProcessMessageHandler = new RenderProcessMessageHandler();

public class RenderProcessMessageHandler: IRenderProcessMessageHandler {
    // Wait for the underlying `Javascript Context` to be created, this is only     called for the main frame.
    // If the page has no javascript, no context will be created.
    void IRenderProcessMessageHandler.OnContextCreated(IWebBrowser browserControl, IBrowser browser, IFrame frame) {
        const string script = "document.addEventListener('DOMContentLoaded', function(){ alert('DomLoaded'); });";

        frame.ExecuteJavaScriptAsync(script);
    }
}

//Wait for the page to finish loading (all resources will have been loaded,     rendering is likely still happening)
browser.LoadingStateChanged += (sender, args) => {
    //Wait for the Page to finish loading
    if (args.IsLoading == false) {
        browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");
    }
}

and this :

    browser.LoadingStateChanged += OnLoadingStateChanged;
private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs args) {
    if (!args.IsLoading) {
        // Page has finished loading, do whatever you want here
    }
}

But i'm not sure that i'm using it properly so i get errors everytime such as "The name does not exist in the current context".

Here is my CefSharp code :

    public CefSharp.WinForms.ChromiumWebBrowser browser;
private void InitializeChromium() {
    CefSettings settings = new CefSettings();
    Cef.Initialize(settings);
    browser = new CefSharp.WinForms.ChromiumWebBrowser("https://google.com/");
    browser.Dock = DockStyle.Fill;

    this.wb_panel.Controls.Add(browser);
}

I'm expecting to get the new url as an output to display it in a RichTextBox

Upvotes: 2

Views: 9209

Answers (1)

Ali Bahrami
Ali Bahrami

Reputation: 6073

Welcome to StackOverflow, you can use ChromiumWebBrowser_AddressChanged event on your code. ChromiumWebBrowser.AddressChanged event is described here at the library website.

this is how you should use it:

Subscribe the event:

browser.AddressChanged += OnBrowserAddressChanged;

Define OnBrowserAddressChanged body to chagne RichBoxText value:

this.InvokeOnUiThreadIfRequired(() => richTextBox1.Text = e.Address);

Done

Here is the complete example:

using CefSharp;
using CefSharp.WinForms;
using CefSharp.WinForms.Internals;

using System;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        private readonly ChromiumWebBrowser browser;
        public Form1()
        {
            InitializeComponent();

            browser = new ChromiumWebBrowser("www.google.com")
            {
                Dock = DockStyle.Fill,
            };


            browser.AddressChanged += OnBrowserAddressChanged;

            Controls.Add(browser);
        }

        private void OnBrowserAddressChanged(object sender, AddressChangedEventArgs e)
        {
            this.InvokeOnUiThreadIfRequired(() => Text = e.Address);
        }
    }
}

Upvotes: 5

Related Questions