Commit de977289 authored by Abhishek Arya's avatar Abhishek Arya Committed by Commit Bot

Revert "[Signin][Android] Add Java side of ConsistencyCookieManager"

This reverts commit e646c056.

Reason for revert: Broke UBSan vptr and Boris is OOO till early May.

Original change's description:
> [Signin][Android] Add Java side of ConsistencyCookieManager
> 
> Adds ConsistencyCookieManager Java class that listens to
> AccountManagerFacade.isUpdatePending and exposes it to the C++ code.
> 
> Bug: 949562
> Change-Id: Ifc375bed3d0d878d89d106807f44f4e7807db999
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1565880
> Commit-Queue: David Roger <droger@chromium.org>
> Reviewed-by: David Roger <droger@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#652073}

TBR=droger@chromium.org,bsazonov@chromium.org

Change-Id: Id672685a05ecea8dcd2bee210369faa9a207c35d
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 949562
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1573860Reviewed-by: default avatarAbhishek Arya <inferno@chromium.org>
Commit-Queue: Abhishek Arya <inferno@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652203}
parent b9d12b3e
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include "components/signin/core/browser/account_consistency_method.h" #include "components/signin/core/browser/account_consistency_method.h"
#include "components/signin/core/browser/account_reconcilor.h" #include "components/signin/core/browser/account_reconcilor.h"
#include "components/signin/core/browser/account_reconcilor_delegate.h" #include "components/signin/core/browser/account_reconcilor_delegate.h"
#include "components/signin/core/browser/consistency_cookie_manager_base.h"
#include "components/signin/core/browser/mirror_account_reconcilor_delegate.h" #include "components/signin/core/browser/mirror_account_reconcilor_delegate.h"
#include "components/signin/core/browser/signin_buildflags.h" #include "components/signin/core/browser/signin_buildflags.h"
...@@ -34,7 +33,6 @@ ...@@ -34,7 +33,6 @@
#endif #endif
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "components/signin/core/browser/consistency_cookie_manager_android.h"
#include "components/signin/core/browser/mice_account_reconcilor_delegate.h" #include "components/signin/core/browser/mice_account_reconcilor_delegate.h"
#endif #endif
...@@ -140,14 +138,11 @@ AccountReconcilorFactory* AccountReconcilorFactory::GetInstance() { ...@@ -140,14 +138,11 @@ AccountReconcilorFactory* AccountReconcilorFactory::GetInstance() {
KeyedService* AccountReconcilorFactory::BuildServiceInstanceFor( KeyedService* AccountReconcilorFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const { content::BrowserContext* context) const {
Profile* profile = Profile::FromBrowserContext(context); Profile* profile = Profile::FromBrowserContext(context);
SigninClient* signin_client =
ChromeSigninClientFactory::GetForProfile(profile);
AccountReconcilor* reconcilor = new AccountReconcilor( AccountReconcilor* reconcilor = new AccountReconcilor(
IdentityManagerFactory::GetForProfile(profile), signin_client, IdentityManagerFactory::GetForProfile(profile),
ChromeSigninClientFactory::GetForProfile(profile),
CreateAccountReconcilorDelegate(profile)); CreateAccountReconcilorDelegate(profile));
reconcilor->Initialize(true /* start_reconcile_if_tokens_available */); reconcilor->Initialize(true /* start_reconcile_if_tokens_available */);
reconcilor->SetConsistencyCookieManager(
CreateConsistencyCookieManager(signin_client, reconcilor));
return reconcilor; return reconcilor;
} }
...@@ -200,16 +195,3 @@ AccountReconcilorFactory::CreateAccountReconcilorDelegate(Profile* profile) { ...@@ -200,16 +195,3 @@ AccountReconcilorFactory::CreateAccountReconcilorDelegate(Profile* profile) {
NOTREACHED(); NOTREACHED();
return nullptr; return nullptr;
} }
std::unique_ptr<signin::ConsistencyCookieManagerBase>
AccountReconcilorFactory::CreateConsistencyCookieManager(
SigninClient* signin_client,
AccountReconcilor* account_reconcilor) const {
#if defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(signin::kMiceFeature)) {
return std::make_unique<signin::ConsistencyCookieManagerAndroid>(
signin_client, account_reconcilor);
}
#endif
return nullptr;
}
...@@ -12,12 +12,10 @@ ...@@ -12,12 +12,10 @@
namespace signin { namespace signin {
class AccountReconcilorDelegate; class AccountReconcilorDelegate;
class ConsistencyCookieManagerBase;
} }
class AccountReconcilor; class AccountReconcilor;
class Profile; class Profile;
class SigninClient;
// Singleton that owns all AccountReconcilors and associates them with // Singleton that owns all AccountReconcilors and associates them with
// Profiles. Listens for the Profile's destruction notification and cleans up. // Profiles. Listens for the Profile's destruction notification and cleans up.
...@@ -45,10 +43,6 @@ class AccountReconcilorFactory : public BrowserContextKeyedServiceFactory { ...@@ -45,10 +43,6 @@ class AccountReconcilorFactory : public BrowserContextKeyedServiceFactory {
// BrowserContextKeyedServiceFactory: // BrowserContextKeyedServiceFactory:
KeyedService* BuildServiceInstanceFor( KeyedService* BuildServiceInstanceFor(
content::BrowserContext* profile) const override; content::BrowserContext* profile) const override;
std::unique_ptr<signin::ConsistencyCookieManagerBase>
CreateConsistencyCookieManager(SigninClient* signin_client,
AccountReconcilor* account_reconcilor) const;
}; };
#endif // CHROME_BROWSER_SIGNIN_ACCOUNT_RECONCILOR_FACTORY_H_ #endif // CHROME_BROWSER_SIGNIN_ACCOUNT_RECONCILOR_FACTORY_H_
...@@ -134,6 +134,8 @@ static_library("browser") { ...@@ -134,6 +134,8 @@ static_library("browser") {
"account_reconcilor_delegate.h", "account_reconcilor_delegate.h",
"chrome_connected_header_helper.cc", "chrome_connected_header_helper.cc",
"chrome_connected_header_helper.h", "chrome_connected_header_helper.h",
"consistency_cookie_manager_android.cc",
"consistency_cookie_manager_android.h",
"cookie_settings_util.cc", "cookie_settings_util.cc",
"cookie_settings_util.h", "cookie_settings_util.h",
"dice_account_reconcilor_delegate.cc", "dice_account_reconcilor_delegate.cc",
...@@ -208,16 +210,6 @@ static_library("browser") { ...@@ -208,16 +210,6 @@ static_library("browser") {
] ]
} }
if (is_android) {
sources += [
"consistency_cookie_manager_android.cc",
"consistency_cookie_manager_android.h",
"consistency_cookie_manager_base.cc",
"consistency_cookie_manager_base.h",
]
deps += [ "android:jni_headers" ]
}
if (!enable_dice_support) { if (!enable_dice_support) {
sources -= [ sources -= [
"dice_account_reconcilor_delegate.cc", "dice_account_reconcilor_delegate.cc",
...@@ -271,6 +263,7 @@ source_set("unit_tests") { ...@@ -271,6 +263,7 @@ source_set("unit_tests") {
"account_reconcilor_unittest.cc", "account_reconcilor_unittest.cc",
"account_tracker_service_unittest.cc", "account_tracker_service_unittest.cc",
"avatar_icon_util_unittest.cc", "avatar_icon_util_unittest.cc",
"consistency_cookie_manager_android_unittest.cc",
"device_id_helper_unittest.cc", "device_id_helper_unittest.cc",
"dice_account_reconcilor_delegate_unittest.cc", "dice_account_reconcilor_delegate_unittest.cc",
"gaia_cookie_manager_service_unittest.cc", "gaia_cookie_manager_service_unittest.cc",
...@@ -320,10 +313,6 @@ source_set("unit_tests") { ...@@ -320,10 +313,6 @@ source_set("unit_tests") {
deps += [ "//chromeos/components/account_manager" ] deps += [ "//chromeos/components/account_manager" ]
} }
if (is_android) {
sources += [ "consistency_cookie_manager_unittest.cc" ]
}
if (!enable_dice_support) { if (!enable_dice_support) {
sources -= [ "dice_account_reconcilor_delegate_unittest.cc" ] sources -= [ "dice_account_reconcilor_delegate_unittest.cc" ]
} }
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "components/signin/core/browser/account_consistency_method.h" #include "components/signin/core/browser/account_consistency_method.h"
#include "components/signin/core/browser/account_reconcilor_delegate.h" #include "components/signin/core/browser/account_reconcilor_delegate.h"
#include "components/signin/core/browser/consistency_cookie_manager_base.h"
#include "components/signin/core/browser/signin_buildflags.h" #include "components/signin/core/browser/signin_buildflags.h"
#include "components/signin/core/browser/signin_client.h" #include "components/signin/core/browser/signin_client.h"
#include "components/signin/core/browser/signin_metrics.h" #include "components/signin/core/browser/signin_metrics.h"
...@@ -233,12 +232,16 @@ void AccountReconcilor::Initialize(bool start_reconcile_if_tokens_available) { ...@@ -233,12 +232,16 @@ void AccountReconcilor::Initialize(bool start_reconcile_if_tokens_available) {
if (start_reconcile_if_tokens_available && IsIdentityManagerReady()) if (start_reconcile_if_tokens_available && IsIdentityManagerReady())
StartReconcile(); StartReconcile();
} }
}
void AccountReconcilor::SetConsistencyCookieManager( #if defined(OS_ANDROID)
std::unique_ptr<signin::ConsistencyCookieManagerBase> // The ConsistencyCookieManager is not created earlier, because it requires
consistency_cookie_manager) { // the reconcilor state to be initialized.
consistency_cookie_manager_ = std::move(consistency_cookie_manager); if (base::FeatureList::IsEnabled(signin::kMiceFeature)) {
consistency_cookie_manager_ =
std::make_unique<signin::ConsistencyCookieManagerAndroid>(client_,
this);
}
#endif
} }
#if defined(OS_IOS) #if defined(OS_IOS)
......
...@@ -34,7 +34,10 @@ extern const base::Feature kUseMultiloginEndpoint; ...@@ -34,7 +34,10 @@ extern const base::Feature kUseMultiloginEndpoint;
namespace signin { namespace signin {
class AccountReconcilorDelegate; class AccountReconcilorDelegate;
class ConsistencyCookieManagerBase;
#if defined(OS_ANDROID)
class ConsistencyCookieManagerAndroid;
#endif
} }
class SigninClient; class SigninClient;
...@@ -102,10 +105,6 @@ class AccountReconcilor : public KeyedService, ...@@ -102,10 +105,6 @@ class AccountReconcilor : public KeyedService,
// construction. // construction.
void Initialize(bool start_reconcile_if_tokens_available); void Initialize(bool start_reconcile_if_tokens_available);
void SetConsistencyCookieManager(
std::unique_ptr<signin::ConsistencyCookieManagerBase>
consistency_cookie_manager);
#if defined(OS_IOS) #if defined(OS_IOS)
// Sets the WKHTTPSystemCookieStore flag value. // Sets the WKHTTPSystemCookieStore flag value.
void SetIsWKHTTPSystemCookieStoreEnabled(bool is_enabled); void SetIsWKHTTPSystemCookieStoreEnabled(bool is_enabled);
...@@ -394,8 +393,10 @@ class AccountReconcilor : public KeyedService, ...@@ -394,8 +393,10 @@ class AccountReconcilor : public KeyedService,
bool is_wkhttp_system_cookie_store_enabled_ = false; bool is_wkhttp_system_cookie_store_enabled_ = false;
#endif // defined(OS_IOS) #endif // defined(OS_IOS)
std::unique_ptr<signin::ConsistencyCookieManagerBase> #if defined(OS_ANDROID)
std::unique_ptr<signin::ConsistencyCookieManagerAndroid>
consistency_cookie_manager_; consistency_cookie_manager_;
#endif
base::WeakPtrFactory<AccountReconcilor> weak_factory_; base::WeakPtrFactory<AccountReconcilor> weak_factory_;
......
...@@ -8,7 +8,6 @@ generate_jni("jni_headers") { ...@@ -8,7 +8,6 @@ generate_jni("jni_headers") {
sources = [ sources = [
"java/src/org/chromium/components/signin/AccountTrackerService.java", "java/src/org/chromium/components/signin/AccountTrackerService.java",
"java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java", "java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java",
"java/src/org/chromium/components/signin/ConsistencyCookieManager.java",
"java/src/org/chromium/components/signin/OAuth2TokenService.java", "java/src/org/chromium/components/signin/OAuth2TokenService.java",
] ]
jni_package = "components/signin" jni_package = "components/signin"
...@@ -20,7 +19,6 @@ android_library("java") { ...@@ -20,7 +19,6 @@ android_library("java") {
"$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_base_java",
"$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_basement_java",
"//base:base_java", "//base:base_java",
"//base:jni_java",
"//net/android:net_java", "//net/android:net_java",
"//third_party/android_deps:android_support_v4_java", "//third_party/android_deps:android_support_v4_java",
"//third_party/android_deps:com_android_support_support_annotations_java", "//third_party/android_deps:com_android_support_support_annotations_java",
...@@ -38,7 +36,6 @@ android_library("java") { ...@@ -38,7 +36,6 @@ android_library("java") {
"java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java", "java/src/org/chromium/components/signin/ChildAccountInfoFetcher.java",
"java/src/org/chromium/components/signin/ChildAccountStatus.java", "java/src/org/chromium/components/signin/ChildAccountStatus.java",
"java/src/org/chromium/components/signin/ChromeSigninController.java", "java/src/org/chromium/components/signin/ChromeSigninController.java",
"java/src/org/chromium/components/signin/ConsistencyCookieManager.java",
"java/src/org/chromium/components/signin/GmsAvailabilityException.java", "java/src/org/chromium/components/signin/GmsAvailabilityException.java",
"java/src/org/chromium/components/signin/GmsJustUpdatedException.java", "java/src/org/chromium/components/signin/GmsJustUpdatedException.java",
"java/src/org/chromium/components/signin/util/PatternMatcher.java", "java/src/org/chromium/components/signin/util/PatternMatcher.java",
...@@ -48,8 +45,6 @@ android_library("java") { ...@@ -48,8 +45,6 @@ android_library("java") {
"java/src/org/chromium/components/signin/ProfileDataSource.java", "java/src/org/chromium/components/signin/ProfileDataSource.java",
"java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java", "java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java",
] ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
} }
junit_binary("components_signin_junit_tests") { junit_binary("components_signin_junit_tests") {
......
// 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.components.signin;
import android.support.annotation.MainThread;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
/**
* Created by native code to get status of {@link AccountManagerFacade#isUpdatePending()} and
* notifications when it changes.
*/
public class ConsistencyCookieManager implements ObservableValue.Observer {
private final long mNativeConsistencyCookieManager;
private final AccountManagerFacade mAccountManagerFacade;
private boolean mIsUpdatePending;
private ConsistencyCookieManager(long nativeConsistencyCookieManager) {
ThreadUtils.assertOnUiThread();
mNativeConsistencyCookieManager = nativeConsistencyCookieManager;
mAccountManagerFacade = AccountManagerFacade.get();
mAccountManagerFacade.isUpdatePending().addObserver(this);
// TODO(https://crbug.com/949562): Observe ongoing sign-in activities.
mIsUpdatePending = calculateIsUpdatePending();
}
@Override
public void onValueChanged() {
boolean state = calculateIsUpdatePending();
if (mIsUpdatePending == state) return;
mIsUpdatePending = state;
ConsistencyCookieManagerJni.get().onIsUpdatePendingChanged(mNativeConsistencyCookieManager);
}
private boolean calculateIsUpdatePending() {
// TODO(https://crbug.com/949562): Check for ongoing sign-in activities.
return mAccountManagerFacade.isUpdatePending().get();
}
@CalledByNative
@MainThread
private static ConsistencyCookieManager create(long nativeConsistencyCookieManager) {
return new ConsistencyCookieManager(nativeConsistencyCookieManager);
}
@CalledByNative
@MainThread
private void destroy() {
ThreadUtils.assertOnUiThread();
mAccountManagerFacade.isUpdatePending().removeObserver(this);
}
@CalledByNative
@MainThread
private boolean getIsUpdatePending() {
ThreadUtils.assertOnUiThread();
return mIsUpdatePending;
}
@JNINamespace("signin")
@NativeMethods
interface Natives {
void onIsUpdatePendingChanged(long nativeConsistencyCookieManagerAndroid);
}
}
...@@ -4,46 +4,82 @@ ...@@ -4,46 +4,82 @@
#include "components/signin/core/browser/consistency_cookie_manager_android.h" #include "components/signin/core/browser/consistency_cookie_manager_android.h"
#include "jni/ConsistencyCookieManager_jni.h" #include "base/logging.h"
#include "base/time/time.h"
#include "components/signin/core/browser/signin_client.h"
#include "google_apis/gaia/gaia_urls.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_options.h"
#include "services/network/public/mojom/cookie_manager.mojom.h"
#include "url/gurl.h"
namespace signin { namespace signin {
namespace {
const char kCookieName[] = "CHROME_ID_CONSISTENCY_STATE";
const char kStateConsistent[] = "Consistent";
const char kStateInconsistent[] = "Inconsistent";
const char kStateUpdating[] = "Updating";
} // namespace
ConsistencyCookieManagerAndroid::ConsistencyCookieManagerAndroid( ConsistencyCookieManagerAndroid::ConsistencyCookieManagerAndroid(
SigninClient* signin_client, SigninClient* signin_client,
AccountReconcilor* reconcilor) AccountReconcilor* reconcilor)
: ConsistencyCookieManagerBase(signin_client, reconcilor) { : account_reconcilor_state_(reconcilor->GetState()),
JNIEnv* env = base::android::AttachCurrentThread(); signin_client_(signin_client),
base::android::ScopedJavaLocalRef<jobject> java_ref = account_reconcilor_observer_(this) {
Java_ConsistencyCookieManager_create(env, DCHECK(signin_client_);
reinterpret_cast<intptr_t>(this)); DCHECK(reconcilor);
java_ref_.Reset(env, java_ref.obj()); account_reconcilor_observer_.Add(reconcilor);
is_update_pending_in_java_ =
Java_ConsistencyCookieManager_getIsUpdatePending(env, java_ref_);
UpdateCookie(); UpdateCookie();
} }
ConsistencyCookieManagerAndroid::~ConsistencyCookieManagerAndroid() { ConsistencyCookieManagerAndroid::~ConsistencyCookieManagerAndroid() = default;
JNIEnv* env = base::android::AttachCurrentThread();
Java_ConsistencyCookieManager_destroy(env, java_ref_);
}
void ConsistencyCookieManagerAndroid::OnIsUpdatePendingChanged( void ConsistencyCookieManagerAndroid::OnStateChanged(
JNIEnv* env, signin_metrics::AccountReconcilorState state) {
const base::android::JavaParamRef<jobject>& java_obj) { if (state == account_reconcilor_state_)
bool is_update_pending_in_java =
Java_ConsistencyCookieManager_getIsUpdatePending(env, java_ref_);
if (is_update_pending_in_java == is_update_pending_in_java_)
return; return;
is_update_pending_in_java_ = is_update_pending_in_java; account_reconcilor_state_ = state;
UpdateCookie(); UpdateCookie();
} }
std::string ConsistencyCookieManagerAndroid::CalculateCookieValue() { void ConsistencyCookieManagerAndroid::UpdateCookie() {
if (is_update_pending_in_java_) { // Compute the new cookie value.
return kStateUpdating; std::string cookie_value;
switch (account_reconcilor_state_) {
case signin_metrics::ACCOUNT_RECONCILOR_OK:
cookie_value = kStateConsistent;
break;
case signin_metrics::ACCOUNT_RECONCILOR_RUNNING:
case signin_metrics::ACCOUNT_RECONCILOR_SCHEDULED:
cookie_value = kStateUpdating;
break;
case signin_metrics::ACCOUNT_RECONCILOR_ERROR:
cookie_value = kStateInconsistent;
break;
case signin_metrics::ACCOUNT_RECONCILOR_HISTOGRAM_COUNT:
NOTREACHED();
break;
} }
return ConsistencyCookieManagerBase::CalculateCookieValue(); DCHECK(!cookie_value.empty());
// Update the cookie with the new value.
network::mojom::CookieManager* cookie_manager =
signin_client_->GetCookieManager();
base::Time now = base::Time::Now();
base::Time expiry = now + base::TimeDelta::FromDays(2 * 365); // Two years.
net::CanonicalCookie cookie(
kCookieName, cookie_value,
"." + GaiaUrls::GetInstance()->gaia_url().host(), /*path=*/"/",
/*creation=*/now, /*expiration=*/expiry, /*last_access=*/now,
/*secure=*/true, /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION,
net::COOKIE_PRIORITY_DEFAULT);
cookie_manager->SetCanonicalCookie(
cookie, "https", net::CookieOptions(),
network::mojom::CookieManager::SetCanonicalCookieCallback());
} }
} // namespace signin } // namespace signin
...@@ -5,33 +5,42 @@ ...@@ -5,33 +5,42 @@
#ifndef COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_ANDROID_H_ #ifndef COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_ANDROID_H_
#define COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_ANDROID_H_ #define COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_ANDROID_H_
#include "base/android/scoped_java_ref.h"
#include "base/macros.h" #include "base/macros.h"
#include "components/signin/core/browser/consistency_cookie_manager_base.h" #include "base/scoped_observer.h"
#include "components/signin/core/browser/account_reconcilor.h"
#include "components/signin/core/browser/signin_metrics.h"
class SigninClient; class SigninClient;
namespace signin { namespace signin {
// ConsistencyCookieManagerAndroid subclasses ConsistencyCookieManagerBase to // The ConsistencyCookieManagerAndroid checks if:
// watch whether there are pending updates to the account list on the Java side. // - the account reconcilor is running
class ConsistencyCookieManagerAndroid : public ConsistencyCookieManagerBase { // - the accounts on the device are updating
// - the user has started to interact with device account settings (from Chrome)
// If one of these conditions is true, then this object sets a cookie on Gaia
// with a "Updating" value.
//
// Otherwise the value of the cookie is "Consistent" if the accounts are
// consistent (web accounts match device accounts) or "Inconsistent".
class ConsistencyCookieManagerAndroid : public AccountReconcilor::Observer {
public: public:
ConsistencyCookieManagerAndroid(SigninClient* signin_client, ConsistencyCookieManagerAndroid(SigninClient* signin_client,
AccountReconcilor* reconcilor); AccountReconcilor* reconcilor);
~ConsistencyCookieManagerAndroid() override; ~ConsistencyCookieManagerAndroid() override;
void OnIsUpdatePendingChanged( private:
JNIEnv* env, // AccountReconcilor::Observer:
const base::android::JavaParamRef<jobject>& java_self); void OnStateChanged(signin_metrics::AccountReconcilorState state) override;
protected: void UpdateCookie();
std::string CalculateCookieValue() override;
private: signin_metrics::AccountReconcilorState account_reconcilor_state_ =
bool is_update_pending_in_java_ = false; signin_metrics::ACCOUNT_RECONCILOR_OK;
base::android::ScopedJavaGlobalRef<jobject> java_ref_; SigninClient* signin_client_ = nullptr;
ScopedObserver<AccountReconcilor, AccountReconcilor::Observer>
account_reconcilor_observer_;
DISALLOW_COPY_AND_ASSIGN(ConsistencyCookieManagerAndroid); DISALLOW_COPY_AND_ASSIGN(ConsistencyCookieManagerAndroid);
}; };
......
...@@ -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 "components/signin/core/browser/consistency_cookie_manager_base.h" #include "components/signin/core/browser/consistency_cookie_manager_android.h"
#include <memory> #include <memory>
#include <string> #include <string>
...@@ -49,19 +49,9 @@ class MockCookieManager ...@@ -49,19 +49,9 @@ class MockCookieManager
network::mojom::CookieManager::SetCanonicalCookieCallback callback)); network::mojom::CookieManager::SetCanonicalCookieCallback callback));
}; };
class FakeConsistencyCookieManager class ConsistencyCookieManagerAndroidTest : public ::testing::Test {
: public signin::ConsistencyCookieManagerBase {
public: public:
FakeConsistencyCookieManager(SigninClient* signin_client, ConsistencyCookieManagerAndroidTest()
AccountReconcilor* reconcilor)
: ConsistencyCookieManagerBase(signin_client, reconcilor) {
UpdateCookie();
}
};
class ConsistencyCookieManagerTest : public ::testing::Test {
public:
ConsistencyCookieManagerTest()
: signin_client_(&pref_service_), : signin_client_(&pref_service_),
identity_test_env_(/*test_url_loader_factory=*/nullptr, identity_test_env_(/*test_url_loader_factory=*/nullptr,
&pref_service_, &pref_service_,
...@@ -75,12 +65,10 @@ class ConsistencyCookieManagerTest : public ::testing::Test { ...@@ -75,12 +65,10 @@ class ConsistencyCookieManagerTest : public ::testing::Test {
reconcilor_ = std::make_unique<AccountReconcilor>( reconcilor_ = std::make_unique<AccountReconcilor>(
identity_test_env_.identity_manager(), &signin_client_, identity_test_env_.identity_manager(), &signin_client_,
std::make_unique<AccountReconcilorDelegate>()); std::make_unique<AccountReconcilorDelegate>());
reconcilor_->Initialize(/*start_reconcile_if_tokens_available=*/false);
} }
~ConsistencyCookieManagerTest() override { reconcilor_->Shutdown(); } ~ConsistencyCookieManagerAndroidTest() override { reconcilor_->Shutdown(); }
SigninClient* signin_client() { return &signin_client_; }
AccountReconcilor* reconcilor() { return reconcilor_.get(); } AccountReconcilor* reconcilor() { return reconcilor_.get(); }
MockCookieManager* mock_cookie_manager() { MockCookieManager* mock_cookie_manager() {
...@@ -102,12 +90,10 @@ class ConsistencyCookieManagerTest : public ::testing::Test { ...@@ -102,12 +90,10 @@ class ConsistencyCookieManagerTest : public ::testing::Test {
}; };
// Tests that the cookie is updated when the account reconcilor state changes. // Tests that the cookie is updated when the account reconcilor state changes.
TEST_F(ConsistencyCookieManagerTest, AccountReconcilorState) { TEST_F(ConsistencyCookieManagerAndroidTest, AccountReconcilorState) {
// AccountReconcilor::Initialize() creates the ConsistencyCookieManager. // AccountReconcilor::Initialize() creates the ConsistencyCookieManager.
mock_cookie_manager()->ExpectSetCookieCall("Consistent"); mock_cookie_manager()->ExpectSetCookieCall("Consistent");
reconcilor()->SetConsistencyCookieManager( reconcilor()->Initialize(/*start_reconcile_if_tokens_available=*/false);
std::make_unique<FakeConsistencyCookieManager>(signin_client(),
reconcilor()));
testing::Mock::VerifyAndClearExpectations(mock_cookie_manager()); testing::Mock::VerifyAndClearExpectations(mock_cookie_manager());
ASSERT_EQ(signin_metrics::ACCOUNT_RECONCILOR_OK, reconcilor()->GetState()); ASSERT_EQ(signin_metrics::ACCOUNT_RECONCILOR_OK, reconcilor()->GetState());
......
// 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.
#include "components/signin/core/browser/consistency_cookie_manager_base.h"
#include "base/logging.h"
#include "base/time/time.h"
#include "components/signin/core/browser/signin_client.h"
#include "google_apis/gaia/gaia_urls.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_options.h"
#include "services/network/public/mojom/cookie_manager.mojom.h"
#include "url/gurl.h"
namespace signin {
const char kCookieName[] = "CHROME_ID_CONSISTENCY_STATE";
const char ConsistencyCookieManagerBase::kStateConsistent[] = "Consistent";
const char ConsistencyCookieManagerBase::kStateInconsistent[] = "Inconsistent";
const char ConsistencyCookieManagerBase::kStateUpdating[] = "Updating";
ConsistencyCookieManagerBase::ConsistencyCookieManagerBase(
SigninClient* signin_client,
AccountReconcilor* reconcilor)
: account_reconcilor_state_(reconcilor->GetState()),
signin_client_(signin_client),
account_reconcilor_observer_(this) {
DCHECK(signin_client_);
DCHECK(reconcilor);
account_reconcilor_observer_.Add(reconcilor);
}
ConsistencyCookieManagerBase::~ConsistencyCookieManagerBase() = default;
void ConsistencyCookieManagerBase::OnStateChanged(
signin_metrics::AccountReconcilorState state) {
if (state == account_reconcilor_state_)
return;
account_reconcilor_state_ = state;
UpdateCookie();
}
std::string ConsistencyCookieManagerBase::CalculateCookieValue() {
switch (account_reconcilor_state_) {
case signin_metrics::ACCOUNT_RECONCILOR_OK:
return kStateConsistent;
case signin_metrics::ACCOUNT_RECONCILOR_RUNNING:
case signin_metrics::ACCOUNT_RECONCILOR_SCHEDULED:
return kStateUpdating;
case signin_metrics::ACCOUNT_RECONCILOR_ERROR:
return kStateInconsistent;
case signin_metrics::ACCOUNT_RECONCILOR_HISTOGRAM_COUNT:
NOTREACHED();
return {};
}
}
void ConsistencyCookieManagerBase::UpdateCookie() {
std::string cookie_value = CalculateCookieValue();
DCHECK(!cookie_value.empty());
// Update the cookie with the new value.
network::mojom::CookieManager* cookie_manager =
signin_client_->GetCookieManager();
base::Time now = base::Time::Now();
base::Time expiry = now + base::TimeDelta::FromDays(2 * 365); // Two years.
net::CanonicalCookie cookie(
kCookieName, cookie_value,
"." + GaiaUrls::GetInstance()->gaia_url().host(), /*path=*/"/",
/*creation=*/now, /*expiration=*/expiry, /*last_access=*/now,
/*secure=*/true, /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION,
net::COOKIE_PRIORITY_DEFAULT);
cookie_manager->SetCanonicalCookie(
cookie, "https", net::CookieOptions(),
network::mojom::CookieManager::SetCanonicalCookieCallback());
}
} // namespace signin
// 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 COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_BASE_H_
#define COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_BASE_H_
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "components/signin/core/browser/account_reconcilor.h"
#include "components/signin/core/browser/signin_metrics.h"
class SigninClient;
namespace signin {
// The ConsistencyCookieManagerBase checks if:
// - the account reconcilor is running
// - the accounts on the device are updating
// - the user has started to interact with device account settings (from Chrome)
// If one of these conditions is true, then this object sets a cookie on Gaia
// with a "Updating" value.
//
// Otherwise the value of the cookie is "Consistent" if the accounts are
// consistent (web accounts match device accounts) or "Inconsistent".
//
// Subclasses have to call UpdateCookie() at the end of the constructor.
class ConsistencyCookieManagerBase : public AccountReconcilor::Observer {
public:
~ConsistencyCookieManagerBase() override;
protected:
static const char kStateConsistent[];
static const char kStateInconsistent[];
static const char kStateUpdating[];
ConsistencyCookieManagerBase(SigninClient* signin_client,
AccountReconcilor* reconcilor);
// Calculates the cookie value solely based on the reconcilor state.
virtual std::string CalculateCookieValue();
// Gets the new value using CalculateCookieValue and sets the cookie.
void UpdateCookie();
private:
// AccountReconcilor::Observer:
void OnStateChanged(signin_metrics::AccountReconcilorState state) override;
signin_metrics::AccountReconcilorState account_reconcilor_state_ =
signin_metrics::ACCOUNT_RECONCILOR_OK;
SigninClient* signin_client_ = nullptr;
ScopedObserver<AccountReconcilor, AccountReconcilor::Observer>
account_reconcilor_observer_;
DISALLOW_COPY_AND_ASSIGN(ConsistencyCookieManagerBase);
};
} // namespace signin
#endif // COMPONENTS_SIGNIN_CORE_BROWSER_CONSISTENCY_COOKIE_MANAGER_BASE_H_
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