Chromium Code Reviews| Index: chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc |
| =================================================================== |
| --- chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc (revision 107682) |
| +++ chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc (working copy) |
| @@ -18,7 +18,6 @@ |
| #include "base/metrics/histogram.h" |
| #include "base/string_piece.h" |
| #include "base/string_util.h" |
| -#include "base/threading/thread_restrictions.h" |
| #include "base/timer.h" |
| #include "base/utf_string_conversions.h" |
| #include "base/values.h" |
| @@ -163,19 +162,23 @@ |
| DISALLOW_COPY_AND_ASSIGN(PortalFrameLoadObserver); |
| }; |
| -class CellularConfigDocument { |
| +class CellularConfigDocument |
| + : public base::RefCountedThreadSafe<CellularConfigDocument> { |
| public: |
| CellularConfigDocument() {} |
| // Return error message for a given code. |
| std::string GetErrorMessage(const std::string& code); |
| + void LoadCellularConfigFile(); |
| const std::string& version() { return version_; } |
| + private: |
| + void SetErrorMap(const std::map<std::string, std::string>& map); |
|
achuithb
2011/10/29 01:42:44
You could consider a typedef like
typedef std::map
zel
2011/10/31 15:12:47
Done.
|
| bool LoadFromFile(const FilePath& config_path); |
| - private: |
| std::string version_; |
| std::map<std::string, std::string> error_map_; |
| + base::Lock config_lock_; |
| DISALLOW_COPY_AND_ASSIGN(CellularConfigDocument); |
| }; |
| @@ -214,6 +217,7 @@ |
| // Init work after Attach. |
| void Init(TabContents* contents); |
| + void StartActivationOnUIThread(); |
| // WebUIMessageHandler implementation. |
| virtual WebUIMessageHandler* Attach(WebUI* web_ui) OVERRIDE; |
| @@ -244,45 +248,11 @@ |
| PLAN_ACTIVATION_ERROR = 0xFF, |
| } PlanActivationState; |
| - class TaskProxy : public base::RefCountedThreadSafe<TaskProxy> { |
| - public: |
| - TaskProxy(const base::WeakPtr<MobileSetupHandler>& handler, int delay) |
| - : handler_(handler), delay_(delay) { |
| - } |
| - TaskProxy(const base::WeakPtr<MobileSetupHandler>& handler, |
| - const std::string& status) |
| - : handler_(handler), status_(status) { |
| - } |
| - void HandleStartActivation() { |
| - if (handler_) |
| - handler_->StartActivation(); |
| - } |
| - void HandleSetTransactionStatus() { |
| - if (handler_) |
| - handler_->SetTransactionStatus(status_); |
| - } |
| - void ContinueConnecting() { |
| - if (handler_) |
| - handler_->ContinueConnecting(delay_); |
| - } |
| - void RetryOTASP() { |
| - if (handler_) |
| - handler_->RetryOTASP(); |
| - } |
| - private: |
| - base::WeakPtr<MobileSetupHandler> handler_; |
| - std::string status_; |
| - int delay_; |
| - DISALLOW_COPY_AND_ASSIGN(TaskProxy); |
| - }; |
| - |
| // Handlers for JS WebUI messages. |
| void HandleSetTransactionStatus(const ListValue* args); |
| void HandleStartActivation(const ListValue* args); |
| void HandlePaymentPortalLoad(const ListValue* args); |
| void SetTransactionStatus(const std::string& status); |
| - // Schedules activation process via task proxy. |
| - void InitiateActivation(); |
| // Starts activation. |
| void StartActivation(); |
| // Retried OTASP. |
| @@ -333,6 +303,8 @@ |
| // Control routines for handling other types of connections during |
| // cellular activation. |
| void ReEnableOtherConnections(); |
| + // Return error message for a given code. |
| + std::string GetErrorMessage(const std::string& code); |
| // Converts the currently active CellularNetwork device into a JS object. |
| static void GetDeviceInfo(chromeos::CellularNetwork* network, |
| @@ -346,16 +318,11 @@ |
| std::string* state, |
| std::string* error); |
| - // Return error message for a given code. |
| - static std::string GetErrorMessage(const std::string& code); |
| - static void LoadCellularConfig(); |
| - |
| // Returns next reconnection state based on the current activation phase. |
| static PlanActivationState GetNextReconnectState(PlanActivationState state); |
| static const char* GetStateDescription(PlanActivationState state); |
| - static scoped_ptr<CellularConfigDocument> cellular_config_; |
| - |
| + scoped_refptr<CellularConfigDocument> cellular_config_; |
| TabContents* tab_contents_; |
| // Internal handler state. |
| PlanActivationState state_; |
| @@ -384,8 +351,6 @@ |
| DISALLOW_COPY_AND_ASSIGN(MobileSetupHandler); |
| }; |
| -scoped_ptr<CellularConfigDocument> MobileSetupHandler::cellular_config_; |
| - |
| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // CellularConfigDocument |
| @@ -393,24 +358,33 @@ |
| //////////////////////////////////////////////////////////////////////////////// |
| std::string CellularConfigDocument::GetErrorMessage(const std::string& code) { |
| + base::AutoLock create(config_lock_); |
| std::map<std::string, std::string>::iterator iter = error_map_.find(code); |
| if (iter == error_map_.end()) |
| return code; |
| return iter->second; |
| } |
| -bool CellularConfigDocument::LoadFromFile(const FilePath& config_path) { |
| - error_map_.clear(); |
| +void CellularConfigDocument::LoadCellularConfigFile() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + // Load partner customization startup manifest if it is available. |
| + FilePath config_path(kCellularConfigPath); |
| + if (!file_util::PathExists(config_path)) |
| + return; |
| - std::string config; |
| - { |
| - // Reading config file causes us to do blocking IO on UI thread. |
| - // Temporarily allow it until we fix http://crosbug.com/11535 |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - if (!file_util::ReadFileToString(config_path, &config)) |
| - return false; |
| + if (LoadFromFile(config_path)) { |
| + LOG(INFO) << "Cellular config file loaded: " << kCellularConfigPath; |
|
achuithb
2011/10/29 01:42:44
Did you intend to land these log stmts or are thes
zel
2011/10/31 15:12:47
Done.
|
| + } else { |
| + LOG(ERROR) << "Error loading cellular config file: " << |
| + kCellularConfigPath; |
| } |
| +} |
| +bool CellularConfigDocument::LoadFromFile(const FilePath& config_path) { |
| + std::string config; |
| + if (!file_util::ReadFileToString(config_path, &config)) |
| + return false; |
| + |
| scoped_ptr<Value> root(base::JSONReader::Read(config, true)); |
| DCHECK(root.get() != NULL); |
| if (!root.get() || root->GetType() != Value::TYPE_DICTIONARY) { |
| @@ -423,6 +397,7 @@ |
| LOG(WARNING) << "Cellular config file missing version"; |
| return false; |
| } |
| + std::map<std::string, std::string> error_map; |
| DictionaryValue* errors = NULL; |
| if (!root_dict->GetDictionary(kErrorsField, &errors)) |
| return false; |
| @@ -432,15 +407,21 @@ |
| std::string value; |
| if (!errors->GetString(*keys, &value)) { |
| LOG(WARNING) << "Bad cellular config error value"; |
| - error_map_.clear(); |
| return false; |
| } |
| - |
| - error_map_.insert(std::pair<std::string, std::string>(*keys, value)); |
| + error_map.insert(std::pair<std::string, std::string>(*keys, value)); |
|
achuithb
2011/10/29 01:42:44
with the ErrorMap typedef, this would become Error
zel
2011/10/31 15:12:47
Done.
|
| } |
| + SetErrorMap(error_map); |
| return true; |
| } |
| +void CellularConfigDocument::SetErrorMap( |
| + const std::map<std::string, std::string>& map) { |
| + base::AutoLock create(config_lock_); |
| + error_map_.clear(); |
| + error_map_.insert(map.begin(), map.end()); |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // MobileSetupUIHTMLSource |
| @@ -505,7 +486,8 @@ |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| MobileSetupHandler::MobileSetupHandler(const std::string& service_path) |
| - : tab_contents_(NULL), |
| + : cellular_config_(new CellularConfigDocument()), |
| + tab_contents_(NULL), |
| state_(PLAN_ACTIVATION_PAGE_LOADING), |
| service_path_(service_path), |
| reenable_wifi_(false), |
| @@ -536,14 +518,6 @@ |
| void MobileSetupHandler::Init(TabContents* contents) { |
| tab_contents_ = contents; |
| - chromeos::CellularNetwork* network = GetCellularNetwork(service_path_); |
| - if (!network || !network->SupportsActivation()) |
| - return; |
| - LoadCellularConfig(); |
| - if (!chromeos::CrosLibrary::Get()->GetNetworkLibrary()->IsLocked()) |
| - SetupActivationProcess(network); |
| - else |
| - already_running_ = true; |
| } |
| void MobileSetupHandler::RegisterMessages() { |
| @@ -578,8 +552,10 @@ |
| } |
| void MobileSetupHandler::HandleStartActivation(const ListValue* args) { |
| - InitiateActivation(); |
| - UMA_HISTOGRAM_COUNTS("Cellular.MobileSetupStart", 1); |
| + BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&CellularConfigDocument::LoadCellularConfigFile, |
| + cellular_config_.get()), |
| + base::Bind(&MobileSetupHandler::StartActivationOnUIThread, AsWeakPtr())); |
| } |
| void MobileSetupHandler::HandleSetTransactionStatus(const ListValue* args) { |
| @@ -590,9 +566,9 @@ |
| std::string status; |
| if (!args->GetString(0, &status)) |
| return; |
| - scoped_refptr<TaskProxy> task = new TaskProxy(AsWeakPtr(), status); |
| BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(&TaskProxy::HandleSetTransactionStatus, task.get())); |
| + base::Bind(&MobileSetupHandler::SetTransactionStatus, AsWeakPtr(), |
| + status)); |
| } |
| void MobileSetupHandler::HandlePaymentPortalLoad(const ListValue* args) { |
| @@ -631,14 +607,9 @@ |
| } |
| } |
| -void MobileSetupHandler::InitiateActivation() { |
| - scoped_refptr<TaskProxy> task = new TaskProxy(AsWeakPtr(), 0); |
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(&TaskProxy::HandleStartActivation, task.get())); |
| -} |
| - |
| void MobileSetupHandler::StartActivation() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + UMA_HISTOGRAM_COUNTS("Cellular.MobileSetupStart", 1); |
| chromeos::NetworkLibrary* lib = |
| chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| chromeos::CellularNetwork* network = GetCellularNetwork(service_path_); |
| @@ -784,10 +755,9 @@ |
| << (network ? network->service_path().c_str() : "no service"); |
| // If we coudn't connect during reconnection phase, try to reconnect |
| // with a delay (and try to reconnect if needed). |
| - scoped_refptr<TaskProxy> task = new TaskProxy(AsWeakPtr(), |
| - delay); |
| BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(&TaskProxy::ContinueConnecting, task.get()), delay); |
| + base::Bind(&MobileSetupHandler::ContinueConnecting, AsWeakPtr(), delay), |
| + delay); |
| return false; |
| } |
| chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> |
| @@ -808,10 +778,9 @@ |
| chromeos::CrosLibrary::Get()->GetNetworkLibrary()-> |
| DisconnectFromNetwork(network); |
| // Check the network state 3s after we disconnect to make sure. |
| - scoped_refptr<TaskProxy> task = new TaskProxy(AsWeakPtr(), |
| - delay); |
| BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(&TaskProxy::ContinueConnecting, task.get()), delay); |
| + base::Bind(&MobileSetupHandler::ContinueConnecting, AsWeakPtr(), delay), |
| + delay); |
| } |
| bool MobileSetupHandler::ConnectionTimeout() { |
| @@ -1214,9 +1183,9 @@ |
| break; |
| case PLAN_ACTIVATION_DELAY_OTASP: { |
| UMA_HISTOGRAM_COUNTS("Cellular.RetryOTASP", 1); |
| - scoped_refptr<TaskProxy> task = new TaskProxy(AsWeakPtr(), 0); |
| BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(&TaskProxy::RetryOTASP, task.get()), kOTASPRetryDelay); |
| + base::Bind(&MobileSetupHandler::RetryOTASP, AsWeakPtr()), |
| + kOTASPRetryDelay); |
| break; |
| } |
| case PLAN_ACTIVATION_INITIATING_ACTIVATION: |
| @@ -1400,40 +1369,23 @@ |
| } |
| std::string MobileSetupHandler::GetErrorMessage(const std::string& code) { |
| - if (!cellular_config_.get()) |
| - return ""; |
| return cellular_config_->GetErrorMessage(code); |
| } |
| -void MobileSetupHandler::LoadCellularConfig() { |
| - static bool config_loaded = false; |
| - if (config_loaded) |
| +void MobileSetupHandler::StartActivationOnUIThread() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + chromeos::CellularNetwork* network = GetCellularNetwork(service_path_); |
| + if (!network || !network->SupportsActivation()) |
| return; |
| - config_loaded = true; |
| - // Load partner customization startup manifest if it is available. |
| - FilePath config_path(kCellularConfigPath); |
| - bool config_exists = false; |
| - { |
| - // Reading config file causes us to do blocking IO on UI thread. |
| - // Temporarily allow it until we fix http://crosbug.com/11535 |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - config_exists = file_util::PathExists(config_path); |
| - } |
| - if (config_exists) { |
| - scoped_ptr<CellularConfigDocument> config(new CellularConfigDocument()); |
| - bool config_loaded = config->LoadFromFile(config_path); |
| - if (config_loaded) { |
| - LOG(INFO) << "Cellular config file loaded: " << kCellularConfigPath; |
| - // lock |
| - cellular_config_.reset(config.release()); |
| - } else { |
| - LOG(ERROR) << "Error loading cellular config file: " << |
| - kCellularConfigPath; |
| - } |
| - } |
| -} |
| + if (!chromeos::CrosLibrary::Get()->GetNetworkLibrary()->IsLocked()) |
| + SetupActivationProcess(network); |
| + else |
| + already_running_ = true; |
| + StartActivation(); |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // MobileSetupUI |