Disclosure Statement: This site contains affiliate links, which means that I may receive a commission if you make a purchase using these links. As an eBay Partner, I earn from qualifying purchases.

FrameNavigationCompleted/DOMContentLoaded - URI

Post Reply
giovani.erthal
Posts: 12
Joined: Mon Nov 18, 2019 9:23 pm

FrameNavigationCompleted/DOMContentLoaded - URI

Post by giovani.erthal »

Is there another way to get the URI in the DOMContentLoaded/FrameNavigationCompleted events?

Currently my code is:

Code: Select all

procedure TFrmBrowser.WVBrowser1FrameNavigationStarting(Sender: TObject;
  const aWebView: ICoreWebView2;
  const aArgs: ICoreWebView2NavigationStartingEventArgs);
var
    ATempArgs : TCoreWebView2NavigationStartingEventArgs;
begin
    ATempArgs := TCoreWebView2NavigationStartingEventArgs.Create( aArgs );
    try
        if Pos( 'MY_URI'.ToLower(), string(ATempArgs.URI).ToLower() ) > 0 then
            FFrameMonitorar := ATempArgs.NavigationID;
    finally
        ATempArgs.Free;
    end;
end;

procedure TFrmBrowser.WVBrowser1FrameNavigationCompleted ( Sender : TObject;
    const aWebView : ICoreWebView2;
    const aArgs : ICoreWebView2NavigationCompletedEventArgs ) ;
var
    TempArgs : TCoreWebView2NavigationCompletedEventArgs;
begin
    TempArgs := TCoreWebView2NavigationCompletedEventArgs.Create ( aArgs ) ;
    try
        if ( FFrameMonitorar > 0 ) and ( TempArgs.NavigationID = FFrameMonitorar ) then
        begin
            FFrameMonitorar := 0;
            // do something
        end;
    finally
        TempArgs.Free;
    end;
end;


procedure TFrmBrowser.WVBrowser1NavigationStarting ( Sender : TObject;
    const aWebView : ICoreWebView2;
    const aArgs : ICoreWebView2NavigationStartingEventArgs ) ;
var
    TempArgs : TCoreWebView2NavigationStartingEventArgs;
begin
    TempArgs := TCoreWebView2NavigationStartingEventArgs.Create ( aArgs ) ;
    try
        if SameText ( 'MY_URI'.ToLower() , string(TempArgs.URI).ToLower() ) = True then
            FNavegacaoMonitorar := TempArgs.NavigationID;
    finally
        TempArgs.Free;
    end;
end;

procedure TFrmBrowser.WVBrowser1DOMContentLoaded ( Sender : TObject;
    const aWebView : ICoreWebView2;
    const aArgs : ICoreWebView2DOMContentLoadedEventArgs ) ;
var
    TempArgs : TCoreWebView2DOMContentLoadedEventArgs;
begin
    TempArgs := TCoreWebView2DOMContentLoadedEventArgs.Create ( aArgs ) ;
    try
        if TempArgs.NavigationId = FNavegacaoMonitorar then
        begin
            FNavegacaoMonitorar := 0;
            // do something
        end;
    finally
        TempArgs.Free;
    end;
end;
It's not very elegant...

####

How to execute a JS code in FrameNavigationCompleted event?

aWebView.ExecuteScript has some extra parameters...
User avatar
salvadordf
Posts: 4079
Joined: Thu Feb 02, 2017 12:24 pm
Location: Spain
Contact:

Re: FrameNavigationCompleted/DOMContentLoaded - URI

Post by salvadordf »

giovani.erthal wrote: Mon Apr 24, 2023 10:33 pm Is there another way to get the URI in the DOMContentLoaded/FrameNavigationCompleted events?

Currently my code is:

Code: Select all

procedure TFrmBrowser.WVBrowser1FrameNavigationStarting(Sender: TObject;
  const aWebView: ICoreWebView2;
  const aArgs: ICoreWebView2NavigationStartingEventArgs);
var
    ATempArgs : TCoreWebView2NavigationStartingEventArgs;
begin
    ATempArgs := TCoreWebView2NavigationStartingEventArgs.Create( aArgs );
    try
        if Pos( 'MY_URI'.ToLower(), string(ATempArgs.URI).ToLower() ) > 0 then
            FFrameMonitorar := ATempArgs.NavigationID;
    finally
        ATempArgs.Free;
    end;
end;

procedure TFrmBrowser.WVBrowser1FrameNavigationCompleted ( Sender : TObject;
    const aWebView : ICoreWebView2;
    const aArgs : ICoreWebView2NavigationCompletedEventArgs ) ;
var
    TempArgs : TCoreWebView2NavigationCompletedEventArgs;
begin
    TempArgs := TCoreWebView2NavigationCompletedEventArgs.Create ( aArgs ) ;
    try
        if ( FFrameMonitorar > 0 ) and ( TempArgs.NavigationID = FFrameMonitorar ) then
        begin
            FFrameMonitorar := 0;
            // do something
        end;
    finally
        TempArgs.Free;
    end;
end;


procedure TFrmBrowser.WVBrowser1NavigationStarting ( Sender : TObject;
    const aWebView : ICoreWebView2;
    const aArgs : ICoreWebView2NavigationStartingEventArgs ) ;
var
    TempArgs : TCoreWebView2NavigationStartingEventArgs;
begin
    TempArgs := TCoreWebView2NavigationStartingEventArgs.Create ( aArgs ) ;
    try
        if SameText ( 'MY_URI'.ToLower() , string(TempArgs.URI).ToLower() ) = True then
            FNavegacaoMonitorar := TempArgs.NavigationID;
    finally
        TempArgs.Free;
    end;
end;

procedure TFrmBrowser.WVBrowser1DOMContentLoaded ( Sender : TObject;
    const aWebView : ICoreWebView2;
    const aArgs : ICoreWebView2DOMContentLoadedEventArgs ) ;
var
    TempArgs : TCoreWebView2DOMContentLoadedEventArgs;
begin
    TempArgs := TCoreWebView2DOMContentLoadedEventArgs.Create ( aArgs ) ;
    try
        if TempArgs.NavigationId = FNavegacaoMonitorar then
        begin
            FNavegacaoMonitorar := 0;
            // do something
        end;
    finally
        TempArgs.Free;
    end;
end;
It's not very elegant...
You're doing everything correctly. The WebView2 API exposes the NavigationID value to use the events exactly like you do.
giovani.erthal wrote: Mon Apr 24, 2023 10:33 pm How to execute a JS code in FrameNavigationCompleted event?
aWebView.ExecuteScript has some extra parameters...
Call TWVBrowserBase.ExecuteScript with the JavaScript code and a custom "aExecutionID" value. This function is asynchronous and it triggers the TWVBrowserBase.OnExecuteScriptCompleted event when it finishes.
TWVBrowserBase.OnExecuteScriptCompleted will have the same aExecutionID value so you know which script triggered the OnExecuteScriptCompleted event.
Post Reply