1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/profiles/profile_avatar_downloader.h"
6
7#include "base/files/file_path.h"
8#include "chrome/browser/browser_process.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/browser/profiles/profile_avatar_icon_util.h"
11#include "chrome/browser/profiles/profile_info_cache.h"
12#include "net/base/load_flags.h"
13
14namespace {
15const char kHighResAvatarDownloadUrlPrefix[] =
16    "http://www.gstatic.com/chrome/profile_avatars/";
17}
18
19ProfileAvatarDownloader::ProfileAvatarDownloader(
20    size_t icon_index,
21    const base::FilePath& profile_path,
22    ProfileInfoCache* cache)
23    : icon_index_(icon_index),
24      profile_path_(profile_path),
25      cache_(cache) {
26  GURL url(std::string(kHighResAvatarDownloadUrlPrefix) +
27           profiles::GetDefaultAvatarIconFileNameAtIndex(icon_index));
28  fetcher_.reset(new chrome::BitmapFetcher(url, this));
29}
30
31ProfileAvatarDownloader::~ProfileAvatarDownloader() {
32}
33
34void ProfileAvatarDownloader::Start() {
35  // In unit tests, the browser process can return a NULL request context.
36  net::URLRequestContextGetter* request_context =
37      g_browser_process->system_request_context();
38  if (request_context)
39    fetcher_->Start(
40        request_context,
41        std::string(),
42        net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
43        net::LOAD_NORMAL);
44}
45
46// BitmapFetcherDelegate overrides.
47void ProfileAvatarDownloader::OnFetchComplete(const GURL url,
48                                              const SkBitmap* bitmap) {
49  if (!bitmap || !cache_)
50    return;
51
52  // Decode the downloaded bitmap. Ownership of the image is taken by |cache_|.
53  gfx::Image image = gfx::Image::CreateFrom1xBitmap(*bitmap);
54  cache_->SaveAvatarImageAtPath(&image,
55      profiles::GetDefaultAvatarIconFileNameAtIndex(icon_index_),
56      profiles::GetPathOfHighResAvatarAtIndex(icon_index_),
57      profile_path_);
58}
59