CEF知识点汇总

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CEF知识点汇总
0, CEF中文环境
初始化时, CefString(&settings.locale) = L"zh_CN";
在浏览器进程的OnBeforeCommandLineProcessing中,用命令行形式,设置浏览器各种属性
如:渲染进程,关闭代理 GPU等
1.void ClientApp::OnBeforeCommandLineProcessing(const CefString& process_type, CefRefPtr<CefCommandLine> command_line)
2.{
3.// Pass additional command-line flags to the browser process.
4.if (process_type.empty())
5.{
6.// 设置子进程路径很关键,如果不设置,可能会触发cef的一个bug
7.// cef在LoadUrl建立渲染进程时,会查找子进程的路径,可能会引发一个bug导致IDE在debug状态时卡死
8.// 这里指定好子进程路径就可以了
9.
10.// 但是使用sandbox的话,不允许使用另外的子进程;不使用sandbox的话,第一次加载flash插件时会弹出个命令提示行,这是cef的bug。

flash与子进程二者不可兼得
11.//#if !defined(SUPPORT_CEF_FLASH)
12.// #ifdef _DEBUG
13.//
command_line->AppendSwitchWithValue("browser-subprocess-path", "render_d.exe");
14.// #else
15.//
command_line->AppendSwitchWithValue("browser-subprocess-path", "render.exe");
16.// #endif
17.//#else
18.//
19.//#endif
20.
21.//cef 在debug模式下有问题
22.
mand_line->AppendSwitchWithValue("brows er-subprocess-path", "render.exe");
24.
25.//command_line->AppendSwitchWithValue("ppa pi-flash-version", "20.0.0.228");
26.//command_line->AppendSwitchWithValue("ppa pi-flash-path", "PepperFlash\\pepflashplayer.dll");
27.
28.//command_line->AppendSwitchWithValue("enab le-media-stream", "1"); //开启摄像头
29.//command_line->AppendSwitchWithValue("enab le-system-flash", "1"); //flash
30.//command_line->AppendSwitchWithValue("enab le-speech-input", "1"); //语音输入
31.
32.
33.
34.
35.
36.//command_line->AppendSwitchWithValue("enab le-webgl", "1"); //开启WEBGL
37.//command_line->AppendSwitchWithValue("igno re-gpu-blacklist", "1"); //忽略显卡黑名单
38.//command_line->AppendSwitchWithValue("allo w-file-access-from-files", "1"); //本地调试WEBGL
39.
40.//同一个域下的使用同一个渲染进程
mand_line->AppendSwitch("process-per-site");
mand_line->AppendSwitch("no-proxy-server");//加载慢,关闭代理试试
43.
44.
45.//禁用GPU
mand_line->AppendSwitch("disable-gpu");
mand_line->AppendSwitch("disable-gpu-compositing");
48.
49.// 开启离屏渲染
50.if
(CefManager::GetInstance()->IsEnableOffsetRender())
51.{
mand_line->AppendSwitch("disable-surfaces");
mand_line->AppendSwitch("enable-begin-frame-scheduling");
54.}
55.}
56.}
1,当网页中有自定义视频控件时,结束程序,关闭CEF时,会发生中断到libcef.dll中
方法:
1)可以去掉这样的控件,正常的网站是可以正常结束的
2)不能替换这样的控件的话,因为只在结束中,有中断
所以强制结束,也不会有什么影响,所以可以强制关闭进程
1.//当网页中有网易自定义的视频控件时,退出有问题,中断到libcef.dll中,为避免这样无效的中断,退出时,强制结束自己的进程
2.HANDLE hself = GetCurrentProcess();
3.
4.TerminateProcess(hself, 0);
2 单进程,多进程模式设置
在CefInitialize 初始化时,设置相关的模式
如:
1.void CefManager::GetCefSetting(const std::wstring& app_data_dir, CefSettings &settings)
2.{
3.if (false == nbase::FilePathIsExist(app_data_dir, true))
4.nbase::CreateDirectory(app_data_dir);
5.
6.#if !defined(SUPPORT_CEF_FLASH)
7.settings.no_sandbox = true;
8.#endif
9.
10.// 设置localstorage,不要在路径末尾加"\\",否则运行时会报错
11.CefString(&settings.cache_path) = app_data_dir +
L"CefLocalStorage";
12.
13.// 设置debug log文件位置
14.CefString(&settings.log_file) = app_data_dir + L"cef.log";
15.
16.// 调试模型下使用单进程,但是千万不要在release发布版本中使用,官方已经不推荐使用单进程模式
17.// cef1916版本debug模式:在单进程模式下程序退出时会触发中断
18.#ifdef _DEBUG
19.settings.single_process = true;
20.#else
21.settings.single_process = false;
22.#endif
23.
24.// cef2623、2526版本debug模式:在使用multi_threaded_message_loop时退出程序会触发中断
25.// 加入disable-extensions参数可以修复这个问题,但是会导致一些页面打开时报错
26.// 开启Cef多线程消息循环,兼容nbase库消息循环
27.settings.multi_threaded_message_loop = true;
28.
29.// 开启离屏渲染
30.settings.windowless_rendering_enabled = is_enable_offset_render_;
31.}
32.
33.
34.
35.
36.
37.CefMainArgs main_args(GetModuleHandle(NULL));
38.CefRefPtr<ClientApp> app(new ClientApp);
39.
40.// 如果是在子进程中调用,会堵塞直到子进程退出,并且exit_code返回大于等于0
41.// 如果在Browser进程中调用,则立即返回-1
42.int exit_code = CefExecuteProcess(main_args, app.get(), sandbox_info);
43.if (exit_code >= 0)
44.return false;
45.
46.GetCefSetting(app_data_dir, settings);
47.
48.
49.
50.bool bRet = CefInitialize(main_args, settings, app.get(), sandbox_info);
51.
3 右键菜单
1.#define MENU_ID_FRESH MENU_ID_USER_FIRST+1
2.#define MENU_ID_DOWNINFO MENU_ID_USER_FIRST+2
3.#define MENU_ID_PASTER MENU_ID_USER_FIRST+3
4.
5.#define MENU_ID_DEVTOOL MENU_ID_USER_FIRST+4
6.
space nim_cef
8.{
9.BrowserHandler::BrowserHandler()
10.{
11.handle_delegate_ = NULL;
12.is_focus_oneditable_field_ = false;
13.ZeroMemory(&rect_cef_control_, sizeof(RECT));
14.}
1.// CefContextMenuHandler methods
2.void
BrowserHandler::OnBeforeContextMenu(CefRefPtr<CefBrowser> browser,
3.CefRefPtr<CefFrame> frame,
4.CefRefPtr<CefContextMenuParams> params,
5.CefRefPtr<CefMenuModel> model)
6.{
7.REQUIRE_UI_THREAD();
8.
9.//if (handle_delegate_)
10.//{
11.//
handle_delegate_->OnBeforeContextMenu(browser, frame, params, model);
12.//}
13.//else
14.{
15.// Customize the context menu...
16.if ((params->GetTypeFlags() & (CM_TYPEFLAG_PAGE | CM_TYPEFLAG_FRAME)) != 0)
17.{
18.if (model->GetCount() > 0)
19.{
20.// 禁止右键菜单
21.//model->Clear();
22.
23.model->Remove(MENU_ID_PRINT);
24.model->Remove(MENU_ID_BACK);
25.model->Remove(MENU_ID_FORWARD);
26.model->Remove(MENU_ID_VIEW_SOURCE);
27.
28.
29.// model->AddSeparator();
30.
31.model->AddItem(MENU_ID_DEVTOOL, L"开发调试");
32.model->AddItem(MENU_ID_FRESH, L"刷新");
33.// model->AddItem(MENU_ID_DOWNINFO, L"下载内容");
34.// model->AddItem(MENU_ID_PASTER, L"粘贴");
35.
36.
37.}
38.}
39.}
40.}
菜单命令:
1.bool
BrowserHandler::OnContextMenuCommand(CefRefPtr<CefBrow ser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, int command_id, EventFlags event_flags)
2.{
3.
4.////菜单ID匹配时,弹出DevTools
5.//if (command_id == MENU_ID_DEVTOOL)
6.//{
7.
8.// return
handle_delegate_->OnContextMenuCommand(browser, frame, params, command_id, event_flags);
9.
10.//}
11.
12.//else if (command_id == MENU_ID_FRESH)
13.//{
14.// browser->Reload();
15.
16.// return true;
17.//}
18.
19.
20.
21.
22.
23.if (handle_delegate_)
24.return
handle_delegate_->OnContextMenuCommand(browser, frame,
params, command_id, event_flags);
25.else
26.return false;
27.}
1.bool
CefControlBase::OnContextMenuCommand(CefRefPtr<CefBrow ser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefContextMenuParams> params, int command_id, CefContextMenuHandler::EventFlags event_flags)
2.{
3.
4.#define MENU_ID_FRESH MENU_ID_USER_FIRST+1
5.#define MENU_ID_DOWNINFO MENU_ID_USER_FIRST+2
6.#define MENU_ID_PASTER MENU_ID_USER_FIRST+3
7.
8.#define MENU_ID_DEVTOOL MENU_ID_USER_FIRST+4
9.
10.
11.if (command_id == MENU_ID_FRESH) //各窗口公用菜单命令
12.{
13.browser->Reload();
14.}
15.else if (command_id == MENU_ID_DEVTOOL)
16.{
17.CefWindowInfo windowInfo;
18.windowInfo.SetAsPopup(NULL, L"cef_devtools");
19.CefBrowserSettings settings;
20.windowInfo.width = 900;
21.windowInfo.height = 700;
22.browser->GetHost()->ShowDevTools(windowInfo, new nim_cef::BrowserHandler/*browser_handler_*/, settings, CefPoint());
23.
24.return false;
25.}
26.
27.if (cb_menu_command_) //定制各窗口自定义命令
28.return cb_menu_command_(params, command_id, event_flags);
29.
30.return false;
31.}
4 下载文件及进度显示
前提:要继承 CefDownloadHandler,接口,才能下载
virtual CefRefPtr<CefDownloadHandler> GetDownloadHandler() OVERRIDE{ return this; }
如果要下载如下资源
/x1.4.20.zip
CEF 只需 LoadURL(url);即可LoadURL(“/x1.4.20.zip”);
不过,要知道下载进度及有没有下载完,还需要进一步处理
1.virtual void OnBeforeDownload( //刚开始下载,设置下载路径等信息
2.CefRefPtr<CefBrowser> browser,
3.CefRefPtr<CefDownloadItem> download_item,
4.const CefString& suggested_name,
5.CefRefPtr<CefBeforeDownloadCallback> callback) OVERRIDE;
6.
7.virtual void OnDownloadUpdated( //下载进度信息
8.CefRefPtr<CefBrowser> browser,
9.CefRefPtr<CefDownloadItem> download_item,
10.CefRefPtr<CefDownloadItemCallback> callback) OVERRIDE;
开始下载,下载路径等信息
1.void BrowserHandler::OnBeforeDownload(
2.CefRefPtr<CefBrowser> browser,
3.CefRefPtr<CefDownloadItem> download_item,
4.const CefString& suggested_name,
5.CefRefPtr<CefBeforeDownloadCallback> callback)
6.{
7.if (handle_delegate_)
8.handle_delegate_->OnBeforeDownload(browser, download_item, suggested_name, callback);
9.
10.CefString url = download_item->GetURL();
11.
12.std::wstring sDownloadPath = QPath::GetLocalAppDataDir();
13.
14.std::wstring::size_type nIndex = sDownloadPath.rfind(L"\\");
15.
16.if (nIndex != -1)
18.sDownloadPath.erase(nIndex);
19.
20.}
21.
22.
23.
24.sDownloadPath += L"\\";
25.sDownloadPath += suggested_name.ToWString();
26.
27.std::wstring wstrExt = suggested_name.T oWString();
28.std::wstring::size_type position = wstrExt.find(L".");
29.
30.if (position == -1)//没找到,说明文件没有扩展名,我们补上默认文件扩展名,不然下载好的文件无法查看
31.{
32.sDownloadPath += L".zip";
33.}
34.
35.CefString sPath;
36.sPath.FromWString(sDownloadPath);
37.//Param [download_path] Set |download_path| to the full file path for the download including the file name
38.//Param [show_dialog] Set | show_dialog | to true if you do wish to show the default "Save As" dialog.
39.
40.callback->Continue(sDownloadPath, false);//第一个参数是设置文件保存全路径包含文件名
41.
43.//callback->Continue(download_item->GetURL(), true);
44.}
下载进度等信息
1.void BrowserHandler::OnDownloadUpdated(
2.CefRefPtr<CefBrowser> browser,
3.CefRefPtr<CefDownloadItem> download_item,
4.CefRefPtr<CefDownloadItemCallback> callback)
5.{
6.if (handle_delegate_)
7.handle_delegate_->OnDownloadUpdated(browser, download_item, callback);
8.
9.if (handle_delegate_)
10.nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnLoadFilePercent,
handle_delegate_, download_item->GetPercentComplete()));
11.
12.
13.if (download_item->IsComplete())
14.{
15.
16.
17.// A frame has finished loading content...
18.if (handle_delegate_)
19.nbase::ThreadManager::PostTask(kThreadUI, nbase::Bind(&HandlerDelegate::OnLoadFileCompleted, handle_delegate_, download_item->GetFullPath()));
21.
22.// MessageBox(L"下载成功");
23.if (browser->IsPopup() && !browser->HasDocument())
24.{
25.//browser->GetHost()->ParentWindowWillClose();
26.browser->GetHost()->CloseBrowser(true);
27.}
28.}
29.}。

相关文档
最新文档