diff options
-rw-r--r-- | chrome/browser/chromeos/cros/mock_network_library.h | 1 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_library.cc | 43 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_library.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/network_screen_browsertest.cc | 26 | ||||
-rw-r--r-- | chrome/browser/chromeos/options/internet_page_view.cc | 1 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_dropdown_button.cc | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_menu.cc | 7 | ||||
-rw-r--r-- | views/controls/menu/native_menu_gtk.cc | 23 | ||||
-rw-r--r-- | views/controls/menu/native_menu_gtk.h | 4 |
9 files changed, 84 insertions, 28 deletions
diff --git a/chrome/browser/chromeos/cros/mock_network_library.h b/chrome/browser/chromeos/cros/mock_network_library.h index 796f735..21b9bf4 100644 --- a/chrome/browser/chromeos/cros/mock_network_library.h +++ b/chrome/browser/chromeos/cros/mock_network_library.h @@ -48,7 +48,6 @@ class MockNetworkLibrary : public NetworkLibrary { MOCK_METHOD1(FindCellularNetworkByPath, CellularNetwork*(const std::string&)); MOCK_METHOD0(RequestWifiScan, void(void)); - MOCK_METHOD0(UpdateSystemInfo, void(void)); MOCK_METHOD1(GetWifiAccessPoints, bool(WifiAccessPointVector*)); MOCK_METHOD4(ConnectToWifiNetwork, bool(const WifiNetwork*, const std::string&, diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index fc7cec6..7e878dd 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -17,6 +17,15 @@ #include "chrome/browser/chromeos/cros/cros_library.h" #include "grit/generated_resources.h" +namespace { + +// FlimFlam may send multiple notifications for single network change. +// We wait small amount of time before retrieving the status to +// avoid send multiple sync request to flim flam. +const int kNetworkUpdateDelayMs = 50; + +} // namespace + namespace chromeos { namespace { @@ -649,7 +658,8 @@ class NetworkLibraryImpl : public NetworkLibrary { available_devices_(0), enabled_devices_(0), connected_devices_(0), - offline_mode_(false) { + offline_mode_(false), + update_task_(NULL) { if (EnsureCrosLoaded()) { Init(); network_manager_monitor_ = @@ -678,6 +688,19 @@ class NetworkLibraryImpl : public NetworkLibrary { network_manager_observers_.AddObserver(observer); } + void NetworkStatusChanged() { + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + if (update_task_) { + update_task_->Cancel(); + } + update_task_ = + NewRunnableMethod(this, + &NetworkLibraryImpl::UpdateNetworkManagerStatus); + BrowserThread::PostDelayedTask( + BrowserThread::UI, FROM_HERE, update_task_, + kNetworkUpdateDelayMs); + } + virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) { network_manager_observers_.RemoveObserver(observer); } @@ -1167,7 +1190,7 @@ class NetworkLibraryImpl : public NetworkLibrary { const Value* value) { NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object); DCHECK(networklib); - networklib->UpdateNetworkManagerStatus(); + networklib->NetworkStatusChanged(); } static void DataPlanUpdateHandler(void* object, @@ -1390,19 +1413,15 @@ class NetworkLibraryImpl : public NetworkLibrary { void UpdateNetworkManagerStatus() { // Make sure we run on UI thread. - if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - NewRunnableMethod(this, - &NetworkLibraryImpl::UpdateNetworkManagerStatus)); - return; - } + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + update_task_ = NULL; + VLOG(1) << "Updating Network Status"; SystemInfo* system = GetSystemInfo(); if (!system) return; - std::string prev_cellular_service_path = cellular_ ? cellular_->service_path() : std::string(); @@ -1573,6 +1592,9 @@ class NetworkLibraryImpl : public NetworkLibrary { bool offline_mode_; + // Delayed task to retrieve the network information. + CancelableTask* update_task_; + DISALLOW_COPY_AND_ASSIGN(NetworkLibraryImpl); }; @@ -1678,7 +1700,6 @@ class NetworkLibraryStubImpl : public NetworkLibrary { return NetworkIPConfigVector(); } virtual std::string GetHtmlInfo(int refresh) { return std::string(); } - virtual void UpdateSystemInfo() {} private: std::string ip_address_; diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h index de81636..8296660 100644 --- a/chrome/browser/chromeos/cros/network_library.h +++ b/chrome/browser/chromeos/cros/network_library.h @@ -495,9 +495,6 @@ class NetworkLibrary { // TODO(joth): Add GetCellTowers to retrieve a CellTowerVector. - // Force an update of the system info. - virtual void UpdateSystemInfo() = 0; - // Connect to the specified wireless network with password. // Returns false if the attempt fails immediately (e.g. passphrase too short). virtual bool ConnectToWifiNetwork(const WifiNetwork* network, diff --git a/chrome/browser/chromeos/login/network_screen_browsertest.cc b/chrome/browser/chromeos/login/network_screen_browsertest.cc index c8c2586..b45c02d 100644 --- a/chrome/browser/chromeos/login/network_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/network_screen_browsertest.cc @@ -64,29 +64,43 @@ class NetworkScreenTest : public WizardInProcessBrowserTest { // Status bar expectations are defined with RetiresOnSaturation() so // these mocks will be active once status bar is initialized. EXPECT_CALL(*mock_network_library_, active_network()) - .Times(2) + .Times(1) .WillRepeatedly((Return((const Network*)(NULL)))) .RetiresOnSaturation(); EXPECT_CALL(*mock_network_library_, ethernet_connected()) - .Times(1) + .Times(2) .WillRepeatedly(Return(false)); EXPECT_CALL(*mock_network_library_, ethernet_connecting()) - .Times(1) + .Times(2) .WillRepeatedly(Return(false)); EXPECT_CALL(*mock_network_library_, wifi_connected()) .Times(1) .WillRepeatedly(Return(false)); EXPECT_CALL(*mock_network_library_, wifi_connecting()) - .Times(3) + .Times(2) .WillRepeatedly(Return(false)); EXPECT_CALL(*mock_network_library_, cellular_connected()) .Times(1) .WillRepeatedly(Return(false)); EXPECT_CALL(*mock_network_library_, cellular_connecting()) - .Times(3) + .Times(2) .WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_network_library_, ethernet_available()) + .Times(1) + .WillRepeatedly((Return(true))) + .RetiresOnSaturation(); + EXPECT_CALL(*mock_network_library_, wifi_available()) + .Times(1) + .WillRepeatedly((Return(false))) + .RetiresOnSaturation(); + EXPECT_CALL(*mock_network_library_, cellular_available()) + .Times(1) + .WillRepeatedly((Return(false))) + .RetiresOnSaturation(); + + // Add a Connecting for prewarming auth url check. EXPECT_CALL(*mock_network_library_, Connecting()) - .Times(2) + .Times(1) .WillRepeatedly(Return(false)); // Add a Connected for prewarming auth url check. EXPECT_CALL(*mock_network_library_, Connected()) diff --git a/chrome/browser/chromeos/options/internet_page_view.cc b/chrome/browser/chromeos/options/internet_page_view.cc index 794814a..14ad91d 100644 --- a/chrome/browser/chromeos/options/internet_page_view.cc +++ b/chrome/browser/chromeos/options/internet_page_view.cc @@ -566,7 +566,6 @@ InternetPageView::InternetPageView(Profile* profile) contents_view_(new InternetPageContentView(profile)), scroll_view_(new views::ScrollView) { NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); - cros->UpdateSystemInfo(); cros->AddNetworkManagerObserver(this); } diff --git a/chrome/browser/chromeos/status/network_dropdown_button.cc b/chrome/browser/chromeos/status/network_dropdown_button.cc index 8deb193..bf8a3be 100644 --- a/chrome/browser/chromeos/status/network_dropdown_button.cc +++ b/chrome/browser/chromeos/status/network_dropdown_button.cc @@ -34,8 +34,9 @@ NetworkDropdownButton::NetworkDropdownButton(bool browser_mode, parent_window_(parent_window) { animation_connecting_.SetThrobDuration(kThrobDuration); animation_connecting_.SetTweenType(Tween::LINEAR); - OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary()); CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this); + // The initial state will be updated on Refresh. + // See network_selection_view.cc. } NetworkDropdownButton::~NetworkDropdownButton() { @@ -117,6 +118,7 @@ void NetworkDropdownButton::OnNetworkManagerChanged(NetworkLibrary* cros) { } SchedulePaint(); + UpdateMenu(); } } // namespace chromeos diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc index 47e2567..fb64aa3 100644 --- a/chrome/browser/chromeos/status/network_menu.cc +++ b/chrome/browser/chromeos/status/network_menu.cc @@ -468,9 +468,10 @@ void NetworkMenu::RunMenu(views::View* source, const gfx::Point& pt) { refreshing_menu_ = true; NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary(); cros->RequestWifiScan(); - cros->UpdateSystemInfo(); - InitMenuItems(); - network_menu_->Rebuild(); + + // Menu contents are built in UpdateMenu, which is called + // when NetworkChagned is called. + // 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_|. diff --git a/views/controls/menu/native_menu_gtk.cc b/views/controls/menu/native_menu_gtk.cc index b648878..d570807 100644 --- a/views/controls/menu/native_menu_gtk.cc +++ b/views/controls/menu/native_menu_gtk.cc @@ -75,7 +75,8 @@ NativeMenuGtk::NativeMenuGtk(Menu2* menu) activate_factory_(this), host_menu_(menu), menu_action_(MENU_ACTION_NONE), - nested_dispatcher_(NULL) { + nested_dispatcher_(NULL), + ignore_button_release_(true) { } NativeMenuGtk::~NativeMenuGtk() { @@ -98,6 +99,8 @@ void NativeMenuGtk::RunMenuAt(const gfx::Point& point, int alignment) { activated_menu_ = NULL; activated_index_ = -1; menu_action_ = MENU_ACTION_NONE; + // ignore button release event unless mouse is pressed or moved. + ignore_button_release_ = true; UpdateStates(); Position position = { point, static_cast<Menu2::Alignment>(alignment) }; @@ -239,6 +242,7 @@ bool NativeMenuGtk::Dispatch(GdkEvent* event) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: { + ignore_button_release_ = true; gpointer data = NULL; gdk_window_get_user_data(((GdkEventAny*)event)->window, &data); GtkWidget* widget = reinterpret_cast<GtkWidget*>(data); @@ -258,6 +262,22 @@ bool NativeMenuGtk::Dispatch(GdkEvent* event) { } break; } + case GDK_MOTION_NOTIFY: { + ignore_button_release_ = false; + break; + } + case GDK_BUTTON_RELEASE: { + if (ignore_button_release_) { + // Ignore if a release event happened without press event. + // Normally, release event is eaten by gtk when menu is opened + // in response to mouse press event. Since the renderer opens + // the context menu asyncrhonous after press event is handled, + // gtk sometimes does not eat it, which causes the menu to be + // closed. + return true; + } + break; + } default: break; } @@ -287,7 +307,6 @@ void NativeMenuGtk::OnMenuMoveCurrent(GtkWidget* menu_widget, if (menu_item) { submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item)); } - if (focus_direction == GTK_MENU_DIR_CHILD && submenu == NULL) { GetAncestor()->menu_action_ = MENU_ACTION_NEXT; gtk_menu_popdown(GTK_MENU(menu_widget)); diff --git a/views/controls/menu/native_menu_gtk.h b/views/controls/menu/native_menu_gtk.h index 99d65cc..f15bc19 100644 --- a/views/controls/menu/native_menu_gtk.h +++ b/views/controls/menu/native_menu_gtk.h @@ -146,6 +146,10 @@ class NativeMenuGtk : public MenuWrapper, // message loop is handled. see http://crosbug.com/7228 . NestedDispatcherGtk* nested_dispatcher_; + // A flag used to detect a button release event without button press or move. + // see http://crosbug.com/8718. + bool ignore_button_release_; + DISALLOW_COPY_AND_ASSIGN(NativeMenuGtk); }; |