nim_duilib/ui_components/cef_control/manager/cef_manager.cpp

222 lines
6.0 KiB
C++
Raw Permalink Normal View History

2019-04-19 17:19:57 +08:00
#include "stdafx.h"
#include "cef_manager.h"
#include "include/wrapper/cef_closure_task.h"
#include "include/base/cef_bind.h"
#include "cef_control/app/client_app.h"
#include "cef_control/handler/browser_handler.h"
namespace nim_comp
2019-04-19 17:19:57 +08:00
{
BOOL CefMessageLoopDispatcher::IsIdleMessage(const MSG* pMsg)
{
switch (pMsg->message)
{
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
case WM_PAINT:
return FALSE;
}
return TRUE;
}
bool CefMessageLoopDispatcher::Dispatch(const MSG &msg)
{
static BOOL bDoIdle = TRUE;
TranslateMessage(&msg);
DispatchMessage(&msg);
if (IsIdleMessage(&msg))
{
bDoIdle = TRUE;
}
while (bDoIdle && !::PeekMessage(const_cast<MSG*>(&msg), NULL, 0, 0, PM_NOREMOVE))
{
CefDoMessageLoopWork();
bDoIdle = FALSE;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bug<75><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ+<2B><><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>Ϣѭ<CFA2><D1AD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رյ<D8B1>
// <20><>cefԴ<66><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ˵<D6B2><CBB5><EFBFBD><EFBFBD><EFBFBD>TrackPopupMenu<6E><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>MSDN<44><4E><EFBFBD><EFBFBD><EFBFBD>ϲ<CFB2><E9BFB4><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>TrackPopupMenuǰ
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><E4B8B8><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>SetForegroundWindow<6F><77><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cefԴ<66><D4B4><EFBFBD><EFBFBD>û<EFBFBD>е<EFBFBD><D0B5><EFBFBD>
// <20><><EFBFBD>շ<EFBFBD>cefԴ<66><D4B4><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cef<65><66>UI<55>̴߳<DFB3><CCB4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UI<55>̴߳<DFB3><CCB4><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ˵<D6B2><CBB5>޷<EFBFBD><DEB7>رյ<D8B1>bug<75>ˣ<EFBFBD><CBA3><EFBFBD>Ȼ<EFBFBD><C8BB>֪<EFBFBD><D6AA>Ϊʲô<CAB2><C3B4><EFBFBD><EFBFBD>bug<75><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FixContextMenuBug(HWND hwnd)
{
CreateWindow(L"Static", L"", WS_CHILD, 0, 0, 0, 0, hwnd, NULL, NULL, NULL);
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
///////////////////////////////////////////////////////////////////////////////////
CefManager::CefManager()
{
browser_count_ = 0;
is_enable_offset_render_ = true;
}
void CefManager::AddCefDllToPath()
{
#if !defined(SUPPORT_CEF)
return;
#endif
TCHAR path_envirom[4096] = { 0 };
GetEnvironmentVariable(L"path", path_envirom, 4096);
std::wstring cef_path = nbase::win32::GetCurrentModuleDirectory();
2019-04-19 17:19:57 +08:00
#ifdef _DEBUG
//cef_path += L"cef_debug"; // <20><><EFBFBD>ڼ<EFBFBD>ʹ<EFBFBD><CAB9>debugģʽ<C4A3><CABD>Ҳʹ<D2B2><CAB9>cef release<73><EFBFBD><E6B1BE>dll<6C><6C>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>cef<65>˳<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>cef<65>Ĺ<EFBFBD><C4B9>ܲ<EFBFBD><DCB2><EFBFBD>Ҫʹ<D2AA><CAB9>debug<75><EFBFBD><E6B1BE>dll
cef_path += L"cef";
#else
cef_path += L"cef";
#endif
if (!nbase::FilePathIsExist(cef_path, true))
{
MessageBox(NULL, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹCef.rarѹ<72><D1B9><EFBFBD><EFBFBD>", L"<EFBFBD><EFBFBD>ʾ", MB_OK);
exit(0);
}
std::wstring new_envirom(cef_path);
new_envirom.append(L";").append(path_envirom);
SetEnvironmentVariable(L"path", new_envirom.c_str());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>flash<73><68><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// https://blog.csdn.net/zhuhongshu/article/details/77482985
std::wstring cmd_path = cef_path + L"\\dummy_cmd.exe";
SetEnvironmentVariable(L"ComSpec", cmd_path.c_str());
}
// Cef<65>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ӿڣ<D3BF>ͬʱ<CDAC><CAB1>ע<EFBFBD><D7A2>ʹ<EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><E6B1BE>Cefʱ<66><CAB1><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>ֿ<EFBFBD>
// Cef1916<31><EFBFBD><E6B1BE><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ijЩ<C4B3><D0A9>debugģʽ<C4A3><CABD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>жϾ<D0B6><CFBE><EFBFBD><E6A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4>󣩣<EFBFBD><F3A3A9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>html<6D><6C>׼֧<D7BC>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>releaseģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
// Cef2357<35><EFBFBD>޷<EFBFBD>ʹ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD>̻<EFBFBD><CCBB><EFBFBD><EFBFBD><EFBFBD>
// Cef2526<32><36>2623<32><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD>涼֧<E6B6BC>֣<EFBFBD>Ψһ<CEA8>ĿӾ<C4BF><D3BE><EFBFBD>debugģʽ<C4A3>ڶ<EFBFBD><DAB6>߳<EFBFBD><DFB3><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD>releaseģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (PS:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD>ʹ<EFBFBD>ø<EFBFBD><C3B8><EFBFBD>Cef<65><66><EFBFBD>ܵĿ<DCB5><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>releaseģʽ<C4A3><CABD>cef dll<6C>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>deubg<62><67>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><E1B1A8><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>AddCefDllToPath<74><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>releaseĿ¼)
bool CefManager::Initialize(const std::wstring& app_data_dir, CefSettings &settings, bool is_enable_offset_render /*= true*/)
{
#if !defined(SUPPORT_CEF)
return true;
#endif
is_enable_offset_render_ = is_enable_offset_render;
CefMainArgs main_args(GetModuleHandle(NULL));
CefRefPtr<ClientApp> app(new ClientApp);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>exit_code<64><65><EFBFBD>ش<EFBFBD><D8B4>ڵ<EFBFBD><DAB5><EFBFBD>0
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Browser<65><72><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1
int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
if (exit_code >= 0)
return false;
GetCefSetting(app_data_dir, settings);
bool bRet = CefInitialize(main_args, settings, app.get(), NULL);
if (is_enable_offset_render_)
{
HWND hwnd = CreateWindow(L"Static", L"", WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
CefPostTask(TID_UI, base::Bind(&FixContextMenuBug, hwnd));
}
return bRet;
}
void CefManager::UnInitialize()
{
#if !defined(SUPPORT_CEF)
return;
#endif
CefShutdown();
}
bool CefManager::IsEnableOffsetRender() const
{
return is_enable_offset_render_;
}
nbase::Dispatcher* CefManager::GetMessageDispatcher()
{
return &message_dispatcher_;
}
void CefManager::AddBrowserCount()
{
browser_count_++;
}
void CefManager::SubBrowserCount()
{
browser_count_--;
ASSERT(browser_count_ >= 0);
}
int CefManager::GetBrowserCount()
{
return browser_count_;
}
void CefManager::PostQuitMessage(int nExitCode)
{
#if !defined(SUPPORT_CEF)
::PostQuitMessage(nExitCode);
return;
#endif
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ǧ<EFBFBD><C7A7><EFBFBD><EFBFBD>Ҫֱ<D2AA>ӵ<EFBFBD><D3B5><EFBFBD>::PostQuitMessage<67><65><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Ӧ<>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA>ٵ<EFBFBD><D9B5><EFBFBD>::PostQuitMessage
if (browser_count_ == 0)
{
nbase::ThreadManager::PostTask(kThreadUI, [nExitCode]()
2019-04-19 17:19:57 +08:00
{
::PostQuitMessage(nExitCode);
});
2019-04-19 17:19:57 +08:00
}
else
{
auto cb = [nExitCode]()
{
CefManager::GetInstance()->PostQuitMessage(nExitCode);
};
nbase::ThreadManager::PostDelayedTask(kThreadUI, cb, nbase::TimeDelta::FromMilliseconds(500));
2019-04-19 17:19:57 +08:00
}
}
void CefManager::GetCefSetting(const std::wstring& app_data_dir, CefSettings &settings)
{
if (false == nbase::FilePathIsExist(app_data_dir, true))
nbase::CreateDirectory(app_data_dir);
settings.no_sandbox = true;
// <20><><EFBFBD><EFBFBD>localstorage<67><65><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>·<EFBFBD><C2B7>ĩβ<C4A9><CEB2>"\\"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E1B1A8>
CefString(&settings.cache_path) = app_data_dir + L"CefLocalStorage";
// <20><><EFBFBD><EFBFBD>debug log<6F>ļ<EFBFBD>λ<EFBFBD><CEBB>
CefString(&settings.log_file) = app_data_dir + L"cef.log";
// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD>ǧ<EFBFBD><C7A7><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>release<73><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE>ʹ<EFBFBD>ã<EFBFBD><C3A3>ٷ<EFBFBD><D9B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>Ƽ<EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ģʽ
// cef1916<31>汾debugģʽ:<3A>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>³<EFBFBD><C2B3><EFBFBD><EFBFBD>˳<EFBFBD>ʱ<EFBFBD><EFBFBD><E1B4A5><EFBFBD>ж<EFBFBD>
#ifdef _DEBUG
settings.single_process = true;
#else
settings.single_process = false;
#endif
// cef2623<32><33>2526<32>汾debugģʽ:<3A><>ʹ<EFBFBD><CAB9>multi_threaded_message_loopʱ<70>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B4A5><EFBFBD>ж<EFBFBD>
// <20><><EFBFBD><EFBFBD>disable-extensions<6E><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3AC><EFBFBD>ǻᵼ<C7BB><E1B5BC>һЩҳ<D0A9><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>Cef<65><66><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>Ϣѭ<CFA2><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nbase<73><65><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
settings.multi_threaded_message_loop = true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ
settings.windowless_rendering_enabled = is_enable_offset_render_;
}
}