Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4928)

Unified Diff: chrome/browser/ui/ash/session_controller_client.cc

Issue 2832903002: cros: Remove supervised user methods from SystemTrayDelegate (Closed)
Patch Set: ready Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/ash/session_controller_client.cc
diff --git a/chrome/browser/ui/ash/session_controller_client.cc b/chrome/browser/ui/ash/session_controller_client.cc
index 693ad99d7eb2ba529957e2d79a080588b3f3b4f7..8c56c944cf534bb604049f2e53710c61394dc049 100644
--- a/chrome/browser/ui/ash/session_controller_client.cc
+++ b/chrome/browser/ui/ash/session_controller_client.cc
@@ -18,6 +18,9 @@
#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/supervised_user/supervised_user_service.h"
+#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/browser/ui/ash/multi_user/user_switch_util.h"
#include "chrome/common/pref_names.h"
#include "chrome/grit/theme_resources.h"
@@ -54,7 +57,8 @@ uint32_t GetSessionId(const User& user) {
// Creates a mojom::UserSession for the given user. Returns nullptr if there is
// no user session started for the given user.
-ash::mojom::UserSessionPtr UserToUserSession(const User& user) {
+ash::mojom::UserSessionPtr UserToUserSession(const User& user,
+ Profile* login_profile) {
const uint32_t user_session_id = GetSessionId(user);
if (user_session_id == 0u)
return nullptr;
@@ -72,6 +76,13 @@ ash::mojom::UserSessionPtr UserToUserSession(const User& user) {
IDR_PROFILE_PICTURE_LOADING);
}
+ if (user.IsSupervised() && login_profile) {
+ SupervisedUserService* service =
+ SupervisedUserServiceFactory::GetForProfile(login_profile);
+ session->custodian_email = service->GetCustodianEmailAddress();
+ session->second_custodian_email = service->GetSecondCustodianEmailAddress();
+ }
+
chromeos::UserFlow* const user_flow =
chromeos::ChromeUserManager::Get()->GetUserFlow(user.GetAccountId());
session->should_enable_settings = user_flow->ShouldEnableSettings();
@@ -94,11 +105,8 @@ SessionControllerClient::SessionControllerClient() : binding_(this) {
registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
content::NotificationService::AllSources());
-
- ConnectToSessionControllerAndSetClient();
- SendSessionInfoIfChanged();
- // User sessions and their order will be sent via UserSessionStateObserver
- // even for crash-n-restart.
+ registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED,
+ content::NotificationService::AllSources());
DCHECK(!g_instance);
g_instance = this;
@@ -108,11 +116,23 @@ SessionControllerClient::~SessionControllerClient() {
DCHECK_EQ(this, g_instance);
g_instance = nullptr;
+ if (login_profile_) {
+ SupervisedUserServiceFactory::GetForProfile(login_profile_)
+ ->RemoveObserver(this);
+ }
SessionManager::Get()->RemoveObserver(this);
UserManager::Get()->RemoveObserver(this);
UserManager::Get()->RemoveSessionStateObserver(this);
}
+void SessionControllerClient::Init() {
+ ConnectToSessionController();
+ session_controller_->SetClient(binding_.CreateInterfacePtrAndBind());
+ SendSessionInfoIfChanged();
+ // User sessions and their order will be sent via UserSessionStateObserver
+ // even for crash-n-restart.
+}
+
// static
SessionControllerClient* SessionControllerClient::Get() {
return g_instance;
@@ -273,21 +293,51 @@ void SessionControllerClient::OnSessionStateChanged() {
SendSessionInfoIfChanged();
}
+void SessionControllerClient::OnCustodianInfoChanged() {
+ SendActiveUserSession();
xiyuan 2017/04/21 23:14:35 Is this safe because supervised user is not allowe
James Cook 2017/04/24 17:47:26 How does this look?
xiyuan 2017/04/24 18:10:09 Looks good.
+}
+
void SessionControllerClient::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
- DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type);
- session_controller_->NotifyChromeTerminating();
+ switch (type) {
+ case chrome::NOTIFICATION_APP_TERMINATING:
+ session_controller_->NotifyChromeTerminating();
+ break;
+ case chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED: {
+ Profile* profile = content::Details<Profile>(details).ptr();
+ OnLoginUserProfilePrepared(profile);
+ break;
+ }
+ default:
+ NOTREACHED() << "Unexpected notification " << type;
+ break;
+ }
+}
+
+void SessionControllerClient::OnLoginUserProfilePrepared(Profile* profile) {
+ DCHECK(!login_profile_);
+ login_profile_ = profile;
+
+ // Update the user session data with information from the profile.
+ SendActiveUserSession();
+
+ // Watch for changes to supervised user manager/custodians. Supervised users
+ // cannot use multiprofile so we don't need to worry about profile switching
+ // and adding/removing observers.
+ SupervisedUserServiceFactory::GetForProfile(login_profile_)
+ ->AddObserver(this);
}
-void SessionControllerClient::ConnectToSessionControllerAndSetClient() {
+void SessionControllerClient::ConnectToSessionController() {
+ // Tests may bind to their own SessionController.
+ if (session_controller_)
+ return;
+
content::ServiceManagerConnection::GetForProcess()
->GetConnector()
->BindInterface(ash::mojom::kServiceName, &session_controller_);
-
- // Set as |session_controller_|'s client.
- session_controller_->SetClient(binding_.CreateInterfacePtrAndBind());
}
void SessionControllerClient::SendSessionInfoIfChanged() {
@@ -306,7 +356,8 @@ void SessionControllerClient::SendSessionInfoIfChanged() {
}
void SessionControllerClient::SendUserSession(const User& user) {
- ash::mojom::UserSessionPtr user_session = UserToUserSession(user);
+ ash::mojom::UserSessionPtr user_session =
+ UserToUserSession(user, login_profile_);
// Bail if the user has no session. Currently the only code path that hits
// this condition is from OnUserImageChanged when user images are changed
@@ -315,9 +366,17 @@ void SessionControllerClient::SendUserSession(const User& user) {
if (!user_session)
return;
+ // TODO(jamescook): Only send if it changed. This will require an Equals()
+ // method for gfx::ImageSkia to allow mojom::UserSession comparison.
xiyuan 2017/04/21 23:14:35 We can use ImageSkia::BackedBySameObjectAs to impl
James Cook 2017/04/24 17:47:26 Is it OK if I do this in a separate CL?
session_controller_->UpdateUserSession(std::move(user_session));
}
+void SessionControllerClient::SendActiveUserSession() {
+ User* active_user = UserManager::Get()->GetActiveUser();
+ DCHECK(active_user);
+ SendUserSession(*active_user);
+}
+
void SessionControllerClient::SendUserSessionOrder() {
UserManager* const user_manager = UserManager::Get();

Powered by Google App Engine
This is Rietveld 408576698