1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-09-30 21:28:55 +02:00

Added custom JavaScript dialogs to FMXExternalPumpBrowser2 for Linux

Removed unused TOpenDialog from FMXExternalPumpBrowser for MacOS
Replaced the address box with a TComboEdit in FMXExternalPumpBrowser for Windows
This commit is contained in:
Salvador Díaz Fau
2021-06-05 18:23:21 +02:00
parent 43ab8ef953
commit 1efd6c9a67
6 changed files with 154 additions and 46 deletions

View File

@@ -27,16 +27,6 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
Size.PlatformDefault = False Size.PlatformDefault = False
TabOrder = 0 TabOrder = 0
TabStop = False TabStop = False
object AddressEdt: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Client
TabOrder = 0
Text = 'https://www.google.com'
Size.Width = 709.000000000000000000
Size.Height = 23.000000000000000000
Size.PlatformDefault = False
OnEnter = AddressEdtEnter
end
object Layout1: TLayout object Layout1: TLayout
Align = Right Align = Right
Padding.Left = 5.000000000000000000 Padding.Left = 5.000000000000000000
@@ -45,7 +35,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
Size.Width = 81.000000000000000000 Size.Width = 81.000000000000000000
Size.Height = 23.000000000000000000 Size.Height = 23.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
TabOrder = 1 TabOrder = 0
TabStop = False TabStop = False
object GoBtn: TButton object GoBtn: TButton
Align = Left Align = Left
@@ -73,6 +63,28 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
OnEnter = SnapshotBtnEnter OnEnter = SnapshotBtnEnter
end end
end end
object AddressCb: TComboEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Client
TabOrder = 1
ItemHeight = 19.000000000000000000
Items.Strings = (
'https://www.google.com'
'https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onco' +
'ntextmenu'
'https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input' +
'_type_file'
'https://www.w3schools.com/js/tryit.asp?filename=tryjs_alert'
'https://www.w3schools.com/js/tryit.asp?filename=tryjs_confirm'
'https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select')
ItemIndex = 0
Text = 'https://www.google.com'
Size.Width = 709.000000000000000000
Size.Height = 23.000000000000000000
Size.PlatformDefault = False
end
end end
object Timer1: TTimer object Timer1: TTimer
Enabled = False Enabled = False
@@ -127,6 +139,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
OnBeforeContextMenu = chrmosrBeforeContextMenu OnBeforeContextMenu = chrmosrBeforeContextMenu
OnTooltip = chrmosrTooltip OnTooltip = chrmosrTooltip
OnCursorChange = chrmosrCursorChange OnCursorChange = chrmosrCursorChange
OnJsdialog = chrmosrJsdialog
OnBeforePopup = chrmosrBeforePopup OnBeforePopup = chrmosrBeforePopup
OnAfterCreated = chrmosrAfterCreated OnAfterCreated = chrmosrAfterCreated
OnBeforeClose = chrmosrBeforeClose OnBeforeClose = chrmosrBeforeClose

View File

