天天看點

dcef3 指出一個坑

dcef3 指出一個坑

http://ju.outofmemory.cn/entry/80119

BccSafe's Blog 2014-06-11 2388 閱讀

dcef3提供了TChromium,可能會有人想用這個來開發遊覽器

可惜這個實作起來有問題

問題就出在OnBeforePopup這個事件上

很多人以為隻要在這做一個攔截

讓新的TChromium來加載這個新網頁即可

這是一個大坑,我之前釋出的遊覽器也是這樣

get可能表面上還看不出什麼問題,

但如果是個post請求,問題就大了

一個好好的post在我們這個所謂的遊覽器裡莫名其妙的變成了get請求

是以開發遊覽器最好的方法就是不要去用這個TChromium

或者說凡是涉及到不是那種簡單跳轉網頁的,都不要用TChromium

你會進坑的

procedure CreateBrowser;
var
  info: TCefWindowInfo;
  settings: TCefBrowserSettings;
begin
  if (FParentRect.IsEmpty) or (FParentHandle = 0) then Exit;

  FillChar(info, SizeOf(info), 0);
  info.Style := WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_TABSTOP;
  info.parent_window := FParentHandle;
  info.x := FParentRect.left;
  info.y := FParentRect.top;
  info.Width := FParentRect.right - FParentRect.left;
  info.Height := FParentRect.bottom - FParentRect.top;
  FillChar(settings, SizeOf(TCefBrowserSettings), 0);
  settings.size := SizeOf(TCefBrowserSettings);
  GetSettings(settings);
{$IFDEF CEF_MULTI_THREADED_MESSAGE_LOOP}
  CefBrowserHostCreate(@info, FHandler, FDefaultUrl, @settings,
    TCefRequestContextRef.CreateContext((FHandler as ICefClientHandler).GetRequestContextHandler));
{$ELSE}
  CefLoadLibDefault;
  FBrowser := CefBrowserHostCreateSync(@info, FClientHandler, FDefaultUrl, @settings,
    TCefRequestContextRef.CreateContext((FClientHandler as ICefClientHandler).GetRequestContextHandler));
  FBrowserId := FBrowser.Identifier;
{$ENDIF}
end;