CEF | CEF浏览器客户端功能扩展:清除缓存、解决闪退
前言
在开发CEF浏览器客户端过程中,随着需求的不断增加,也会遇到各种问题,这里把清除缓存功能介绍完之后,会总结一下遇到的一些问题,并给出解决方法。也算是一次合集吧。比如说解决点击网页中弹框的关闭按钮后,浏览器闪退的问题。还有点击空白区域托盘菜单不消失的问题。
清除缓存
我是将浏览器的缓存路径设置在了启动程序目录下的LocalStorage文件夹下。在main函数中设置缓存路径,通过设置CefSettings的cache_path和root_cache_path指定缓存路径。
QString storagePath = appPath + "/LocalStorage"; // 缓存保存路径
CefString(&settings.cache_path).FromString(storagePath.toStdString());
CefString(&settings.root_cache_path).FromString(storagePath.toStdString());
deleteCefDir(storagePath); //清除缓存
清除缓存就是将LcalStorage文件夹下的缓存文件全部删除。我选择的是在程序启动的时候去执行清除缓存的功能。也可以选择在程序运行过程中,点击清除缓存按钮去清理,但是因为程序在运行过程中,有很多网页的显示是依赖缓存文件的,所以删除的时候有些会自动跳过。还可以在程序结束时去清理,这时清理可能会存在清理不掉的风险。
因为我的浏览器有记住账号和密码的需求,所以每次清理缓存时,都要跳过Local Storage文件夹,所以不能直接调用dir.removeRecursively(),而是需要进行遍历,筛选出不是Local Storage文件夹下的文件及文件夹并删除。
void deleteCefDir(const QString path)
{
QDir dir(path);
if(!dir.exists())
{
return;
}
dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); //设置过滤
QFileInfoList fileList = dir.entryInfoList(); // 获取所有的文件信息
foreach (QFileInfo file, fileList)
{
if (file.isFile())
{
file.dir().remove(file.fileName());
}
else
{
if(file.fileName() != "Local Storage")
{
deleteCefDir(file.absoluteFilePath());
}
}
}
dir.rmpath(dir.absolutePath()); // 删除文件夹本身
}
解决点击网页中弹框的关闭按钮后,浏览器闪退问题
点击弹窗的关闭按钮时,响应了ClientHandler::DoClose()方法,因为此时的网页数量是1,它自动执行了关闭操作,所以在Doclose()方法中,我们要加上一个判断,如果网页是popup出来的,就让她return true。
bool ClientHandler::DoClose(CefRefPtr<CefBrowser> browser)
{
CEF_REQUIRE_UI_THREAD();
if(!browser->IsPopup())
{
sigDoClose();
return true;
}
else
{
if (browser_list_.size() == 1)
{
is_closing_ = true;
}
return false;
}
}
解决点击空白区域托盘菜单不消失问题
这个问题是因为托盘菜单在创建时没有将菜单的父指向桌面,所以点击桌面空白区域时没有任何响应。只需要在菜单创建时,将它的父指针传入QApplication::desktop()就可以了。
m_menu = new QMenu(QApplication::desktop());
这样就可以实现点击桌面空白区域隐藏菜单了。
- 点赞
- 收藏
- 关注作者
评论(0)