ここで問題となるのはポップアップウィンドウです。彼らはOnBeforeBrowse
イベントが発生する前に作成され、あなたはゴーストのように見えるようにナビゲーションをキャンセルします。
OnBeforePopup
イベントの結果をTrueに設定すると、その作成を防止できますが、これによりナビゲーションが終了し、OnBeforeBrowse
は発生しません。このようにすれば、OnBeforePopup
イベントでもShellExecute
アクションを実行する必要があります。
procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const parentBrowser: ICefBrowser; var popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var url: ustring; var client: ICefBase;
out Result: Boolean);
begin
// you can set the Result to True here and block the window creation at all,
// but then you will stop also the navigation and the OnBeforeBrowse event
// won't be fired, so if you will follow this way then you'll have to perform
// your ShellExecute action here as well
if url <> 'http://www.yourdomain.com' then
begin
Result := True;
ShellExecute(Handle, 'open', PChar(url), '', '', SW_SHOWNORMAL);
end;
end;
別の方法ceflib.pas
に記載されていないウィンドウが作成されますが、非表示のままです私見公式ドキュメントで、(作成されるポップアップウィンドウを防ぐべきかOnBeforePopup
イベントでTrueにm_bWindowRenderingDisabled
フラグを設定することです私はこれがどんなリークにもつながることはないと確信しています)、ナビゲーションは続行されますので、OnBeforePopup
イベントが発生するでしょう。
procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const parentBrowser: ICefBrowser; var popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var url: ustring; var client: ICefBase;
out Result: Boolean);
begin
// you can set the m_bWindowRenderingDisabled flag to True here what should
// prevent the popup window to be created and since we don't need to take
// care about substitute parent for popup menus or dialog boxes of this popup
// window (because we will cancel the navigation anyway) we don't need to set
// the WndParent member here; but please check if there are no resource leaks
// with this solution because it seems more that the window is just hidden
if url <> 'http://www.yourdomain.com' then
windowInfo.m_bWindowRenderingDisabled := True;
end;
次のコードは、問題のシミュレーション(例はクリックした場合、ポップアップウィンドウが開きますページの下部にリンクmy popup
あるとしてthis tutorial
で使用される)です。
uses
ShellAPI, ceflib, cefvcl;
const
PageURL = 'http://www.htmlcodetutorial.com/linking/linking_famsupp_72.html';
PopupURL = 'http://www.htmlcodetutorial.com/linking/popupbasic.html';
procedure TForm1.FormCreate(Sender: TObject);
begin
Chromium1.Load(PageURL);
end;
procedure TForm1.Chromium1BeforeBrowse(Sender: TObject;
const browser: ICefBrowser; const frame: ICefFrame;
const request: ICefRequest; navType: TCefHandlerNavtype; isRedirect: Boolean;
out Result: Boolean);
begin
if request.Url = PopupURL then
begin
Result := True;
ShellExecute(Handle, 'open', PChar(request.Url), '', '', SW_SHOWNORMAL);
end;
end;
procedure TForm1.Chromium1BeforePopup(Sender: TObject;
const parentBrowser: ICefBrowser; var popupFeatures: TCefPopupFeatures;
var windowInfo: TCefWindowInfo; var url: ustring; var client: ICefBase;
out Result: Boolean);
begin
{
// Solution 1
// this will block the popup window creation and cancel the navigation to
// the target, so we have to perform the ShellExecute action here as well
if url = PopupURL then
begin
Result := True;
ShellExecute(Handle, 'open', PChar(url), '', '', SW_SHOWNORMAL);
end;
}
{
// Solution 2
// or we can set the m_bWindowRenderingDisabled flag to True and the window
// won't be created (as described in ceflib.pas), but the navigation continue
if url = PopupURL then
windowInfo.m_bWindowRenderingDisabled := True;
}
end;
グレート答え、ありがとう。 –