CEF | CEF浏览器客户端功能扩展:清除缓存、解决闪退

举报
黑兔子 发表于 2022/10/17 16:31:41 2022/10/17
【摘要】 在开发CEF浏览器客户端过程中,随着需求的不断增加,也会遇到各种问题,这里把清除缓存功能介绍完之后,会总结一下遇到的一些问题,并给出解决方法。也算是一次合集吧。比如说解决点击网页中弹框的关闭按钮后,浏览器闪退的问题。还有点击空白区域托盘菜单不消失的问题。

前言

在开发CEF浏览器客户端过程中,随着需求的不断增加,也会遇到各种问题,这里把清除缓存功能介绍完之后,会总结一下遇到的一些问题,并给出解决方法。也算是一次合集吧。比如说解决点击网页中弹框的关闭按钮后,浏览器闪退的问题。还有点击空白区域托盘菜单不消失的问题。

清除缓存

我是将浏览器的缓存路径设置在了启动程序目录下的LocalStorage文件夹下。在main函数中设置缓存路径,通过设置CefSettings的cache_pathroot_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());

这样就可以实现点击桌面空白区域隐藏菜单了。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。