From 72294fb8d33f3bf02bcb266741eb5d54824328f0 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 30 Nov 2018 06:22:54 +1100 Subject: [PATCH] [Windows] Fix cefConsoleMessage handler --- .../Keyman.Developer.UI.UframeCEFHost.pas | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/windows/src/developer/TIKE/main/Keyman.Developer.UI.UframeCEFHost.pas b/windows/src/developer/TIKE/main/Keyman.Developer.UI.UframeCEFHost.pas index b2b0cb8183..addb5f4f90 100644 --- a/windows/src/developer/TIKE/main/Keyman.Developer.UI.UframeCEFHost.pas +++ b/windows/src/developer/TIKE/main/Keyman.Developer.UI.UframeCEFHost.pas @@ -38,17 +38,26 @@ const CEF_SETFOCUS = WM_USER + 305; CEF_KEYEVENT = WM_USER + 306; CEF_BEFOREBROWSE = WM_USER + 307; + CEF_CONSOLEMESSAGE = WM_USER + 308; type TCEFHostKeyEventData = record browserid: Integer; - frameid: Int64; event: TCefKeyEvent; osEvent: TMsg; end; PCEFHostKeyEventData = ^TCEFHostKeyEventData; + TCEFConsoleMessageEventData = record + browserid: Integer; + level: Cardinal; + message, source: ustring; + line: Integer; + end; + + PCEFConsoleMessageEventData = ^TCEFConsoleMessageEventData; + TCEFHostBeforeBrowseSyncEvent = procedure(Sender: TObject; const Url: string; out Handled: Boolean) of object; TCEFHostBeforeBrowseEvent = procedure(Sender: TObject; const Url: string; params: TStringList; wasHandled: Boolean) of object; @@ -126,6 +135,7 @@ type procedure Handle_CEF_SETFOCUS(var message: TMessage); procedure Handle_CEF_KEYEVENT(var message: TMessage); procedure Handle_CEF_BEFOREBROWSE(var message: TMessage); + procedure Handle_CEF_CONSOLEMESSAGE(var message: TMessage); // CEF: You have to handle this two messages to call NotifyMoveOrResizeStarted or some page elements will be misaligned. procedure WMMove(var aMessage : TWMMove); message WM_MOVE; @@ -313,6 +323,7 @@ begin CEF_SETFOCUS: Handle_CEF_SETFOCUS(Message); CEF_KEYEVENT: Handle_CEF_KEYEVENT(Message); CEF_BEFOREBROWSE: Handle_CEF_BEFOREBROWSE(Message); + CEF_CONSOLEMESSAGE: Handle_CEF_CONSOLEMESSAGE(Message); end; if Self <> nil then @@ -370,6 +381,28 @@ begin params.Free; end; +procedure TframeCEFHost.Handle_CEF_CONSOLEMESSAGE(var message: TMessage); +var + I: Integer; + id: string; + p: PCEFConsoleMessageEventData; +begin + AssertVclThread; + p := PCEFConsoleMessageEventData(message.LParam); + + id := LowerCase(ExtractFileName(ParamStr(0)))+'_'+GetVersionString+'_script_'; + if Assigned(Owner) + then id := id + Owner.ClassName + else id := id + 'unknown'; + + I := string(p.source).LastDelimiter('/'); + id := id + '_' + string(p.source).SubString(I + 1) + '_' + IntToStr(p.line); + + LogExceptionToExternalHandler(id, 'Error occurred at line '+IntToStr(p.line)+' of '+p.source, p.message, ''); + + FreeMem(p); +end; + procedure TframeCEFHost.cefBeforeBrowse(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; user_gesture, isRedirect: Boolean; @@ -422,21 +455,20 @@ procedure TframeCEFHost.cefConsoleMessage(Sender: TObject; const browser: ICefBrowser; level: Cardinal; const message, source: ustring; line: Integer; out Result: Boolean); var - id: string; - I: Integer; + p: PCEFConsoleMessageEventData; begin AssertVclThread; - id := LowerCase(ExtractFileName(ParamStr(0)))+'_'+GetVersionString+'_script_'; - if Assigned(Owner) - then id := id + Owner.ClassName - else id := id + 'unknown'; - I := string(source).LastDelimiter('/'); - id := id + '_' + string(source).SubString(I + 1) + '_' + IntToStr(line); - - LogExceptionToExternalHandler(id, 'Error occurred at line '+IntToStr(line)+' of '+source, message, ''); + p := AllocMem(SizeOf(TCEFConsoleMessageEventData)); + p.browserid := browser.Identifier; + p.level := level; + p.message := message; + p.source := source; + p.line := line; Result := True; + + PostMessage(FCallbackWnd, CEF_CONSOLEMESSAGE, WORD(Result), LPARAM(p)); end; procedure TframeCEFHost.Handle_CEF_DESTROY(var Message: TMessage); @@ -510,6 +542,7 @@ begin Result := False; p := AllocMem(Sizeof(TCEFHostKeyEventData)); + p.browserid := browser.Identifier; p.event := event^; if Assigned(osEvent) then p.osEvent := osEvent^;