WebBrowser component lazarus / 38-Networking and Web Programming ---------------------------------------------------------------------- AliZairov · 2021-02-14 18:46 Hi. I could not find WebBrowser component working in Linux environment. Has anyone worked on this issue. LazWebkit: https://sourceforge.net/projects/lazwebkit/ ( The package has been compiled. IDE but the package was not installed. ) CrossWebView: https://github.com/eugenekryukov/crosswebview ( Delphi also works fine on CrossVCL. ) CrossWebView I edited it because it is open source. But there are some problems. Unfortunately, I could not find the corresponding functions below in lazarus. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i GetNativeHandles(FParentWnd, Window, Fixed)SetNativeParent(FScroll, FParentWnd);WaitMessage; GetClientRect(FParentWnd, R);  WebView.pas Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i unit WebView; interface uses  Messages, SysUtils, Classes, Controls; const  DefaultMime = 'text/html'; type   EWebView = class(Exception);   IWebViewDelegate = interface    ['{60ACB0A0-DCAB-465C-82AF-7D1D935C71BE}']    procedure FinishLoading;  end;   IWebView = interface    ['{09342BAC-1400-4FD3-BF26-E6D9EABEB128}']    procedure WebViewUpdateBounds;    procedure WebViewNavigate(const URL: string);    procedure WebViewLoadFromStream(const AStream: TStream; const MimeType, BaseUrl: string);    procedure WebViewLoadFromString(const AString: string; const BaseUrl: string);    function WebViewRunScript(const AScript: string; var ResultStr, ErrorStr: string): Boolean;    function WebViewGetSelectedText: string;    procedure WebViewGoForward;    procedure WebViewGoBack;    function WebGetHandle: Pointer;  end;   TCustomWebView = class(TWinControl, IWebViewDelegate)  private    FWebView: IWebView;    FOnFinishLoading: TNotifyEvent;    function GetNativeHandle: Pointer;    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;    { IWebViewDelegate }    procedure FinishLoading; virtual;  protected    procedure CreateWnd; override;    procedure DestroyWnd; override;    procedure Resize; override;  protected    function CreateWebView: IWebView; virtual;    procedure DoFinishLoading; virtual;  public    constructor Create(AOwner: TComponent); override;    destructor Destroy; override;    procedure Navigate(const URL: string);    procedure LoadFromStream(const AStream: TStream; const MimeType: string = DefaultMime; const BaseUrl: string = '');    procedure LoadFromString(const AString: string; const BaseUrl: string = '');    function RunScript(const AScript: string): string;    procedure GoForward;    procedure GoBack;    function GetSelectedText: string;  // Handle to native WebView object    //   TWebBrowser control on Windows    //   WKWebView view on macOS    //   GtkWebView widget on Linux    property NativeHandle: Pointer read GetNativeHandle;    property OnFinishLoading: TNotifyEvent read FOnFinishLoading write FOnFinishLoading;  end;   TWebView = class(TCustomWebView)  published    property Align;    property Anchors;    property BiDiMode;    property Color;    property Constraints;    property UseDockManager default True;    property DockSite;    property DragCursor;    property DragKind;    property DragMode;    property Enabled;    property ParentBiDiMode;    property ParentBackground;    property ParentColor;    property ParentFont;    property ParentShowHint;    property PopupMenu;    property ShowHint;    property Visible;    property OnClick;    property OnConstrainedResize;    property OnContextPopup;    property OnDockDrop;    property OnDockOver;    property OnDblClick;    property OnDragDrop;    property OnDragOver;  property OnEndDock;    property OnEndDrag;    property OnEnter;    property OnExit;    property OnFinishLoading;    property OnGetSiteInfo;    property OnMouseDown;    property OnMouseMove;    property OnMouseUp;    property OnResize;    property OnStartDock;    property OnStartDrag;    property OnUnDock;  end; procedure Register; implementation {$IFDEF MSWINDOWS}uses WebView.Win;{$ENDIF}{$IFDEF MACOS}uses WebView.Mac;{$ENDIF}{$IFDEF LINUX}uses WebView.Linux;{$ENDIF} procedure Register;begin  RegisterComponents('WebKit', [TWebView]);end; { TWebView } constructor TCustomWebView.Create(AOwner: TComponent);begin  inherited;end; destructor TCustomWebView.Destroy;begin  inherited;end; function TCustomWebView.CreateWebView: IWebView;begin  {$IFDEF MSWINDOWS}  Result := TWinWebView.Create(Handle, Self);  {$ENDIF}  {$IFDEF MACOS}  Result := TMacWebView.Create(Handle, Self);  {$ENDIF}  {$IFDEF LINUX}  Result := TLinuxWebView.Create(Handle, Self);  {$ENDIF}  if Result = nil then    raise EWebView.Create('No implementation of IWebView found');end; procedure TCustomWebView.CreateWnd;begin  inherited;  FWebView := CreateWebView;end; procedure TCustomWebView.DestroyWnd;begin  FWebView := nil;  inherited;end; procedure TCustomWebView.DoFinishLoading;begin  if Assigned(FOnFinishLoading) then    FOnFinishLoading(Self);end; procedure TCustomWebView.FinishLoading;begin  DoFinishLoading;end; function TCustomWebView.GetNativeHandle: Pointer;begin  Result := FWebView.WebGetHandle;end; procedure TCustomWebView.GoBack;begin  FWebView.WebViewGoBack;end; procedure TCustomWebView.GoForward;begin  FWebView.WebViewGoForward;end; procedure TCustomWebView.LoadFromStream(const AStream: TStream; const MimeType: string = DefaultMime; const BaseUrl: string = '');begin  FWebView.WebViewLoadFromStream(AStream, MimeType, BaseUrl);end; procedure TCustomWebView.LoadFromString(const AString: string; const BaseUrl: string = '');begin  FWebView.WebViewLoadFromString(AString, BaseUrl);end; procedure TCustomWebView.Navigate(const URL: string);begin  FWebView.WebViewNavigate(URL);end; procedure TCustomWebView.Resize;begin  inherited;  if FWebView <> nil then    FWebView.WebViewUpdateBounds;end; function TCustomWebView.RunScript(const AScript: string): string;var  Error: string;begin  if not FWebView.WebViewRunScript(AScript, Result, Error) then    raise EWebView.Create('Error evaluating JS: ' + Error);end; function TCustomWebView.GetSelectedText: string;begin  Result := FWebView.WebViewGetSelectedText;end; procedure TCustomWebView.WMEraseBkgnd(var Message: TWmEraseBkgnd);begin  Message.Result := 1;end; end.  WebView.Linux.pas Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i unit WebView.Linux; {$mode delphi} interface uses  LCLType, Messages, SysUtils, Classes, WebView; type   PGtkWidget = Pointer;  PWebKitWebView = Pointer;   TLinuxWebView = class(TInterfacedObject, IWebView)  private    FScroll: PGtkWidget;    FWebView: PWebKitWebView;    FParentWnd: HWND;    FDelegate: IWebViewDelegate;  FJSRunning: Boolean;    FJSResult: Boolean;    FJSResultStr: string;    FJSErrorStr: string;    { IWebView }    procedure WebViewUpdateBounds;    procedure WebViewNavigate(const URL: string);    procedure WebViewLoadFromStream(const AStream: TStream; const MimeType, BaseUrl: string);    procedure WebViewLoadFromString(const AString: string; const BaseUrl: string);    function WebViewRunScript(const AScript: string; var ResultStr, ErrorStr: string): Boolean;    function WebViewGetSelectedText: string;    procedure WebViewGoForward;    procedure WebViewGoBack;    function WebGetHandle: Pointer;  protected  public    constructor Create(AParentWnd: HWND; ADelegate: IWebViewDelegate);    destructor Destroy; override;  end; implementation type  PGError = ^TGError;  TGError = packed record    domain: Cardinal;    code: Integer;    msg: PAnsiChar;  end; var  Lib: NativeInt;  webkit_web_view_new: function : PWebKitWebView; cdecl;  webkit_web_view_load_uri: procedure (web_view: PWebKitWebView; uri: PUtf8Char); cdecl;  webkit_web_view_load_html: procedure (web_view: PWebKitWebView; contents: PUtf8Char; base_uri: PUtf8Char); cdecl;  webkit_web_view_load_bytes: procedure (web_view: PWebKitWebView; bytes: Pointer; mime_type: PUtf8Char; encoding: PUtf8Char; base_uri: PUtf8Char); cdecl;  webkit_web_view_load_plain_text: procedure (web_view: PWebKitWebView; content: PUtf8Char); cdecl;  webkit_web_view_can_go_back: function (web_view: PWebKitWebView): boolean; cdecl;  webkit_web_view_can_go_forward: function (web_view: PWebKitWebView): boolean; cdecl;  webkit_web_view_go_back: procedure (web_view: PWebKitWebView); cdecl;  webkit_web_view_go_forward: procedure (web_view: PWebKitWebView); cdecl;  webkit_web_view_reload: procedure (web_view: PWebKitWebView); cdecl;  webkit_web_view_stop_loading: procedure (web_view: PWebKitWebView); cdecl;  webkit_web_view_run_javascript: function (web_view: PWebKitWebView; script: PUtf8Char; cancellable, callback, user_data: Pointer): Pointer; cdecl;  webkit_web_view_run_javascript_finish: function (web_view: PWebKitWebView; result, error: Pointer): Pointer; cdecl;  webkit_javascript_result_get_global_context: function (value: Pointer): Pointer; cdecl;  webkit_javascript_result_get_value: function (value: Pointer): Pointer; cdecl;  webkit_javascript_result_unref: procedure (value: Pointer); cdecl;  JSValueIsString: function (ctx: Pointer; value: Pointer): LongBool; cdecl;  JSValueToStringCopy: function (ctx: Pointer; value: Pointer; exception: Pointer): Pointer; cdecl;  JSStringGetLength: function (str: Pointer): LongWord; cdecl;  JSStringGetCharactersPtr: function (&string: Pointer): PChar; cdecl;  JSStringRelease: procedure (&string: Pointer); cdecl;  g_bytes_new: function (data: Pointer; size: NativeUInt): Pointer; cdecl;  g_bytes_unref: procedure (bytes: Pointer); cdecl;  g_bytes_get_size: function (bytes: Pointer): NativeUInt; cdecl;  g_signal_connect_data: function (instance: Pointer; detailed_signal: PUtf8Char; c_handler: Pointer; data: Pointer;    destroy_data: Pointer; connect_flags: Integer): NativeUInt; cdecl;  gtk_widget_destroy: procedure (widget: PGtkWidget); cdecl;  gtk_widget_show: procedure (widget: PGtkWidget); cdecl;  gtk_widget_set_size_request: procedure (widget: PGtkWidget; width: Integer; height: Integer); cdecl;  gtk_container_add: procedure (container: Pointer; widget: PGtkWidget); cdecl;  gtk_scrolled_window_new: function (hadjustment, vadjustment: Pointer): Pointer; cdecl; function LoadWebKit: Boolean;begin  Lib := LoadLibrary('libwebkit2gtk-4.0.so.37');  Result := Lib <> 0;  if Result then  begin    webkit_web_view_new := GetProcAddress(Lib, 'webkit_web_view_new');    webkit_web_view_load_uri := GetProcAddress(Lib, 'webkit_web_view_load_uri');    webkit_web_view_load_bytes := GetProcAddress(Lib, 'webkit_web_view_load_bytes');    webkit_web_view_load_html := GetProcAddress(Lib, 'webkit_web_view_load_html');    webkit_web_view_load_plain_text := GetProcAddress(Lib, 'webkit_web_view_load_plain_text');    webkit_web_view_can_go_back := GetProcAddress(Lib, 'webkit_web_view_can_go_back');    webkit_web_view_can_go_forward := GetProcAddress(Lib, 'webkit_web_view_can_go_forward');    webkit_web_view_go_back := GetProcAddress(Lib, 'webkit_web_view_go_back');    webkit_web_view_go_forward := GetProcAddress(Lib, 'webkit_web_view_go_forward');    webkit_web_view_reload := GetProcAddress(Lib, 'webkit_web_view_reload');    webkit_web_view_stop_loading := GetProcAddress(Lib, 'webkit_web_view_stop_loading');    webkit_web_view_run_javascript := GetProcAddress(Lib, 'webkit_web_view_run_javascript');    webkit_web_view_run_javascript_finish := GetProcAddress(Lib, 'webkit_web_view_run_javascript_finish');    webkit_javascript_result_get_global_context := GetProcAddress(Lib, 'webkit_javascript_result_get_global_context');    webkit_javascript_result_get_value := GetProcAddress(Lib, 'webkit_javascript_result_get_value');    webkit_javascript_result_unref := GetProcAddress(Lib, 'webkit_javascript_result_unref');     Lib := LoadLibrary('libjavascriptcoregtk-4.0.so.18');    Result := Lib <> 0;    if Result then    begin      JSValueIsString := GetProcAddress(Lib, 'JSValueIsString');      JSValueToStringCopy := GetProcAddress(Lib, 'JSValueToStringCopy');      JSStringGetLength := GetProcAddress(Lib, 'JSStringGetLength');      JSStringGetCharactersPtr := GetProcAddress(Lib, 'JSStringGetCharactersPtr');      JSStringRelease := GetProcAddress(Lib, 'JSStringRelease');    end;     Lib := LoadLibrary('libglib-2.0.so.0');    Result := Lib <> 0;    if Result then    begin      g_bytes_new := GetProcAddress(Lib, 'g_bytes_new');      g_bytes_unref := GetProcAddress(Lib, 'g_bytes_unref');      g_bytes_get_size := GetProcAddress(Lib, 'g_bytes_get_size');    end;     Lib := LoadLibrary('libgobject-2.0.so.0');    Result := Lib <> 0;  if Result then    begin      g_signal_connect_data := GetProcAddress(Lib, 'g_signal_connect_data');    end;     Lib := LoadLibrary('libgtk-3.so.0');    Result := Lib <> 0;    if Result then    begin      gtk_widget_destroy := GetProcAddress(Lib, 'gtk_widget_destroy');      gtk_widget_show := GetProcAddress(Lib, 'gtk_widget_show');      gtk_widget_set_size_request := GetProcAddress(Lib, 'gtk_widget_set_size_request');      gtk_container_add := GetProcAddress(Lib, 'gtk_container_add');      gtk_scrolled_window_new := GetProcAddress(Lib, 'gtk_scrolled_window_new');    end;  end;end; { Callbacks } procedure LoadStarted(web_view: PWebKitWebView; load_event: Pointer; user_data: Pointer); cdecl;beginend; procedure LoadFinished(web_view: PWebKitWebView; load_event: Pointer; user_data: Pointer); cdecl;begin  TLinuxWebView(user_data).FDelegate.FinishLoading;end; function LoadError(web_view: PWebKitWebView; web_frame: Pointer; uri: PAnsiChar; error: Pointer;  user_data: Pointer): boolean; cdecl;begin  Result := True;end; { TLinuxWebView } constructor TLinuxWebView.Create(AParentWnd: HWND; ADelegate: IWebViewDelegate);var  Window, Fixed: Pointer;begin  inherited Create;  FDelegate := ADelegate;  FParentWnd := AParentWnd;   if not LoadWebKit then    raise EWebView.Create('WebView requires WebKitGtk. Install it first - "sudo apt install libwebkit2gtk-4.0" or "sudo yum install webkitgtk2.x86_64"');   FWebView := webkit_web_view_new;  gtk_widget_show(FWebView);   g_signal_connect_data(FWebView, 'load- started', @LoadStarted, Self, nil, 0);  g_signal_connect_data(FWebView, 'load-finished', @LoadFinished, Self, nil, 0);  g_signal_connect_data(FWebView, 'load-error', @LoadError, Self, nil, 0);   {  if GetNativeHandles(FParentWnd, Window, Fixed) then  begin    // Create GtkScrollerWindow    FScroll := gtk_scrolled_window_new(nil, nil);    gtk_widget_show(FScroll);     // Add to Scroll    gtk_container_add(FScroll, FWebView);     // Add Scroll to Parent    SetNativeParent(FScroll, FParentWnd);     WebViewUpdateBounds;  end;  } end; destructor TLinuxWebView.Destroy;begin  gtk_widget_destroy(FWebView);  FWebView := nil;  inherited;end; function TLinuxWebView.WebGetHandle: Pointer;begin  Result := FWebView;end; function TLinuxWebView.WebViewGetSelectedText: string;var  Error: string;begin  if not WebViewRunScript('window.getSelection().toString()', Result, Error) then    raise EWebView.Create('Can''t get selection');end; procedure TLinuxWebView.WebViewGoBack;begin  webkit_web_view_go_back(FWebView);end; procedure TLinuxWebView.WebViewGoForward;begin  webkit_web_view_go_forward(FWebView);end; procedure TLinuxWebView.WebViewLoadFromStream(const AStream: TStream; const MimeType, BaseUrl: string);var  GB: Pointer;  Memory: TMemoryStream;begin  Memory := TMemoryStream.Create;  try    Memory.CopyFrom(AStream, AStream.Size);    GB := g_bytes_new(Memory.Memory, Memory.Size);    try      webkit_web_view_load_bytes(FWebView, GB, PUtf8Char(Utf8Encode(MimeType)), nil, PUtf8Char(Utf8Encode(BaseUrl)));    finally      g_bytes_unref(GB);  end;  finally    Memory.Free;  end;end; procedure TLinuxWebView.WebViewLoadFromString(const AString: string; const BaseUrl: string);begin  webkit_web_view_load_html(FWebView, PUtf8Char(Utf8Encode(AString)), PUtf8Char(Utf8Encode(BaseUrl)));end; procedure TLinuxWebView.WebViewNavigate(const URL: string);var  AUrl: Utf8String;begin  AUrl := Url;  webkit_web_view_load_uri(FWebView, PUtf8Char(AUrl));end; function JSStringToStr(const Str: Pointer): string;var  Len: Integer;begin  Len := JSStringGetLength(Str);  SetLength(Result, Len);  Move(JSStringGetCharactersPtr(Str)^, PChar(Result)^, Len * 2);end; function JSFinishCallback(web_view: PWebKitWebView; res: Pointer; user_data: TLinuxWebView): Pointer; cdecl;var  JSResult: Pointer;  Error: PGError;  JSStr, Value, Ctx: Pointer;begin  user_data.FJSRunning := False;   Error := nil;  JSResult := webkit_web_view_run_javascript_finish(user_data.FWebView, res, @Error);   if JSResult = nil then  begin    user_data.FJSErrorStr := Error.msg;    Exit;  end;   Ctx := webkit_javascript_result_get_global_context(JSResult);  Value := webkit_javascript_result_get_value(JSResult);   if JSValueIsString(Ctx, Value) then  begin    JSStr := JSValueToStringCopy(Ctx, Value, nil);    user_data.FJSResultStr := JSStringToStr(JSStr);    user_data.FJSResult := True;    JSStringRelease(JSStr);  end;   webkit_javascript_result_unref(JSResult);end; function TLinuxWebView.WebViewRunScript(const AScript: string; var ResultStr, ErrorStr: string): Boolean;begin  Result := False;   FJSRunning := True;  FJSResult := False;  FJSResultStr := '';  FJSErrorStr := '';   webkit_web_view_run_javascript(FWebView, PUtf8Char(Utf8Encode(AScript)), nil, @JSFinishCallback, Self);  while FJSRunning do    //WaitMessage;   ResultStr := FJSResultStr;  ErrorStr := FJSErrorStr;  Result := FJSResult;end; procedure TLinuxWebView.WebViewUpdateBounds;var  R: TRect;begin  //GetClientRect(FParentWnd, R);  gtk_widget_set_size_request(FScroll, R.Width, R.Height);end; end. ---------------------------------------------------------------------- winni · 2021-02-14 19:20 Hi! You can havea look at this discussion about CEF4Delphi which is ported to Lazarus: https://forum.lazarus.freepascal.org/index.php/topic,41272.msg388904/t opicseen.html Winni ---------------------------------------------------------------------- AliZairov · 2021-02-14 19:49 Thank you for your answer. I've seen this. It makes 500+ mb single additional file for a tiny project. So webkit is more efficient for me. ---------------------------------------------------------------------- egsuh · 2021-02-15 02:46 Doesn't this work? I'm using it for Windows application. https://github.com/BerndGabriel/HtmlViewer ---------------------------------------------------------------------- Jurassic Pork · 2021-02-15 08:15 hello, Quote from: AliZairov on February 14, 2021, 07:46:10 pmLazWebkit: https://sourceforge.net/projects/lazwebkit/ ( The package has been compiled. IDE but the package was not installed. ) what is your O.S ? On Ubuntu 20.04 library libwebkitgtk-1 no longer exists and there is a link error when rebuilding lazarus. I have found packages from older version of Ubuntu and i have succeeded to install them : Quotesudo dpkg -i libicu60_60.2-3ubuntu3.1_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-dev_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-dev_2.4.11-3ubuntu3_amd64.deb sudo ldconfigWWith that i can install lazwebkit and see the components on the lazarus ide ( version 2.0.10) i have tried the example lazbrowser. Some properties are wrong in one lfm file ( remove them) . finally succeeded to compile and run the projet lazbrowser (see attachment) . Friendly, J.P ---------------------------------------------------------------------- alaa123456789 · 2021-02-15 09:07 Quote from: Jurassic Pork on February 15, 2021, 09:15:07 amhello, Quote from: AliZairov on February 14, 2021, 07:46:10 pmLazWebkit: https://sourceforge.net/projects/lazwebkit/ ( The package has been compiled. IDE but the package was not installed. ) what is your O.S ? On Ubuntu 20.04 library libwebkitgtk-1 no longer exists and there is a link error when rebuilding lazarus. I have found packages from older version of Ubuntu and i have succeeded to install them : Quotesudo dpkg -i libicu60_60.2-3ubuntu3.1_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-dev_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-dev_2.4.11-3ubuntu3_amd64.deb sudo ldconfigWWith that i can install lazwebkit and see the components on the lazarus ide ( version 2.0.10) i have tried the example lazbrowser. Some properties are wrong in one lfm file ( remove them) . finally succeeded to compile and run the projet lazbrowser (see attachment) . Friendly, J.P can you provide an example for this package on windows? thanks ---------------------------------------------------------------------- Jurassic Pork · 2021-02-15 11:23 hello, Quote from: alaa123456789 on February 15, 2021, 10:07:28 amcan you provide an example for this package on windows? thanks it is better to use Qt WidgetSet for multiplatform webkit project : When using the Qt WidgetSet, you can use the Qt WebKit to embed a browser into a LCL form. Friendly, J.P ---------------------------------------------------------------------- marcov · 2021-02-15 11:27 If you "just" want to do a bit of embedded web, it seems like a big step to switch your whole application to QT on Windows. ---------------------------------------------------------------------- alaa123456789 · 2021-02-15 12:08 Quote from: Jurassic Pork on February 15, 2021, 12:23:13 pmhello, Quote from: alaa123456789 on February 15, 2021, 10:07:28 amcan you provide an example for this package on windows? thanks it is better to use Qt WidgetSet for multiplatform webkit project : When using the Qt WidgetSet, you can use the Qt WebKit to embed a browser into a LCL form. Friendly, J.P hi jurassic , what you have said above ,it is too complicated and ii searched the web to know how use qt on lazarus but i never found ,if possible you have a tutorial or sample ,please share thanks ---------------------------------------------------------------------- Jurassic Pork · 2021-02-15 16:36 Quote from: alaa123456789 on February 15, 2021, 10:07:28 amcan you provide an example for this package on windows? LazWebkit is a project focused to provide browser and composer web content features for Lazarus IDE based projects.       NOTE: Currently is only implemented for GTK2 widgetset. ---------------------------------------------------------------------- alaa123456789 · 2021-02-16 09:08 [/quote] LazWebkit is a project focused to provide browser and composer web content features for Lazarus IDE based projects.       NOTE: Currently is only implemented for GTK2 widgetset.    [/quote]   it is so sad ,not to have any component for webbrowser on lazarus windows aside from CEF which is not recommended due to big size thanks ---------------------------------------------------------------------- vfclists · 2021-02-16 09:52 Does the size CEF include debugging information? At 500Mb it most likely does ---------------------------------------------------------------------- AliZairov · 2021-02-16 16:47 Quote from: egsuh on February 15, 2021, 03:46:49 amDoesn't this work? I'm using it for Windows application. https://github.com/BerndGabriel/HtmlViewer Hi.I have not tried. I do a test. I've tried. Unfortunately that's not what I want. ---------------------------------------------------------------------- AliZairov · 2021-02-16 16:51 Quote from: Jurassic Pork on February 15, 2021, 09:15:07 amhello, Quote from: AliZairov on February 14, 2021, 07:46:10 pmLazWebkit: https://sourceforge.net/projects/lazwebkit/ ( The package has been compiled. IDE but the package was not installed. ) what is your O.S ? Hi. Mint 20.1. ---------------------------------------------------------------------- Jurassic Pork · 2021-02-16 17:01 hello, mint 20.1 is based on Ubuntu 20.04, you can try to find those packages   and install them : Quote from: Jurassic Pork on February 15, 2021, 09:15:07 amI have found packages from older version of Ubuntu and i have succeeded to install them : Quotesudo dpkg -i libicu60_60.2-3ubuntu3.1_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-dev_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-dev_2.4.11-3ubuntu3_amd64.deb sudo ldconfig Friendly, J.P ---------------------------------------------------------------------- AliZairov · 2021-02-16 17:48 Quote from: Jurassic Pork on February 16, 2021, 06:01:57 pmhello, mint 20.1 is based on Ubuntu 20.04, you can try to find those packages   and install them : Quote from: Jurassic Pork on February 15, 2021, 09:15:07 amI have found packages from older version of Ubuntu and i have succeeded to install them : Quotesudo dpkg -i libicu60_60.2-3ubuntu3.1_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libjavascriptcoregtk-1.0-dev_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-1.0-0_2.4.11-3ubuntu3_amd64.deb sudo dpkg -i libwebkitgtk-dev_2.4.11-3ubuntu3_amd64.deb sudo ldconfig Friendly, J.P I installed the packages. Component compiled I have installed. It worked but Chrome 17.0.963.56 old version html5 is not fully compatible. CrossWebView writes fully compatible with Safari 13.0. I would like to get a better result by looking at the CrossWebView structure with LazWebkit.