Index: chromeos/dbus/session_manager_client.cc |
diff --git a/chromeos/dbus/session_manager_client.cc b/chromeos/dbus/session_manager_client.cc |
index 6c40353cbece0b57d9d3e6e5e37f09b2f0cbba8f..2feb79ab5e51b5ccfe1a0da36fcbcdba35076fa6 100644 |
--- a/chromeos/dbus/session_manager_client.cc |
+++ b/chromeos/dbus/session_manager_client.cc |
@@ -6,6 +6,7 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
+#include "base/metrics/histogram.h" |
#include "base/string_util.h" |
#include "dbus/bus.h" |
#include "dbus/message.h" |
@@ -18,14 +19,30 @@ namespace chromeos { |
// The SessionManagerClient implementation used in production. |
class SessionManagerClientImpl : public SessionManagerClient { |
public: |
+ enum LockScreensState { |
Daniel Erat
2012/07/03 22:44:27
Rob, are these metrics still useful? If not, I ca
flackr
2012/07/04 12:55:52
We still have to get lid and idle notifications fr
Daniel Erat
2012/07/09 16:01:42
Screen locking can be initiated by either Chrome o
flackr
2012/07/09 18:19:57
Thanks for clarifying, I don't think the current m
|
+ LOCK_SCREEN_REQUESTED, // Lock screen is requested. |
+ LOCK_SCREEN_REQUEST_SUCCEEDED, // Method call succeeded. |
+ LOCK_SCREEN_REQUEST_FAILED, // Method call failed. |
+ LOCK_SCREEN_FINISHED, // Signal is received. |
+ NUM_LOCK_SCREEN_STATES |
+ }; |
+ |
+ enum UnlockScreensState { |
+ UNLOCK_SCREEN_REQUESTED, // Unlock screen is requested. |
+ UNLOCK_SCREEN_REQUEST_SUCCEEDED, // Method call succeeded. |
+ UNLOCK_SCREEN_REQUEST_FAILED, // Method call failed. |
+ UNLOCK_SCREEN_FINISHED, // Signal is received. |
+ NUM_UNLOCK_SCREEN_STATES |
+ }; |
+ |
explicit SessionManagerClientImpl(dbus::Bus* bus) |
: session_manager_proxy_(NULL), |
+ screen_locked_(false), |
weak_ptr_factory_(this) { |
session_manager_proxy_ = bus->GetObjectProxy( |
login_manager::kSessionManagerServiceName, |
dbus::ObjectPath(login_manager::kSessionManagerServicePath)); |
- // Monitor the D-Bus signal for owner key changes. |
session_manager_proxy_->ConnectToSignal( |
chromium::kChromiumInterface, |
chromium::kOwnerKeySetSignal, |
@@ -34,7 +51,6 @@ class SessionManagerClientImpl : public SessionManagerClient { |
base::Bind(&SessionManagerClientImpl::SignalConnected, |
weak_ptr_factory_.GetWeakPtr())); |
- // Monitor the D-Bus signal for property changes. |
session_manager_proxy_->ConnectToSignal( |
chromium::kChromiumInterface, |
chromium::kPropertyChangeCompleteSignal, |
@@ -42,46 +58,50 @@ class SessionManagerClientImpl : public SessionManagerClient { |
weak_ptr_factory_.GetWeakPtr()), |
base::Bind(&SessionManagerClientImpl::SignalConnected, |
weak_ptr_factory_.GetWeakPtr())); |
+ |
+ session_manager_proxy_->ConnectToSignal( |
+ chromium::kChromiumInterface, |
+ chromium::kLockScreenSignal, |
+ base::Bind(&SessionManagerClientImpl::ScreenLockReceived, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&SessionManagerClientImpl::SignalConnected, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ |
+ session_manager_proxy_->ConnectToSignal( |
+ chromium::kChromiumInterface, |
+ chromium::kUnlockScreenSignal, |
+ base::Bind(&SessionManagerClientImpl::ScreenUnlockReceived, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&SessionManagerClientImpl::SignalConnected, |
+ weak_ptr_factory_.GetWeakPtr())); |
} |
virtual ~SessionManagerClientImpl() { |
} |
- // SessionManagerClient override. |
+ // SessionManagerClient overrides: |
virtual void AddObserver(Observer* observer) OVERRIDE { |
observers_.AddObserver(observer); |
} |
- // SessionManagerClient override. |
virtual void RemoveObserver(Observer* observer) OVERRIDE { |
observers_.RemoveObserver(observer); |
} |
- // SessionManagerClient override. |
+ virtual bool HasObserver(Observer* observer) OVERRIDE { |
+ return observers_.HasObserver(observer); |
+ } |
+ |
virtual void EmitLoginPromptReady() OVERRIDE { |
- dbus::MethodCall method_call( |
- login_manager::kSessionManagerInterface, |
+ SimpleMethodCallToSessionManager( |
login_manager::kSessionManagerEmitLoginPromptReady); |
- session_manager_proxy_->CallMethod( |
- &method_call, |
- dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&SessionManagerClientImpl::OnEmitLoginPromptReady, |
- weak_ptr_factory_.GetWeakPtr())); |
} |
- // SessionManagerClient override. |
virtual void EmitLoginPromptVisible() OVERRIDE { |
- dbus::MethodCall method_call( |
- login_manager::kSessionManagerInterface, |
+ SimpleMethodCallToSessionManager( |
login_manager::kSessionManagerEmitLoginPromptVisible); |
- session_manager_proxy_->CallMethod( |
- &method_call, |
- dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&SessionManagerClientImpl::OnEmitLoginPromptVisible, |
- weak_ptr_factory_.GetWeakPtr())); |
} |
- // SessionManagerClient override. |
virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE { |
dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
login_manager::kSessionManagerRestartJob); |
@@ -95,18 +115,10 @@ class SessionManagerClientImpl : public SessionManagerClient { |
weak_ptr_factory_.GetWeakPtr())); |
} |
- // SessionManagerClient override. |
virtual void RestartEntd() OVERRIDE { |
- dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
- login_manager::kSessionManagerRestartEntd); |
- session_manager_proxy_->CallMethod( |
- &method_call, |
- dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&SessionManagerClientImpl::OnRestartEntd, |
- weak_ptr_factory_.GetWeakPtr())); |
+ SimpleMethodCallToSessionManager(login_manager::kSessionManagerRestartEntd); |
} |
- // SessionManagerClient override. |
virtual void StartSession(const std::string& user_email) OVERRIDE { |
dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
login_manager::kSessionManagerStartSession); |
@@ -120,7 +132,6 @@ class SessionManagerClientImpl : public SessionManagerClient { |
weak_ptr_factory_.GetWeakPtr())); |
} |
- // SessionManagerClient override. |
virtual void StopSession() OVERRIDE { |
dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
login_manager::kSessionManagerStopSession); |
@@ -133,28 +144,58 @@ class SessionManagerClientImpl : public SessionManagerClient { |
weak_ptr_factory_.GetWeakPtr())); |
} |
- // SessionManagerClient override. |
+ virtual void RequestLockScreen() OVERRIDE { |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.LockScreenPath", |
+ LOCK_SCREEN_REQUESTED, |
+ NUM_LOCK_SCREEN_STATES); |
+ dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
+ login_manager::kSessionManagerLockScreen); |
+ session_manager_proxy_->CallMethodWithErrorCallback( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ base::Bind(&SessionManagerClientImpl::OnRequestLockScreenSuccess, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&SessionManagerClientImpl::OnRequestLockScreenError, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
+ |
+ virtual void RequestUnlockScreen() OVERRIDE { |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.UnlockScreenPath", |
+ UNLOCK_SCREEN_REQUESTED, |
+ NUM_UNLOCK_SCREEN_STATES); |
+ dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
+ login_manager::kSessionManagerUnlockScreen); |
+ session_manager_proxy_->CallMethodWithErrorCallback( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ base::Bind(&SessionManagerClientImpl::OnRequestUnlockScreenSuccess, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&SessionManagerClientImpl::OnRequestUnlockScreenError, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
+ |
+ virtual bool GetIsScreenLocked() OVERRIDE { |
+ return screen_locked_; |
+ } |
+ |
virtual void RetrieveDevicePolicy( |
const RetrievePolicyCallback& callback) OVERRIDE { |
CallRetrievePolicy(login_manager::kSessionManagerRetrievePolicy, |
callback); |
} |
- // SessionManagerClient override. |
virtual void RetrieveUserPolicy( |
const RetrievePolicyCallback& callback) OVERRIDE { |
CallRetrievePolicy(login_manager::kSessionManagerRetrieveUserPolicy, |
callback); |
} |
- // SessionManagerClient override. |
virtual void StoreDevicePolicy(const std::string& policy_blob, |
const StorePolicyCallback& callback) OVERRIDE { |
CallStorePolicy(login_manager::kSessionManagerStorePolicy, |
policy_blob, callback); |
} |
- // SessionManagerClient override. |
virtual void StoreUserPolicy(const std::string& policy_blob, |
const StorePolicyCallback& callback) OVERRIDE { |
CallStorePolicy(login_manager::kSessionManagerStoreUserPolicy, |
@@ -162,6 +203,17 @@ class SessionManagerClientImpl : public SessionManagerClient { |
} |
private: |
+ // Makes a method call to the session manager with no arguments and no |
+ // response. |
+ void SimpleMethodCallToSessionManager(const std::string& method_name) { |
+ dbus::MethodCall method_call(login_manager::kSessionManagerInterface, |
+ method_name); |
+ session_manager_proxy_->CallMethod( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ dbus::ObjectProxy::EmptyResponseCallback()); |
+ } |
+ |
// Helper for Retrieve{User,Device}Policy. |
virtual void CallRetrievePolicy(const std::string& method_name, |
const RetrievePolicyCallback& callback) { |
@@ -195,20 +247,6 @@ class SessionManagerClientImpl : public SessionManagerClient { |
callback)); |
} |
- // Called when kSessionManagerEmitLoginPromptReady method is complete. |
- void OnEmitLoginPromptReady(dbus::Response* response) { |
- LOG_IF(ERROR, !response) |
- << "Failed to call " |
- << login_manager::kSessionManagerEmitLoginPromptReady; |
- } |
- |
- // Called when kSessionManagerEmitLoginPromptVisible method is complete. |
- void OnEmitLoginPromptVisible(dbus::Response* response) { |
- LOG_IF(ERROR, !response) |
- << "Failed to call " |
- << login_manager::kSessionManagerEmitLoginPromptVisible; |
- } |
- |
// Called when kSessionManagerRestartJob method is complete. |
void OnRestartJob(dbus::Response* response) { |
LOG_IF(ERROR, !response) |
@@ -216,13 +254,6 @@ class SessionManagerClientImpl : public SessionManagerClient { |
<< login_manager::kSessionManagerRestartJob; |
} |
- // Called when kSessionManagerRestartEntd method is complete. |
- void OnRestartEntd(dbus::Response* response) { |
- LOG_IF(ERROR, !response) |
- << "Failed to call " |
- << login_manager::kSessionManagerRestartEntd; |
- } |
- |
// Called when kSessionManagerStartSession method is complete. |
void OnStartSession(dbus::Response* response) { |
LOG_IF(ERROR, !response) |
@@ -300,6 +331,27 @@ class SessionManagerClientImpl : public SessionManagerClient { |
FOR_EACH_OBSERVER(Observer, observers_, PropertyChangeComplete(success)); |
} |
+ void ScreenLockReceived(dbus::Signal* signal) { |
+ // TODO(flackr): This warning is actually a signal that things are working |
+ // as expected. As per http://crbug.com/126217, this will help determine |
+ // if the problem is with dbus or in chrome. |
+ LOG(WARNING) << "LockScreen signal received from session manager."; |
+ screen_locked_ = true; |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.LockScreenPath", |
+ LOCK_SCREEN_FINISHED, |
+ NUM_LOCK_SCREEN_STATES); |
+ FOR_EACH_OBSERVER(Observer, observers_, LockScreen()); |
+ } |
+ |
+ void ScreenUnlockReceived(dbus::Signal* signal) { |
+ screen_locked_ = false; |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.UnlockScreenPath", |
+ UNLOCK_SCREEN_FINISHED, |
+ NUM_UNLOCK_SCREEN_STATES); |
+ FOR_EACH_OBSERVER(Observer, observers_, UnlockScreen()); |
+ } |
+ |
+ |
// Called when the object is connected to the signal. |
void SignalConnected(const std::string& interface_name, |
const std::string& signal_name, |
@@ -307,8 +359,51 @@ class SessionManagerClientImpl : public SessionManagerClient { |
LOG_IF(ERROR, !success) << "Failed to connect to " << signal_name; |
} |
+ void OnRequestLockScreenSuccess(dbus::Response* response) { |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.LockScreenPath", |
+ LOCK_SCREEN_REQUEST_SUCCEEDED, |
+ NUM_LOCK_SCREEN_STATES); |
+ } |
+ |
+ void OnRequestLockScreenError(dbus::ErrorResponse* error_response) { |
+ if (error_response) { |
+ dbus::MessageReader reader(error_response); |
+ std::string error_message; |
+ reader.PopString(&error_message); |
+ LOG(ERROR) << "Failed to call " |
+ << login_manager::kSessionManagerLockScreen |
+ << error_response->GetErrorName() |
+ << ": " << error_message; |
+ } |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.LockScreenPath", |
+ LOCK_SCREEN_REQUEST_FAILED, |
+ NUM_LOCK_SCREEN_STATES); |
+ } |
+ |
+ void OnRequestUnlockScreenSuccess(dbus::Response* response) { |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.UnlockScreenPath", |
+ UNLOCK_SCREEN_REQUEST_SUCCEEDED, |
+ NUM_UNLOCK_SCREEN_STATES); |
+ } |
+ |
+ void OnRequestUnlockScreenError(dbus::ErrorResponse* error_response) { |
+ if (error_response) { |
+ dbus::MessageReader reader(error_response); |
+ std::string error_message; |
+ reader.PopString(&error_message); |
+ LOG(ERROR) << "Failed to call " |
+ << login_manager::kSessionManagerUnlockScreen |
+ << error_response->GetErrorName() |
+ << ": " << error_message; |
+ } |
+ UMA_HISTOGRAM_ENUMERATION("LockScreen.UnlockScreenPath", |
+ UNLOCK_SCREEN_REQUEST_FAILED, |
+ NUM_UNLOCK_SCREEN_STATES); |
+ } |
+ |
dbus::ObjectProxy* session_manager_proxy_; |
ObserverList<Observer> observers_; |
+ bool screen_locked_; |
base::WeakPtrFactory<SessionManagerClientImpl> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(SessionManagerClientImpl); |
@@ -320,12 +415,16 @@ class SessionManagerClientStubImpl : public SessionManagerClient { |
// SessionManagerClient overrides. |
virtual void AddObserver(Observer* observer) OVERRIDE {} |
virtual void RemoveObserver(Observer* observer) OVERRIDE {} |
+ virtual bool HasObserver(Observer* observer) OVERRIDE { return false; } |
virtual void EmitLoginPromptReady() OVERRIDE {} |
virtual void EmitLoginPromptVisible() OVERRIDE {} |
virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE {} |
virtual void RestartEntd() OVERRIDE {} |
virtual void StartSession(const std::string& user_email) OVERRIDE {} |
virtual void StopSession() OVERRIDE {} |
+ virtual void RequestLockScreen() OVERRIDE {} |
+ virtual void RequestUnlockScreen() OVERRIDE {} |
+ virtual bool GetIsScreenLocked() OVERRIDE { return false; } |
virtual void RetrieveDevicePolicy( |
const RetrievePolicyCallback& callback) OVERRIDE { |
callback.Run(""); |