Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1511)

Unified Diff: chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc

Issue 8043024: [cros,webui] Captive portal on login screen proper handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merged Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index 28cfe67a0e2e49edc49c6a6612ce3acb79e24ead..1d2467f054947263ddfc016e5233c0cc6dbefddf 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "base/command_line.h"
+#include "base/hash_tables.h"
#include "base/stringprintf.h"
#include "base/task.h"
#include "base/values.h"
@@ -12,6 +13,7 @@
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/io_thread.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/cros/power_library.h"
#include "chrome/browser/chromeos/login/user_manager.h"
#include "chrome/browser/chromeos/login/webui_login_display.h"
@@ -66,6 +68,38 @@ std::string SanitizeEmail(const std::string& email) {
namespace chromeos {
+// Class which observes network state changes and calls registerd callbacks.
+// State is considered changed if connection or the active network has been
+// changed. Also, it answers to the requests about current network state.
+class NetworkStateInformer
+ : public chromeos::NetworkLibrary::NetworkManagerObserver {
+ public:
+ explicit NetworkStateInformer(WebUI* web_ui);
+ virtual ~NetworkStateInformer();
+
+ // Adds observer's callback to be called when network state has been changed.
+ void AddObserver(const std::string& callback);
+
+ // Removes observer's callback.
+ void RemoveObserver(const std::string& callback);
+
+ // Sends current network state using the callback.
+ void SendState(const std::string& callback);
+
+ // NetworkLibrary::NetworkManagerObserver implementation:
+ virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* cros) OVERRIDE;
+
+ private:
+ enum State {OFFLINE, ONLINE, CAPTIVE_PORTAL};
+
+ bool UpdateState(chromeos::NetworkLibrary* cros);
+
+ base::hash_set<std::string> observers_;
+ std::string active_network_;
+ State state_;
+ WebUI* web_ui_;
+};
+
// Clears DNS cache on IO thread.
class ClearDnsCacheTaskOnIOThread : public Task {
public:
@@ -90,6 +124,63 @@ class ClearDnsCacheTaskOnIOThread : public Task {
DISALLOW_COPY_AND_ASSIGN(ClearDnsCacheTaskOnIOThread);
};
+// NetworkStateInformer implementation -----------------------------------------
+
+NetworkStateInformer::NetworkStateInformer(WebUI* web_ui) : web_ui_(web_ui) {
+ NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
+ UpdateState(cros);
+ cros->AddNetworkManagerObserver(this);
+}
+
+NetworkStateInformer::~NetworkStateInformer() {
+ CrosLibrary::Get()->GetNetworkLibrary()->
+ RemoveNetworkManagerObserver(this);
+}
+
+void NetworkStateInformer::AddObserver(const std::string& callback) {
+ observers_.insert(callback);
+}
+
+void NetworkStateInformer::RemoveObserver(const std::string& callback) {
+ observers_.erase(callback);
+}
+
+void NetworkStateInformer::SendState(const std::string& callback) {
+ base::FundamentalValue state_value(state_);
+ web_ui_->CallJavascriptFunction(callback, state_value);
+}
+
+void NetworkStateInformer::OnNetworkManagerChanged(NetworkLibrary* cros) {
+ if (UpdateState(cros)) {
+ for (base::hash_set<std::string>::iterator it = observers_.begin();
+ it != observers_.end(); ++it) {
+ SendState(*it);
+ }
+ }
+}
+
+bool NetworkStateInformer::UpdateState(NetworkLibrary* cros) {
+ State new_state;
+ std::string new_active_network;
+ if (!cros->Connected()) {
+ new_state = OFFLINE;
+ } else {
+ const Network* active_network = cros->active_network();
+ new_active_network = active_network->unique_id();
+ if (active_network && active_network->restricted_pool()) {
+ new_state = CAPTIVE_PORTAL;
+ } else {
+ new_state = ONLINE;
+ }
+ }
+ bool updated = (new_state != state_) ||
+ (active_network_ != new_active_network);
+ state_ = new_state;
+ active_network_ = new_active_network;
+ return updated;
+}
+
+// SigninScreenHandler implementation ------------------------------------------
SigninScreenHandler::SigninScreenHandler()
: delegate_(WebUILoginDisplay::GetInstance()),
@@ -182,6 +273,8 @@ void SigninScreenHandler::Initialize() {
}
void SigninScreenHandler::RegisterMessages() {
+ network_state_informer_.reset(new NetworkStateInformer(web_ui_));
+
web_ui_->RegisterMessageCallback("authenticateUser",
NewCallback(this, &SigninScreenHandler::HandleAuthenticateUser));
web_ui_->RegisterMessageCallback("completeLogin",
@@ -206,6 +299,14 @@ void SigninScreenHandler::RegisterMessages() {
NewCallback(this, &SigninScreenHandler::HandleCreateAccount));
web_ui_->RegisterMessageCallback("loginWebuiReady",
NewCallback(this, &SigninScreenHandler::HandleLoginWebuiReady));
+ web_ui_->RegisterMessageCallback("loginRequestNetworkState",
+ NewCallback(this, &SigninScreenHandler::HandleLoginRequestNetworkState));
+ web_ui_->RegisterMessageCallback("loginAddNetworkStateObserver",
+ NewCallback(this,
+ &SigninScreenHandler::HandleLoginAddNetworkStateObserver));
+ web_ui_->RegisterMessageCallback("loginRemoveNetworkStateObserver",
+ NewCallback(this,
+ &SigninScreenHandler::HandleLoginRemoveNetworkStateObserver));
}
void SigninScreenHandler::HandleGetUsers(const base::ListValue* args) {
@@ -457,6 +558,36 @@ void SigninScreenHandler::HandleLoginWebuiReady(const base::ListValue* args) {
NotificationService::NoDetails());
}
+void SigninScreenHandler::HandleLoginRequestNetworkState(
+ const base::ListValue* args) {
+ std::string callback;
+ if (!args->GetString(0, &callback)) {
+ NOTREACHED();
+ return;
+ }
+ network_state_informer_->SendState(callback);
+}
+
+void SigninScreenHandler::HandleLoginAddNetworkStateObserver(
+ const base::ListValue* args) {
+ std::string callback;
+ if (!args->GetString(0, &callback)) {
+ NOTREACHED();
+ return;
+ }
+ network_state_informer_->AddObserver(callback);
+}
+
+void SigninScreenHandler::HandleLoginRemoveNetworkStateObserver(
+ const base::ListValue* args) {
+ std::string callback;
+ if (!args->GetString(0, &callback)) {
+ NOTREACHED();
+ return;
+ }
+ network_state_informer_->RemoveObserver(callback);
+}
+
void SigninScreenHandler::HandleCreateAccount(const base::ListValue* args) {
delegate_->CreateAccount();
}
« no previous file with comments | « chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698