diff --git a/libcef/browser/context.cc b/libcef/browser/context.cc index b53cae35c..bd1b72f6f 100644 --- a/libcef/browser/context.cc +++ b/libcef/browser/context.cc @@ -422,6 +422,9 @@ void CefContext::FinishShutdownOnUIThread( if (trace_subscriber_.get()) trace_subscriber_.reset(NULL); + if (component_updater_.get()) + component_updater_.reset(NULL); + if (uithread_shutdown_event) uithread_shutdown_event->Signal(); } diff --git a/patch/patch.cfg b/patch/patch.cfg index 82701edee..059acdd19 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -136,6 +136,13 @@ patches = [ 'name': 'spellcheck_137', 'path': '../chrome/browser/spellchecker/', }, + { + # Fix AtExitManager assertion on PrefWatcherFactory destruction during + # Windows multi-threaded message loop shutdown. + # https://bitbucket.org/chromiumembedded/cef/issues/1680 + 'name': 'prefs_tab_helper_1680', + 'path': '../chrome/browser/ui/prefs/', + }, { # Make URLRequest::set_is_pending() public so that it can be called from # CefRequestInterceptor::MaybeInterceptResponse(). diff --git a/patch/patches/prefs_tab_helper_1680.patch b/patch/patches/prefs_tab_helper_1680.patch new file mode 100644 index 000000000..0428ec805 --- /dev/null +++ b/patch/patches/prefs_tab_helper_1680.patch @@ -0,0 +1,47 @@ +diff --git prefs_tab_helper.cc prefs_tab_helper.cc +index 5cb2d6e..b0c8689 100644 +--- prefs_tab_helper.cc ++++ prefs_tab_helper.cc +@@ -7,7 +7,7 @@ + #include + #include + +-#include "base/memory/singleton.h" ++#include "base/lazy_instance.h" + #include "base/prefs/overlay_user_pref_store.h" + #include "base/prefs/pref_change_registrar.h" + #include "base/prefs/pref_service.h" +@@ -413,12 +413,10 @@ class PrefWatcherFactory : public BrowserContextKeyedServiceFactory { + GetInstance()->GetServiceForBrowserContext(profile, true)); + } + +- static PrefWatcherFactory* GetInstance() { +- return base::Singleton::get(); +- } ++ static PrefWatcherFactory* GetInstance(); + + private: +- friend struct base::DefaultSingletonTraits; ++ friend struct base::DefaultLazyInstanceTraits; + + PrefWatcherFactory() : BrowserContextKeyedServiceFactory( + "PrefWatcher", +@@ -439,6 +437,18 @@ class PrefWatcherFactory : public BrowserContextKeyedServiceFactory { + } + }; + ++namespace { ++ ++base::LazyInstance::Leaky g_pref_watcher_factory = ++ LAZY_INSTANCE_INITIALIZER; ++ ++} // namespace ++ ++// static ++PrefWatcherFactory* PrefWatcherFactory::GetInstance() { ++ return g_pref_watcher_factory.Pointer(); ++} ++ + // static + PrefWatcher* PrefWatcher::Get(Profile* profile) { + return PrefWatcherFactory::GetForProfile(profile);