1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_
#define CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_
#include <memory>
#include <string>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "base/sequence_checker.h"
#include "chrome/browser/image_decoder/image_decoder.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "services/network/public/cpp/simple_url_loader.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace signin {
class AccessTokenFetcher;
struct AccessTokenInfo;
} // namespace signin
class ProfileDownloaderDelegate;
// Downloads user profile information. The profile picture is decoded in a
// sandboxed process.
class ProfileDownloader : public ImageDecoder::ImageRequest,
public signin::IdentityManager::Observer {
public:
enum PictureStatus {
PICTURE_SUCCESS,
PICTURE_FAILED,
PICTURE_DEFAULT,
PICTURE_CACHED,
};
explicit ProfileDownloader(ProfileDownloaderDelegate* delegate);
ProfileDownloader(const ProfileDownloader&) = delete;
ProfileDownloader& operator=(const ProfileDownloader&) = delete;
~ProfileDownloader() override;
// Starts downloading profile information if the necessary authorization token
// is ready. If not, subscribes to token service and starts fetching if the
// token is available. Should not be called more than once.
virtual void Start();
// Starts downloading profile information if the necessary authorization token
// is ready. If not, subscribes to token service and starts fetching if the
// token is available. Should not be called more than once.
virtual void StartForAccount(const CoreAccountId& account_id);
// On successful download this returns the full name of the user. For example
// "Pat Smith".
virtual std::u16string GetProfileFullName() const;
// On successful download this returns the given name of the user. For example
// if the name is "Pat Smith", the given name is "Pat".
virtual std::u16string GetProfileGivenName() const;
// On successful download this returns G+ locale preference of the user.
virtual std::string GetProfileLocale() const;
// On successful download this returns the profile picture of the user.
// For users with no profile picture set (that is, they have the default
// profile picture) this will return an Null bitmap.
virtual SkBitmap GetProfilePicture() const;
// Gets the profile picture status.
virtual PictureStatus GetProfilePictureStatus() const;
// Gets the URL for the profile picture. This can be cached so that the same
// picture is not downloaded multiple times. This value should only be used
// when the picture status is PICTURE_SUCCESS.
virtual std::string GetProfilePictureURL() const;
private:
friend class ProfileDownloaderTest;
FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest, AccountInfoReady);
FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest, AccountInfoNotReady);
FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest,
AccountInfoNoPictureDoesNotCrash);
FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest,
AccountInfoInvalidPictureURLDoesNotCrash);
void FetchImageData();
void OnURLLoaderComplete(std::unique_ptr<std::string> response_body);
// Overridden from ImageDecoder::ImageRequest:
void OnImageDecoded(const SkBitmap& decoded_image) override;
void OnDecodeImageFailed() override;
// Overridden from signin::IdentityManager::Observer:
void OnExtendedAccountInfoUpdated(const AccountInfo& info) override;
// Callback for AccessTokenFetcher.
void OnAccessTokenFetchComplete(GoogleServiceAuthError error,
signin::AccessTokenInfo access_token_info);
// Issues the first request to get user profile image.
void StartFetchingImage();
// Gets the authorization header.
const char* GetAuthorizationHeader() const;
// Starts fetching OAuth2 access token. This is needed before the GAIA info
// can be downloaded.
void StartFetchingOAuth2AccessToken();
SEQUENCE_CHECKER(sequence_checker_);
raw_ptr<ProfileDownloaderDelegate> delegate_;
CoreAccountId account_id_;
std::string auth_token_;
std::unique_ptr<network::SimpleURLLoader> simple_loader_;
std::unique_ptr<signin::AccessTokenFetcher> oauth2_access_token_fetcher_;
AccountInfo account_info_;
SkBitmap profile_picture_;
PictureStatus picture_status_ = PICTURE_FAILED;
raw_ptr<signin::IdentityManager> identity_manager_;
base::ScopedObservation<signin::IdentityManager,
signin::IdentityManager::Observer>
identity_manager_observation_{this};
bool waiting_for_account_info_ = false;
};
#endif // CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_
|