Page 1 of 1

FrameNavigationCompleted/DOMContentLoaded - URI

Posted: Mon Apr 24, 2023 10:33 pm
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...

Re: FrameNavigationCompleted/DOMContentLoaded - URI

Posted: Tue Apr 25, 2023 10:38 am
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.