web4iewでJSエラーのハンドリングについて

解決


りん  2026-04-28 20:48:32  No: 152264

こんちはです。D7でWebView4Delphiをいじっています。

そこで、javascriptのエラーを参照したく色々調べて

 DevTools Protocolを使用してコンソールログを購読する方法と、JavaScript インジェクション を使用して window.onerror をフックする方法の2通りがあると見かけましたがエラーの表示まではたどりつけませんでした。

/---------------------------------------------------------
//意図的にエラーを起こす

procedure TForm1.Button28Click(Sender: TObject);
begin
WVBrowser1.ExecuteScript('console.log(alert("xxx););', 0);
end;

procedure TForm1.WVBrowser1AfterCreated(Sender: TObject);
begin
WVWindowParent1.UpdateSize;

//  WVBrowser1.OnWebResourceRequestedイベントが発火するようになる
  WVBrowser1.AddWebResourceRequestedFilter(
    '*',COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL);

 //コンソールの使用を申請する
  WVBrowser1.CallDevToolsProtocolMethod('Console.enable','{}', 0);

 //コンソールにメッセージが出力時に
  //[OnDevToolsProtocolEventReceived]イベントEventID=1としてを発生させる
  WVBrowser1.SubscribeToDevToolsProtocolEvent('Console.messageAdded',1);

 // Logドメインを有効にする(これはいるか不明)
WVBrowser1.CallDevToolsProtocolMethod('Log.enable', '{}');
// Log.entryAdded イベントを購読する(これはいるか不明)
WVBrowser1.SubscribeToDevToolsProtocolEvent('Log.entryAdded');
end;

procedure TForm1.WVBrowser1DevToolsProtocolEventReceived(Sender: TObject;
  const aWebView: ICoreWebView2;
  const aArgs: ICoreWebView2DevToolsProtocolEventReceivedEventArgs;
  const aEventName: wvstring; aEventID: Integer);
  var

  EventName: PWideChar;
  JSONParams: PWideChar;
begin
  //aargs.Get_EventName(EventName);
  ..//if string(EventName) = 'Log.entryAdded' then
bwgin
    aargs.Get_ParameterObjectAsJson(JSONParams);
    // JSONParams を解析してエラーメッセージやレベルを取得
    Memo3.Lines.Add('JS Error: ' + string(JSONParams));
//end;
wnd
/---------------------------------------------------------

他にもこんなかんじのものもみかけましたが全く何も表示されないので
糸口が詰めない感じになってます。

//JsCode := 'window.onerror = function(message, source, lineno, colno, error) { alert("エラー発生: ${message} at ${source}:${lineno}:${colno}"); return true;' + '};';
//  WVBrowser1.ExecuteScript(JsCode, 0);

// WVBrowser1.ExecuteScript('window.addEventListener("error",function(event){connsole.log(event.message, event.filename, event.lineno);});',10);


りん  2026-04-28 20:52:53  No: 152265

WebView4Delphiでした(>_<)


りん  2026-05-06 05:01:46  No: 152271

JS構文のTry catchのエラーをコンソールに投げる事で表示できるようになりました。
おさわがししました。


mam  2026-05-07 13:43:39  No: 152272

以下のような感じでしょうか。解決しているのにすいません。

procedure TForm1.Button1Click(Sender: TObject);
begin
  WVBrowser1.ExecuteScript(
    'try{'+
    '  let a=20;'+
    '  console.log("success");'+
    '}catch(e){'+
    '  console.log("error");'+
    '};'
  );
end;


りん  2026-05-09 15:53:46  No: 152273

そうです。そのやりかたとpostmessageのやり方がわかったんですが
でも、しっくりこないんですよぉ。

JSファイルに書き込むのではなくdomloaddedので追加したりnavigatecompleteで動的に追加したいんですが
挫折しました。

あと、ExecuteScriptで追加したJSを一覧する方法も探しているんですが、これはソースに追加しているようなものではなく
ブラウザーオブジェクトとか見えない部分に追加しているんでしょうかね?

EMBEDWBだと追加したJSやCSSが一覧で見れた気がしたのでさがしてみましたが見つけられずにいます。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加