diff options
author | dilmah@chromium.org <dilmah@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-27 13:31:11 +0000 |
---|---|---|
committer | dilmah@chromium.org <dilmah@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-27 13:31:11 +0000 |
commit | 95012e07da3e85d6f9e0568d0670b6d03e3ebc32 (patch) | |
tree | aa13a3a997408814bd13e8ae26e436448a240d97 /chrome | |
parent | 34e40e29ac6fa6b07478ba2c940604cb9f83065d (diff) | |
download | chromium_src-95012e07da3e85d6f9e0568d0670b6d03e3ebc32.zip chromium_src-95012e07da3e85d6f9e0568d0670b6d03e3ebc32.tar.gz chromium_src-95012e07da3e85d6f9e0568d0670b6d03e3ebc32.tar.bz2 |
Merge 83046 - Show hardware addresses for wifi and ethernet networks.Network menu (in status area button) is modified in following way:In oobe and login screen we add "More..." submenu and show hardware addresses in submenu.In login screen we additionally show proxy settings in this submenu.In browser this menu is unchanged because:(1) we assume that there is no need in those hardware addresses since login was successful.(2) user can see them via other means.We add some methods (GetWifiDevice and GetEthernetDevice) to login_library because we need to obtain hardware addresses for ethernet and wifi even if there is no visible wi-fi networks and if ethernet is disconected.BUG=chromium-os:13010TEST=ManualReview URL: http://codereview.chromium.org/6899025
TBR=dilmah@chromium.org
Review URL: http://codereview.chromium.org/6905056
git-svn-id: svn://svn.chromium.org/chrome/branches/742/src@83146 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
9 files changed, 209 insertions, 78 deletions
diff --git a/chrome/browser/chromeos/cros/mock_network_library.h b/chrome/browser/chromeos/cros/mock_network_library.h index 728d789..0f28a4b 100644 --- a/chrome/browser/chromeos/cros/mock_network_library.h +++ b/chrome/browser/chromeos/cros/mock_network_library.h @@ -64,6 +64,8 @@ class MockNetworkLibrary : public NetworkLibrary { MOCK_CONST_METHOD1(FindNetworkDeviceByPath, NetworkDevice*(const std::string&)); MOCK_CONST_METHOD0(FindCellularDevice, const NetworkDevice*(void)); + MOCK_CONST_METHOD0(FindWifiDevice, const NetworkDevice*(void)); + MOCK_CONST_METHOD0(FindEthernetDevice, const NetworkDevice*(void)); MOCK_CONST_METHOD1(FindNetworkByPath, Network*(const std::string&)); MOCK_CONST_METHOD1(FindWifiNetworkByPath, @@ -127,8 +129,9 @@ class MockNetworkLibrary : public NetworkLibrary { MOCK_METHOD1(EnableWifiNetworkDevice, void(bool)); MOCK_METHOD1(EnableCellularNetworkDevice, void(bool)); MOCK_METHOD1(EnableOfflineMode, void(bool)); - MOCK_METHOD2(GetIPConfigs, NetworkIPConfigVector(const std::string&, - std::string*)); + MOCK_METHOD3(GetIPConfigs, NetworkIPConfigVector(const std::string&, + std::string*, + HardwareAddressFormat)); MOCK_METHOD1(GetHtmlInfo, std::string(int)); }; diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index dbe04ce..6b923ac 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -2216,6 +2216,24 @@ class NetworkLibraryImpl : public NetworkLibrary { return NULL; } + virtual const NetworkDevice* FindEthernetDevice() const { + for (NetworkDeviceMap::const_iterator iter = device_map_.begin(); + iter != device_map_.end(); ++iter) { + if (iter->second->type() == TYPE_ETHERNET) + return iter->second; + } + return NULL; + } + + virtual const NetworkDevice* FindWifiDevice() const { + for (NetworkDeviceMap::const_iterator iter = device_map_.begin(); + iter != device_map_.end(); ++iter) { + if (iter->second->type() == TYPE_WIFI) + return iter->second; + } + return NULL; + } + virtual Network* FindNetworkByPath(const std::string& path) const { NetworkMap::const_iterator iter = network_map_.find(path); if (iter != network_map_.end()) @@ -2790,7 +2808,9 @@ class NetworkLibraryImpl : public NetworkLibrary { } virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path, - std::string* hardware_address) { + std::string* hardware_address, + HardwareAddressFormat format) { + DCHECK(hardware_address); hardware_address->clear(); NetworkIPConfigVector ipconfig_vector; if (EnsureCrosLoaded() && !device_path.empty()) { @@ -2809,6 +2829,22 @@ class NetworkLibraryImpl : public NetworkLibrary { std::sort(ipconfig_vector.begin(), ipconfig_vector.end()); } } + + for (size_t i = 0; i < hardware_address->size(); ++i) + (*hardware_address)[i] = toupper((*hardware_address)[i]); + if (format == FORMAT_COLON_SEPARATED_HEX) { + if (hardware_address->size() % 2 == 0) { + std::string output; + for (size_t i = 0; i < hardware_address->size(); ++i) { + if ((i != 0) && (i % 2 == 0)) + output.push_back(':'); + output.push_back((*hardware_address)[i]); + } + *hardware_address = output; + } + } else { + DCHECK(format == FORMAT_RAW_HEX); + } return ipconfig_vector; } @@ -4153,6 +4189,12 @@ class NetworkLibraryStubImpl : public NetworkLibrary { virtual const NetworkDevice* FindCellularDevice() const { return NULL; } + virtual const NetworkDevice* FindEthernetDevice() const { + return NULL; + } + virtual const NetworkDevice* FindWifiDevice() const { + return NULL; + } virtual Network* FindNetworkByPath( const std::string& path) const { return NULL; } virtual WifiNetwork* FindWifiNetworkByPath( @@ -4215,7 +4257,8 @@ class NetworkLibraryStubImpl : public NetworkLibrary { virtual void EnableCellularNetworkDevice(bool enable) {} virtual void EnableOfflineMode(bool enable) {} virtual NetworkIPConfigVector GetIPConfigs(const std::string& device_path, - std::string* hardware_address) { + std::string* hardware_address, + HardwareAddressFormat) { hardware_address->clear(); return NetworkIPConfigVector(); } diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h index 0c1ebf3..ee471dc 100644 --- a/chrome/browser/chromeos/cros/network_library.h +++ b/chrome/browser/chromeos/cros/network_library.h @@ -847,6 +847,11 @@ typedef std::vector<NetworkIPConfig> NetworkIPConfigVector; // library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary() class NetworkLibrary { public: + enum HardwareAddressFormat { + FORMAT_RAW_HEX, + FORMAT_COLON_SEPARATED_HEX + }; + class NetworkManagerObserver { public: // Called when the state of the network manager has changed, @@ -980,10 +985,15 @@ class NetworkLibrary { virtual const NetworkDevice* FindNetworkDeviceByPath( const std::string& path) const = 0; - // Returns device with TYPE_CELLULAR. Returns NULL if such a device doesn't - // exist. + // Returns device with TYPE_CELLULAR. Returns NULL if none exists. virtual const NetworkDevice* FindCellularDevice() const = 0; + // Returns device with TYPE_ETHERNET. Returns NULL if none exists. + virtual const NetworkDevice* FindEthernetDevice() const = 0; + + // Returns device with TYPE_WIFI. Returns NULL if none exists. + virtual const NetworkDevice* FindWifiDevice() const = 0; + // Return a pointer to the network, if it exists, or NULL. // NOTE: Never store these results, store service paths instead. // The pattern for doing an operation on a Network is: @@ -1126,7 +1136,8 @@ class NetworkLibrary { // found. virtual NetworkIPConfigVector GetIPConfigs( const std::string& device_path, - std::string* hardware_address) = 0; + std::string* hardware_address, + HardwareAddressFormat) = 0; // Factory function, creates a new instance and returns ownership. // For normal usage, access the singleton via CrosLibrary::Get(). diff --git a/chrome/browser/chromeos/login/network_screen_browsertest.cc b/chrome/browser/chromeos/login/network_screen_browsertest.cc index d3de156..5c625b0 100644 --- a/chrome/browser/chromeos/login/network_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/network_screen_browsertest.cc @@ -76,6 +76,10 @@ class NetworkScreenTest : public WizardInProcessBrowserTest { EXPECT_CALL(*mock_network_library_, cellular_connected()) .Times(1) .WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_network_library_, FindWifiDevice()) + .Times(AnyNumber()); + EXPECT_CALL(*mock_network_library_, FindEthernetDevice()) + .Times(AnyNumber()); cros_mock_->SetStatusAreaMocksExpectations(); diff --git a/chrome/browser/chromeos/login/update_screen_browsertest.cc b/chrome/browser/chromeos/login/update_screen_browsertest.cc index c6897bd..9004b8b 100644 --- a/chrome/browser/chromeos/login/update_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/update_screen_browsertest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. @@ -13,6 +13,7 @@ namespace chromeos { using ::testing::_; +using ::testing::AnyNumber; using ::testing::AtLeast; using ::testing::Return; using ::testing::ReturnRef; @@ -63,6 +64,10 @@ class UpdateScreenTest : public WizardInProcessBrowserTest { EXPECT_CALL(*mock_network_library_, AddNetworkManagerObserver(_)) .Times(1) .RetiresOnSaturation(); + EXPECT_CALL(*mock_network_library_, FindWifiDevice()) + .Times(AnyNumber()); + EXPECT_CALL(*mock_network_library_, FindEthernetDevice()) + .Times(AnyNumber()); } virtual void TearDownInProcessBrowserTestFixture() { diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc index 7f5d05c..285ccbe 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: @@ -290,8 +305,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, @@ -509,7 +525,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); } } @@ -562,34 +580,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_LANGUAGES_MORE), + SkBitmap(), more_menu_model_.get(), FLAG_NONE)); } } } @@ -703,6 +711,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 @@ -750,8 +831,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())); } @@ -994,3 +1074,5 @@ void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { } } // namespace chromeos + + diff --git a/chrome/browser/chromeos/status/network_menu.h b/chrome/browser/chromeos/status/network_menu.h index 62c1a8e..893bdbc 100644 --- a/chrome/browser/chromeos/status/network_menu.h +++ b/chrome/browser/chromeos/status/network_menu.h @@ -63,7 +63,7 @@ class NetworkMenuModel : public ui::MenuModel { // Called by NetworkMenu::RunMenu to initialize list of menu items. virtual void InitMenuItems(bool is_browser_mode, - bool should_open_button_options) {} + bool should_open_button_options) = 0; // ui::MenuModel implementation. virtual bool HasIcons() const { return true; } @@ -90,6 +90,7 @@ class NetworkMenuModel : public ui::MenuModel { protected: enum MenuItemFlags { + FLAG_NONE = 0, FLAG_DISABLED = 1 << 0, FLAG_TOGGLE_ETHERNET = 1 << 1, FLAG_TOGGLE_WIFI = 1 << 2, @@ -99,13 +100,12 @@ class NetworkMenuModel : public ui::MenuModel { 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 { diff --git a/chrome/browser/ui/views/about_ipc_dialog.cc b/chrome/browser/ui/views/about_ipc_dialog.cc index 1215473..fb1fdc4 100644 --- a/chrome/browser/ui/views/about_ipc_dialog.cc +++ b/chrome/browser/ui/views/about_ipc_dialog.cc @@ -219,7 +219,7 @@ void AboutIPCDialog::RunDialog() { views::Window::CreateChromeWindow(NULL, gfx::Rect(), g_active_dialog)->Show(); } else { - // TOOD(brettw) it would be nice to focus the existing window. + // TODO(brettw) it would be nice to focus the existing window. } } diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc index 8b677ca..ef2c7a43 100644 --- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc @@ -46,22 +46,6 @@ static const char kOtherNetworksFakePath[] = "?"; -namespace { - -// Format the hardware address like "0011AA22BB33" => "00:11:AA:22:BB:33". -std::string FormatHardwareAddress(const std::string& address) { - std::string output; - for (size_t i = 0; i < address.size(); ++i) { - if (i != 0 && i % 2 == 0) { - output.push_back(':'); - } - output.push_back(toupper(address[i])); - } - return output; -} - -} // namespace - InternetOptionsHandler::InternetOptionsHandler() : chromeos::CrosOptionsPageUIHandler( new chromeos::UserCrosSettingsProvider), @@ -593,12 +577,11 @@ void InternetOptionsHandler::PopulateDictionaryDetails( DCHECK(net); DictionaryValue dictionary; std::string hardware_address; - chromeos::NetworkIPConfigVector ipconfigs = - cros->GetIPConfigs(net->device_path(), &hardware_address); - if (!hardware_address.empty()) { - dictionary.SetString("hardwareAddress", - FormatHardwareAddress(hardware_address)); - } + chromeos::NetworkIPConfigVector ipconfigs = cros->GetIPConfigs( + net->device_path(), &hardware_address, + chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX); + if (!hardware_address.empty()) + dictionary.SetString("hardwareAddress", hardware_address); scoped_ptr<ListValue> ipconfig_list(new ListValue()); for (chromeos::NetworkIPConfigVector::const_iterator it = ipconfigs.begin(); it != ipconfigs.end(); ++it) { |