2020年12月

老话题新提,还是那个退出报错的流程。
cef是个启动容易退出难的框架,毕竟不是我们自己设计的东西。
1.
用户发送了 WM_CLOSE 消息,我们要检测浏览器是否存在!
如果存在则调用TryCloseBrowser()或者

    if (Chromium::BrowserHandler::GetInstance() && Chromium::BrowserHandler::GetInstance()->IsClosing())
    {
            Chromium::BrowserHandler::GetInstance()->CloseHostBrowser(false); // 取消关闭
            event->ignore(); // 取消关闭窗口继续执行
    }

整个流程不由主线程执行,因为CEF的内核设计与QT大致相同。如果你的CEF是基于多线程的启动,外部线程调用这些有关于浏览器操作的函数退出时会报错,所以,我们就把一系列的操作都交给

    bool BrowserClosure::PostClosure(const base::Closure& closure)
    {
        return CefPostTask(TID_UI, CefCreateClosureTask(closure));
    }

这样我们将任务投递给UI线程进行内部执行。

我们取消关闭后,由CEF再一次发送 WM_CLOSE 消息。进行CEF内部消息循环关闭,这里我们不去多说。

接下来的流程就是调用 OnBeforeClose 停止浏览器做最后的清理操作。

最后在入口函数增加(在执行CefQuitMessageLoop之前一定要释放掉你所有初始化函数的内存,否则会有异常的错误。)
原因不明,因为你必须在退出CEF消息循环之前释放掉你用过所有函数的内存,可能在此之后释放的话内部有一些操作会用到消息循环,所以没有了消息循环就会报错。
CefQuitMessageLoop
CefShutdown

至此结束,具体代码请看https://github.com/X-Crack/Publisher/blob/master/Source/Browser/Browser.WinMain.cc

我的目录:f:\\Development\\chromium

拉取成功:f:\\Development\\chromium\\src

开始拉取(cd 某盘:\chromium\)

    fetch --nohooks chromium

如果中途中断执行:

    gclient sync --nohooks --with_branch_heads --jobs 16

拉取完全成功会提示:

    Syncing projects: 100% (xxx/xxx), done.
    Running: git submodule foreach 'git config -f $toplevel/.git/config submodule.$name.ignore all'
    Running: git config --add remote.origin.fetch '+refs/tags/*:refs/tags/*'
    Running: git config diff.ignoreSubmodules all

拉取成功执行 - 获得所有发布tags信息
查看

    git show-ref --tags

获取

    git fetch --tags

开始拉取(依次执行)

    git checkout -b chromium_release_branch 87.0.4280.88
    gclient sync --with_branch_heads --with_tags --no_auth --jobs 16 -D

如果报错,请注意是否有(SET DEPOT_TOOLS_WIN_TOOLCHAIN=0)排除问题后继续执行

    gclient sync --with_branch_heads --with_tags --no_auth --jobs 16 -D

资料仅供参考,一切情况还要以你的环境为准,尽可能在虚拟机全新系统中进行。

所有版本:https://chromiumdash.appspot.com/releases
参考资料:https://www.chromium.org/developers/how-tos/get-the-code/working-with-release-branches