| Index: components/suggestions/suggestions_service_impl.cc
|
| diff --git a/components/suggestions/suggestions_service_impl.cc b/components/suggestions/suggestions_service_impl.cc
|
| index 5f30527c68bed1804c66139fcf5e696ebfa879bf..c6fa2383e4a4e40f7b2576d23d790783e64905ca 100644
|
| --- a/components/suggestions/suggestions_service_impl.cc
|
| +++ b/components/suggestions/suggestions_service_impl.cc
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "base/feature_list.h"
|
| #include "base/location.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/metrics/sparse_histogram.h"
|
| #include "base/strings/string_number_conversions.h"
|
| @@ -136,73 +137,23 @@ const int64_t kDefaultExpiryUsec = 168 * base::Time::kMicrosecondsPerHour;
|
|
|
| } // namespace
|
|
|
| -// Helper class for fetching OAuth2 access tokens.
|
| -// To get a token, call |GetAccessToken|. Does not support multiple concurrent
|
| -// token requests, i.e. check |HasPendingRequest| first.
|
| -class SuggestionsServiceImpl::AccessTokenFetcher
|
| - : public OAuth2TokenService::Consumer {
|
| - public:
|
| - using TokenCallback = base::Callback<void(const std::string&)>;
|
| -
|
| - AccessTokenFetcher(const SigninManagerBase* signin_manager,
|
| - OAuth2TokenService* token_service)
|
| - : OAuth2TokenService::Consumer("suggestions_service"),
|
| - signin_manager_(signin_manager),
|
| - token_service_(token_service) {}
|
| -
|
| - void GetAccessToken(const TokenCallback& callback) {
|
| - callback_ = callback;
|
| - std::string account_id;
|
| - // |signin_manager_| can be null in unit tests.
|
| - if (signin_manager_)
|
| - account_id = signin_manager_->GetAuthenticatedAccountId();
|
| - OAuth2TokenService::ScopeSet scopes;
|
| - scopes.insert(GaiaConstants::kChromeSyncOAuth2Scope);
|
| - token_request_ = token_service_->StartRequest(account_id, scopes, this);
|
| - }
|
| -
|
| - bool HasPendingRequest() const { return !!token_request_.get(); }
|
| -
|
| - private:
|
| - void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
|
| - const std::string& access_token,
|
| - const base::Time& expiration_time) override {
|
| - DCHECK_EQ(request, token_request_.get());
|
| - callback_.Run(access_token);
|
| - token_request_.reset(nullptr);
|
| - }
|
| -
|
| - void OnGetTokenFailure(const OAuth2TokenService::Request* request,
|
| - const GoogleServiceAuthError& error) override {
|
| - DCHECK_EQ(request, token_request_.get());
|
| - LOG(WARNING) << "Token error: " << error.ToString();
|
| - callback_.Run(std::string());
|
| - token_request_.reset(nullptr);
|
| - }
|
| -
|
| - const SigninManagerBase* signin_manager_;
|
| - OAuth2TokenService* token_service_;
|
| -
|
| - TokenCallback callback_;
|
| - std::unique_ptr<OAuth2TokenService::Request> token_request_;
|
| -};
|
| -
|
| SuggestionsServiceImpl::SuggestionsServiceImpl(
|
| - const SigninManagerBase* signin_manager,
|
| + SigninManagerBase* signin_manager,
|
| OAuth2TokenService* token_service,
|
| syncer::SyncService* sync_service,
|
| net::URLRequestContextGetter* url_request_context,
|
| std::unique_ptr<SuggestionsStore> suggestions_store,
|
| std::unique_ptr<ImageManager> thumbnail_manager,
|
| std::unique_ptr<BlacklistStore> blacklist_store)
|
| - : sync_service_(sync_service),
|
| + : signin_manager_(signin_manager),
|
| + token_service_(token_service),
|
| + sync_service_(sync_service),
|
| sync_service_observer_(this),
|
| url_request_context_(url_request_context),
|
| suggestions_store_(std::move(suggestions_store)),
|
| thumbnail_manager_(std::move(thumbnail_manager)),
|
| blacklist_store_(std::move(blacklist_store)),
|
| scheduling_delay_(TimeDelta::FromSeconds(kDefaultSchedulingDelaySec)),
|
| - token_fetcher_(new AccessTokenFetcher(signin_manager, token_service)),
|
| weak_ptr_factory_(this) {
|
| // |sync_service_| is null if switches::kDisableSync is set (tests use that).
|
| if (sync_service_)
|
| @@ -387,22 +338,40 @@ void SuggestionsServiceImpl::IssueRequestIfNoneOngoing(const GURL& url) {
|
| return;
|
| }
|
| // If there is an ongoing token request, also wait for that.
|
| - if (token_fetcher_->HasPendingRequest()) {
|
| + if (token_fetcher_) {
|
| return;
|
| }
|
| - token_fetcher_->GetAccessToken(
|
| - base::Bind(&SuggestionsServiceImpl::IssueSuggestionsRequest,
|
| - base::Unretained(this), url));
|
| +
|
| + OAuth2TokenService::ScopeSet scopes{GaiaConstants::kChromeSyncOAuth2Scope};
|
| + token_fetcher_ = base::MakeUnique<AccessTokenFetcher>(
|
| + "suggestions_service", signin_manager_, token_service_, scopes,
|
| + base::BindOnce(&SuggestionsServiceImpl::AccessTokenAvailable,
|
| + base::Unretained(this), url));
|
| }
|
|
|
| -void SuggestionsServiceImpl::IssueSuggestionsRequest(
|
| +void SuggestionsServiceImpl::AccessTokenAvailable(
|
| const GURL& url,
|
| + const GoogleServiceAuthError& error,
|
| const std::string& access_token) {
|
| - if (access_token.empty()) {
|
| + DCHECK(token_fetcher_);
|
| + std::unique_ptr<AccessTokenFetcher> token_fetcher_deleter(
|
| + std::move(token_fetcher_));
|
| +
|
| + if (error.state() != GoogleServiceAuthError::NONE) {
|
| UpdateBlacklistDelay(false);
|
| ScheduleBlacklistUpload();
|
| return;
|
| }
|
| +
|
| + DCHECK(!access_token.empty());
|
| +
|
| + IssueSuggestionsRequest(url, access_token);
|
| +}
|
| +
|
| +void SuggestionsServiceImpl::IssueSuggestionsRequest(
|
| + const GURL& url,
|
| + const std::string& access_token) {
|
| + DCHECK(!access_token.empty());
|
| pending_request_ = CreateSuggestionsRequest(url, access_token);
|
| pending_request_->Start();
|
| last_request_started_time_ = TimeTicks::Now();
|
|
|