@@ -44,12 +44,19 @@ uses
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Edit, FMX.StdCtrls, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Edit, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.Graphics, FMX.Layouts, FMX.DialogService, FMX.Controls.Presentation, FMX.Graphics, FMX.Layouts, FMX.DialogService,
uCEFFMXChromium, uCEFFMXBufferPanel, uCEFFMXWorkScheduler, uCEFFMXChromium, uCEFFMXBufferPanel, uCEFFMXWorkScheduler,
uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFChromiumCore; uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFChromiumCore, FMX.ComboEdit;
type type
TJSDialogInfo = record
OriginUrl : ustring;
MessageText : ustring;
DefaultPromptText : ustring;
DialogType : TCefJsDialogType;
Callback : ICefJsDialogCallback;
end;
TFMXExternalPumpBrowserFrm = class(TForm) TFMXExternalPumpBrowserFrm = class(TForm)
AddressPnl: TPanel; AddressPnl: TPanel;
AddressEdt: TEdit;
chrmosr: TFMXChromium; chrmosr: TFMXChromium;
Timer1: TTimer; Timer1: TTimer;
SaveDialog1: TSaveDialog; SaveDialog1: TSaveDialog;
@@ -59,6 +66,7 @@ type
SnapshotBtn: TButton; SnapshotBtn: TButton;
StatusBar1: TStatusBar; StatusBar1: TStatusBar;
StatusLbl: TLabel; StatusLbl: TLabel;
AddressCb: TComboEdit;
procedure GoBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject);
procedure GoBtnEnter(Sender: TObject); procedure GoBtnEnter(Sender: TObject);
@@ -93,6 +101,7 @@ type
procedure chrmosrLoadingStateChange(Sender: TObject; const browser: ICefBrowser; isLoading, canGoBack, canGoForward: Boolean); procedure chrmosrLoadingStateChange(Sender: TObject; const browser: ICefBrowser; isLoading, canGoBack, canGoForward: Boolean);
procedure chrmosrLoadError(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer; const errorText, failedUrl: ustring); procedure chrmosrLoadError(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; errorCode: Integer; const errorText, failedUrl: ustring);
procedure chrmosrBeforeContextMenu(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel); procedure chrmosrBeforeContextMenu(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const params: ICefContextMenuParams; const model: ICefMenuModel);
procedure chrmosrJsdialog(Sender: TObject; const browser: ICefBrowser; const originUrl: ustring; dialogType: TCefJsDialogType; const messageText, defaultPromptText: ustring; const callback: ICefJsDialogCallback; out suppressMessage, Result: Boolean);
procedure Timer1Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject);
procedure AddressEdtEnter(Sender: TObject); procedure AddressEdtEnter(Sender: TObject);
@@ -109,6 +118,7 @@ type
FCanClose : boolean; FCanClose : boolean;
FClosing : boolean; FClosing : boolean;
FResizeCS : TCriticalSection; FResizeCS : TCriticalSection;
FJSDialogInfo : TJSDialogInfo;
{$IFDEF DELPHI17_UP} {$IFDEF DELPHI17_UP}
FMouseWheelService : IFMXMouseService; FMouseWheelService : IFMXMouseService;
{$ENDIF} {$ENDIF}
@@ -118,6 +128,8 @@ type
function getModifiers(Button: TMouseButton; Shift: TShiftState): TCefEventFlags; overload; function getModifiers(Button: TMouseButton; Shift: TShiftState): TCefEventFlags; overload;
function GetButton(Button: TMouseButton): TCefMouseButtonType; function GetButton(Button: TMouseButton): TCefMouseButtonType;
function GetMousePosition(var aPoint : TPointF) : boolean; function GetMousePosition(var aPoint : TPointF) : boolean;
procedure ShowPendingJSDialog;
public public
procedure DoResize; procedure DoResize;
procedure NotifyMoveOrResizeStarted; procedure NotifyMoveOrResizeStarted;
@@ -151,7 +163,7 @@ implementation
{$R *.fmx} {$R *.fmx}
uses uses
System.SysUtils, System.Math, FMX.Platform, FMX.Platform.Linux, System.SysUtils, System.Math, FMX.Platform, FMX.Platform.Linux, FMX.DialogService.Async,
uCEFMiscFunctions, uCEFApplication, uCEFLinuxTypes, uCEFLinuxConstants, uCEFMiscFunctions, uCEFApplication, uCEFLinuxTypes, uCEFLinuxConstants,
uCEFLinuxFunctions; uCEFLinuxFunctions;
@@ -232,9 +244,11 @@ begin
if not(FClosing) then if not(FClosing) then
begin begin
FClosing := True; FClosing := True;
Visible := False; Visible := False;
AddressPnl.Enabled := False; AddressPnl.Enabled := False;
FJSDialogInfo.Callback := nil;
chrmosr.CloseBrowser(True); chrmosr.CloseBrowser(True);
end; end;
end; end;
@@ -250,7 +264,13 @@ begin
FClosing := False; FClosing := False;
FResizeCS := TCriticalSection.Create; FResizeCS := TCriticalSection.Create;
chrmosr.DefaultURL := AddressEdt.Text; FJSDialogInfo.OriginUrl := '';
FJSDialogInfo.MessageText := '';
FJSDialogInfo.DefaultPromptText := '';
FJSDialogInfo.DialogType := JSDIALOGTYPE_ALERT;
FJSDialogInfo.Callback := nil;
chrmosr.DefaultURL := AddressCb.Text;
{$IFDEF DELPHI17_UP} {$IFDEF DELPHI17_UP}
if TPlatformServices.Current.SupportsPlatformService(IFMXMouseService) then if TPlatformServices.Current.SupportsPlatformService(IFMXMouseService) then
@@ -261,7 +281,9 @@ end;
procedure TFMXExternalPumpBrowserFrm.FormDestroy(Sender: TObject); procedure TFMXExternalPumpBrowserFrm.FormDestroy(Sender: TObject);
begin begin
FResizeCS.Free; FResizeCS.Free;
if (FPopUpBitmap <> nil) then FreeAndNil(FPopUpBitmap);
if (FPopUpBitmap <> nil) then
FreeAndNil(FPopUpBitmap);
end; end;
procedure TFMXExternalPumpBrowserFrm.FormHide(Sender: TObject); procedure TFMXExternalPumpBrowserFrm.FormHide(Sender: TObject);
@@ -288,7 +310,7 @@ begin
FPendingResize := False; FPendingResize := False;
FResizeCS.Release; FResizeCS.Release;
chrmosr.LoadURL(AddressEdt.Text); chrmosr.LoadURL(AddressCb.Text);
end; end;
procedure TFMXExternalPumpBrowserFrm.GoBtnEnter(Sender: TObject); procedure TFMXExternalPumpBrowserFrm.GoBtnEnter(Sender: TObject);
@@ -572,6 +594,71 @@ begin
rect.height := round(Panel1.Height); rect.height := round(Panel1.Height);
end; end;
procedure TFMXExternalPumpBrowserFrm.chrmosrJsdialog( Sender : TObject;
const browser : ICefBrowser;
const originUrl : ustring;
dialogType : TCefJsDialogType;
const messageText : ustring;
const defaultPromptText : ustring;
const callback : ICefJsDialogCallback;
out suppressMessage : Boolean;
out Result : Boolean);
begin
FJSDialogInfo.OriginUrl := originUrl;
FJSDialogInfo.DialogType := dialogType;
FJSDialogInfo.MessageText := messageText;
FJSDialogInfo.DefaultPromptText := defaultPromptText;
FJSDialogInfo.Callback := callback;
Result := True;
suppressMessage := False;
TThread.ForceQueue(nil, ShowPendingJSDialog);
end;
procedure TFMXExternalPumpBrowserFrm.ShowPendingJSDialog;
var
TempCaption : string;
begin
if FClosing or (FJSDialogInfo.Callback = nil) then exit;
TempCaption := 'JavaScript message from : ' + FJSDialogInfo.OriginUrl;
case FJSDialogInfo.DialogType of
JSDIALOGTYPE_CONFIRM :
begin
TempCaption := TempCaption + CRLF + CRLF + FJSDialogInfo.MessageText;
TDialogServiceAsync.MessageDialog(TempCaption,
TMsgDlgType.mtConfirmation,
[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],
TMsgDlgBtn.mbYes,
0,
procedure(const AResult: TModalResult)
begin
FJSDialogInfo.Callback.cont(AResult in [mrOk, mrYes], '');
FJSDialogInfo.Callback := nil;
end);
end;
JSDIALOGTYPE_PROMPT :
TDialogServiceAsync.InputQuery(TempCaption,
[FJSDialogInfo.MessageText],
[FJSDialogInfo.DefaultPromptText],
procedure(const AResult: TModalResult; const AValues: array of string)
begin
FJSDialogInfo.Callback.cont(AResult in [mrOk, mrYes], AValues[0]);
FJSDialogInfo.Callback := nil;
end);
else // JSDIALOGTYPE_ALERT
begin
TempCaption := TempCaption + CRLF + CRLF + FJSDialogInfo.MessageText;
TDialogServiceAsync.ShowMessage(TempCaption);
FJSDialogInfo.Callback := nil;
end;
end;
end;
procedure TFMXExternalPumpBrowserFrm.chrmosrLoadError( Sender : TObject; procedure TFMXExternalPumpBrowserFrm.chrmosrLoadError( Sender : TObject;
const browser : ICefBrowser; const browser : ICefBrowser;
const frame : ICefFrame; const frame : ICefFrame;

View File

@@ -96,7 +96,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
Filter = 'Bitmap files (*.bmp)|*.BMP' Filter = 'Bitmap files (*.bmp)|*.BMP'
Title = 'Save snapshot' Title = 'Save snapshot'
Left = 40 Left = 40
Top = 241 Top = 185
end end
object Panel1: TFMXBufferPanel object Panel1: TFMXBufferPanel
Align = Client Align = Client
@@ -120,7 +120,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
end end
object MainMenu1: TMainMenu object MainMenu1: TMainMenu
Left = 40 Left = 40
Top = 297 Top = 241
object EditMenu: TMenuItem object EditMenu: TMenuItem
Text = 'Edit' Text = 'Edit'
object UndoMenuItem: TMenuItem object UndoMenuItem: TMenuItem
@@ -173,7 +173,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
object PopupMenu1: TPopupMenu object PopupMenu1: TPopupMenu
OnPopup = PopupMenu1Popup OnPopup = PopupMenu1Popup
Left = 40 Left = 40
Top = 353 Top = 297
object BackMenuItem: TMenuItem object BackMenuItem: TMenuItem
Text = 'Back' Text = 'Back'
OnClick = BackMenuItemClick OnClick = BackMenuItemClick
@@ -183,10 +183,6 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
OnClick = ForwardMenuItemClick OnClick = ForwardMenuItemClick
end end
end end
object OpenDialog1: TOpenDialog
Left = 40
Top = 185
end
object chrmosr: TFMXChromium object chrmosr: TFMXChromium
OnBeforeContextMenu = chrmosrBeforeContextMenu OnBeforeContextMenu = chrmosrBeforeContextMenu
OnTooltip = chrmosrTooltip OnTooltip = chrmosrTooltip

View File

@@ -90,7 +90,6 @@ type
PopupMenu1: TPopupMenu; PopupMenu1: TPopupMenu;
BackMenuItem: TMenuItem; BackMenuItem: TMenuItem;
ForwardMenuItem: TMenuItem; ForwardMenuItem: TMenuItem;
OpenDialog1: TOpenDialog;
procedure GoBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject);
procedure GoBtnEnter(Sender: TObject); procedure GoBtnEnter(Sender: TObject);

View File

@@ -23,17 +23,8 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
Size.Width = 800.000000000000000000 Size.Width = 800.000000000000000000
Size.Height = 33.000000000000000000 Size.Height = 33.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
TabOrder = 1 TabOrder = 0
object AddressEdt: TEdit TabStop = False
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Client
TabOrder = 0
Text = 'https://www.google.com'
Size.Width = 709.000000000000000000
Size.Height = 23.000000000000000000
Size.PlatformDefault = False
OnEnter = AddressEdtEnter
end
object Layout1: TLayout object Layout1: TLayout
Align = Right Align = Right
Padding.Left = 5.000000000000000000 Padding.Left = 5.000000000000000000
@@ -42,7 +33,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
Size.Width = 81.000000000000000000 Size.Width = 81.000000000000000000
Size.Height = 23.000000000000000000 Size.Height = 23.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
TabOrder = 2 TabOrder = 1
object GoBtn: TButton object GoBtn: TButton
Align = Left Align = Left
Position.X = 5.000000000000000000 Position.X = 5.000000000000000000
@@ -69,6 +60,28 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
OnEnter = SnapshotBtnEnter OnEnter = SnapshotBtnEnter
end end
end end
object AddressCb: TComboEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Client
TabOrder = 0
ItemHeight = 19.000000000000000000
Items.Strings = (
'https://www.google.com'
'https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onco' +
'ntextmenu'
'https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input' +
'_type_file'
'https://www.w3schools.com/js/tryit.asp?filename=tryjs_alert'
'https://www.w3schools.com/js/tryit.asp?filename=tryjs_confirm'
'https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select')
ItemIndex = 0
Text = 'https://www.google.com'
Size.Width = 709.000000000000000000
Size.Height = 23.000000000000000000
Size.PlatformDefault = False
end
end end
object Timer1: TTimer object Timer1: TTimer
Enabled = False Enabled = False
@@ -86,8 +99,7 @@ object FMXExternalPumpBrowserFrm: TFMXExternalPumpBrowserFrm
end end
object Panel1: TFMXBufferPanel object Panel1: TFMXBufferPanel
Align = Client Align = Client
TabOrder = 0 TabOrder = 1
Color = claTomato
CanFocus = True CanFocus = True
Size.Width = 800.000000000000000000 Size.Width = 800.000000000000000000
Size.Height = 600.000000000000000000 Size.Height = 600.000000000000000000

View File

@@ -52,12 +52,12 @@ uses
FMX.Graphics, FMX.Graphics,
{$ENDIF} {$ENDIF}
uCEFFMXChromium, uCEFFMXBufferPanel, uCEFFMXWorkScheduler, uCEFFMXChromium, uCEFFMXBufferPanel, uCEFFMXWorkScheduler,
uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFChromiumCore, FMX.Layouts; uCEFInterfaces, uCEFTypes, uCEFConstants, uCEFChromiumCore, FMX.Layouts,
FMX.ComboEdit;
type type
TFMXExternalPumpBrowserFrm = class(TForm) TFMXExternalPumpBrowserFrm = class(TForm)
AddressPnl: TPanel; AddressPnl: TPanel;
AddressEdt: TEdit;
chrmosr: TFMXChromium; chrmosr: TFMXChromium;
Timer1: TTimer; Timer1: TTimer;
SaveDialog1: TSaveDialog; SaveDialog1: TSaveDialog;
@@ -65,6 +65,7 @@ type
Layout1: TLayout; Layout1: TLayout;
GoBtn: TButton; GoBtn: TButton;
SnapshotBtn: TButton; SnapshotBtn: TButton;
AddressCb: TComboEdit;
procedure GoBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject);
procedure GoBtnEnter(Sender: TObject); procedure GoBtnEnter(Sender: TObject);
@@ -257,7 +258,7 @@ begin
FAtLeastWin8 := False; FAtLeastWin8 := False;
{$ENDIF} {$ENDIF}
chrmosr.DefaultURL := AddressEdt.Text; chrmosr.DefaultURL := AddressCb.Text;
InitializeLastClick; InitializeLastClick;
@@ -307,7 +308,7 @@ begin
FPendingResize := False; FPendingResize := False;
FResizeCS.Release; FResizeCS.Release;
chrmosr.LoadURL(AddressEdt.Text); chrmosr.LoadURL(AddressCb.Text);
end; end;
procedure TFMXExternalPumpBrowserFrm.GoBtnEnter(Sender: TObject); procedure TFMXExternalPumpBrowserFrm.GoBtnEnter(Sender: TObject);