summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DEPS2
-rw-r--r--chrome/browser/extensions/extension_gcm_app_handler_unittest.cc4
-rw-r--r--chrome/browser/services/gcm/chromeos_gcm_connection_observer.cc47
-rw-r--r--chrome/browser/services/gcm/chromeos_gcm_connection_observer.h34
-rw-r--r--chrome/browser/services/gcm/gcm_profile_service.cc12
-rw-r--r--chrome/browser/services/gcm/gcm_profile_service.h3
-rw-r--r--chrome/browser/services/gcm/gcm_profile_service_unittest.cc8
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chromeos/dbus/fake_shill_manager_client.cc17
-rw-r--r--chromeos/dbus/fake_shill_manager_client.h16
-rw-r--r--chromeos/dbus/mock_shill_manager_client.h12
-rw-r--r--chromeos/dbus/shill_manager_client.cc38
-rw-r--r--chromeos/dbus/shill_manager_client.h42
13 files changed, 225 insertions, 12 deletions
diff --git a/DEPS b/DEPS
index ebc7852..93aff87 100644
--- a/DEPS
+++ b/DEPS
@@ -432,7 +432,7 @@ deps_os = {
# For Linux and Chromium OS.
'src/third_party/cros_system_api':
- Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '3a7cfa4ba91518b8dd03282d09996d2f42ec6a2b',
+ Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '58e64ad700fb0e9d182feba37fa02af612d4179e',
# Note that this is different from Android's freetype repo.
'src/third_party/freetype2/src':
diff --git a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
index cee0ea9..1c7234f 100644
--- a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
+++ b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
@@ -56,6 +56,7 @@
#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/chromeos/settings/device_settings_service.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
#endif
namespace extensions {
@@ -220,6 +221,9 @@ class ExtensionGCMAppHandlerTest : public testing::Test {
// This is needed to create extension service under CrOS.
#if defined(OS_CHROMEOS)
test_user_manager_.reset(new chromeos::ScopedTestUserManager());
+ // Create a DBus thread manager setter for its side effect.
+ // Ignore the return value.
+ chromeos::DBusThreadManager::GetSetterForTesting();
#endif
// Create a new profile.
diff --git a/chrome/browser/services/gcm/chromeos_gcm_connection_observer.cc b/chrome/browser/services/gcm/chromeos_gcm_connection_observer.cc
new file mode 100644
index 0000000..99a1873
--- /dev/null
+++ b/chrome/browser/services/gcm/chromeos_gcm_connection_observer.cc
@@ -0,0 +1,47 @@
+// Copyright (c) 2014 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.
+
+#include "chrome/browser/services/gcm/chromeos_gcm_connection_observer.h"
+
+#include "base/callback.h"
+#include "base/logging.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill_manager_client.h"
+
+namespace gcm {
+
+ChromeOSGCMConnectionObserver::ChromeOSGCMConnectionObserver() {
+}
+
+ChromeOSGCMConnectionObserver::~ChromeOSGCMConnectionObserver() {
+}
+
+// static
+void ChromeOSGCMConnectionObserver::ErrorCallback(
+ const std::string& error_name,
+ const std::string& error) {
+ LOG(ERROR) << "GCM D-Bus method error " << error_name << ": " << error;
+}
+
+void ChromeOSGCMConnectionObserver::OnConnected(
+ const net::IPEndPoint& ip_endpoint) {
+ ip_endpoint_ = ip_endpoint;
+ chromeos::DBusThreadManager::Get()->
+ GetShillManagerClient()->
+ AddWakeOnPacketConnection(
+ ip_endpoint,
+ base::Bind(&base::DoNothing),
+ base::Bind(&ChromeOSGCMConnectionObserver::ErrorCallback));
+}
+
+void ChromeOSGCMConnectionObserver::OnDisconnected() {
+ chromeos::DBusThreadManager::Get()->
+ GetShillManagerClient()->
+ RemoveWakeOnPacketConnection(
+ ip_endpoint_,
+ base::Bind(&base::DoNothing),
+ base::Bind(&ChromeOSGCMConnectionObserver::ErrorCallback));
+}
+
+} // namespace gcm
diff --git a/chrome/browser/services/gcm/chromeos_gcm_connection_observer.h b/chrome/browser/services/gcm/chromeos_gcm_connection_observer.h
new file mode 100644
index 0000000..f224e38
--- /dev/null
+++ b/chrome/browser/services/gcm/chromeos_gcm_connection_observer.h
@@ -0,0 +1,34 @@
+// Copyright (c) 2014 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.
+
+#ifndef CHROME_BROWSER_SERVICES_GCM_CHROMEOS_GCM_CONNECTION_OBSERVER_H_
+#define CHROME_BROWSER_SERVICES_GCM_CHROMEOS_GCM_CONNECTION_OBSERVER_H_
+
+#include "base/compiler_specific.h"
+#include "components/gcm_driver/gcm_connection_observer.h"
+#include "net/base/ip_endpoint.h"
+
+namespace gcm {
+
+class ChromeOSGCMConnectionObserver : public GCMConnectionObserver {
+ public:
+ ChromeOSGCMConnectionObserver();
+ virtual ~ChromeOSGCMConnectionObserver();
+ // gcm::GCMConnectionObserver implementation:
+ virtual void OnConnected(const net::IPEndPoint& ip_endpoint) OVERRIDE;
+ virtual void OnDisconnected() OVERRIDE;
+
+ static void ErrorCallback(
+ const std::string& error_name,
+ const std::string& error);
+
+ private:
+ net::IPEndPoint ip_endpoint_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChromeOSGCMConnectionObserver);
+};
+
+} // namespace gcm
+
+#endif // CHROME_BROWSER_SERVICES_GCM_CHROMEOS_GCM_CONNECTION_OBSERVER_H_
diff --git a/chrome/browser/services/gcm/gcm_profile_service.cc b/chrome/browser/services/gcm/gcm_profile_service.cc
index 069862d..5324ffd 100644
--- a/chrome/browser/services/gcm/gcm_profile_service.cc
+++ b/chrome/browser/services/gcm/gcm_profile_service.cc
@@ -16,6 +16,9 @@
#include "components/gcm_driver/gcm_driver_android.h"
#else
#include "base/bind.h"
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/services/gcm/chromeos_gcm_connection_observer.h"
+#endif
#include "base/files/file_path.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/services/gcm/gcm_account_tracker.h"
@@ -169,6 +172,11 @@ GCMProfileService::GCMProfileService(
profile_->GetPath().Append(chrome::kGCMStoreDirname),
profile_->GetRequestContext());
+#ifdef CHROMEOS
+ chromeos_connection_observer_.reset(new gcm::ChromeOSGCMConnectionObserver);
+ driver_->AddConnectionObserver(chromeos_connection_observer_.get());
+#endif
+
identity_observer_.reset(new IdentityObserver(
profile, static_cast<gcm::GCMDriverDesktop*>(driver_.get())));
}
@@ -204,6 +212,10 @@ void GCMProfileService::Shutdown() {
#if !defined(OS_ANDROID)
identity_observer_.reset();
#endif // !defined(OS_ANDROID)
+#if defined(OS_CHROMEOS)
+ driver_->RemoveConnectionObserver(chromeos_connection_observer_.get());
+ chromeos_connection_observer_.reset();
+#endif
if (driver_) {
driver_->Shutdown();
diff --git a/chrome/browser/services/gcm/gcm_profile_service.h b/chrome/browser/services/gcm/gcm_profile_service.h
index abfd3ce..83f9372 100644
--- a/chrome/browser/services/gcm/gcm_profile_service.h
+++ b/chrome/browser/services/gcm/gcm_profile_service.h
@@ -86,6 +86,9 @@ class GCMProfileService : public KeyedService {
class IdentityObserver;
scoped_ptr<IdentityObserver> identity_observer_;
#endif
+#if defined(OS_CHROMEOS)
+ scoped_ptr<GCMConnectionObserver> chromeos_connection_observer_;
+#endif
DISALLOW_COPY_AND_ASSIGN(GCMProfileService);
};
diff --git a/chrome/browser/services/gcm/gcm_profile_service_unittest.cc b/chrome/browser/services/gcm/gcm_profile_service_unittest.cc
index 3d77031..7f0d632 100644
--- a/chrome/browser/services/gcm/gcm_profile_service_unittest.cc
+++ b/chrome/browser/services/gcm/gcm_profile_service_unittest.cc
@@ -15,6 +15,9 @@
#include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/test/base/testing_profile.h"
+#if defined(OS_CHROMEOS)
+#include "chromeos/dbus/dbus_thread_manager.h"
+#endif
#include "components/gcm_driver/fake_gcm_app_handler.h"
#include "components/gcm_driver/fake_gcm_client.h"
#include "components/gcm_driver/fake_gcm_client_factory.h"
@@ -116,6 +119,11 @@ FakeGCMClient* GCMProfileServiceTest::GetGCMClient() const {
}
void GCMProfileServiceTest::SetUp() {
+#if defined(OS_CHROMEOS)
+ // Create a DBus thread manager setter for its side effect.
+ // Ignore the return value.
+ chromeos::DBusThreadManager::GetSetterForTesting();
+#endif
TestingProfile::Builder builder;
builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
FakeSigninManager::Build);
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 3f2e426..47364be 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2633,6 +2633,8 @@
# support ChromeOS with enable_plugins==0.
'browser/renderer_host/pepper/pepper_platform_verification_message_filter.cc',
'browser/renderer_host/pepper/pepper_platform_verification_message_filter.h',
+ 'browser/services/gcm/chromeos_gcm_connection_observer.cc',
+ 'browser/services/gcm/chromeos_gcm_connection_observer.h',
],
# Used everywhere but ChromeOS.
'chrome_browser_non_chromeos_sources': [
diff --git a/chromeos/dbus/fake_shill_manager_client.cc b/chromeos/dbus/fake_shill_manager_client.cc
index d57917f..934985e 100644
--- a/chromeos/dbus/fake_shill_manager_client.cc
+++ b/chromeos/dbus/fake_shill_manager_client.cc
@@ -355,6 +355,23 @@ void FakeShillManagerClient::ConnectToBestServices(
dbus::ObjectPath(best_service_), callback, error_callback);
}
+void FakeShillManagerClient::AddWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) {
+}
+
+void FakeShillManagerClient::RemoveWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) {
+}
+
+void FakeShillManagerClient::RemoveAllWakeOnPacketConnections(
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) {
+}
+
ShillManagerClient::TestInterface* FakeShillManagerClient::GetTestInterface() {
return this;
}
diff --git a/chromeos/dbus/fake_shill_manager_client.h b/chromeos/dbus/fake_shill_manager_client.h
index 34b10a5..7f24ca2 100644
--- a/chromeos/dbus/fake_shill_manager_client.h
+++ b/chromeos/dbus/fake_shill_manager_client.h
@@ -12,6 +12,10 @@
#include "chromeos/chromeos_export.h"
#include "chromeos/dbus/shill_manager_client.h"
+namespace net {
+class IPEndPoint;
+}
+
namespace chromeos {
// A fake implementation of ShillManagerClient. This works in close coordination
@@ -77,6 +81,18 @@ class CHROMEOS_EXPORT FakeShillManagerClient
virtual void ConnectToBestServices(
const base::Closure& callback,
const ErrorCallback& error_callback) OVERRIDE;
+ virtual void AddWakeOnPacketConnection(
+ const net::IPEndPoint& ip_connection,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) OVERRIDE;
+ virtual void RemoveWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) OVERRIDE;
+ virtual void RemoveAllWakeOnPacketConnections(
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) OVERRIDE;
+
virtual ShillManagerClient::TestInterface* GetTestInterface() OVERRIDE;
// ShillManagerClient::TestInterface overrides.
diff --git a/chromeos/dbus/mock_shill_manager_client.h b/chromeos/dbus/mock_shill_manager_client.h
index bf80b64..63c8c9c4 100644
--- a/chromeos/dbus/mock_shill_manager_client.h
+++ b/chromeos/dbus/mock_shill_manager_client.h
@@ -8,6 +8,7 @@
#include "base/values.h"
#include "chromeos/dbus/shill_manager_client.h"
#include "chromeos/dbus/shill_property_changed_observer.h"
+#include "net/base/ip_endpoint.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace chromeos {
@@ -66,6 +67,17 @@ class MockShillManagerClient : public ShillManagerClient {
MOCK_METHOD2(ConnectToBestServices,
void(const base::Closure& callback,
const ErrorCallback& error_callback));
+ MOCK_METHOD3(AddWakeOnPacketConnection,
+ void(const net::IPEndPoint& ip_connection,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback));
+ MOCK_METHOD3(RemoveWakeOnPacketConnection,
+ void(const net::IPEndPoint& ip_connection,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback));
+ MOCK_METHOD2(RemoveAllWakeOnPacketConnections,
+ void(const base::Closure& callback,
+ const ErrorCallback& error_callback));
MOCK_METHOD0(GetTestInterface, TestInterface*());
};
diff --git a/chromeos/dbus/shill_manager_client.cc b/chromeos/dbus/shill_manager_client.cc
index 0ad602f..d4c0019 100644
--- a/chromeos/dbus/shill_manager_client.cc
+++ b/chromeos/dbus/shill_manager_client.cc
@@ -14,6 +14,7 @@
#include "dbus/object_path.h"
#include "dbus/object_proxy.h"
#include "dbus/values_util.h"
+#include "net/base/ip_endpoint.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace chromeos {
@@ -210,6 +211,43 @@ class ShillManagerClientImpl : public ShillManagerClient {
error_callback);
}
+ virtual void AddWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) OVERRIDE {
+ dbus::MethodCall method_call(shill::kFlimflamManagerInterface,
+ shill::kAddWakeOnPacketConnectionFunction);
+ dbus::MessageWriter writer(&method_call);
+ writer.AppendString(net::IPAddressToString(ip_endpoint.address()));
+ helper_->CallVoidMethodWithErrorCallback(&method_call,
+ callback,
+ error_callback);
+ }
+
+ virtual void RemoveWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) OVERRIDE {
+ dbus::MethodCall method_call(shill::kFlimflamManagerInterface,
+ shill::kRemoveWakeOnPacketConnectionFunction);
+ dbus::MessageWriter writer(&method_call);
+ writer.AppendString(net::IPAddressToString(ip_endpoint.address()));
+ helper_->CallVoidMethodWithErrorCallback(&method_call,
+ callback,
+ error_callback);
+ }
+
+ virtual void RemoveAllWakeOnPacketConnections(
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) OVERRIDE {
+ dbus::MethodCall method_call(
+ shill::kFlimflamManagerInterface,
+ shill::kRemoveAllWakeOnPacketConnectionsFunction);
+ helper_->CallVoidMethodWithErrorCallback(&method_call,
+ callback,
+ error_callback);
+ }
+
virtual TestInterface* GetTestInterface() OVERRIDE {
return NULL;
}
diff --git a/chromeos/dbus/shill_manager_client.h b/chromeos/dbus/shill_manager_client.h
index 9b9541d..8bc7251 100644
--- a/chromeos/dbus/shill_manager_client.h
+++ b/chromeos/dbus/shill_manager_client.h
@@ -14,10 +14,12 @@
#include "chromeos/dbus/shill_client_helper.h"
namespace dbus {
-
class ObjectPath;
+}
-} // namespace dbus
+namespace net {
+class IPEndPoint;
+}
namespace chromeos {
@@ -193,35 +195,53 @@ class CHROMEOS_EXPORT ShillManagerClient : public DBusClient {
const ObjectPathCallback& callback,
const ErrorCallback& error_callback) = 0;
- // Verify that the given data corresponds to a trusted device, and return true
- // to the callback if it is.
+ // Verifies that the given data corresponds to a trusted device, and returns
+ // true to the callback if it is.
virtual void VerifyDestination(const VerificationProperties& properties,
const BooleanCallback& callback,
const ErrorCallback& error_callback) = 0;
- // Verify that the given data corresponds to a trusted device, and if it is,
- // return the encrypted credentials for connecting to the network represented
+ // Verifies that the given data corresponds to a trusted device, and if it is,
+ // returns the encrypted credentials for connecting to the network represented
// by the given |service_path|, encrypted using the |public_key| for the
- // trusted device. If the device is not trusted, return the empty string.
+ // trusted device. If the device is not trusted, returns the empty string.
virtual void VerifyAndEncryptCredentials(
const VerificationProperties& properties,
const std::string& service_path,
const StringCallback& callback,
const ErrorCallback& error_callback) = 0;
- // Verify that the given data corresponds to a trusted device, and return the
- // |data| encrypted using the |public_key| for the trusted device. If the
- // device is not trusted, return the empty string.
+ // Verifies that the given data corresponds to a trusted device, and returns
+ // the |data| encrypted using the |public_key| for the trusted device. If the
+ // device is not trusted, returns the empty string.
virtual void VerifyAndEncryptData(const VerificationProperties& properties,
const std::string& data,
const StringCallback& callback,
const ErrorCallback& error_callback) = 0;
- // For each technology present, connect to the "best" service available.
+ // For each technology present, connects to the "best" service available.
// Called once the user is logged in and certificates are loaded.
virtual void ConnectToBestServices(const base::Closure& callback,
const ErrorCallback& error_callback) = 0;
+ // Requests that shill program the NIC so that packets incoming on
+ // |ip_connection| wake up the CPU.
+ virtual void AddWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) = 0;
+
+ // Removes a request to wake up on packets coming on |ip_connection|.
+ virtual void RemoveWakeOnPacketConnection(
+ const net::IPEndPoint& ip_endpoint,
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) = 0;
+
+ // Clears all requests to wake up on packets.
+ virtual void RemoveAllWakeOnPacketConnections(
+ const base::Closure& callback,
+ const ErrorCallback& error_callback) = 0;
+
// Returns an interface for testing (stub only), or returns NULL.
virtual TestInterface* GetTestInterface() = 0;