summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/cros/mock_network_library.h1
-rw-r--r--chrome/browser/chromeos/cros/network_library.cc43
-rw-r--r--chrome/browser/chromeos/cros/network_library.h3
-rw-r--r--chrome/browser/chromeos/login/network_screen_browsertest.cc26
-rw-r--r--chrome/browser/chromeos/options/internet_page_view.cc1
-rw-r--r--chrome/browser/chromeos/status/network_dropdown_button.cc4
-rw-r--r--chrome/browser/chromeos/status/network_menu.cc7
-rw-r--r--views/controls/menu/native_menu_gtk.cc23
-rw-r--r--views/controls/menu/native_menu_gtk.h4
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);
};