diff options
-rw-r--r-- | chrome/browser/browser_main.cc | 15 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc | 14 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/cros_network_change_notifier_factory.h | 29 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/network_change_notifier_chromeos.cc | 52 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/network_change_notifier_chromeos.h | 2 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_host_delegate_helper.cc | 3 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | content/common/view_messages.h | 1 | ||||
-rw-r--r-- | net/base/network_change_notifier.cc | 19 | ||||
-rw-r--r-- | net/base/network_change_notifier.h | 6 | ||||
-rw-r--r-- | net/base/network_change_notifier_factory.h | 25 | ||||
-rw-r--r-- | net/net.gyp | 1 | ||||
-rw-r--r-- | webkit/glue/webpreferences.cc | 5 | ||||
-rw-r--r-- | webkit/glue/webpreferences.h | 3 |
14 files changed, 147 insertions, 30 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 67bd547..e5711cc 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -147,7 +147,7 @@ #include "chrome/browser/chromeos/login/screen_locker.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/metrics_cros_settings_provider.h" -#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" +#include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h" #include "chrome/browser/chromeos/system_key_event_listener.h" #include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h" #include "chrome/browser/oom_priority_manager.h" @@ -570,15 +570,7 @@ void BrowserMainParts::MainMessageLoopStart() { InitializeMainThread(); -#if defined(OS_CHROMEOS) - // TODO(zelidrag): We need to move cros library glue code outside of - // chrome/browser directory to avoid check_deps issues and then migrate - // NetworkChangeNotifierCros class to net/base where other OS implementations - // live. - network_change_notifier_.reset(new chromeos::NetworkChangeNotifierChromeos()); -#else network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); -#endif PostMainMessageLoopStart(); Profiling::MainMessageLoopStarted(); @@ -1285,6 +1277,11 @@ int BrowserMain(const MainFunctionParams& parameters) { // SetUseStubImpl doesn't do anything. if (parameters.command_line_.HasSwitch(switches::kStubCros)) chromeos::CrosLibrary::Get()->GetTestApi()->SetUseStubImpl(); + + // Replace the default NetworkChangeNotifierFactory with ChromeOS specific + // implementation. + net::NetworkChangeNotifier::SetFactory( + new chromeos::CrosNetworkChangeNotifierFactory()); #endif parts->MainMessageLoopStart(); diff --git a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc new file mode 100644 index 0000000..ad38c6c --- /dev/null +++ b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc @@ -0,0 +1,14 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h" + +#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" + +namespace chromeos { + +net::NetworkChangeNotifier* CrosNetworkChangeNotifierFactory::CreateInstance() { + return new NetworkChangeNotifierChromeos(); +} + +} // namespace net diff --git a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h new file mode 100644 index 0000000..73c7663 --- /dev/null +++ b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_NET_CROS_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ +#define CHROME_BROWSER_CHROMEOS_NET_CROS_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ +#pragma once + +#include "base/compiler_specific.h" +#include "net/base/network_change_notifier_factory.h" + +namespace chromeos { + +class NetworkChangeNotifier; + +// CrosNetworkChangeNotifierFactory creates ChromeOS-specific specialization of +// NetworkChangeNotifier. +class CrosNetworkChangeNotifierFactory + : public net::NetworkChangeNotifierFactory { + public: + CrosNetworkChangeNotifierFactory() {} + + // Overrides of net::NetworkChangeNotifierFactory. + virtual net::NetworkChangeNotifier* CreateInstance() OVERRIDE; +}; + +} // namespace net + +#endif // CHROME_BROWSER_CHROMEOS_NET_CROS_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc index b8c1dc9..5fffbf7 100644 --- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc +++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc @@ -14,13 +14,16 @@ NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos() : has_active_network_(false), connection_state_(chromeos::STATE_UNKNOWN) { - chromeos::NetworkLibrary* lib = + chromeos::NetworkLibrary* net = chromeos::CrosLibrary::Get()->GetNetworkLibrary(); - lib->AddNetworkManagerObserver(this); + net->AddNetworkManagerObserver(this); chromeos::PowerLibrary* power = chromeos::CrosLibrary::Get()->GetPowerLibrary(); power->AddObserver(this); + + connection_state_ = net->active_network() ? + net->active_network()->connection_state() : chromeos::STATE_UNKNOWN; } NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() { @@ -55,6 +58,18 @@ bool NetworkChangeNotifierChromeos::IsCurrentlyOffline() const { return connection_state_ != chromeos::STATE_ONLINE; } +void NetworkChangeNotifierChromeos::OnNetworkChanged( + chromeos::NetworkLibrary* cros, + const chromeos::Network* network) { + CHECK(network); + + // Active network changed? + if (network->service_path() != service_path_) + UpdateNetworkState(cros); + else + UpdateConnectivityState(network); +} + void NetworkChangeNotifierChromeos::UpdateNetworkState( chromeos::NetworkLibrary* lib) { const chromeos::Network* network = lib->active_network(); @@ -70,12 +85,17 @@ void NetworkChangeNotifierChromeos::UpdateNetworkState( has_active_network_ = false; service_path_.clear(); ip_address_.clear(); + connection_state_ = chromeos::STATE_UNKNOWN; } else { has_active_network_ = true; service_path_ = network->service_path(); ip_address_ = network->ip_address(); - lib->AddNetworkObserver(network->service_path(), this); } + UpdateConnectivityState(network); + // If there is an active network, add observer to track its changes. + if (network) + lib->AddNetworkObserver(network->service_path(), this); + BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, NewRunnableFunction( @@ -83,36 +103,30 @@ void NetworkChangeNotifierChromeos::UpdateNetworkState( } } -void NetworkChangeNotifierChromeos::OnNetworkChanged( - chromeos::NetworkLibrary* cros, - const chromeos::Network* network) { - if (!network) { - NOTREACHED(); - return; - } - // Active network changed? - if (network->service_path() != service_path_) { - UpdateNetworkState(cros); - } - +void NetworkChangeNotifierChromeos::UpdateConnectivityState( + const chromeos::Network* network) { // We don't care about all transitions of ConnectionState. OnlineStateChange // notification should trigger if // a) we were online and went offline // b) we were offline and went online // c) switched to/from captive portal - chromeos::ConnectionState new_connection_state = network->connection_state(); + chromeos::ConnectionState new_connection_state = + network ? network->connection_state() : chromeos::STATE_UNKNOWN; + bool is_online = (new_connection_state == chromeos::STATE_ONLINE); bool was_online = (connection_state_ == chromeos::STATE_ONLINE); bool is_portal = (new_connection_state == chromeos::STATE_PORTAL); bool was_portal = (connection_state_ == chromeos::STATE_PORTAL); - - if (is_online != was_online || is_portal != was_portal) { + bool is_unknown = (new_connection_state == chromeos::STATE_UNKNOWN); + bool was_unknown = (connection_state_ == chromeos::STATE_UNKNOWN); + connection_state_ = new_connection_state; + if (is_online != was_online || is_portal != was_portal || + is_unknown != was_unknown) { BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, NewRunnableFunction( &NetworkChangeNotifierChromeos::NotifyObserversOfOnlineStateChange)); } - connection_state_ = new_connection_state; } } // namespace net diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h index 4fa94b9..b3ab865 100644 --- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h +++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h @@ -40,6 +40,8 @@ class NetworkChangeNotifierChromeos // Updates data members that keep the track the network stack state. void UpdateNetworkState(chromeos::NetworkLibrary* cros); + // Updates network connectivity state. + void UpdateConnectivityState(const chromeos::Network* network); // True if we previously had an active network around. bool has_active_network_; diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc index 3f23de0..e2e2bc3 100644 --- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc +++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc @@ -33,6 +33,7 @@ #include "content/browser/tab_contents/tab_contents_view.h" #include "content/browser/webui/web_ui.h" #include "content/common/notification_service.h" +#include "net/base/network_change_notifier.h" RenderViewHostDelegateViewHelper::RenderViewHostDelegateViewHelper() { registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, @@ -395,6 +396,8 @@ WebPreferences RenderViewHostDelegateHelper::GetWebkitPrefs( web_prefs.javascript_enabled = true; } + web_prefs.is_online = !net::NetworkChangeNotifier::IsOffline(); + return web_prefs; } diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 75c5e1f..33a8cd1 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -635,6 +635,8 @@ 'browser/chromeos/metrics_cros_settings_provider.h', 'browser/chromeos/native_dialog_window.cc', 'browser/chromeos/native_dialog_window.h', + 'browser/chromeos/net/cros_network_change_notifier_factory.cc', + 'browser/chromeos/net/cros_network_change_notifier_factory.h', 'browser/chromeos/net/network_change_notifier_chromeos.cc', 'browser/chromeos/net/network_change_notifier_chromeos.h', 'browser/chromeos/network_login_observer.cc', diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 7c3ef4a..f7a1bcd 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -303,6 +303,7 @@ IPC_STRUCT_TRAITS_BEGIN(WebPreferences) IPC_STRUCT_TRAITS_MEMBER(application_cache_enabled) IPC_STRUCT_TRAITS_MEMBER(tabs_to_links) IPC_STRUCT_TRAITS_MEMBER(hyperlink_auditing_enabled) + IPC_STRUCT_TRAITS_MEMBER(is_online) IPC_STRUCT_TRAITS_MEMBER(user_style_sheet_enabled) IPC_STRUCT_TRAITS_MEMBER(user_style_sheet_location) IPC_STRUCT_TRAITS_MEMBER(author_and_user_styles_enabled) diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc index 5fa0645..2eb59ad 100644 --- a/net/base/network_change_notifier.cc +++ b/net/base/network_change_notifier.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "net/base/network_change_notifier.h" +#include "net/base/network_change_notifier_factory.h" #include "build/build_config.h" #if defined(OS_WIN) #include "net/base/network_change_notifier_win.h" @@ -22,6 +23,9 @@ namespace { // anyway.) NetworkChangeNotifier* g_network_change_notifier = NULL; +// Class factory singleton. +NetworkChangeNotifierFactory* g_network_change_notifier_factory = NULL; + class MockNetworkChangeNotifier : public NetworkChangeNotifier { public: virtual bool IsCurrentlyOffline() const { return false; } @@ -34,9 +38,24 @@ NetworkChangeNotifier::~NetworkChangeNotifier() { g_network_change_notifier = NULL; } +// static +void NetworkChangeNotifier::SetFactory( + NetworkChangeNotifierFactory* factory) { + CHECK(!g_network_change_notifier_factory); + g_network_change_notifier_factory = factory; +} + +// static NetworkChangeNotifier* NetworkChangeNotifier::Create() { + if (g_network_change_notifier_factory) + return g_network_change_notifier_factory->CreateInstance(); + #if defined(OS_WIN) return new NetworkChangeNotifierWin(); +#elif defined(OS_CHROMEOS) + // ChromeOS builds MUST use its own class factory. + CHECK(false); + return NULL; #elif defined(OS_LINUX) || defined(OS_ANDROID) return new NetworkChangeNotifierLinux(); #elif defined(OS_MACOSX) diff --git a/net/base/network_change_notifier.h b/net/base/network_change_notifier.h index 246346d..fe2a8f1 100644 --- a/net/base/network_change_notifier.h +++ b/net/base/network_change_notifier.h @@ -12,6 +12,8 @@ namespace net { +class NetworkChangeNotifierFactory; + // NetworkChangeNotifier monitors the system for network changes, and notifies // registered observers of those events. Observers may register on any thread, // and will be called back on the thread from which they registered. @@ -55,6 +57,10 @@ class NET_API NetworkChangeNotifier { // cheap as this could be called (repeatedly) from the IO thread. virtual bool IsCurrentlyOffline() const = 0; + // Replaces the default class factory instance of NetworkChangeNotifier class. + // The method will take over the ownership of |factory| object. + static void SetFactory(NetworkChangeNotifierFactory* factory); + // Creates the process-wide, platform-specific NetworkChangeNotifier. The // caller owns the returned pointer. You may call this on any thread. You // may also avoid creating this entirely (in which case nothing will be diff --git a/net/base/network_change_notifier_factory.h b/net/base/network_change_notifier_factory.h new file mode 100644 index 0000000..d4f3f8d --- /dev/null +++ b/net/base/network_change_notifier_factory.h @@ -0,0 +1,25 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_BASE_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ +#define NET_BASE_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ +#pragma once + +#include "net/base/net_api.h" + +namespace net { + +class NetworkChangeNotifier; +// NetworkChangeNotifierFactory provides a mechanism for overriding the default +// instance creation process of NetworkChangeNotifier. +class NET_API NetworkChangeNotifierFactory { + public: + NetworkChangeNotifierFactory() {} + virtual ~NetworkChangeNotifierFactory() {} + virtual NetworkChangeNotifier* CreateInstance() = 0; +}; + +} // namespace net + +#endif // NET_BASE_NETWORK_CHANGE_NOTIFIER_FACTORY_H_ diff --git a/net/net.gyp b/net/net.gyp index 996954a..40de019 100644 --- a/net/net.gyp +++ b/net/net.gyp @@ -152,6 +152,7 @@ 'base/net_util_win.cc', 'base/network_change_notifier.cc', 'base/network_change_notifier.h', + 'base/network_change_notifier_factory.h', 'base/network_change_notifier_linux.cc', 'base/network_change_notifier_linux.h', 'base/network_change_notifier_mac.cc', diff --git a/webkit/glue/webpreferences.cc b/webkit/glue/webpreferences.cc index 362c212..dec3db6 100644 --- a/webkit/glue/webpreferences.cc +++ b/webkit/glue/webpreferences.cc @@ -6,6 +6,7 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebNetworkStateNotifier.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebSettings.h" @@ -14,6 +15,7 @@ #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "webkit/glue/webkit_glue.h" +using WebKit::WebNetworkStateNotifier; using WebKit::WebRuntimeFeatures; using WebKit::WebSettings; using WebKit::WebString; @@ -56,6 +58,7 @@ WebPreferences::WebPreferences() tabs_to_links(true), caret_browsing_enabled(false), hyperlink_auditing_enabled(true), + is_online(true), user_style_sheet_enabled(false), author_and_user_styles_enabled(true), frame_flattening_enabled(false), @@ -233,4 +236,6 @@ void WebPreferences::Apply(WebView* web_view) const { settings->setAllowRunningOfInsecureContent(allow_running_insecure_content); settings->setShouldPrintBackgrounds(should_print_backgrounds); settings->setEnableScrollAnimator(enable_scroll_animator); + + WebNetworkStateNotifier::setOnLine(is_online); } diff --git a/webkit/glue/webpreferences.h b/webkit/glue/webpreferences.h index 78dc8f1..77414b8 100644 --- a/webkit/glue/webpreferences.h +++ b/webkit/glue/webpreferences.h @@ -63,7 +63,7 @@ struct WebPreferences { bool tabs_to_links; bool caret_browsing_enabled; bool hyperlink_auditing_enabled; - + bool is_online; bool user_style_sheet_enabled; GURL user_style_sheet_location; bool author_and_user_styles_enabled; @@ -92,7 +92,6 @@ struct WebPreferences { bool allow_running_insecure_content; bool should_print_backgrounds; bool enable_scroll_animator; - // We try to keep the default values the same as the default values in // chrome, except for the cases where it would require lots of extra work for // the embedder to use the same default value. |