OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/android/logo_service.h" | 5 #include "chrome/browser/android/logo_service.h" |
6 | 6 |
7 #include "base/memory/weak_ptr.h" | 7 #include "base/memory/weak_ptr.h" |
8 #include "chrome/browser/image_decoder.h" | 8 #include "chrome/browser/image_decoder.h" |
9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
10 #include "chrome/browser/search_engines/template_url_service_factory.h" | 10 #include "chrome/browser/search_engines/template_url_service_factory.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 // https://www.google.com/async/newtab_mobile. This depends on the user's | 29 // https://www.google.com/async/newtab_mobile. This depends on the user's |
30 // Google domain. | 30 // Google domain. |
31 GURL GetGoogleDoodleURL(Profile* profile) { | 31 GURL GetGoogleDoodleURL(Profile* profile) { |
32 GURL google_base_url(UIThreadSearchTermsData(profile).GoogleBaseURLValue()); | 32 GURL google_base_url(UIThreadSearchTermsData(profile).GoogleBaseURLValue()); |
33 const char kGoogleDoodleURLPath[] = "async/newtab_mobile"; | 33 const char kGoogleDoodleURLPath[] = "async/newtab_mobile"; |
34 GURL::Replacements replacements; | 34 GURL::Replacements replacements; |
35 replacements.SetPathStr(kGoogleDoodleURLPath); | 35 replacements.SetPathStr(kGoogleDoodleURLPath); |
36 return google_base_url.ReplaceComponents(replacements); | 36 return google_base_url.ReplaceComponents(replacements); |
37 } | 37 } |
38 | 38 |
39 class LogoDecoderDelegate : public ImageDecoder::Delegate { | 39 class LogoDecoderDelegate : public ImageDecoder::ImageRequest { |
40 public: | 40 public: |
41 LogoDecoderDelegate( | 41 LogoDecoderDelegate( |
42 const scoped_refptr<ImageDecoder>& image_decoder, | |
43 const base::Callback<void(const SkBitmap&)>& image_decoded_callback) | 42 const base::Callback<void(const SkBitmap&)>& image_decoded_callback) |
44 : image_decoder_(image_decoder), | 43 : ImageRequest(base::MessageLoopProxy::current()), |
45 image_decoded_callback_(image_decoded_callback), | 44 image_decoded_callback_(image_decoded_callback), |
46 weak_ptr_factory_(this) { | 45 weak_ptr_factory_(this) { |
47 // If the ImageDecoder crashes or otherwise never completes, call | 46 // If the ImageDecoder crashes or otherwise never completes, call |
48 // OnImageDecodeTimedOut() eventually to ensure that image_decoded_callback_ | 47 // OnImageDecodeTimedOut() eventually to ensure that image_decoded_callback_ |
49 // is run. | 48 // is run. |
50 base::MessageLoopProxy::current()->PostDelayedTask( | 49 base::MessageLoopProxy::current()->PostDelayedTask( |
51 FROM_HERE, | 50 FROM_HERE, base::Bind(&LogoDecoderDelegate::OnDecodeImageFailed, |
52 base::Bind(&LogoDecoderDelegate::OnDecodeImageFailed, | 51 weak_ptr_factory_.GetWeakPtr()), |
53 weak_ptr_factory_.GetWeakPtr(), | |
54 (const ImageDecoder*) NULL), | |
55 base::TimeDelta::FromSeconds(kDecodeLogoTimeoutSeconds)); | 52 base::TimeDelta::FromSeconds(kDecodeLogoTimeoutSeconds)); |
56 } | 53 } |
57 | 54 |
58 ~LogoDecoderDelegate() override { image_decoder_->set_delegate(NULL); } | 55 ~LogoDecoderDelegate() override {} |
59 | 56 |
60 // ImageDecoder::Delegate: | 57 // ImageDecoder::ImageRequest: |
61 void OnImageDecoded(const ImageDecoder* decoder, | 58 void OnImageDecoded(const SkBitmap& decoded_image) override { |
62 const SkBitmap& decoded_image) override { | |
63 image_decoded_callback_.Run(decoded_image); | 59 image_decoded_callback_.Run(decoded_image); |
64 delete this; | 60 delete this; |
65 } | 61 } |
66 | 62 |
67 void OnDecodeImageFailed(const ImageDecoder* decoder) override { | 63 void OnDecodeImageFailed() override { |
68 image_decoded_callback_.Run(SkBitmap()); | 64 image_decoded_callback_.Run(SkBitmap()); |
69 delete this; | 65 delete this; |
70 } | 66 } |
71 | 67 |
72 private: | 68 private: |
73 scoped_refptr<ImageDecoder> image_decoder_; | |
74 base::Callback<void(const SkBitmap&)> image_decoded_callback_; | 69 base::Callback<void(const SkBitmap&)> image_decoded_callback_; |
75 base::WeakPtrFactory<LogoDecoderDelegate> weak_ptr_factory_; | 70 base::WeakPtrFactory<LogoDecoderDelegate> weak_ptr_factory_; |
76 | 71 |
77 DISALLOW_COPY_AND_ASSIGN(LogoDecoderDelegate); | 72 DISALLOW_COPY_AND_ASSIGN(LogoDecoderDelegate); |
78 }; | 73 }; |
79 | 74 |
80 class ChromeLogoDelegate : public search_provider_logos::LogoDelegate { | 75 class ChromeLogoDelegate : public search_provider_logos::LogoDelegate { |
81 public: | 76 public: |
82 ChromeLogoDelegate() {} | 77 ChromeLogoDelegate() {} |
83 ~ChromeLogoDelegate() override {} | 78 ~ChromeLogoDelegate() override {} |
84 | 79 |
85 // search_provider_logos::LogoDelegate: | 80 // search_provider_logos::LogoDelegate: |
86 void DecodeUntrustedImage( | 81 void DecodeUntrustedImage( |
87 const scoped_refptr<base::RefCountedString>& encoded_image, | 82 const scoped_refptr<base::RefCountedString>& encoded_image, |
88 base::Callback<void(const SkBitmap&)> image_decoded_callback) override { | 83 base::Callback<void(const SkBitmap&)> image_decoded_callback) override { |
89 scoped_refptr<ImageDecoder> image_decoder = new ImageDecoder( | |
90 NULL, | |
91 encoded_image->data(), | |
92 ImageDecoder::DEFAULT_CODEC); | |
93 LogoDecoderDelegate* delegate = | 84 LogoDecoderDelegate* delegate = |
94 new LogoDecoderDelegate(image_decoder, image_decoded_callback); | 85 new LogoDecoderDelegate(image_decoded_callback); |
95 image_decoder->set_delegate(delegate); | 86 ImageDecoder::Start(delegate, encoded_image->data(), |
96 image_decoder->Start(base::MessageLoopProxy::current()); | 87 ImageDecoder::DEFAULT_CODEC, false); |
97 } | 88 } |
98 | 89 |
99 private: | 90 private: |
100 DISALLOW_COPY_AND_ASSIGN(ChromeLogoDelegate); | 91 DISALLOW_COPY_AND_ASSIGN(ChromeLogoDelegate); |
101 }; | 92 }; |
102 | 93 |
103 } // namespace | 94 } // namespace |
104 | 95 |
105 // LogoService ---------------------------------------------------------------- | 96 // LogoService ---------------------------------------------------------------- |
106 | 97 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 } | 149 } |
159 | 150 |
160 LogoServiceFactory::~LogoServiceFactory() {} | 151 LogoServiceFactory::~LogoServiceFactory() {} |
161 | 152 |
162 KeyedService* LogoServiceFactory::BuildServiceInstanceFor( | 153 KeyedService* LogoServiceFactory::BuildServiceInstanceFor( |
163 content::BrowserContext* context) const { | 154 content::BrowserContext* context) const { |
164 Profile* profile = static_cast<Profile*>(context); | 155 Profile* profile = static_cast<Profile*>(context); |
165 DCHECK(!profile->IsOffTheRecord()); | 156 DCHECK(!profile->IsOffTheRecord()); |
166 return new LogoService(profile); | 157 return new LogoService(profile); |
167 } | 158 } |
OLD | NEW |