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 524e44d11c1de8644cb9a3d3359f40cdd99d9f05..b638fe984579014e5de68f493bb8b9475c07ccd6 100644 |
--- a/chrome/browser/chromeos/status/network_menu.cc |
+++ b/chrome/browser/chromeos/status/network_menu.cc |
@@ -30,19 +30,18 @@ |
namespace chromeos { |
-class MainMenuModel : public NetworkMenuModel { |
+class MoreMenuModel : public NetworkMenuModel { |
public: |
- explicit MainMenuModel(NetworkMenu* owner); |
- virtual ~MainMenuModel() {} |
+ explicit MoreMenuModel(NetworkMenu* owner); |
+ virtual ~MoreMenuModel() {} |
// NetworkMenuModel implementation. |
virtual void InitMenuItems(bool is_browser_mode, |
bool should_open_button_options); |
private: |
- scoped_ptr<NetworkMenuModel> vpn_menu_model_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MainMenuModel); |
+ friend class MainMenuModel; |
+ DISALLOW_COPY_AND_ASSIGN(MoreMenuModel); |
}; |
class VPNMenuModel : public NetworkMenuModel { |
@@ -60,6 +59,22 @@ class VPNMenuModel : public NetworkMenuModel { |
DISALLOW_COPY_AND_ASSIGN(VPNMenuModel); |
}; |
+class MainMenuModel : public NetworkMenuModel { |
+ public: |
+ explicit MainMenuModel(NetworkMenu* owner); |
+ virtual ~MainMenuModel() {} |
+ |
+ // NetworkMenuModel implementation. |
+ virtual void InitMenuItems(bool is_browser_mode, |
+ bool should_open_button_options); |
+ |
+ private: |
+ scoped_ptr<NetworkMenuModel> vpn_menu_model_; |
+ scoped_ptr<MoreMenuModel> more_menu_model_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MainMenuModel); |
+}; |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// NetworkMenuModel, public methods: |
@@ -289,8 +304,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)) { |
} |
void MainMenuModel::InitMenuItems(bool is_browser_mode, |
@@ -508,7 +524,9 @@ 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)); |
+ vpn_menu_model_->InitMenuItems( |
+ is_browser_mode, should_open_button_options); |
} |
} |
@@ -561,34 +579,24 @@ 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)); |
- } |
- } |
- |
- 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) { |
- menu_items_[i].sub_menu_model->InitMenuItems(is_browser_mode, |
- should_open_button_options); |
+ // 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) { |
+ // In browser mode we do not want separate submenu, inline items. |
+ 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)); |
} |
} |
} |
@@ -702,6 +710,79 @@ 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; |
+ MenuItemVector address_items; |
+ |
+ 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) { |
+ const NetworkDevice* ether = cros->FindEthernetDevice(); |
+ if (ether) { |
+ std::string hardware_address; |
+ cros->GetIPConfigs(ether->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)); |
+ } |
+ } |
+ |
+ if (cros->wifi_enabled()) { |
+ const NetworkDevice* wifi = cros->FindWifiDevice(); |
+ if (wifi) { |
+ std::string hardware_address; |
+ cros->GetIPConfigs(wifi->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)); |
+ } |
+ } |
+ } |
+ } |
+ |
+ menu_items_ = link_items; |
+ 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()); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// NetworkMenu |
// static |
@@ -749,8 +830,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::Menu2(main_menu_model_.get())); |
} |
@@ -993,3 +1073,5 @@ void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { |
} |
} // namespace chromeos |
+ |
+ |