diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/00-Delete.bat b/demos/Lazarus_Mac/ExternalPumpBrowser/00-Delete.bat
new file mode 100644
index 00000000..0b5ba5c8
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/00-Delete.bat
@@ -0,0 +1,2 @@
+rmdir /S /Q lib
+rmdir /S /Q backup
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.ico b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.ico
new file mode 100644
index 00000000..0341321b
Binary files /dev/null and b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.ico differ
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.lpi b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.lpi
new file mode 100644
index 00000000..a72ab281
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.lpi
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.lpr b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.lpr
new file mode 100644
index 00000000..c04fad72
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.lpr
@@ -0,0 +1,75 @@
+// ************************************************************************
+// ***************************** CEF4Delphi *******************************
+// ************************************************************************
+//
+// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
+// browser in Delphi applications.
+//
+// The original license of DCEF3 still applies to CEF4Delphi.
+//
+// For more information about CEF4Delphi visit :
+// https://www.briskbard.com/index.php?lang=en&pageid=cef
+//
+// Copyright © 2018 Salvador DÃaz Fau. All rights reserved.
+//
+// ************************************************************************
+// ************ vvvv Original license and comments below vvvv *************
+// ************************************************************************
+(*
+ * Delphi Chromium Embedded 3
+ *
+ * Usage allowed under the restrictions of the Lesser GNU General Public License
+ * or alternatively the restrictions of the Mozilla Public License 1.1
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ * the specific language governing rights and limitations under the License.
+ *
+ * Unit owner : Henri Gourvest
+ * Web site : http://www.progdigy.com
+ * Repository : http://code.google.com/p/delphichromiumembedded/
+ * Group : http://groups.google.com/group/delphichromiumembedded
+ *
+ * Embarcadero Technologies, Inc is not permitted to use or redistribute
+ * this source code without explicit permission.
+ *
+ *)
+
+
+ (*
+ * Include the following files
+ * ExternalPumpBrowser.app/Contents/Frameworks/ExternalPumpBrowser Helper.app/
+ * files from the demos/Lazarus_Mac/AppHelper project
+ * use create_mac_helper.sh
+ *
+ * ExternalPumpBrowser.app/Contents/Frameworks/Chromium Embedded Framework.framework
+ * files from Release folder in cef download
+ *
+ *)
+
+
+program ExternalPumpBrowser;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}{$IFDEF UseCThreads}
+ cthreads,
+ {$ENDIF}{$ENDIF}
+ Interfaces,
+ Forms,
+ uExternalPumpBrowser, GlobalCefApplication
+ { you can add units after this }
+ ;
+
+{$R *.res}
+
+begin
+ RequireDerivedFormResource:=True;
+ Application.Title := 'External Pump Browser';
+ Application.Scaled := True;
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
+
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.res b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.res
new file mode 100644
index 00000000..bec39b4a
Binary files /dev/null and b/demos/Lazarus_Mac/ExternalPumpBrowser/ExternalPumpBrowser.res differ
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/README.txt b/demos/Lazarus_Mac/ExternalPumpBrowser/README.txt
new file mode 100644
index 00000000..deeaaf98
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/README.txt
@@ -0,0 +1,24 @@
+ExternalPumpBrowser
+
+# ABOUT
+
+This example uses
+ TCEFLinkedWindowParent
+ TCEFWorkScheduler
+
+TCEFWorkScheduler feeds the CEF messageloop by calling DoMessageLoopWork(). On Mac this is currently the only way to run the CEF messageloop.
+
+
+# SETUP
+
+1) Go to "project options" and create the "App Bundle"
+2) Download the CEF framework and place the content of the "Release" folder into ExternalPumpBrowser.app/Contents/Frameworks/Chromium Embedded Framework.framework
+You should have:
+ Chromium Embedded Framework
+ Libraries/*
+ Resources/*
+3) Open project "AppHelper" (from demos/Lazarus_any_OS ), create App Bundle and compile the AppHelper.
+ Run create_mac_helper.sh
+4) Open project ExternalPumpBrowser, compile and run
+
+
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/cef.inc b/demos/Lazarus_Mac/ExternalPumpBrowser/cef.inc
new file mode 100644
index 00000000..c8ce967e
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/cef.inc
@@ -0,0 +1,468 @@
+// ************************************************************************
+// ***************************** CEF4Delphi *******************************
+// ************************************************************************
+//
+// CEF4Delphi is based on DCEF3 which uses CEF3 to embed a chromium-based
+// browser in Delphi applications.
+//
+// The original license of DCEF3 still applies to CEF4Delphi.
+//
+// For more information about CEF4Delphi visit :
+// https://www.briskbard.com/index.php?lang=en&pageid=cef
+//
+// Copyright © 2017 Salvador Diaz Fau. All rights reserved.
+//
+// ************************************************************************
+// ************ vvvv Original license and comments below vvvv *************
+// ************************************************************************
+(*
+ * Delphi Chromium Embedded 3
+ *
+ * Usage allowed under the restrictions of the Lesser GNU General Public License
+ * or alternatively the restrictions of the Mozilla Public License 1.1
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ * the specific language governing rights and limitations under the License.
+ *
+ * Unit owner : Henri Gourvest
+ * Web site : http://www.progdigy.com
+ * Repository : http://code.google.com/p/delphichromiumembedded/
+ * Group : http://groups.google.com/group/delphichromiumembedded
+ *
+ * Embarcadero Technologies, Inc is not permitted to use or redistribute
+ * this source code without explicit permission.
+ *
+ *)
+
+ // The complete list of compiler versions is here :
+ // http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiler_Versions
+
+{$DEFINE DELPHI_VERSION_UNKNOW}
+
+// Delphi 5
+{$IFDEF VER130}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+{$ENDIF}
+
+// Delphi 6
+{$IFDEF VER140}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+{$ENDIF}
+
+// Delphi 7
+{$IFDEF VER150}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+{$ENDIF}
+
+// Delphi 8
+{$IFDEF VER160}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+{$ENDIF}
+
+// Delphi 2005
+{$IFDEF VER170}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+{$ENDIF}
+
+{$IFDEF VER180}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ // Delphi 2007
+ {$IFDEF VER185}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ // Delphi 2006
+ {$ELSE}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$ENDIF}
+{$ENDIF}
+
+// Delphi 2009
+{$IFDEF VER200}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+{$ENDIF}
+
+//Delphi 2010
+{$IFDEF VER210}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+{$ENDIF}
+
+// Delphi XE
+{$IFDEF VER220}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+{$ENDIF}
+
+// Delphi XE2 (First FireMonkey and 64bit compiler)
+{$IFDEF VER230}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+{$ENDIF}
+
+// Delphi XE3
+{$IFDEF VER240}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+{$ENDIF}
+
+// Delphi XE4
+{$IFDEF VER250}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+{$ENDIF}
+
+// Delphi XE5
+{$IFDEF VER260}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+{$ENDIF}
+
+// Delphi XE6
+{$IFDEF VER270}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+{$ENDIF}
+
+// Delphi XE7
+{$IFDEF VER280}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+{$ENDIF}
+
+// Delphi XE8
+{$IFDEF VER290}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+{$ENDIF VER290}
+
+// Rad Studio 10 - Delphi Seattle
+{$IFDEF VER300}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+ {$DEFINE DELPHI23_UP}
+{$ENDIF}
+
+// Rad Studio 10.1 - Delphi Berlin
+{$IFDEF VER310}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+ {$DEFINE DELPHI23_UP}
+ {$DEFINE DELPHI24_UP}
+{$ENDIF}
+
+// Rad Studio 10.2 - Delphi Tokyo
+{$IFDEF VER320}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+ {$DEFINE DELPHI23_UP}
+ {$DEFINE DELPHI24_UP}
+ {$DEFINE DELPHI25_UP}
+{$ENDIF}
+
+// Rad Studio 10.3 - Delphi Rio
+{$IFDEF VER330}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+ {$DEFINE DELPHI23_UP}
+ {$DEFINE DELPHI24_UP}
+ {$DEFINE DELPHI25_UP}
+ {$DEFINE DELPHI26_UP}
+{$ENDIF}
+
+// Rad Studio 10.4 - Delphi Sydney
+{$IFDEF VER340}
+ {$UNDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+ {$DEFINE DELPHI23_UP}
+ {$DEFINE DELPHI24_UP}
+ {$DEFINE DELPHI25_UP}
+ {$DEFINE DELPHI26_UP}
+ {$DEFINE DELPHI27_UP}
+{$ENDIF}
+
+{$IFDEF FPC}
+ {$DEFINE SUPPORTS_INLINE}
+ {$IF DEFINED(FPC_FULLVERSION) AND (FPC_FULLVERSION >= 30200)}
+ {$DEFINE FPC_VER_320}
+ {$IFEND}
+{$ELSE}
+ {$IFDEF DELPHI_VERSION_UNKNOW}
+ {$DEFINE DELPHI5_UP}
+ {$DEFINE DELPHI6_UP}
+ {$DEFINE DELPHI7_UP}
+ {$DEFINE DELPHI8_UP}
+ {$DEFINE DELPHI9_UP}
+ {$DEFINE DELPHI10_UP}
+ {$DEFINE DELPHI11_UP}
+ {$DEFINE DELPHI12_UP}
+ {$DEFINE DELPHI14_UP}
+ {$DEFINE DELPHI15_UP}
+ {$DEFINE DELPHI16_UP}
+ {$DEFINE DELPHI17_UP}
+ {$DEFINE DELPHI18_UP}
+ {$DEFINE DELPHI19_UP}
+ {$DEFINE DELPHI20_UP}
+ {$DEFINE DELPHI21_UP}
+ {$DEFINE DELPHI22_UP}
+ {$DEFINE DELPHI23_UP}
+ {$DEFINE DELPHI24_UP}
+ {$DEFINE DELPHI25_UP}
+ {$DEFINE DELPHI26_UP}
+ {$DEFINE DELPHI27_UP}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF DELPHI9_UP}
+ {$DEFINE SUPPORTS_INLINE}
+{$ENDIF}
+
+{$IF DEFINED(CPUX32) OR
+ DEFINED(CPU386) OR
+ DEFINED(CPUi386) OR
+ DEFINED(CPUPOWERPC32) OR
+ DEFINED(CPUSPARC32) OR
+ DEFINED(CPU32BITS) OR
+ DEFINED(CPUARM32) OR
+ DEFINED(WIN32) OR
+ DEFINED(IOS32) OR
+ DEFINED(MACOS32) OR
+ DEFINED(LINUX32) OR
+ DEFINED(POSIX32) OR
+ DEFINED(ANDROID32)}
+ {$DEFINE TARGET_32BITS}
+{$IFEND}
+
+// Delphi uses MACOS for the new MacOSX and DARWIN is not defined
+// FPC uses DARWIN for the new MacOSX and MACOS is defined for the classic Macintosh OS (System 7)
+// We define MACOSX to avoid conflicts in both situations
+{$IFDEF FPC}
+ {$IFDEF DARWIN}
+ {$DEFINE MACOSX}
+ {$ENDIF}
+{$ELSE}
+ {$IFDEF MACOS}
+ {$DEFINE MACOSX}
+ {$ENDIF}
+{$ENDIF}
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/create_mac_helper.sh b/demos/Lazarus_Mac/ExternalPumpBrowser/create_mac_helper.sh
new file mode 100755
index 00000000..bd124ded
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/create_mac_helper.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+CDIR=$(pwd)
+cd "$(dirname "$0")"
+
+../../Lazarus_any_OS/AppHelper/create_mac_helper_apps.sh ../../../bin/ExternalPumpBrowser.app
+
+cd "$CDIR"
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/globalcefapplication.pas b/demos/Lazarus_Mac/ExternalPumpBrowser/globalcefapplication.pas
new file mode 100644
index 00000000..529245f8
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/globalcefapplication.pas
@@ -0,0 +1,48 @@
+unit GlobalCefApplication;
+
+{$mode ObjFPC}{$H+}
+{$I cef.inc}
+
+interface
+
+uses
+ uCEFApplication, uCEFWorkScheduler;
+
+procedure CreateGlobalCEFApp;
+
+implementation
+
+procedure GlobalCEFApp_OnScheduleMessagePumpWork(const aDelayMS : int64);
+begin
+ if (GlobalCEFWorkScheduler <> nil) then GlobalCEFWorkScheduler.ScheduleMessagePumpWork(aDelayMS);
+end;
+
+procedure CreateGlobalCEFApp;
+begin
+ if GlobalCEFApp <> nil then
+ exit;
+
+ // TCEFWorkScheduler will call cef_do_message_loop_work when
+ // it's told in the GlobalCEFApp.OnScheduleMessagePumpWork event.
+ // GlobalCEFWorkScheduler needs to be created before the
+ // GlobalCEFApp.StartMainProcess call.
+ GlobalCEFWorkScheduler := TCEFWorkScheduler.Create(nil);
+
+ GlobalCEFApp := TCefApplication.Create;
+ GlobalCEFApp.ExternalMessagePump := True;
+ GlobalCEFApp.MultiThreadedMessageLoop := False;
+ GlobalCEFApp.OnScheduleMessagePumpWork := @GlobalCEFApp_OnScheduleMessagePumpWork;
+
+ (* Enable the below to prevent being asked for permission to access "Chromium Safe Storage"
+ If set to true, Cookies will not be encrypted.
+ *)
+ //GlobalCEFApp.UseMockKeyChain := True;
+
+ {
+ GlobalCEFApp.LogFile := 'cef.log';
+ GlobalCEFApp.LogSeverity := LOGSEVERITY_VERBOSE;
+ }
+end;
+
+end.
+
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/uExternalPumpBrowser.lfm b/demos/Lazarus_Mac/ExternalPumpBrowser/uExternalPumpBrowser.lfm
new file mode 100644
index 00000000..312fb071
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/uExternalPumpBrowser.lfm
@@ -0,0 +1,94 @@
+object Form1: TForm1
+ Left = 473
+ Height = 589
+ Top = 227
+ Width = 967
+ Caption = 'Initializing browser. Please wait...'
+ ClientHeight = 589
+ ClientWidth = 967
+ OnActivate = FormActivate
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ LCLVersion = '2.0.10.0'
+ object AddressPnl: TPanel
+ Left = 0
+ Height = 23
+ Top = 0
+ Width = 967
+ Align = alTop
+ BevelOuter = bvNone
+ ClientHeight = 23
+ ClientWidth = 967
+ Enabled = False
+ TabOrder = 0
+ object GoBtn: TButton
+ Left = 932
+ Height = 23
+ Top = 0
+ Width = 35
+ Align = alRight
+ Caption = 'Go'
+ OnClick = GoBtnClick
+ TabOrder = 0
+ end
+ object AddressEdt: TComboBox
+ Left = 0
+ Height = 21
+ Top = 0
+ Width = 932
+ Align = alClient
+ ItemHeight = 13
+ ItemIndex = 0
+ Items.Strings = (
+ 'https://www.google.com'
+ 'https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending'
+ 'https://www.w3schools.com/js/tryit.asp?filename=tryjs_win_close'
+ 'https://www.w3schools.com/html/html5_video.asp'
+ 'http://www.adobe.com/software/flash/about/'
+ 'http://isflashinstalled.com/'
+ 'chrome://version/'
+ 'http://html5test.com/'
+ 'https://www.w3schools.com/'
+ 'http://webglsamples.org/'
+ 'https://get.webgl.org/'
+ 'https://www.youtube.com'
+ 'https://html5demos.com/drag/'
+ 'https://developers.google.com/maps/documentation/javascript/examples/streetview-embed?hl=fr'
+ 'https://www.w3schools.com/Tags/tryit.asp?filename=tryhtml_iframe_name'
+ 'https://www.browserleaks.com/webrtc'
+ 'https://frames-per-second.appspot.com/'
+ )
+ TabOrder = 1
+ Text = 'https://www.google.com'
+ end
+ end
+ object CEFLinkedWindowParent1: TCEFLinkedWindowParent
+ Left = 0
+ Height = 566
+ Top = 23
+ Width = 967
+ Align = alClient
+ TabStop = True
+ TabOrder = 1
+ OnEnter = CEFLinkedWindowParent1Enter
+ OnExit = CEFLinkedWindowParent1Exit
+ Chromium = Chromium1
+ end
+ object Chromium1: TChromium
+ OnGotFocus = Chromium1GotFocus
+ OnBeforePopup = Chromium1BeforePopup
+ OnAfterCreated = Chromium1AfterCreated
+ OnBeforeClose = Chromium1BeforeClose
+ OnClose = Chromium1Close
+ OnOpenUrlFromTab = Chromium1OpenUrlFromTab
+ Left = 56
+ Top = 80
+ end
+ object Timer1: TTimer
+ Enabled = False
+ OnTimer = Timer1Timer
+ Left = 56
+ Top = 160
+ end
+end
diff --git a/demos/Lazarus_Mac/ExternalPumpBrowser/uExternalPumpBrowser.pas b/demos/Lazarus_Mac/ExternalPumpBrowser/uExternalPumpBrowser.pas
new file mode 100644
index 00000000..14f94ad6
--- /dev/null
+++ b/demos/Lazarus_Mac/ExternalPumpBrowser/uExternalPumpBrowser.pas
@@ -0,0 +1,289 @@
+// ************************************************************************
+// ***************************** CEF4Delphi *******************************
+// ************************************************************************
+//
+// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
+// browser in Delphi applications.
+//
+// The original license of DCEF3 still applies to CEF4Delphi.
+//
+// For more information about CEF4Delphi visit :
+// https://www.briskbard.com/index.php?lang=en&pageid=cef
+//
+// Copyright © 2021 Salvador Diaz Fau. All rights reserved.
+//
+// ************************************************************************
+// ************ vvvv Original license and comments below vvvv *************
+// ************************************************************************
+(*
+ * Delphi Chromium Embedded 3
+ *
+ * Usage allowed under the restrictions of the Lesser GNU General Public License
+ * or alternatively the restrictions of the Mozilla Public License 1.1
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ * the specific language governing rights and limitations under the License.
+ *
+ * Unit owner : Henri Gourvest
+ * Web site : http://www.progdigy.com
+ * Repository : http://code.google.com/p/delphichromiumembedded/
+ * Group : http://groups.google.com/group/delphichromiumembedded
+ *
+ * Embarcadero Technologies, Inc is not permitted to use or redistribute
+ * this source code without explicit permission.
+ *
+ *)
+
+unit uExternalPumpBrowser;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ GlobalCefApplication, Classes, SysUtils, Messages, Forms, Controls, Graphics,
+ Dialogs, ExtCtrls, StdCtrls, LMessages, uCEFChromium, uCEFWindowParent,
+ uCEFConstants, uCEFTypes, uCEFInterfaces, uCEFChromiumEvents,
+ uCEFLinkedWindowParent, uCEFWorkScheduler;
+
+type
+
+ { TForm1 }
+
+ TForm1 = class(TForm)
+ AddressEdt: TComboBox;
+ CEFLinkedWindowParent1: TCEFLinkedWindowParent;
+ GoBtn: TButton;
+ Chromium1: TChromium;
+ AddressPnl: TPanel;
+ Timer1: TTimer;
+
+ procedure CEFLinkedWindowParent1Enter(Sender: TObject);
+ procedure CEFLinkedWindowParent1Exit(Sender: TObject);
+
+ procedure Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
+ procedure Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
+ procedure Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction);
+ procedure Chromium1BeforePopup(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl, targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; const popupFeatures: TCefPopupFeatures; var windowInfo: TCefWindowInfo; var client: ICefClient; var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue; var noJavascriptAccess: Boolean; var Result: Boolean);
+ procedure Chromium1GotFocus(Sender: TObject; const browser: ICefBrowser);
+ procedure Chromium1OpenUrlFromTab(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring; targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out Result: Boolean);
+
+ procedure FormCreate(Sender: TObject);
+ procedure FormActivate(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
+
+ procedure GoBtnClick(Sender: TObject);
+ procedure Timer1Timer(Sender: TObject);
+ private
+
+ protected
+ // Variables to control when can we destroy the form safely
+ FCanClose : boolean; // Set to True in TChromium.OnBeforeClose
+ FClosing : boolean; // Set to True in the CloseQuery event.
+
+ // CEF needs to handle these messages to call TChromium.NotifyMoveOrResizeStarted
+ procedure WMMove(var Message: TLMMove); message LM_MOVE;
+ procedure WMSize(var Message: TLMSize); message LM_SIZE;
+ procedure WMWindowPosChanged(var Message: TLMWindowPosChanged); message LM_WINDOWPOSCHANGED;
+
+ procedure SendCompMessage(aMsg : cardinal);
+
+ procedure BrowserCreatedMsg(Data: PtrInt);
+ procedure BrowserCloseFormMsg(Data: PtrInt);
+ public
+
+ end;
+
+var
+ Form1: TForm1;
+
+
+implementation
+
+{$R *.lfm}
+
+// This is a demo with the simplest web browser you can build using CEF4Delphi and
+// it doesn't show any sign of progress like other web browsers do.
+
+// Remember that it may take a few seconds to load if Windows update, your antivirus or
+// any other windows service is using your hard drive.
+
+// Depending on your internet connection it may take longer than expected.
+
+// Please check that your firewall or antivirus are not blocking this application
+// or the domain "google.com". If you don't live in the US, you'll be redirected to
+// another domain which will take a little time too.
+
+// This demo uses a TChromium and a TCEFLinkedWindowParent
+
+// We need to use TCEFLinkedWindowParent in Linux to update the browser
+// visibility and size automatically.
+
+// Destruction steps
+// =================
+// 1. FormCloseQuery sets CanClose to FALSE calls TChromium.CloseBrowser which triggers the TChromium.OnClose event.
+// 2. TChromium.OnClose sets aAction to cbaClose to destroy the browser, which triggers the TChromium.OnBeforeClose event.
+// 3. TChromium.OnBeforeClose sets FCanClose := True and sends CEF_BEFORECLOSE to close the form.
+
+uses
+ uCEFApplication;
+
+{ TForm1 }
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+ FCanClose := False;
+ FClosing := False;
+
+ Chromium1.DefaultURL := UTF8Decode(AddressEdt.Text);
+end;
+
+procedure TForm1.GoBtnClick(Sender: TObject);
+begin
+ Chromium1.LoadURL(UTF8Decode(AddressEdt.Text));
+end;
+
+procedure TForm1.Timer1Timer(Sender: TObject);
+begin
+ Timer1.Enabled := False;
+ if not(Chromium1.CreateBrowser(CEFLinkedWindowParent1.Handle, CEFLinkedWindowParent1.BoundsRect)) and
+ not(Chromium1.Initialized) then
+ Timer1.Enabled := True;
+end;
+
+procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
+begin
+ CanClose := FCanClose;
+
+ if not(FClosing) then
+ begin
+ FClosing := True;
+ Visible := False;
+ Chromium1.CloseBrowser(True);
+ end;
+end;
+
+procedure TForm1.Chromium1BeforePopup(Sender: TObject;
+ const browser: ICefBrowser; const frame: ICefFrame; const targetUrl,
+ targetFrameName: ustring; targetDisposition: TCefWindowOpenDisposition;
+ userGesture: Boolean; const popupFeatures: TCefPopupFeatures;
+ var windowInfo: TCefWindowInfo; var client: ICefClient;
+ var settings: TCefBrowserSettings; var extra_info: ICefDictionaryValue;
+ var noJavascriptAccess: Boolean; var Result: Boolean);
+begin
+ // For simplicity, this demo blocks all popup windows and new tabs
+ Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
+end;
+
+procedure TForm1.Chromium1OpenUrlFromTab(Sender: TObject;
+ const browser: ICefBrowser; const frame: ICefFrame; const targetUrl: ustring;
+ targetDisposition: TCefWindowOpenDisposition; userGesture: Boolean; out
+ Result: Boolean);
+begin
+ // For simplicity, this demo blocks all popup windows and new tabs
+ Result := (targetDisposition in [WOD_NEW_FOREGROUND_TAB, WOD_NEW_BACKGROUND_TAB, WOD_NEW_POPUP, WOD_NEW_WINDOW]);
+end;
+
+procedure TForm1.FormActivate(Sender: TObject);
+begin
+// if not(Chromium1.Initialized) and
+// not(Chromium1.CreateBrowser(CEFLinkedWindowParent1.Handle, CEFLinkedWindowParent1.BoundsRect)) then
+ Timer1.Enabled := True;
+end;
+
+procedure TForm1.Chromium1Close(Sender: TObject; const browser: ICefBrowser; var aAction: TCefCloseBrowserAction);
+begin
+ aAction := cbaClose;
+end;
+
+procedure TForm1.Chromium1BeforeClose(Sender: TObject; const browser: ICefBrowser);
+begin
+ // We must wait until all browsers trigger the TChromium.OnBeforeClose event
+ // in order to close the application safely or we will have shutdown issues.
+ FCanClose := True;
+ SendCompMessage(CEF_BEFORECLOSE);
+end;
+
+procedure TForm1.Chromium1AfterCreated(Sender: TObject; const browser: ICefBrowser);
+begin
+ // Now the browser is fully initialized we can initialize the UI.
+ SendCompMessage(CEF_AFTERCREATED);
+end;
+
+procedure TForm1.CEFLinkedWindowParent1Enter(Sender: TObject);
+begin
+ If not(csDesigning in ComponentState) then Chromium1.SetFocus(True);
+end;
+
+// This is a workaround for the CEF issue #2026
+// https://bitbucket.org/chromiumembedded/cef/issues/2026/multiple-major-keyboard-focus-issues-on
+// We use CEFLinkedWindowParent1.OnEnter, CEFLinkedWindowParent1.OnExit and
+// TChromium.OnGotFocus to avoid most of the focus issues.
+// CEFLinkedWindowParent1.TabStop must be TRUE.
+procedure TForm1.CEFLinkedWindowParent1Exit(Sender: TObject);
+begin
+ if not(csDesigning in ComponentState) then
+ Chromium1.SendCaptureLostEvent;
+end;
+
+procedure TForm1.BrowserCreatedMsg(Data: PtrInt);
+begin
+ Caption := 'External-Pump Browser 2';
+ AddressPnl.Enabled := True;
+end;
+
+procedure TForm1.BrowserCloseFormMsg(Data: PtrInt);
+begin
+ Close;
+end;
+
+procedure TForm1.SendCompMessage(aMsg : cardinal);
+begin
+ case aMsg of
+ CEF_AFTERCREATED : Application.QueueAsyncCall(@BrowserCreatedMsg, 0);
+ CEF_BEFORECLOSE : Application.QueueAsyncCall(@BrowserCloseFormMsg, 0);
+ end;
+end;
+
+procedure TForm1.Chromium1GotFocus(Sender: TObject; const browser: ICefBrowser);
+begin
+ CEFLinkedWindowParent1.SetFocus;
+end;
+
+procedure TForm1.WMMove(var Message: TLMMove);
+begin
+ inherited;
+ Chromium1.NotifyMoveOrResizeStarted;
+end;
+
+procedure TForm1.WMSize(var Message: TLMSize);
+begin
+ inherited;
+ Chromium1.NotifyMoveOrResizeStarted;
+end;
+
+procedure TForm1.WMWindowPosChanged(var Message: TLMWindowPosChanged);
+begin
+ inherited;
+ Chromium1.NotifyMoveOrResizeStarted;
+end;
+
+initialization
+ if GlobalCEFApp = nil then begin
+ CreateGlobalCEFApp;
+ if not GlobalCEFApp.StartMainProcess then begin
+ DestroyGlobalCEFApp;
+ halt(0); // exit the subprocess
+ end;
+ end;
+
+finalization
+ (* Destroy from this unit, which is used after "Interfaces". So this happens before the Application object is destroyed *)
+ if GlobalCEFWorkScheduler <> nil then
+ GlobalCEFWorkScheduler.StopScheduler;
+ DestroyGlobalCEFApp;
+ DestroyGlobalCEFWorkScheduler;
+
+end.
+