summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
authorstevenjb@chromium.org <stevenjb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-12 08:58:27 +0000
committerstevenjb@chromium.org <stevenjb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-12 08:58:27 +0000
commit89ccd24cfaa85943cc774a85be0a8eb8ed867b1c (patch)
tree8f1747d19ee33b1235ff5a81882caddedb0aaefb /chrome/browser/chromeos
parent644a041c9dd21ce8f0399d2913fdd1f12272e42c (diff)
downloadchromium_src-89ccd24cfaa85943cc774a85be0a8eb8ed867b1c.zip
chromium_src-89ccd24cfaa85943cc774a85be0a8eb8ed867b1c.tar.gz
chromium_src-89ccd24cfaa85943cc774a85be0a8eb8ed867b1c.tar.bz2
Add network_menu_ui.cc and network_menu.js
Implement the network menu as a subclass of MenuUI (c++) and Menu (js). BUG=chromium-os:7343 TEST=Test that the network menu is still functional. NOTE: With this CL, the menu won't look pretty, and it still has the old behavior. There will be a followup CL that will fix the UI. Review URL: http://codereview.chromium.org/3675002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62266 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r--chrome/browser/chromeos/cros/network_library.h3
-rw-r--r--chrome/browser/chromeos/dom_ui/network_menu_ui.cc125
-rw-r--r--chrome/browser/chromeos/dom_ui/network_menu_ui.h49
-rw-r--r--chrome/browser/chromeos/status/network_menu.cc125
-rw-r--r--chrome/browser/chromeos/status/network_menu.h28
5 files changed, 311 insertions, 19 deletions
diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h
index fa9c4bb..1b11788 100644
--- a/chrome/browser/chromeos/cros/network_library.h
+++ b/chrome/browser/chromeos/cros/network_library.h
@@ -30,6 +30,7 @@ class Network {
bool connecting_or_connected() const { return connecting() || connected(); }
bool failed() const { return state_ == STATE_FAILURE; }
ConnectionError error() const { return error_; }
+ ConnectionState state() const { return state_; }
void set_service_path(const std::string& service_path) {
service_path_ = service_path; }
@@ -45,11 +46,9 @@ class Network {
virtual void ConfigureFromService(const ServiceInfo& service);
// Return a string representation of the state code.
- // This not translated and should be only used for debugging purposes.
std::string GetStateString() const;
// Return a string representation of the error code.
- // This not translated and should be only used for debugging purposes.
std::string GetErrorString() const;
protected:
diff --git a/chrome/browser/chromeos/dom_ui/network_menu_ui.cc b/chrome/browser/chromeos/dom_ui/network_menu_ui.cc
new file mode 100644
index 0000000..b7905fa
--- /dev/null
+++ b/chrome/browser/chromeos/dom_ui/network_menu_ui.cc
@@ -0,0 +1,125 @@
+// Copyright (c) 2010 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/dom_ui/network_menu_ui.h"
+
+#include "base/values.h"
+#include "base/string_util.h"
+#include "chrome/app/chrome_dll_resource.h"
+#include "chrome/browser/chromeos/status/network_menu.h"
+#include "chrome/browser/chromeos/views/native_menu_domui.h"
+#include "chrome/common/url_constants.h"
+#include "googleurl/src/gurl.h"
+#include "grit/browser_resources.h"
+#include "views/controls/menu/menu_2.h"
+
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// MenuHandler
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// The handler for Javascript messages related to the "system" view.
+class NetworkMenuHandler : public chromeos::MenuHandlerBase,
+ public base::SupportsWeakPtr<NetworkMenuHandler> {
+ public:
+ NetworkMenuHandler();
+ virtual ~NetworkMenuHandler();
+
+ // DOMMessageHandler implementation.
+ virtual void RegisterMessages();
+
+ private:
+ void HandleAction(const ListValue* values);
+
+ DISALLOW_COPY_AND_ASSIGN(NetworkMenuHandler);
+};
+
+void NetworkMenuHandler::RegisterMessages() {
+ dom_ui_->RegisterMessageCallback(
+ "action",
+ NewCallback(this,
+ &NetworkMenuHandler::HandleAction));
+}
+
+void NetworkMenuHandler::HandleAction(const ListValue* values) {
+ menus::MenuModel* model = GetMenuModel();
+ if (model)
+ static_cast<chromeos::NetworkMenuUI*>(dom_ui_)->ModelAction(model, values);
+}
+
+NetworkMenuHandler::NetworkMenuHandler() {
+}
+
+NetworkMenuHandler::~NetworkMenuHandler() {
+}
+
+} // namespace
+
+namespace chromeos {
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// NetworkMenuUI
+//
+////////////////////////////////////////////////////////////////////////////////
+
+NetworkMenuUI::NetworkMenuUI(TabContents* contents)
+ : chromeos::MenuUI(
+ contents,
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ CreateMenuUIHTMLSource(*this,
+ chrome::kChromeUINetworkMenu,
+ "NetworkMenu",
+ IDR_NETWORK_MENU_JS,
+ -1))) {
+ NetworkMenuHandler* handler = new NetworkMenuHandler();
+ AddMessageHandler((handler)->Attach(this));
+}
+
+void NetworkMenuUI::AddCustomConfigValues(DictionaryValue* config) const {
+}
+
+void NetworkMenuUI::ModelAction(const menus::MenuModel* model,
+ const ListValue* values) {
+ //const NetworkMenu* network_menu = static_cast<const NetworkMenu*>(model);
+ // Invoke model methods here.
+}
+
+DictionaryValue* NetworkMenuUI::CreateMenuItem(const menus::MenuModel* model,
+ int index,
+ const char* type,
+ int* max_icon_width,
+ bool* has_accel) const {
+ // Create a MenuUI menu item, then append network specific values.
+ DictionaryValue* item = MenuUI::CreateMenuItem(model,
+ index,
+ type,
+ max_icon_width,
+ has_accel);
+ // Network menu specific values.
+ const NetworkMenu* network_menu = static_cast<const NetworkMenu*>(model);
+ NetworkMenu::NetworkInfo info;
+ bool found = network_menu->GetNetworkAt(index, &info);
+
+ item->SetBoolean("visible", found);
+ item->SetString("network_type", info.network_type);
+ item->SetString("status", info.status);
+ item->SetString("message", info.message);
+ item->SetString("ip_address", info.ip_address);
+ item->SetBoolean("need_passphrase", info.need_passphrase);
+ item->SetBoolean("remembered", info.remembered);
+ return item;
+}
+
+views::Menu2* NetworkMenuUI::CreateMenu2(menus::MenuModel* model) {
+ views::Menu2* menu = new views::Menu2(model);
+ NativeMenuDOMUI::SetMenuURL(
+ menu, GURL(StringPrintf("chrome://%s", chrome::kChromeUINetworkMenu)));
+ return menu;
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/dom_ui/network_menu_ui.h b/chrome/browser/chromeos/dom_ui/network_menu_ui.h
new file mode 100644
index 0000000..79bac9c
--- /dev/null
+++ b/chrome/browser/chromeos/dom_ui/network_menu_ui.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2010 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_DOM_UI_NETWORK_MENU_UI_H_
+#define CHROME_BROWSER_CHROMEOS_DOM_UI_NETWORK_MENU_UI_H_
+#pragma once
+
+#include "chrome/browser/chromeos/dom_ui/menu_ui.h"
+
+namespace views {
+class Menu2;
+} // namespace views
+
+namespace menus {
+class MenuModel;
+} // namespace menus
+
+namespace chromeos {
+
+class NetworkMenuUI : public MenuUI {
+ public:
+ explicit NetworkMenuUI(TabContents* contents);
+
+ // A callback method that is invoked when the JavaScript wants
+ // to invoke an action in the model.
+ // By convention the first member of 'values' describes the action.
+ void ModelAction(const menus::MenuModel* model,
+ const ListValue* values);
+
+ // MenuUI overrides
+ virtual DictionaryValue* CreateMenuItem(const menus::MenuModel* model,
+ int index,
+ const char* type,
+ int* max_icon_width,
+ bool* has_accel) const;
+ virtual void AddCustomConfigValues(DictionaryValue* config) const;
+
+ // A convenient factory method to create Menu2 for the network menu.
+ static views::Menu2* CreateMenu2(menus::MenuModel* model);
+
+ private:
+
+ DISALLOW_COPY_AND_ASSIGN(NetworkMenuUI);
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_DOM_UI_NETWORK_MENU_UI_H_
diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc
index 11b7aed..7e269e9 100644
--- a/chrome/browser/chromeos/status/network_menu.cc
+++ b/chrome/browser/chromeos/status/network_menu.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/dom_ui/network_menu_ui.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "chrome/browser/views/window.h"
@@ -20,8 +21,22 @@
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "net/base/escape.h"
+#include "views/controls/menu/menu_2.h"
#include "views/window/window.h"
+namespace {
+// Constants passed to Javascript:
+static const char* kNetworkTypeEthernet = "ethernet";
+static const char* kNetworkTypeWifi = "wifi";
+static const char* kNetworkTypeCellular = "cellular";
+static const char* kNetworkTypeOther = "other";
+
+static const char* kNetworkStatusConnected = "connected";
+static const char* kNetworkStatusConnecting = "connecting";
+static const char* kNetworkStatusDisconnected = "disconnected";
+static const char* kNetworkStatusError = "error";
+}
+
namespace chromeos {
////////////////////////////////////////////////////////////////////////////////
@@ -31,13 +46,100 @@ namespace chromeos {
const int NetworkMenu::kNumWifiImages = 9;
NetworkMenu::NetworkMenu()
- : ALLOW_THIS_IN_INITIALIZER_LIST(network_menu_(this)),
- min_width_(-1) {
+ : min_width_(-1) {
+ network_menu_.reset(NetworkMenuUI::CreateMenu2(this));
}
NetworkMenu::~NetworkMenu() {
}
+bool NetworkMenu::GetNetworkAt(int index, NetworkInfo* info) const {
+ DCHECK(info);
+ bool res = true; // True unless a network doesn't exist.
+ int flags = menu_items_[index].flags;
+ NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
+ if (flags & FLAG_ETHERNET) {
+ info->network_type = kNetworkTypeEthernet;
+ if (cros->ethernet_connected()) {
+ info->status = kNetworkStatusConnected;
+ info->ip_address = cros->ethernet_network().ip_address();
+ }
+ info->need_passphrase = false;
+ info->remembered = true;
+ } else if (flags & FLAG_WIFI) {
+ WifiNetwork wifi;
+ bool found = cros->FindWifiNetworkByPath(
+ menu_items_[index].wireless_path, &wifi);
+ if (found) {
+ info->network_type = kNetworkTypeWifi;
+ if (wifi.name() == cros->wifi_name()) {
+ if (cros->wifi_connected()) {
+ info->status = kNetworkStatusConnected;
+ info->message = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED);
+ } else if (cros->wifi_connecting()) {
+ info->status = kNetworkStatusConnecting;
+ // TODO(stevenjb): Eliminate status message, or localize properly.
+ info->message = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING)
+ + ": " + wifi.GetStateString();
+ } else if (wifi.state() == STATE_FAILURE) {
+ info->status = kNetworkStatusError;
+ info->message = wifi.GetErrorString();
+ } else {
+ info->status = kNetworkStatusDisconnected;
+ info->message = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED);
+ }
+ }
+ info->ip_address = wifi.ip_address();
+ info->need_passphrase = wifi.encrypted();
+ info->remembered = wifi.favorite();
+ } else {
+ res = false; // Network not found, hide entry.
+ }
+ } else if (flags & FLAG_CELLULAR) {
+ CellularNetwork cellular;
+ bool found = cros->FindCellularNetworkByPath(
+ menu_items_[index].wireless_path, &cellular);
+ if (found) {
+ info->network_type = kNetworkTypeCellular;
+ if (cellular.name() == cros->cellular_name()) {
+ if (cros->cellular_connected()) {
+ info->status = kNetworkStatusConnected;
+ info->message = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED);
+ } else if (cros->cellular_connecting()) {
+ // TODO(stevenjb): Eliminate status message, or localize properly.
+ info->status = kNetworkStatusConnecting;
+ info->message = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING)
+ + ": " + cellular.GetStateString();
+ } else if (cellular.state() == STATE_FAILURE) {
+ info->status = kNetworkStatusError;
+ info->message = cellular.GetErrorString();
+ } else {
+ info->status = kNetworkStatusDisconnected;
+ info->message = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED);
+ }
+ }
+ info->ip_address = cellular.ip_address();
+ info->need_passphrase = false;
+ info->remembered = true;
+ } else {
+ res = false; // Network not found, hide entry.
+ }
+ } else if (flags & FLAG_OTHER_NETWORK) {
+ info->network_type = kNetworkTypeOther;
+ info->need_passphrase = true;
+ info->remembered = true;
+ } else {
+ // Not a network, e.g options, separator.
+ }
+ return res;
+}
+
////////////////////////////////////////////////////////////////////////////////
// NetworkMenu, menus::MenuModel implementation:
@@ -205,11 +307,11 @@ void NetworkMenu::ActivatedAt(int index) {
void NetworkMenu::SetFirstLevelMenuWidth(int width) {
min_width_ = width;
// This actually has no effect since menu is rebuilt before showing.
- network_menu_.SetMinimumWidth(width);
+ network_menu_->SetMinimumWidth(width);
}
void NetworkMenu::CancelMenu() {
- network_menu_.CancelMenu();
+ network_menu_->CancelMenu();
}
// static
@@ -275,15 +377,15 @@ void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) {
cros->RequestWifiScan();
cros->UpdateSystemInfo();
InitMenuItems();
- network_menu_.Rebuild();
- network_menu_.UpdateStates();
+ network_menu_->Rebuild();
+ network_menu_->UpdateStates();
// Restore menu width, if it was set up.
// NOTE: width isn't checked for correctness here since all width-related
// logic implemented inside |network_menu_|.
if (min_width_ != -1)
- network_menu_.SetMinimumWidth(min_width_);
+ network_menu_->SetMinimumWidth(min_width_);
refreshing_menu_ = false;
- network_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
+ network_menu_->RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
}
void NetworkMenu::InitMenuItems() {
@@ -383,13 +485,6 @@ void NetworkMenu::InitMenuItems() {
// Separator.
menu_items_.push_back(MenuItem());
- // IP address
- if (cros->Connected()) {
- menu_items_.push_back(MenuItem(menus::MenuModel::TYPE_COMMAND,
- ASCIIToUTF16(cros->IPAddress()), SkBitmap(),
- std::string(), FLAG_DISABLED));
- }
-
// Network settings.
if (ShouldOpenButtonOptions()) {
label =
diff --git a/chrome/browser/chromeos/status/network_menu.h b/chrome/browser/chromeos/status/network_menu.h
index d3a3b21..acd9acc 100644
--- a/chrome/browser/chromeos/status/network_menu.h
+++ b/chrome/browser/chromeos/status/network_menu.h
@@ -9,9 +9,9 @@
#include <string>
#include <vector>
+#include "app/menus/menu_model.h"
#include "chrome/browser/chromeos/options/network_config_view.h"
#include "gfx/native_widget_types.h"
-#include "views/controls/menu/menu_2.h"
#include "views/controls/menu/view_menu_delegate.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -19,6 +19,10 @@ namespace gfx {
class Canvas;
}
+namespace views {
+class Menu2;
+}
+
namespace chromeos {
// Menu for network menu button in the status area/welcome screen.
@@ -47,9 +51,29 @@ namespace chromeos {
class NetworkMenu : public views::ViewMenuDelegate,
public menus::MenuModel {
public:
+ struct NetworkInfo {
+ NetworkInfo() : need_passphrase(false), remembered(true) {}
+ // "ethernet" | "wifi" | "cellular" | "other".
+ std::string network_type;
+ // "connected" | "connecting" | "disconnected" | "error".
+ std::string status;
+ // status message or error message, empty if unknown status.
+ std::string message;
+ // IP address (if network is active, empty otherwise)
+ std::string ip_address;
+ // true if the network requires a passphrase.
+ bool need_passphrase;
+ // true if the network is currently remembered.
+ bool remembered;
+ };
+
NetworkMenu();
virtual ~NetworkMenu();
+ // Retrieves network info for the DOMUI NetworkMenu (NetworkMenuUI).
+ // |index| is the index in menu_items_, set when the menu is built.
+ bool GetNetworkAt(int index, NetworkInfo* info) const;
+
// menus::MenuModel implementation.
virtual bool HasIcons() const { return true; }
virtual int GetItemCount() const;
@@ -150,7 +174,7 @@ class NetworkMenu : public views::ViewMenuDelegate,
MenuItemVector menu_items_;
// The network menu.
- views::Menu2 network_menu_;
+ scoped_ptr<views::Menu2> network_menu_;
// Holds minimum width or -1 if it wasn't set up.
int min_width_;