summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-06 08:41:16 +0000
committerdpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-06 08:41:16 +0000
commit4cecc39811420bfde5c8dc19a03225141a22a5ec (patch)
tree2d2296d01a43829b94de76ec90cb07d2bc54e121
parent0007c23e638d01fe596d9389793dad5170ffb837 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/resources/chromeos/choose_mobile_network.html28
-rw-r--r--chrome/browser/resources/chromeos/choose_mobile_network.js26
-rw-r--r--chrome/browser/ui/webui/chromeos/choose_mobile_network_ui.cc42
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)