diff --git a/libcef/cef_process_ui_thread.cc b/libcef/cef_process_ui_thread.cc index c213b48aa..ce4ef553e 100644 --- a/libcef/cef_process_ui_thread.cc +++ b/libcef/cef_process_ui_thread.cc @@ -16,6 +16,7 @@ #include "build/build_config.h" #include "net/base/net_module.h" #include "net/url_request/url_request.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebNetworkStateNotifier.h" #include "ui/gfx/gl/gl_implementation.h" #include "webkit/blob/blob_storage_controller.h" #include "webkit/blob/blob_url_request_job.h" @@ -175,6 +176,16 @@ void CefProcessUIThread::Init() { webkit::npapi::PluginList::Singleton()->AddExtraPluginPath(path); } } + + // Create a network change notifier before starting the IO & File threads. + network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); + + // Add a listener for OnOnlineStateChanged to notify WebKit of changes. + net::NetworkChangeNotifier::AddOnlineStateObserver(this); + + // Initialize WebKit with the current state. + WebKit::WebNetworkStateNotifier::setOnLine( + !net::NetworkChangeNotifier::IsOffline()); } void CefProcessUIThread::CleanUp() { @@ -195,5 +206,15 @@ void CefProcessUIThread::CleanUp() { delete webkit_init_; webkit_init_ = NULL; + // Release the network change notifier after all other threads end. + net::NetworkChangeNotifier::RemoveOnlineStateObserver(this); + network_change_notifier_.reset(); + PlatformCleanUp(); } + +void CefProcessUIThread::OnOnlineStateChanged(bool online) { + DCHECK(CefThread::CurrentlyOn(CefThread::UI)); + WebKit::WebNetworkStateNotifier::setOnLine(online); +} + diff --git a/libcef/cef_process_ui_thread.h b/libcef/cef_process_ui_thread.h index 9703267af..c6e64fd37 100644 --- a/libcef/cef_process_ui_thread.h +++ b/libcef/cef_process_ui_thread.h @@ -7,7 +7,9 @@ #define _CEF_PROCESS_UI_THREAD #include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" #include "cef_thread.h" +#include "net/base/network_change_notifier.h" class BrowserWebKitInit; namespace base { @@ -23,7 +25,10 @@ class StatsTable; // Applications must initialize the COM library before they can call // COM library functions other than CoGetMalloc and memory allocation // functions, so this class initializes COM for those users. -class CefProcessUIThread : public CefThread { +class CefProcessUIThread + : public net::NetworkChangeNotifier::OnlineStateObserver, + public CefThread +{ public: explicit CefProcessUIThread(); CefProcessUIThread(MessageLoop* message_loop); @@ -36,11 +41,16 @@ class CefProcessUIThread : public CefThread { void PlatformInit(); void PlatformCleanUp(); + // From net::NetworkChangeNotifier::OnlineStateObserver + void OnOnlineStateChanged(bool online); + base::StatsTable* statstable_; // WebKit implementation class. BrowserWebKitInit* webkit_init_; + scoped_ptr network_change_notifier_; + DISALLOW_COPY_AND_ASSIGN(CefProcessUIThread); };