こんちはです。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);
WebView4Delphiでした(>_<)
JS構文のTry catchのエラーをコンソールに投げる事で表示できるようになりました。
おさわがししました。
以下のような感じでしょうか。解決しているのにすいません。
procedure TForm1.Button1Click(Sender: TObject);
begin
WVBrowser1.ExecuteScript(
'try{'+
' let a=20;'+
' console.log("success");'+
'}catch(e){'+
' console.log("error");'+
'};'
);
end;
そうです。そのやりかたとpostmessageのやり方がわかったんですが
でも、しっくりこないんですよぉ。
JSファイルに書き込むのではなくdomloaddedので追加したりnavigatecompleteで動的に追加したいんですが
挫折しました。
あと、ExecuteScriptで追加したJSを一覧する方法も探しているんですが、これはソースに追加しているようなものではなく
ブラウザーオブジェクトとか見えない部分に追加しているんでしょうかね?
EMBEDWBだと追加したJSやCSSが一覧で見れた気がしたのでさがしてみましたが見つけられずにいます。
| ツイート |
|