diff options
author | stevenjb@chromium.org <stevenjb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-12 08:58:27 +0000 |
---|---|---|
committer | stevenjb@chromium.org <stevenjb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-12 08:58:27 +0000 |
commit | 89ccd24cfaa85943cc774a85be0a8eb8ed867b1c (patch) | |
tree | 8f1747d19ee33b1235ff5a81882caddedb0aaefb /chrome/browser/chromeos | |
parent | 644a041c9dd21ce8f0399d2913fdd1f12272e42c (diff) | |
download | chromium_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.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/dom_ui/network_menu_ui.cc | 125 | ||||
-rw-r--r-- | chrome/browser/chromeos/dom_ui/network_menu_ui.h | 49 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_menu.cc | 125 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_menu.h | 28 |
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_; |