Commit 11320f06 authored by Pâris MEULEMAN's avatar Pâris MEULEMAN Committed by Commit Bot

Merge SigninManagerDelegate back into SigninManager

This merges back SigninManagerDelegate.java into SigninManager.java and
likewise for c++ code. This is in the scope of a change of strategy
regarding the identityManager implementation on Android, using a
layering strategy similar to what was done on iOS.

The change consist in:
* copy chrome_signin_manager_delegate.* methods to
  signin_manager_android.*
* rename occurrences of ChromeSigninManagerDelegate to
  SigninManagerAndroid, in Java including JNI invocations and C++.
* Directly invoke methods instead of calling mDelegate (java)
* Update constructors to include the delegate dependencies.

* A significant change that is not an obvious code move is the rollback of
  SigninManagerAndroid's constructor using
  SigninClient/PrefService(local_state) to Profile. This makes the
  remainder of the change much simpler, but does cascade to the factory.

The above changes are described in their files in PS3:
crrev.com/c/1700210/3

Change-Id: I1b0de2129f3df649fa56d50b8dd191e8e1bb30ab
Bug: 985256
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1700210
Commit-Queue: Colin Blundell <blundell@chromium.org>
Reviewed-by: default avatarColin Blundell <blundell@chromium.org>
Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Auto-Submit: Pâris Meuleman <pmeuleman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#681349}
parent 7dd2ac40
...@@ -2588,7 +2588,6 @@ generate_jni("chrome_jni_headers") { ...@@ -2588,7 +2588,6 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java", "java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
"java/src/org/chromium/chrome/browser/sharing/SharingJNIBridge.java", "java/src/org/chromium/chrome/browser/sharing/SharingJNIBridge.java",
"java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java", "java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java",
"java/src/org/chromium/chrome/browser/signin/ChromeSigninManagerDelegate.java",
"java/src/org/chromium/chrome/browser/signin/IdentityServicesProvider.java", "java/src/org/chromium/chrome/browser/signin/IdentityServicesProvider.java",
"java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java", "java/src/org/chromium/chrome/browser/signin/ProfileDownloader.java",
"java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java", "java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java",
......
...@@ -1426,8 +1426,6 @@ chrome_java_sources = [ ...@@ -1426,8 +1426,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/signin/SigninHelper.java", "java/src/org/chromium/chrome/browser/signin/SigninHelper.java",
"java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java", "java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java",
"java/src/org/chromium/chrome/browser/signin/SigninManager.java", "java/src/org/chromium/chrome/browser/signin/SigninManager.java",
"java/src/org/chromium/chrome/browser/signin/SigninManagerDelegate.java",
"java/src/org/chromium/chrome/browser/signin/ChromeSigninManagerDelegate.java",
"java/src/org/chromium/chrome/browser/signin/SigninPromoController.java", "java/src/org/chromium/chrome/browser/signin/SigninPromoController.java",
"java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java", "java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java",
"java/src/org/chromium/chrome/browser/signin/SigninScrollView.java", "java/src/org/chromium/chrome/browser/signin/SigninScrollView.java",
......
...@@ -174,7 +174,6 @@ chrome_junit_test_java_sources = [ ...@@ -174,7 +174,6 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java", "junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java",
"junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java", "junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java",
"junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java", "junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java",
"junit/src/org/chromium/chrome/browser/signin/ChromeSigninManagerDelegateTest.java",
"junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java", "junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java",
"junit/src/org/chromium/chrome/browser/signin/SigninPromoUtilTest.java", "junit/src/org/chromium/chrome/browser/signin/SigninPromoUtilTest.java",
"junit/src/org/chromium/chrome/browser/snackbar/SnackbarCollectionUnitTest.java", "junit/src/org/chromium/chrome/browser/snackbar/SnackbarCollectionUnitTest.java",
......
// Copyright 2019 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.
package org.chromium.chrome.browser.signin;
import android.accounts.Account;
import android.app.Activity;
import android.content.Context;
import org.chromium.base.Callback;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JCaller;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler;
import org.chromium.components.sync.AndroidSyncSettings;
/**
* This implementation of {@link SigninManagerDelegate} provides {@link SigninManager} access to
* //chrome/browser level dependencies.
*/
public class ChromeSigninManagerDelegate implements SigninManagerDelegate {
private final AndroidSyncSettings mAndroidSyncSettings;
private long mNativeChromeSigninManagerDelegate;
@CalledByNative
private static ChromeSigninManagerDelegate create(long nativeChromeSigninManagerDelegate) {
assert nativeChromeSigninManagerDelegate != 0;
return new ChromeSigninManagerDelegate(
nativeChromeSigninManagerDelegate, AndroidSyncSettings.get());
}
@CalledByNative
public void destroy() {
mNativeChromeSigninManagerDelegate = 0;
}
@VisibleForTesting
ChromeSigninManagerDelegate(
long nativeChromeSigninManagerDelegate, AndroidSyncSettings androidSyncSettings) {
assert androidSyncSettings != null;
mAndroidSyncSettings = androidSyncSettings;
mNativeChromeSigninManagerDelegate = nativeChromeSigninManagerDelegate;
}
@Override
public String getManagementDomain() {
return ChromeSigninManagerDelegateJni.get().getManagementDomain(
this, mNativeChromeSigninManagerDelegate);
}
@Override
public void handleGooglePlayServicesUnavailability(Activity activity, boolean cancelable) {
UserRecoverableErrorHandler errorHandler = activity != null
? new UserRecoverableErrorHandler.ModalDialog(activity, cancelable)
: new UserRecoverableErrorHandler.SystemNotification();
ExternalAuthUtils.getInstance().canUseGooglePlayServices(errorHandler);
}
@Override
public boolean isGooglePlayServicesPresent(Context context) {
return !ExternalAuthUtils.getInstance().isGooglePlayServicesMissing(context);
}
@Override
public void isAccountManaged(String email, final Callback<Boolean> callback) {
ChromeSigninManagerDelegateJni.get().isAccountManaged(
this, mNativeChromeSigninManagerDelegate, email, callback);
}
@Override
public void fetchAndApplyCloudPolicy(String username, final Runnable callback) {
ChromeSigninManagerDelegateJni.get().fetchAndApplyCloudPolicy(
this, mNativeChromeSigninManagerDelegate, username, callback);
}
@Override
public void stopApplyingCloudPolicy() {
ChromeSigninManagerDelegateJni.get().stopApplyingCloudPolicy(
this, mNativeChromeSigninManagerDelegate);
}
@Override
public void enableSync(Account account) {
// Cache the signed-in account name. This must be done after the native call, otherwise
// sync tries to start without being signed in natively and crashes.
mAndroidSyncSettings.updateAccount(account);
mAndroidSyncSettings.enableChromeSync();
}
@Override
public void disableSyncAndWipeData(
boolean isManagedOrForceWipe, final Runnable wipeDataCallback) {
mAndroidSyncSettings.updateAccount(null);
if (isManagedOrForceWipe) {
ChromeSigninManagerDelegateJni.get().wipeProfileData(
this, mNativeChromeSigninManagerDelegate, wipeDataCallback);
} else {
ChromeSigninManagerDelegateJni.get().wipeGoogleServiceWorkerCaches(
this, mNativeChromeSigninManagerDelegate, wipeDataCallback);
}
}
// Native methods.
@NativeMethods
interface Natives {
void fetchAndApplyCloudPolicy(@JCaller ChromeSigninManagerDelegate self,
long nativeChromeSigninManagerDelegate, String username, Runnable callback);
void stopApplyingCloudPolicy(
@JCaller ChromeSigninManagerDelegate self, long nativeChromeSigninManagerDelegate);
void isAccountManaged(@JCaller ChromeSigninManagerDelegate self,
long nativeChromeSigninManagerDelegate, String username,
Callback<Boolean> callback);
String getManagementDomain(
@JCaller ChromeSigninManagerDelegate self, long nativeChromeSigninManagerDelegate);
void wipeProfileData(@JCaller ChromeSigninManagerDelegate self,
long nativeChromeSigninManagerDelegate, Runnable callback);
void wipeGoogleServiceWorkerCaches(@JCaller ChromeSigninManagerDelegate self,
long nativeChromeSigninManagerDelegate, Runnable callback);
}
}
// Copyright 2019 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.
package org.chromium.chrome.browser.signin;
import android.accounts.Account;
import android.app.Activity;
import android.content.Context;
import org.chromium.base.Callback;
/**
* Interface providing SigninManager access to dependencies that are not part of the SignIn
* component. This interface interacts with //chrome features such as Policy, Sync, data wiping,
* Google Play services.
*/
public interface SigninManagerDelegate {
/**
* If there is no Google Play Services available, ask the user to fix by showing either a
* notification or a modal dialog
* @param activity The activity used to open the dialog, or null to use notifications
* @param cancelable Whether the dialog can be canceled
*/
void handleGooglePlayServicesUnavailability(Activity activity, boolean cancelable);
/**
* @return the management domain if the signed in account is managed, otherwise null.
*/
String getManagementDomain();
/**
* @return Whether the device has Google Play Services.
*/
boolean isGooglePlayServicesPresent(Context context);
/**
* Verifies if the account is managed. Callback may be called either synchronously or
* asynchronously depending on the availability of the result.
* @param email An email of the account.
* @param callback The callback that will receive true if the account is managed, false
* otherwise.
*/
void isAccountManaged(String email, final Callback<Boolean> callback);
/**
* Interact with the UserPolicySigninService to retrieve the user policy.
* @param username (email) of the user signing in.
* @param callback The callback called once the policy is retrieved and applied
*/
void fetchAndApplyCloudPolicy(String username, Runnable callback);
/**
* Perform the required cloud policy cleanup when a signin is aborted.
*/
void stopApplyingCloudPolicy();
/**
* Called AFTER native sign-in is complete, enabling Sync.
* @param account to be used by sync
*/
void enableSync(Account account);
/**
* Called AFTER native sign-out is complete, this method clears various
* account and profile data associated with the previous signin and aborts sync.
* @param isManagedOrForceWipe if the account is managed or force wipe enabled, which triggers a
* different cleanup flow
* @param wipeDataCallback to be called once profile data cleanup is complete
*/
void disableSyncAndWipeData(boolean isManagedOrForceWipe, Runnable wipeDataCallback);
}
// Copyright 2019 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.
package org.chromium.chrome.browser.signin;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
import org.chromium.components.sync.AndroidSyncSettings;
import org.chromium.components.sync.test.util.MockSyncContentResolverDelegate;
/** Tests for {@link ChromeSigninManagerDelegate}. */
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class ChromeSigninManagerDelegateTest {
@Rule
public JniMocker mocker = new JniMocker();
@Mock
ChromeSigninManagerDelegate.Natives mNativeMock;
private ChromeSigninManagerDelegate mDelegate;
@Before
public void setUp() {
initMocks(this);
mocker.mock(ChromeSigninManagerDelegateJni.TEST_HOOKS, mNativeMock);
// SigninManager interacts with AndroidSyncSettings, but its not the focus
// of this test. Using MockSyncContentResolver reduces burden of test setup.
AndroidSyncSettings.overrideForTests(new MockSyncContentResolverDelegate(), null);
mDelegate = new ChromeSigninManagerDelegate(0, AndroidSyncSettings.get());
}
@Test
public void signOutWithManagedDomain() {
// Stub out various native calls. Some of these are verified as never called
// and those stubs simply allow that verification to catch any issues.
doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
// Simulate call from SigninManager
mDelegate.disableSyncAndWipeData(true, null);
// Sign-out should only clear the profile when the user is managed.
verify(mNativeMock, times(1)).wipeProfileData(any(), anyLong(), any());
verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
}
@Test
public void signOutWithNullDomain() {
// Stub out various native calls. Some of these are verified as never called
// and those stubs simply allow that verification to catch any issues.
doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
// Simulate call from SigninManager
mDelegate.disableSyncAndWipeData(false, null);
// Sign-out should only clear the service worker cache when the user is not managed.
verify(mNativeMock, never()).wipeProfileData(any(), anyLong(), any());
verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
}
}
...@@ -2596,13 +2596,10 @@ jumbo_split_static_library("browser") { ...@@ -2596,13 +2596,10 @@ jumbo_split_static_library("browser") {
"android/shortcut_helper.h", "android/shortcut_helper.h",
"android/shortcut_info.cc", "android/shortcut_info.cc",
"android/shortcut_info.h", "android/shortcut_info.h",
"android/signin/chrome_signin_manager_delegate.cc",
"android/signin/chrome_signin_manager_delegate.h",
"android/signin/signin_investigator_android.cc", "android/signin/signin_investigator_android.cc",
"android/signin/signin_investigator_android.h", "android/signin/signin_investigator_android.h",
"android/signin/signin_manager_android.cc", "android/signin/signin_manager_android.cc",
"android/signin/signin_manager_android.h", "android/signin/signin_manager_android.h",
"android/signin/signin_manager_delegate.h",
"android/signin/signin_promo_util_android.cc", "android/signin/signin_promo_util_android.cc",
"android/signin/signin_promo_util_android.h", "android/signin/signin_promo_util_android.h",
"android/signin/signin_utils.cc", "android/signin/signin_utils.cc",
......
// Copyright 2019 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_ANDROID_SIGNIN_CHROME_SIGNIN_MANAGER_DELEGATE_H_
#define CHROME_BROWSER_ANDROID_SIGNIN_CHROME_SIGNIN_MANAGER_DELEGATE_H_
#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/android/signin/signin_manager_delegate.h"
#include "components/signin/public/identity_manager/account_info.h"
namespace signin {
class IdentityManager;
}
namespace policy {
class UserCloudPolicyManager;
class UserPolicySigninService;
} // namespace policy
class Profile;
// This class provide ChromeSigninManagerDelegate.java access to the native
// dependencies.
class ChromeSigninManagerDelegate : public SigninManagerDelegate {
public:
ChromeSigninManagerDelegate();
~ChromeSigninManagerDelegate() override;
base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override;
// Registers a CloudPolicyClient for fetching policy for a user and fetches
// the policy if necessary.
void FetchAndApplyCloudPolicy(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& username,
const base::android::JavaParamRef<jobject>& j_callback);
void StopApplyingCloudPolicy(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void IsAccountManaged(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_username,
const base::android::JavaParamRef<jobject>& j_callback);
base::android::ScopedJavaLocalRef<jstring> GetManagementDomain(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Delete all data for this profile.
void WipeProfileData(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback);
// Delete service worker caches for google.<eTLD>.
void WipeGoogleServiceWorkerCaches(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback);
private:
friend class ChromeSigninManagerDelegateTest;
FRIEND_TEST_ALL_PREFIXES(ChromeSigninManagerDelegateTest,
DeleteGoogleServiceWorkerCaches);
struct ManagementCredentials {
ManagementCredentials(const std::string& dm_token,
const std::string& client_id)
: dm_token(dm_token), client_id(client_id) {}
const std::string dm_token;
const std::string client_id;
};
using RegisterPolicyWithAccountCallback = base::OnceCallback<void(
const base::Optional<ManagementCredentials>& credentials)>;
ChromeSigninManagerDelegate(const ChromeSigninManagerDelegate&) = delete;
ChromeSigninManagerDelegate& operator=(const ChromeSigninManagerDelegate&) =
delete;
// If required registers for policy with given account. callback will be
// called with credentials if the account is managed.
void RegisterPolicyWithAccount(const CoreAccountInfo& account,
RegisterPolicyWithAccountCallback callback);
void OnPolicyRegisterDone(
const CoreAccountInfo& account_id,
base::OnceCallback<void()> policy_callback,
const base::Optional<ManagementCredentials>& credentials);
void FetchPolicyBeforeSignIn(const CoreAccountInfo& account_id,
base::OnceCallback<void()> policy_callback,
const ManagementCredentials& credentials);
static void WipeData(Profile* profile,
bool all_data,
base::OnceClosure callback);
Profile* const profile_ = nullptr;
signin::IdentityManager* const identity_manager_ = nullptr;
policy::UserCloudPolicyManager* const user_cloud_policy_manager_ = nullptr;
policy::UserPolicySigninService* const user_policy_signin_service_ = nullptr;
// Java-side ChromeSigninManagerDelegate object.
base::android::ScopedJavaGlobalRef<jobject> java_signin_manager_delegate_;
base::WeakPtrFactory<ChromeSigninManagerDelegate> weak_factory_;
};
#endif // CHROME_BROWSER_ANDROID_SIGNIN_CHROME_SIGNIN_MANAGER_DELEGATE_H_
...@@ -11,13 +11,16 @@ ...@@ -11,13 +11,16 @@
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "chrome/browser/android/signin/signin_manager_delegate.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/prefs/pref_member.h" #include "components/prefs/pref_member.h"
#include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/identity_manager.h"
class SigninClient; namespace policy {
class UserCloudPolicyManager;
class UserPolicySigninService;
} // namespace policy
class Profile;
// Android wrapper of Chrome's C++ identity management code which provides // Android wrapper of Chrome's C++ identity management code which provides
// access from the Java layer. Note that on Android, there's only a single // access from the Java layer. Note that on Android, there's only a single
...@@ -30,11 +33,8 @@ class SigninClient; ...@@ -30,11 +33,8 @@ class SigninClient;
class SigninManagerAndroid : public KeyedService, class SigninManagerAndroid : public KeyedService,
public signin::IdentityManager::Observer { public signin::IdentityManager::Observer {
public: public:
SigninManagerAndroid( SigninManagerAndroid(Profile* profile,
SigninClient* signin_client, signin::IdentityManager* identity_manager);
PrefService* local_state_prefs_service,
signin::IdentityManager* identity_manager,
std::unique_ptr<SigninManagerDelegate> signin_manager_delegate);
~SigninManagerAndroid() override; ~SigninManagerAndroid() override;
...@@ -73,11 +73,75 @@ class SigninManagerAndroid : public KeyedService, ...@@ -73,11 +73,75 @@ class SigninManagerAndroid : public KeyedService,
void OnPrimaryAccountCleared( void OnPrimaryAccountCleared(
const CoreAccountInfo& previous_primary_account_info) override; const CoreAccountInfo& previous_primary_account_info) override;
// Registers a CloudPolicyClient for fetching policy for a user and fetches
// the policy if necessary.
void FetchAndApplyCloudPolicy(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& username,
const base::android::JavaParamRef<jobject>& j_callback);
void StopApplyingCloudPolicy(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
void IsAccountManaged(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& j_username,
const base::android::JavaParamRef<jobject>& j_callback);
base::android::ScopedJavaLocalRef<jstring> GetManagementDomain(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Delete all data for this profile.
void WipeProfileData(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback);
// Delete service worker caches for google.<eTLD>.
void WipeGoogleServiceWorkerCaches(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_callback);
private: private:
friend class SigninManagerAndroidTest;
FRIEND_TEST_ALL_PREFIXES(SigninManagerAndroidTest,
DeleteGoogleServiceWorkerCaches);
void OnSigninAllowedPrefChanged() const; void OnSigninAllowedPrefChanged() const;
bool IsSigninAllowed() const; bool IsSigninAllowed() const;
SigninClient* signin_client_; struct ManagementCredentials {
ManagementCredentials(const std::string& dm_token,
const std::string& client_id)
: dm_token(dm_token), client_id(client_id) {}
const std::string dm_token;
const std::string client_id;
};
using RegisterPolicyWithAccountCallback = base::OnceCallback<void(
const base::Optional<ManagementCredentials>& credentials)>;
// If required registers for policy with given account. callback will be
// called with credentials if the account is managed.
void RegisterPolicyWithAccount(const CoreAccountInfo& account,
RegisterPolicyWithAccountCallback callback);
void OnPolicyRegisterDone(
const CoreAccountInfo& account_id,
base::OnceCallback<void()> policy_callback,
const base::Optional<ManagementCredentials>& credentials);
void FetchPolicyBeforeSignIn(const CoreAccountInfo& account_id,
base::OnceCallback<void()> policy_callback,
const ManagementCredentials& credentials);
static void WipeData(Profile* profile,
bool all_data,
base::OnceClosure callback);
Profile* const profile_ = nullptr;
// Handler for prefs::kSigninAllowed set in user's profile. // Handler for prefs::kSigninAllowed set in user's profile.
BooleanPrefMember signin_allowed_; BooleanPrefMember signin_allowed_;
...@@ -86,15 +150,17 @@ class SigninManagerAndroid : public KeyedService, ...@@ -86,15 +150,17 @@ class SigninManagerAndroid : public KeyedService,
// State, not in user prefs. // State, not in user prefs.
BooleanPrefMember force_browser_signin_; BooleanPrefMember force_browser_signin_;
signin::IdentityManager* identity_manager_; signin::IdentityManager* const identity_manager_ = nullptr;
policy::UserCloudPolicyManager* const user_cloud_policy_manager_ = nullptr;
std::unique_ptr<SigninManagerDelegate> signin_manager_delegate_; policy::UserPolicySigninService* const user_policy_signin_service_ = nullptr;
// Java-side SigninManager object. // Java-side SigninManager object.
base::android::ScopedJavaGlobalRef<jobject> java_signin_manager_; base::android::ScopedJavaGlobalRef<jobject> java_signin_manager_;
base::ThreadChecker thread_checker_; base::ThreadChecker thread_checker_;
base::WeakPtrFactory<SigninManagerAndroid> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(SigninManagerAndroid); DISALLOW_COPY_AND_ASSIGN(SigninManagerAndroid);
}; };
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome_signin_manager_delegate.h" #include "signin_manager_android.h"
#include <memory> #include <memory>
#include <set> #include <set>
...@@ -50,11 +50,11 @@ std::unique_ptr<KeyedService> BuildOfflinePageModel(SimpleFactoryKey* key) { ...@@ -50,11 +50,11 @@ std::unique_ptr<KeyedService> BuildOfflinePageModel(SimpleFactoryKey* key) {
} // namespace } // namespace
class ChromeSigninManagerDelegateTest : public ::testing::Test { class SigninManagerAndroidTest : public ::testing::Test {
public: public:
ChromeSigninManagerDelegateTest() SigninManagerAndroidTest()
: profile_manager_(TestingBrowserProcess::GetGlobal()) {} : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
~ChromeSigninManagerDelegateTest() override {} ~SigninManagerAndroidTest() override {}
void SetUp() override { void SetUp() override {
ASSERT_TRUE(profile_manager_.SetUp()); ASSERT_TRUE(profile_manager_.SetUp());
...@@ -92,8 +92,8 @@ class ChromeSigninManagerDelegateTest : public ::testing::Test { ...@@ -92,8 +92,8 @@ class ChromeSigninManagerDelegateTest : public ::testing::Test {
// Calls SigninManager::WipeData(|all_data|) and waits for its completion. // Calls SigninManager::WipeData(|all_data|) and waits for its completion.
void WipeData(bool all_data) { void WipeData(bool all_data) {
std::unique_ptr<base::RunLoop> run_loop(new base::RunLoop()); std::unique_ptr<base::RunLoop> run_loop(new base::RunLoop());
ChromeSigninManagerDelegate::WipeData(profile(), all_data, SigninManagerAndroid::WipeData(profile(), all_data,
run_loop->QuitClosure()); run_loop->QuitClosure());
run_loop->Run(); run_loop->Run();
} }
...@@ -102,14 +102,13 @@ class ChromeSigninManagerDelegateTest : public ::testing::Test { ...@@ -102,14 +102,13 @@ class ChromeSigninManagerDelegateTest : public ::testing::Test {
TestingProfileManager profile_manager_; TestingProfileManager profile_manager_;
TestingProfile* profile_; // Owned by |profile_manager_|. TestingProfile* profile_; // Owned by |profile_manager_|.
DISALLOW_COPY_AND_ASSIGN(ChromeSigninManagerDelegateTest); DISALLOW_COPY_AND_ASSIGN(SigninManagerAndroidTest);
}; };
// TODO(crbug.com/929456): This test does not actually test anything; the // TODO(crbug.com/929456): This test does not actually test anything; the
// CannedBrowsingDataCacheStorageHelper isn't hooked up to observe any // CannedBrowsingDataCacheStorageHelper isn't hooked up to observe any
// deletions. Disabled to allow refactoring of browsing data code. // deletions. Disabled to allow refactoring of browsing data code.
TEST_F(ChromeSigninManagerDelegateTest, TEST_F(SigninManagerAndroidTest, DISABLED_DeleteGoogleServiceWorkerCaches) {
DISABLED_DeleteGoogleServiceWorkerCaches) {
struct TestCase { struct TestCase {
std::string worker_url; std::string worker_url;
bool should_be_deleted; bool should_be_deleted;
...@@ -147,9 +146,9 @@ TEST_F(ChromeSigninManagerDelegateTest, ...@@ -147,9 +146,9 @@ TEST_F(ChromeSigninManagerDelegateTest,
// Delete service workers and wait for completion. // Delete service workers and wait for completion.
base::RunLoop run_loop; base::RunLoop run_loop;
ChromeSigninManagerDelegate::WipeData( SigninManagerAndroid::WipeData(profile(),
profile(), false /* only Google service worker caches */, false /* only Google service worker caches */,
run_loop.QuitClosure()); run_loop.QuitClosure());
run_loop.Run(); run_loop.Run();
// Test whether the correct service worker caches were deleted. // Test whether the correct service worker caches were deleted.
...@@ -168,7 +167,7 @@ TEST_F(ChromeSigninManagerDelegateTest, ...@@ -168,7 +167,7 @@ TEST_F(ChromeSigninManagerDelegateTest,
} }
// Tests that wiping all data also deletes bookmarks. // Tests that wiping all data also deletes bookmarks.
TEST_F(ChromeSigninManagerDelegateTest, DeleteBookmarksWhenWipingAllData) { TEST_F(SigninManagerAndroidTest, DeleteBookmarksWhenWipingAllData) {
bookmarks::BookmarkModel* bookmark_model = AddTestBookmarks(); bookmarks::BookmarkModel* bookmark_model = AddTestBookmarks();
ASSERT_GE(bookmark_model->bookmark_bar_node()->children().size(), 0u); ASSERT_GE(bookmark_model->bookmark_bar_node()->children().size(), 0u);
WipeData(true); WipeData(true);
...@@ -176,8 +175,7 @@ TEST_F(ChromeSigninManagerDelegateTest, DeleteBookmarksWhenWipingAllData) { ...@@ -176,8 +175,7 @@ TEST_F(ChromeSigninManagerDelegateTest, DeleteBookmarksWhenWipingAllData) {
} }
// Tests that wiping Google service worker caches does not delete bookmarks. // Tests that wiping Google service worker caches does not delete bookmarks.
TEST_F(ChromeSigninManagerDelegateTest, TEST_F(SigninManagerAndroidTest, DontDeleteBookmarksWhenDeletingSWCaches) {
DontDeleteBookmarksWhenDeletingSWCaches) {
bookmarks::BookmarkModel* bookmark_model = AddTestBookmarks(); bookmarks::BookmarkModel* bookmark_model = AddTestBookmarks();
size_t num_bookmarks = bookmark_model->bookmark_bar_node()->children().size(); size_t num_bookmarks = bookmark_model->bookmark_bar_node()->children().size();
ASSERT_GE(num_bookmarks, 0u); ASSERT_GE(num_bookmarks, 0u);
......
// Copyright 2019 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_ANDROID_SIGNIN_SIGNIN_MANAGER_DELEGATE_H_
#define CHROME_BROWSER_ANDROID_SIGNIN_SIGNIN_MANAGER_DELEGATE_H_
#include "base/android/scoped_java_ref.h"
// This class provides SigninManager.java access to dependencies on
// chrome/browser through its derivated class ChromeSigninManagerDelegate and
// the java counterparts SigninManagerDelegate.java and
// ChromeSigninManagerDelegate.java.
class SigninManagerDelegate {
public:
virtual base::android::ScopedJavaLocalRef<jobject> GetJavaObject() = 0;
SigninManagerDelegate() = default;
virtual ~SigninManagerDelegate() = default;
SigninManagerDelegate(const SigninManagerDelegate&) = delete;
SigninManagerDelegate& operator=(const SigninManagerDelegate&) = delete;
};
#endif // CHROME_BROWSER_ANDROID_SIGNIN_SIGNIN_MANAGER_DELEGATE_H_
...@@ -4,11 +4,8 @@ ...@@ -4,11 +4,8 @@
#include "chrome/browser/signin/signin_manager_android_factory.h" #include "chrome/browser/signin/signin_manager_android_factory.h"
#include "chrome/browser/android/signin/chrome_signin_manager_delegate.h"
#include "chrome/browser/android/signin/signin_manager_android.h" #include "chrome/browser/android/signin/signin_manager_android.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/chrome_signin_client_factory.h"
#include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/identity_manager_factory.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
...@@ -38,12 +35,7 @@ SigninManagerAndroidFactory* SigninManagerAndroidFactory::GetInstance() { ...@@ -38,12 +35,7 @@ SigninManagerAndroidFactory* SigninManagerAndroidFactory::GetInstance() {
KeyedService* SigninManagerAndroidFactory::BuildServiceInstanceFor( KeyedService* SigninManagerAndroidFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const { content::BrowserContext* context) const {
Profile* profile = Profile::FromBrowserContext(context); Profile* profile = Profile::FromBrowserContext(context);
auto* signin_client = ChromeSigninClientFactory::GetForProfile(profile);
auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
auto signin_manager_delegate =
std::make_unique<ChromeSigninManagerDelegate>();
return new SigninManagerAndroid( return new SigninManagerAndroid(profile, identity_manager);
signin_client, g_browser_process->local_state(), identity_manager,
std::move(signin_manager_delegate));
} }
...@@ -2764,7 +2764,7 @@ test("unit_tests") { ...@@ -2764,7 +2764,7 @@ test("unit_tests") {
"../browser/android/preferences/pref_service_bridge_unittest.cc", "../browser/android/preferences/pref_service_bridge_unittest.cc",
"../browser/android/preferences/prefs_unittest.cc", "../browser/android/preferences/prefs_unittest.cc",
"../browser/android/shortcut_info_unittest.cc", "../browser/android/shortcut_info_unittest.cc",
"../browser/android/signin/chrome_signin_manager_delegate_unittest.cc", "../browser/android/signin/signin_manager_android_unittest.cc",
"../browser/android/thumbnail/scoped_ptr_expiring_cache_unittest.cc", "../browser/android/thumbnail/scoped_ptr_expiring_cache_unittest.cc",
"../browser/android/usage_stats/usage_stats_database_unittest.cc", "../browser/android/usage_stats/usage_stats_database_unittest.cc",
"../browser/android/webapk/webapk_icon_hasher_unittest.cc", "../browser/android/webapk/webapk_icon_hasher_unittest.cc",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment