Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Unified Diff: chrome/browser/chromeos/status/network_menu.cc

Issue 6899025: Show hardware addresses for wifi and ethernet networks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: z Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/status/network_menu.cc
diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc
index 6fdc441ee887229be8671b3c23e4b65024f29bd4..02bff3997d6740bb806bb8d99ba3141d689b7d40 100644
--- a/chrome/browser/chromeos/status/network_menu.cc
+++ b/chrome/browser/chromeos/status/network_menu.cc
@@ -35,8 +35,9 @@ using views::MenuItemView;
namespace {
-// Offset for VPN menu items.
+// Offsets for submenus items.
const int kVPNCommandIndexOffset = 10000;
+const int kMoreCommandIndexOffset = 20000;
} // namespace
@@ -69,7 +70,6 @@ class NetworkMenuModel : public views::MenuDelegate {
virtual ~NetworkMenuModel() {}
// views::MenuDelegate implementation ----------------------------------------
-
virtual const gfx::Font& GetLabelFont(int id) const OVERRIDE;
virtual bool IsItemChecked(int id) const OVERRIDE;
virtual bool IsCommandEnabled(int id) const OVERRIDE;
@@ -94,12 +94,11 @@ class NetworkMenuModel : public views::MenuDelegate {
// for the submenu after adding it.
virtual void PopulateMenu(views::MenuItemView* menu);
virtual void PopulateMenuItem(
- views::MenuItemView* menu,
- int index,
- int command_id);
+ views::MenuItemView* menu, int index, int command_id);
protected:
enum MenuItemFlags {
+ FLAG_NONE = 0,
FLAG_DISABLED = 1 << 0,
FLAG_TOGGLE_ETHERNET = 1 << 1,
FLAG_TOGGLE_WIFI = 1 << 2,
@@ -109,13 +108,12 @@ class NetworkMenuModel : public views::MenuDelegate {
FLAG_ETHERNET = 1 << 6,
FLAG_WIFI = 1 << 7,
FLAG_CELLULAR = 1 << 8,
- FLAG_PRIVATE_NETWORKS = 1 << 9,
- FLAG_OPTIONS = 1 << 10,
- FLAG_ADD_WIFI = 1 << 11,
- FLAG_ADD_CELLULAR = 1 << 12,
- FLAG_VPN = 1 << 13,
- FLAG_ADD_VPN = 1 << 14,
- FLAG_DISCONNECT_VPN = 1 << 15,
+ FLAG_OPTIONS = 1 << 9,
+ FLAG_ADD_WIFI = 1 << 10,
+ FLAG_ADD_CELLULAR = 1 << 11,
+ FLAG_VPN = 1 << 12,
+ FLAG_ADD_VPN = 1 << 13,
+ FLAG_DISCONNECT_VPN = 1 << 14,
};
struct MenuItem {
@@ -167,14 +165,47 @@ class NetworkMenuModel : public views::MenuDelegate {
DISALLOW_COPY_AND_ASSIGN(NetworkMenuModel);
};
+class MoreMenuModel : public NetworkMenuModel {
+ public:
+ explicit MoreMenuModel(NetworkMenu* owner);
+ virtual ~MoreMenuModel() {}
+
+ // NetworkMenuModel implementation -------------------------------------------
+ virtual void InitMenuItems(
+ bool is_browser_mode, bool should_open_button_options) OVERRIDE;
+ virtual void PopulateMenuItem(
+ views::MenuItemView* menu, int index, int command_id) OVERRIDE;
+
+ private:
+ friend class MainMenuModel;
+ DISALLOW_COPY_AND_ASSIGN(MoreMenuModel);
+};
+
+class VPNMenuModel : public NetworkMenuModel {
+ public:
+ explicit VPNMenuModel(NetworkMenu* owner);
+ virtual ~VPNMenuModel() {}
+
+ // NetworkMenuModel implementation.
+ virtual void InitMenuItems(
+ bool is_browser_mode, bool should_open_button_options) OVERRIDE;
+ virtual void PopulateMenuItem(
+ views::MenuItemView* menu, int index, int command_id) OVERRIDE;
+
+ static SkBitmap IconForDisplay(const Network* network);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(VPNMenuModel);
+};
+
class MainMenuModel : public NetworkMenuModel {
public:
explicit MainMenuModel(NetworkMenu* owner);
virtual ~MainMenuModel() {}
- // NetworkMenuModel implementation -------------------------------------------
+ // NetworkMenuModel implementation.
virtual void InitMenuItems(bool is_browser_mode,
- bool should_open_button_options) OVERRIDE;
+ bool should_open_button_options);
virtual void PopulateMenuItem(views::MenuItemView* menu,
int index,
int command_id) OVERRIDE;
@@ -187,29 +218,11 @@ class MainMenuModel : public NetworkMenuModel {
private:
scoped_ptr<NetworkMenuModel> vpn_menu_model_;
+ scoped_ptr<MoreMenuModel> more_menu_model_;
DISALLOW_COPY_AND_ASSIGN(MainMenuModel);
};
-class VPNMenuModel : public NetworkMenuModel {
- public:
- explicit VPNMenuModel(NetworkMenu* owner);
- virtual ~VPNMenuModel() {}
-
- // NetworkMenuModel implementation.
- virtual void InitMenuItems(bool is_browser_mode,
- bool should_open_button_options);
- virtual void PopulateMenuItem(
- views::MenuItemView* menu,
- int index,
- int command_id) OVERRIDE;
-
- static SkBitmap IconForDisplay(const Network* network);
-
- private:
- DISALLOW_COPY_AND_ASSIGN(VPNMenuModel);
-};
-
// NetworkMenuModel, public methods: -------------------------------------------
bool NetworkMenuModel::ConnectToNetworkAt(int index,
@@ -375,17 +388,13 @@ void NetworkMenuModel::ExecuteCommand(int id) {
void NetworkMenuModel::PopulateMenu(views::MenuItemView* menu) {
menu->CreateSubmenu()->RemoveAllChildViews(true);
- const int menu_items_count = static_cast<int>(menu_items_.size());
- for (int i = 0; i < menu_items_count; ++i)
+ for (size_t i = 0; i < menu_items_.size(); ++i)
PopulateMenuItem(menu, i, i);
-
menu->ChildrenChanged();
}
void NetworkMenuModel::PopulateMenuItem(
- views::MenuItemView* menu,
- int index,
- int command_id) {
+ views::MenuItemView* menu, int index, int command_id) {
DCHECK_GT(static_cast<int>(menu_items_.size()), index);
const MenuItem& item = menu_items_[index];
switch (item.type) {
@@ -397,9 +406,7 @@ void NetworkMenuModel::PopulateMenuItem(
menu->AppendMenuItemWithLabel(command_id, UTF16ToWide(item.label));
} else {
menu->AppendMenuItemWithIcon(
- command_id,
- UTF16ToWide(item.label),
- item.icon);
+ command_id, UTF16ToWide(item.label), item.icon);
}
break;
default:
@@ -452,8 +459,9 @@ void NetworkMenuModel::ShowOtherCellular() const {
// MainMenuModel ---------------------------------------------------------------
MainMenuModel::MainMenuModel(NetworkMenu* owner)
- : NetworkMenuModel(owner) {
- vpn_menu_model_.reset(new VPNMenuModel(owner));
+ : NetworkMenuModel(owner),
+ vpn_menu_model_(new VPNMenuModel(owner)),
+ more_menu_model_(new MoreMenuModel(owner)) {
}
// MainMenuModel, NetworkMenuModel implementation: -----------------------------
@@ -673,7 +681,7 @@ void MainMenuModel::InitMenuItems(bool is_browser_mode,
ui::MenuModel::TYPE_SUBMENU,
l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_PRIVATE_NETWORKS),
VPNMenuModel::IconForDisplay(connected_network),
- vpn_menu_model_.get(), FLAG_PRIVATE_NETWORKS));
+ vpn_menu_model_.get(), FLAG_NONE));
}
}
@@ -726,32 +734,37 @@ void MainMenuModel::InitMenuItems(bool is_browser_mode,
// l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_OFFLINE_MODE),
// SkBitmap(), std::string(), FLAG_TOGGLE_OFFLINE));
- bool connected = cros->Connected(); // always call for test expectations.
- bool oobe = !should_open_button_options; // we don't show options for OOBE.
- // Network settings. (And IP Address)
- if (!oobe) {
- menu_items_.push_back(MenuItem()); // Separator
-
- if (connected) {
- std::string ip_address = cros->IPAddress();
- if (!ip_address.empty()) {
- menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
- ASCIIToUTF16(cros->IPAddress()), SkBitmap(), std::string(),
- FLAG_DISABLED));
- }
+ // Additional links like:
+ // * Network settings;
+ // * IP Address on active interface;
+ // * Hardware addresses for wifi and ethernet.
+ menu_items_.push_back(MenuItem()); // Separator
+ more_menu_model_->InitMenuItems(
+ is_browser_mode, should_open_button_options);
+ if (is_browser_mode) {
+ menu_items_.insert(
+ menu_items_.end(),
+ more_menu_model_->menu_items_.begin(),
+ more_menu_model_->menu_items_.end());
+ } else {
+ if (!more_menu_model_->menu_items_.empty()) {
+ menu_items_.push_back(MenuItem(
+ ui::MenuModel::TYPE_SUBMENU,
+ l10n_util::GetStringUTF16(IDS_STATUSBAR_NETWORK_MORE),
+ SkBitmap(), more_menu_model_.get(), FLAG_NONE));
}
-
- label = l10n_util::GetStringUTF16(is_browser_mode ?
- IDS_STATUSBAR_NETWORK_OPEN_OPTIONS_DIALOG :
- IDS_STATUSBAR_NETWORK_OPEN_PROXY_SETTINGS_DIALOG);
- menu_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND, label,
- SkBitmap(), std::string(), FLAG_OPTIONS));
}
// Recursively call each submenu to populate its own menu items.
for (size_t i = 0; i < menu_items_.size(); ++i) {
- if (menu_items_[i].type == ui::MenuModel::TYPE_SUBMENU &&
- menu_items_[i].sub_menu_model) {
+ if (menu_items_[i].type == ui::MenuModel::TYPE_SUBMENU) {
+ NetworkMenuModel* model = menu_items_[i].sub_menu_model;
+ if (model == NULL)
+ continue;
+ if (model == more_menu_model_.get()) {
+ // This submenu is already initialized.
+ continue;
+ }
menu_items_[i].sub_menu_model->InitMenuItems(is_browser_mode,
should_open_button_options);
}
@@ -761,28 +774,40 @@ void MainMenuModel::InitMenuItems(bool is_browser_mode,
// MainMenuModel, views::MenuDelegate implementation ---------------------------
const gfx::Font& MainMenuModel::GetLabelFont(int id) const {
- if (id >= kVPNCommandIndexOffset)
+ DCHECK(kMoreCommandIndexOffset > kVPNCommandIndexOffset);
+ if (id >= kMoreCommandIndexOffset)
+ return more_menu_model_->GetLabelFont(id - kMoreCommandIndexOffset);
+ else if (id >= kVPNCommandIndexOffset)
return vpn_menu_model_->GetLabelFont(id - kVPNCommandIndexOffset);
else
return NetworkMenuModel::GetLabelFont(id);
}
bool MainMenuModel::IsItemChecked(int id) const {
- if (id >= kVPNCommandIndexOffset)
+ DCHECK(kMoreCommandIndexOffset > kVPNCommandIndexOffset);
+ if (id >= kMoreCommandIndexOffset)
+ return more_menu_model_->IsItemChecked(id - kMoreCommandIndexOffset);
+ else if (id >= kVPNCommandIndexOffset)
return vpn_menu_model_->IsItemChecked(id - kVPNCommandIndexOffset);
else
return NetworkMenuModel::IsItemChecked(id);
}
bool MainMenuModel::IsCommandEnabled(int id) const {
- if (id >= kVPNCommandIndexOffset)
+ DCHECK(kMoreCommandIndexOffset > kVPNCommandIndexOffset);
+ if (id >= kMoreCommandIndexOffset)
+ return more_menu_model_->IsCommandEnabled(id - kMoreCommandIndexOffset);
+ else if (id >= kVPNCommandIndexOffset)
return vpn_menu_model_->IsCommandEnabled(id - kVPNCommandIndexOffset);
else
return NetworkMenuModel::IsCommandEnabled(id);
}
void MainMenuModel::ExecuteCommand(int id) {
- if (id >= kVPNCommandIndexOffset)
+ DCHECK(kMoreCommandIndexOffset > kVPNCommandIndexOffset);
+ if (id >= kMoreCommandIndexOffset)
+ more_menu_model_->ExecuteCommand(id - kMoreCommandIndexOffset);
+ else if (id >= kVPNCommandIndexOffset)
vpn_menu_model_->ExecuteCommand(id - kVPNCommandIndexOffset);
else
NetworkMenuModel::ExecuteCommand(id);
@@ -791,22 +816,18 @@ void MainMenuModel::ExecuteCommand(int id) {
// MainMenuModel, NetworkMenuModel implementation: -----------------------------
void MainMenuModel::PopulateMenuItem(
- views::MenuItemView* menu,
- int index,
- int command_id) {
+ views::MenuItemView* menu, int index, int command_id) {
DCHECK_GT(static_cast<int>(menu_items_.size()), index);
const MenuItem& item = menu_items_[index];
if (item.type == ui::MenuModel::TYPE_SUBMENU) {
- views::MenuItemView* vpn_menu = NULL;
+ views::MenuItemView* sub_menu = NULL;
if (item.icon.empty()) {
- vpn_menu = menu->AppendSubMenu(command_id, UTF16ToWide(item.label));
+ sub_menu = menu->AppendSubMenu(command_id, UTF16ToWide(item.label));
} else {
- vpn_menu = menu->AppendSubMenuWithIcon(
- command_id,
- UTF16ToWide(item.label),
- item.icon);
+ sub_menu = menu->AppendSubMenuWithIcon(
+ command_id, UTF16ToWide(item.label), item.icon);
}
- vpn_menu_model_->PopulateMenu(vpn_menu);
+ item.sub_menu_model->PopulateMenu(sub_menu);
} else {
NetworkMenuModel::PopulateMenuItem(menu, index, command_id);
}
@@ -886,13 +907,9 @@ void VPNMenuModel::InitMenuItems(bool is_browser_mode,
}
void VPNMenuModel::PopulateMenuItem(
- views::MenuItemView* menu,
- int index,
- int command_id) {
+ views::MenuItemView* menu, int index, int command_id) {
NetworkMenuModel::PopulateMenuItem(
- menu,
- index,
- command_id + kVPNCommandIndexOffset);
+ menu, index, command_id + kVPNCommandIndexOffset);
}
// static
@@ -932,6 +949,85 @@ SkBitmap VPNMenuModel::IconForDisplay(const Network* network) {
}
////////////////////////////////////////////////////////////////////////////////
+// MoreMenuModel
+
+MoreMenuModel::MoreMenuModel(NetworkMenu* owner)
+ : NetworkMenuModel(owner) {
+}
+
+void MoreMenuModel::InitMenuItems(
+ bool is_browser_mode, bool should_open_button_options) {
+ // This gets called on initialization, so any changes should be reflected
+ // in CrosMock::SetNetworkLibraryStatusAreaExpectations().
+
+ menu_items_.clear();
+ MenuItemVector link_items_;
stevenjb 2011/04/25 17:54:27 'link_items' for local variable name
Denis Lagno 2011/04/26 15:54:58 Done.
+ MenuItemVector address_items_;
stevenjb 2011/04/25 17:54:27 'address_items' for local variable name
Denis Lagno 2011/04/26 15:54:58 Done.
+
+ NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
+ bool oobe = !should_open_button_options; // we don't show options for OOBE.
+ if (!oobe) {
+ string16 label = l10n_util::GetStringUTF16(is_browser_mode ?
+ IDS_STATUSBAR_NETWORK_OPEN_OPTIONS_DIALOG :
+ IDS_STATUSBAR_NETWORK_OPEN_PROXY_SETTINGS_DIALOG);
+ link_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND, label,
+ SkBitmap(), std::string(), FLAG_OPTIONS));
+ }
+
+ bool connected = cros->Connected(); // always call for test expectations.
+ if (connected) {
+ std::string ip_address = cros->IPAddress();
+ if (!ip_address.empty()) {
+ address_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
+ ASCIIToUTF16(cros->IPAddress()), SkBitmap(), std::string(),
+ FLAG_DISABLED));
+ }
+ }
+
+ if (!is_browser_mode) {
+ if (cros->wifi_enabled()) {
+ NetworkDeviceVector wifi = cros->FindWifiDevices();
+ for (size_t i = 0; i < wifi.size(); ++i) {
+ std::string hardware_address;
+ cros->GetIPConfigs(wifi[i]->device_path(),
+ &hardware_address, NetworkLibrary::FORMAT_COLON_SEPARATED_HEX);
+ if (!hardware_address.empty()) {
+ std::string label = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_WIFI) + " " + hardware_address;
+ address_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
+ UTF8ToUTF16(label), SkBitmap(), std::string(), FLAG_DISABLED));
+ }
+ }
+ }
+
+ NetworkDeviceVector ether = cros->FindEthernetDevices();
+ for (size_t i = 0; i < ether.size(); ++i) {
+ std::string hardware_address;
+ cros->GetIPConfigs(ether[i]->device_path(), &hardware_address,
+ NetworkLibrary::FORMAT_COLON_SEPARATED_HEX);
+ if (!hardware_address.empty()) {
+ std::string label = l10n_util::GetStringUTF8(
+ IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET) + " " + hardware_address;
+ address_items_.push_back(MenuItem(ui::MenuModel::TYPE_COMMAND,
+ UTF8ToUTF16(label), SkBitmap(), std::string(), FLAG_DISABLED));
+ }
+ }
stevenjb 2011/04/25 17:54:27 Since we list ethernet networks first, shouldn't w
Denis Lagno 2011/04/26 15:54:58 Done.
+ }
+
+ menu_items_.swap(link_items_);
stevenjb 2011/04/25 17:54:27 manu_items_ = link_items; (no need for swap)
Denis Lagno 2011/04/26 15:54:58 Done.
+ if (!menu_items_.empty() && address_items_.size() > 1)
+ menu_items_.push_back(MenuItem()); // Separator
+ menu_items_.insert(menu_items_.end(),
+ address_items_.begin(), address_items_.end());
+}
+
+void MoreMenuModel::PopulateMenuItem(
+ views::MenuItemView* menu, int index, int command_id) {
+ NetworkMenuModel::PopulateMenuItem(
+ menu, index, command_id + kMoreCommandIndexOffset);
+}
+
+////////////////////////////////////////////////////////////////////////////////
// NetworkMenu
// static
@@ -979,8 +1075,7 @@ SkBitmap NetworkMenu::kAnimatingImages[kNumAnimatingImages];
// static
SkBitmap NetworkMenu::kAnimatingImagesBlack[kNumAnimatingImages];
-NetworkMenu::NetworkMenu()
- : min_width_(-1) {
+NetworkMenu::NetworkMenu() : min_width_(-1) {
main_menu_model_.reset(new MainMenuModel(this));
network_menu_.reset(new views::MenuItemView(main_menu_model_.get()));
network_menu_->set_has_icons(true);
@@ -1229,3 +1324,5 @@ void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) {
}
} // namespace chromeos
+
+

Powered by Google App Engine
This is Rietveld 408576698