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

Unified Diff: chrome/browser/profiles/profile_downloader.cc

Issue 1091363002: Change ProfileDownloader to use AccountTrackerService. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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/profiles/profile_downloader.cc
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc
index 2377772ebde2ee9a379e2153f591755b8e6a4d2e..8a8387f71c6bf0d1c6d0819eccba973db8c276cc 100644
--- a/chrome/browser/profiles/profile_downloader.cc
+++ b/chrome/browser/profiles/profile_downloader.cc
@@ -13,10 +13,12 @@
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_downloader_delegate.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/signin/account_tracker_service_factory.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "components/signin/core/browser/profile_oauth2_token_service.h"
@@ -39,20 +41,6 @@ namespace {
const char kAuthorizationHeader[] =
"Authorization: Bearer %s";
-// Path in JSON dictionary to user's photo thumbnail URL.
-const char kPhotoThumbnailURLPath[] = "picture";
-
-// Path in JSON dictionary to user's hosted domain.
-const char kHostedDomainPath[] = "hd";
-
-// From the user info API, this field corresponds to the full name of the user.
-const char kFullNamePath[] = "name";
-
-const char kGivenNamePath[] = "given_name";
-
-// Path in JSON dictionary to user's preferred locale.
-const char kLocalePath[] = "locale";
-
// Path format for specifying thumbnail's size.
const char kThumbnailSizeFormat[] = "s%d-c";
// Default thumbnail size.
@@ -126,47 +114,6 @@ bool GetImageURLWithSize(const GURL& old_url, int size, GURL* new_url) {
} // namespace
-// Parses the entry response and gets the name and profile image URL.
-// |data| should be the JSON formatted data return by the response.
-// Returns false to indicate a parsing error.
-bool ProfileDownloader::ParseProfileJSON(base::DictionaryValue* root_dictionary,
- base::string16* full_name,
- base::string16* given_name,
- std::string* url,
- int image_size,
- std::string* profile_locale,
- base::string16* hosted_domain) {
- DCHECK(full_name);
- DCHECK(given_name);
- DCHECK(url);
- DCHECK(profile_locale);
- DCHECK(hosted_domain);
-
- *full_name = base::string16();
- *given_name = base::string16();
- *url = std::string();
- *profile_locale = std::string();
- *hosted_domain = base::string16();
-
- root_dictionary->GetString(kFullNamePath, full_name);
- root_dictionary->GetString(kGivenNamePath, given_name);
- root_dictionary->GetString(kLocalePath, profile_locale);
- root_dictionary->GetString(kHostedDomainPath, hosted_domain);
-
- std::string url_string;
- if (root_dictionary->GetString(kPhotoThumbnailURLPath, &url_string)) {
- GURL new_url;
- if (!GetImageURLWithSize(GURL(url_string), image_size, &new_url)) {
- LOG(ERROR) << "GetImageURLWithSize failed for url: " << url_string;
- return false;
- }
- *url = new_url.spec();
- }
-
- // The profile data is considered valid as long as it has a name or a picture.
- return !full_name->empty() || !url->empty();
-}
-
// static
bool ProfileDownloader::IsDefaultProfileImageURL(const std::string& url) {
if (url.empty())
@@ -205,9 +152,14 @@ void ProfileDownloader::Start() {
StartForAccount(std::string());
}
-void ProfileDownloader::StartForAccount(const std::string& account_id) {
+void ProfileDownloader::StartForAccount(
+ const std::string& account_id,
+ AccountTrackerService* account_tracker_service) {
VLOG(1) << "Starting profile downloader...";
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ // Ensure that these methods are called on the UI thread, except for
+ // unittests where a UI thread might not have been created.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
+ !BrowserThread::IsMessageLoopValid(BrowserThread::UI));
Mike Lerman 2015/04/20 13:25:23 I don't understand why you need IsMessageLoopValid
Roger Tawa OOO till Jul 10th 2015/04/21 14:00:33 Use a TestBrowserThreadBundle in the test.
anthonyvd 2015/04/29 15:15:08 Done.
ProfileOAuth2TokenService* service =
ProfileOAuth2TokenServiceFactory::GetForProfile(
@@ -230,22 +182,28 @@ void ProfileDownloader::StartForAccount(const std::string& account_id) {
} else {
service->AddObserver(this);
}
+
+ if (account_tracker_service)
Mike Lerman 2015/04/20 13:25:22 Since we now have a reference to a PKS, I wonder i
Roger Tawa OOO till Jul 10th 2015/04/21 14:00:33 I think it might be worth making this a PKS, since
+ account_tracker_service_ = account_tracker_service;
+ else
+ account_tracker_service_ = AccountTrackerServiceFactory::GetForProfile(
+ delegate_->GetBrowserProfile());
}
base::string16 ProfileDownloader::GetProfileHostedDomain() const {
- return profile_hosted_domain_;
+ return base::UTF8ToUTF16(account_info_.hosted_domain);
Mike Lerman 2015/04/20 13:25:23 I'm not convinced we still need these methods at a
Roger Tawa OOO till Jul 10th 2015/04/21 14:00:33 Agreed we don't need these methods. As is, the co
}
base::string16 ProfileDownloader::GetProfileFullName() const {
- return profile_full_name_;
+ return base::UTF8ToUTF16(account_info_.full_name);
}
base::string16 ProfileDownloader::GetProfileGivenName() const {
- return profile_given_name_;
+ return base::UTF8ToUTF16(account_info_.given_name);
}
std::string ProfileDownloader::GetProfileLocale() const {
- return profile_locale_;
+ return account_info_.locale;
}
SkBitmap ProfileDownloader::GetProfilePicture() const {
@@ -258,14 +216,25 @@ ProfileDownloader::PictureStatus ProfileDownloader::GetProfilePictureStatus()
}
std::string ProfileDownloader::GetProfilePictureURL() const {
- return picture_url_;
+ return account_info_.picture_url;
Mike Lerman 2015/04/20 13:25:23 This used to be the result of GetImageURLWithSize.
anthonyvd 2015/04/29 15:15:08 You're right, fixed!
+}
+
+void ProfileDownloader::StartFetchingImageForTesting(
+ net::URLFetcher* image_fetcher) {
+ profile_image_fetcher_.reset(image_fetcher);
+ StartFetchingImage();
}
void ProfileDownloader::StartFetchingImage() {
VLOG(1) << "Fetching user entry with token: " << auth_token_;
- gaia_client_.reset(new gaia::GaiaOAuthClient(
- delegate_->GetBrowserProfile()->GetRequestContext()));
- gaia_client_->GetUserInfo(auth_token_, 0, this);
+
Mike Lerman 2015/04/20 13:25:23 nit: Delete this empty line.
anthonyvd 2015/04/29 15:15:08 Done.
+ account_info_ = account_tracker_service_->GetAccountInfo(account_id_);
+
+ if (account_info_.IsValid()) {
+ FetchImageData(account_info_.picture_url);
+ } else {
+ account_tracker_service_->AddObserver(this);
Mike Lerman 2015/04/20 13:25:23 I think the idea here is that the ATS is still fet
Roger Tawa OOO till Jul 10th 2015/04/21 14:00:33 Right, would be better to get pointer to ATS in ct
anthonyvd 2015/04/29 15:15:08 Makes sense, done. The new version starts observin
+ }
}
void ProfileDownloader::StartFetchingOAuth2AccessToken() {
@@ -291,45 +260,44 @@ ProfileDownloader::~ProfileDownloader() {
service->RemoveObserver(this);
}
-void ProfileDownloader::OnGetUserInfoResponse(
- scoped_ptr<base::DictionaryValue> user_info) {
- std::string image_url;
- if (!ParseProfileJSON(user_info.get(),
- &profile_full_name_,
- &profile_given_name_,
- &image_url,
- delegate_->GetDesiredImageSideLength(),
- &profile_locale_,
- &profile_hosted_domain_)) {
- delegate_->OnProfileDownloadFailure(
- this, ProfileDownloaderDelegate::SERVICE_ERROR);
+void ProfileDownloader::FetchImageData(std::string image_url) {
Roger Tawa OOO till Jul 10th 2015/04/21 14:00:33 This should probably be a no-arg function. All ca
anthonyvd 2015/04/29 15:15:08 Done.
+ GURL url;
+ if (!GetImageURLWithSize(GURL(image_url),
+ delegate_->GetDesiredImageSideLength(),
+ &url)) {
return;
}
+ std::string image_url_with_size = url.spec();
+
if (!delegate_->NeedsProfilePicture()) {
VLOG(1) << "Skipping profile picture download";
delegate_->OnProfileDownloadSuccess(this);
return;
}
- if (IsDefaultProfileImageURL(image_url)) {
+ if (IsDefaultProfileImageURL(image_url_with_size)) {
VLOG(1) << "User has default profile picture";
picture_status_ = PICTURE_DEFAULT;
delegate_->OnProfileDownloadSuccess(this);
return;
}
- if (!image_url.empty() && image_url == delegate_->GetCachedPictureURL()) {
+ if (!image_url_with_size.empty() &&
+ image_url_with_size == delegate_->GetCachedPictureURL()) {
VLOG(1) << "Picture URL matches cached picture URL";
picture_status_ = PICTURE_CACHED;
delegate_->OnProfileDownloadSuccess(this);
return;
}
- VLOG(1) << "Fetching profile image from " << image_url;
- picture_url_ = image_url;
- profile_image_fetcher_.reset(net::URLFetcher::Create(
- GURL(image_url), net::URLFetcher::GET, this));
- profile_image_fetcher_->SetRequestContext(
- delegate_->GetBrowserProfile()->GetRequestContext());
- profile_image_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
- net::LOAD_DO_NOT_SAVE_COOKIES);
+ VLOG(1) << "Fetching profile image from " << image_url_with_size;
+
+ if (!profile_image_fetcher_) {
Mike Lerman 2015/04/20 13:25:23 Why not reset and Create a new fetcher? That way,
anthonyvd 2015/04/29 15:15:08 That makes a lot of sense. I wasn't resetting the
Mike Lerman 2015/04/30 19:09:06 commented in the header - use the TestSigninClient
anthonyvd 2015/05/01 19:16:33 See header, done!
+ profile_image_fetcher_.reset(net::URLFetcher::Create(
+ GURL(image_url_with_size), net::URLFetcher::GET, this));
+ profile_image_fetcher_->SetRequestContext(
+ delegate_->GetBrowserProfile()->GetRequestContext());
+ profile_image_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
+ net::LOAD_DO_NOT_SAVE_COOKIES);
+ }
+
if (!auth_token_.empty()) {
profile_image_fetcher_->SetExtraRequestHeaders(
base::StringPrintf(kAuthorizationHeader, auth_token_.c_str()));
@@ -337,19 +305,6 @@ void ProfileDownloader::OnGetUserInfoResponse(
profile_image_fetcher_->Start();
}
-void ProfileDownloader::OnOAuthError() {
- LOG(WARNING) << "OnOAuthError: Fetching profile data failed";
- delegate_->OnProfileDownloadFailure(
- this, ProfileDownloaderDelegate::SERVICE_ERROR);
-}
-
-void ProfileDownloader::OnNetworkError(int response_code) {
- LOG(WARNING) << "OnNetworkError: Fetching profile data failed";
- DVLOG(1) << " Response code: " << response_code;
- delegate_->OnProfileDownloadFailure(
- this, ProfileDownloaderDelegate::NETWORK_ERROR);
-}
-
void ProfileDownloader::OnURLFetchComplete(const net::URLFetcher* source) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
std::string data;
@@ -365,11 +320,11 @@ void ProfileDownloader::OnURLFetchComplete(const net::URLFetcher* source) {
delegate_->OnProfileDownloadFailure(this, network_error ?
ProfileDownloaderDelegate::NETWORK_ERROR :
ProfileDownloaderDelegate::SERVICE_ERROR);
- return;
+ } else {
+ VLOG(1) << "Decoding the image...";
+ ImageDecoder::Start(this, data);
}
-
- VLOG(1) << "Decoding the image...";
- ImageDecoder::Start(this, data);
+ profile_image_fetcher_.reset();
Mike Lerman 2015/04/20 13:25:23 Do we need to reset() the profile_image_fetcher_ b
anthonyvd 2015/04/29 15:15:08 Can fetchers be reused? Let's say the delegate dec
Mike Lerman 2015/04/30 19:09:07 You're now always reset()ing at line 295, so now i
anthonyvd 2015/05/01 19:16:33 Right, it was just a generally useful thing to kno
}
void ProfileDownloader::OnImageDecoded(const SkBitmap& decoded_image) {
@@ -424,3 +379,20 @@ void ProfileDownloader::OnGetTokenFailure(
delegate_->OnProfileDownloadFailure(
this, ProfileDownloaderDelegate::TOKEN_ERROR);
}
+
+void ProfileDownloader::OnAccountUpdated(
+ const AccountTrackerService::AccountInfo& info) {
+ if (info.account_id == account_id_ && info.IsValid()) {
+ account_tracker_service_->RemoveObserver(this);
+ account_info_ = info;
+ FetchImageData(account_info_.picture_url);
Mike Lerman 2015/04/20 13:25:23 How do we know the Access Token is valid when Fetc
Roger Tawa OOO till Jul 10th 2015/04/21 14:00:34 I think this CL needs to turn the order of operati
anthonyvd 2015/04/29 15:15:08 The last part of that comment seems to have been c
+ }
+}
+
+void ProfileDownloader::OnAccountUpdateFailed(const std::string& account_id) {
+ if (account_id == account_id_) {
+ account_tracker_service_->RemoveObserver(this);
+ delegate_->OnProfileDownloadFailure(
+ this, ProfileDownloaderDelegate::SERVICE_ERROR);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698