Search code examples
c#.netchromium-embedded

ChromiumFX - How to get HTML source synchonously?


I want to get source of web page in CEF3/ChromiumFX from non-UI thread (offscreen browser)

I do this

void loadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)
{
    // Get HTML code
    string htmlSource;

    CfxStringVisitor sv = new CfxStringVisitor();
    sv.Visit += ((se, ee) => { htmlSource = ee.String; });
    browser.MainFrame.GetSource(sv);
}

But htmlSource is always NULL.

How can i get HTML source synchonously?


Solution

  • I found. Here is my solution.

    Based on CefSharp TaskStringVisitor implementation (https://github.com/cefsharp/CefSharp/blob/master/CefSharp/TaskStringVisitor.cs)

        public class TaskStringVisitor : CfxStringVisitor
        {
            private readonly TaskCompletionSource<string> taskCompletionSource;
    
            public TaskStringVisitor()
            {
                taskCompletionSource = new TaskCompletionSource<string>();
                this.Visit += TaskStringVisitor_Visit;
            }
    
            void TaskStringVisitor_Visit(object sender, Chromium.Event.CfxStringVisitorVisitEventArgs e)
            {
                try
                {
                    taskCompletionSource.SetResult(e.String);
                }
                catch (Exception ex)
                {
                    taskCompletionSource.SetException(ex);
                }
            }
    
            public Task<string> Task
            {
                get { return taskCompletionSource.Task; }
            }
        }
        public Task<string> GetSourceAsync()
        {
            TaskStringVisitor taskStringVisitor = new TaskStringVisitor();
            browser.MainFrame.GetSource(taskStringVisitor);
    
            return taskStringVisitor.Task;
        }
    
        async void loadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)
        {
            // Get HTML code
            string HTMLsource = await GetSourceAsync();
        }