diff options
author | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-06 08:41:16 +0000 |
---|---|---|
committer | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-06 08:41:16 +0000 |
commit | 4cecc39811420bfde5c8dc19a03225141a22a5ec (patch) | |
tree | 2d2296d01a43829b94de76ec90cb07d2bc54e121 | |
parent | 0007c23e638d01fe596d9389793dad5170ffb837 (diff) | |
download | chromium_src-4cecc39811420bfde5c8dc19a03225141a22a5ec.zip chromium_src-4cecc39811420bfde5c8dc19a03225141a22a5ec.tar.gz chromium_src-4cecc39811420bfde5c8dc19a03225141a22a5ec.tar.bz2 |
Eliminate race condition between RequestCellularScan, notification OnNetworkDeviceChanged
and HTML/JS page loading
BUG=chromium-os:16309
TEST=manual
Review URL: http://codereview.chromium.org/7248071
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91532 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 61 insertions, 35 deletions
diff --git a/chrome/browser/resources/chromeos/choose_mobile_network.html b/chrome/browser/resources/chromeos/choose_mobile_network.html index 30a23d6..f66cff7 100644 --- a/chrome/browser/resources/chromeos/choose_mobile_network.html +++ b/chrome/browser/resources/chromeos/choose_mobile_network.html @@ -10,34 +10,6 @@ <script src="chrome://resources/js/local_strings.js"></script> <script src="chrome://resources/js/util.js"></script> <script src="choose_mobile_network.js"></script> -<script> -var ChooseNetwork = mobile.ChooseNetwork; - -function load() { - // TODO(dpolukhin): refactor spinner code&css to be reusable. - // Setup css canvas 'spinner-circle' - (function() { - var lineWidth = 3; - var r = 8; - var ctx = document.getCSSCanvasContext( - '2d', 'spinner-circle', 2 * r, 2 * r); - - ctx.lineWidth = lineWidth; - ctx.lineCap = 'round'; - ctx.lineJoin = 'round'; - - ctx.strokeStyle = '#4e73c7'; - ctx.beginPath(); - ctx.moveTo(lineWidth / 2, r - lineWidth / 2); - ctx.arc(r, r, r - lineWidth / 2, Math.PI, Math.PI * 3 / 2); - ctx.stroke(); - })(); - - ChooseNetwork.initialize(); -} - -document.addEventListener('DOMContentLoaded', load); -</script> </head> <body i18n-values=".style.fontFamily:fontfamily;"> <div id="container" class="container"> diff --git a/chrome/browser/resources/chromeos/choose_mobile_network.js b/chrome/browser/resources/chromeos/choose_mobile_network.js index 15dc0c9..a39f4d7 100644 --- a/chrome/browser/resources/chromeos/choose_mobile_network.js +++ b/chrome/browser/resources/chromeos/choose_mobile_network.js @@ -77,6 +77,7 @@ cr.define('mobile', function() { $('connect').addEventListener('click', function(event) { ChooseNetwork.connect(); }); + chrome.send('pageReady', []); }; ChooseNetwork.showNetworks = function(networks) { @@ -88,3 +89,28 @@ cr.define('mobile', function() { ChooseNetwork: ChooseNetwork }; }); + +var ChooseNetwork = mobile.ChooseNetwork; + +document.addEventListener('DOMContentLoaded', function () { + // TODO(dpolukhin): refactor spinner code&css to be reusable. + // Setup css canvas 'spinner-circle' + (function() { + var lineWidth = 3; + var r = 8; + var ctx = document.getCSSCanvasContext( + '2d', 'spinner-circle', 2 * r, 2 * r); + + ctx.lineWidth = lineWidth; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + + ctx.strokeStyle = '#4e73c7'; + ctx.beginPath(); + ctx.moveTo(lineWidth / 2, r - lineWidth / 2); + ctx.arc(r, r, r - lineWidth / 2, Math.PI, Math.PI * 3 / 2); + ctx.stroke(); + })(); + + ChooseNetwork.initialize(); +}); diff --git a/chrome/browser/ui/webui/chromeos/choose_mobile_network_ui.cc b/chrome/browser/ui/webui/chromeos/choose_mobile_network_ui.cc index 34cb867..cdbea69 100644 --- a/chrome/browser/ui/webui/chromeos/choose_mobile_network_ui.cc +++ b/chrome/browser/ui/webui/chromeos/choose_mobile_network_ui.cc @@ -31,6 +31,7 @@ namespace { // JS API callbacks names. const char kJsApiCancel[] = "cancel"; const char kJsApiConnect[] = "connect"; +const char kJsApiPageReady[] = "pageReady"; // Page JS API function names. const char kJsApiShowNetworks[] = "mobile.ChooseNetwork.showNetworks"; @@ -58,7 +59,6 @@ class ChooseMobileNetworkHTMLSource private: virtual ~ChooseMobileNetworkHTMLSource() {} - std::string service_path_; DISALLOW_COPY_AND_ASSIGN(ChooseMobileNetworkHTMLSource); }; @@ -80,8 +80,12 @@ class ChooseMobileNetworkHandler // Handlers for JS WebUI messages. void HandleCancel(const ListValue* args); void HandleConnect(const ListValue* args); + void HandlePageReady(const ListValue* args); std::string device_path_; + ListValue networks_list_; + bool is_page_ready_; + bool has_pending_results_; DISALLOW_COPY_AND_ASSIGN(ChooseMobileNetworkHandler); }; @@ -130,16 +134,17 @@ void ChooseMobileNetworkHTMLSource::StartDataRequest(const std::string& path, // ChooseMobileNetworkHandler implementation. -ChooseMobileNetworkHandler::ChooseMobileNetworkHandler() { +ChooseMobileNetworkHandler::ChooseMobileNetworkHandler() + : is_page_ready_(false), has_pending_results_(false) { if (!CrosLibrary::Get()->EnsureLoaded()) return; NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); - cros->RequestCellularScan(); if (const NetworkDevice* cellular = cros->FindCellularDevice()) { device_path_ = cellular->device_path(); cros->AddNetworkDeviceObserver(device_path_, this); } + cros->RequestCellularScan(); } ChooseMobileNetworkHandler::~ChooseMobileNetworkHandler() { @@ -156,13 +161,15 @@ void ChooseMobileNetworkHandler::RegisterMessages() { web_ui_->RegisterMessageCallback( kJsApiConnect, NewCallback(this, &ChooseMobileNetworkHandler::HandleConnect)); + web_ui_->RegisterMessageCallback( + kJsApiPageReady, + NewCallback(this, &ChooseMobileNetworkHandler::HandlePageReady)); } void ChooseMobileNetworkHandler::OnNetworkDeviceChanged( NetworkLibrary* cros, const NetworkDevice* device) { - - ListValue networks_list; + networks_list_.Clear(); std::set<std::string> network_ids; const CellularNetworkList& found_networks = device->found_cellular_networks(); for (CellularNetworkList::const_iterator it = found_networks.begin(); @@ -182,10 +189,16 @@ void ChooseMobileNetworkHandler::OnNetworkDeviceChanged( network->SetString(kOperatorNameProperty, it->network_id); network->SetString(kStatusProperty, it->status); network->SetString(kTechnologyProperty, it->technology); - networks_list.Append(network); + networks_list_.Append(network); } } - web_ui_->CallJavascriptFunction(kJsApiShowNetworks, networks_list); + if (is_page_ready_) { + web_ui_->CallJavascriptFunction(kJsApiShowNetworks, networks_list_); + networks_list_.Clear(); + has_pending_results_ = false; + } else { + has_pending_results_ = true; + } } void ChooseMobileNetworkHandler::HandleCancel(const ListValue* args) { @@ -219,6 +232,21 @@ void ChooseMobileNetworkHandler::HandleConnect(const ListValue* args) { cros->RequestCellularRegister(network_id); } +void ChooseMobileNetworkHandler::HandlePageReady(const ListValue* args) { + const size_t kConnectParamCount = 0; + if (args->GetSize() != kConnectParamCount) { + NOTREACHED(); + return; + } + + if (has_pending_results_) { + web_ui_->CallJavascriptFunction(kJsApiShowNetworks, networks_list_); + networks_list_.Clear(); + has_pending_results_ = false; + } + is_page_ready_ = true; +} + } // namespace ChooseMobileNetworkUI::ChooseMobileNetworkUI(TabContents* contents) |