铬嵌入式框架

问题描述 投票:-1回答:1

如何使用标签或简单相同的cef组件或创建新组件,以相同的形式创建真正的新标签,而不是重要的部分。重要的是什么用法

procedure OnBeforePopup ...
  ...
  begin
  Return:= true;
  TChromium1.LoadURL(target_url);
end; 

在某些情况下不能像在真实的浏览器中那样工作(我认为这不是对新标签的实际调度)。

在TWebBrowser中我没有这样的问题,代码运行良好:

  procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
  var NewWindow: TForm1;
  begin
    NewWindow := TForm1.Create(self);
    NewWindow.Show;
   ppDisp := NewWindow.Webbrowser1.DefaultDispatch;
  end;

如何进行实际调度?

在OnBeforePopup中存在const target_disposition。如何将它(target_disposition)更改为current tab

c++ delphi chromium chromium-embedded
1个回答
3
投票

您为更好的浏览器支付的价格是更多时间尝试将其嵌入您的应用程序。通常,从开发人员的角度来看,TWebBrowser组件更容易使用,但您的用户将获得更糟糕的体验。

使用CEF以正确的方式打开新选项卡或表单是更复杂的功能之一。

这就是我在PopupBrowser2CEF4Delphi中添加OldCEF4Delphi演示的原因。

您无法更改CONST参数。我建议你按照CEF3关于这个事件的说法创建一个新的子浏览器。

OnBeforePopup事件的CEF3代码注释如下:

///
// Called on the UI thread before a new popup browser is created. The
// |browser| and |frame| values represent the source of the popup request. The
// |target_url| and |target_frame_name| values indicate where the popup
// browser should navigate and may be NULL if not specified with the request.
// The |target_disposition| value indicates where the user intended to open
// the popup (e.g. current tab, new tab, etc). The |user_gesture| value will
// be true (1) if the popup was opened via explicit user gesture (e.g.
// clicking a link) or false (0) if the popup opened automatically (e.g. via
// the DomContentLoaded event). The |popupFeatures| structure contains
// additional information about the requested popup window. To allow creation
// of the popup browser optionally modify |windowInfo|, |client|, |settings|
// and |no_javascript_access| and return false (0). To cancel creation of the
// popup browser return true (1). The |client| and |settings| values will
// default to the source browser's values. If the |no_javascript_access| value
// is set to false (0) the new browser will not be scriptable and may not be
// hosted in the same renderer process as the source browser. Any
// modifications to |windowInfo| will be ignored if the parent browser is
// wrapped in a cef_browser_view_t. Popup browser creation will be canceled if
// the parent browser is destroyed before the popup browser creation completes
// (indicated by a call to OnAfterCreated for the popup browser).
///

这里的挑战是CEF3可能使用与主线程不同的线程来执行所有事件,并且您希望在触发此事件时创建VCL组件。

如果在cef.inc中设置CEF_MULTI_THREADED_MESSAGE_LOOP,则DCEF3使用不同的线程。如果GlobalCEFApp.MultiThreadedMessageLoop为True,则CEF4Delphi使用不同的线程,这是默认值,因为它是CEF3对Windows应用程序的推荐设置。

如您所知,如果您在不同的线程中创建和销毁VCL组件,您将遇到问题。

这会强制您创建一个隐藏的弹出窗体,以防万一触发此事件。正如您在PopupBrowser2中看到的那样,在主线程和此事件之外创建了一个隐藏的FChildForm。

稍后,当执行OnBeforePopup时,演示调用CreateClientHandler以使用FChildForm使用的windowInfo和客户端设置“windowInfo”和“client”事件参数。

如果要使用选项卡,还需要创建隐藏选项卡。

您也可以尝试在DCEF3中取消设置CEF_MULTI_THREADED_MESSAGE_LOOP或在CEF4Delphi中将GlobalCEFApp.MultiThreadedMessageLoop设置为False,但是您需要使用“外部泵”。有关更多详细信息,请参阅SimpleExternalPumpBrowser演示。

© www.soinside.com 2019 - 2024. All rights reserved.