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

Side by Side Diff: chrome/browser/android/logo_service.cc

Issue 931993002: Make image_decoder a Leaky LazyInstance (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix a few comments Created 5 years, 9 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 unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/apps/drive/drive_app_converter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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());
97 } 87 }
98 88
99 private: 89 private:
100 DISALLOW_COPY_AND_ASSIGN(ChromeLogoDelegate); 90 DISALLOW_COPY_AND_ASSIGN(ChromeLogoDelegate);
101 }; 91 };
102 92
103 } // namespace 93 } // namespace
104 94
105 // LogoService ---------------------------------------------------------------- 95 // LogoService ----------------------------------------------------------------
106 96
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 } 148 }
159 149
160 LogoServiceFactory::~LogoServiceFactory() {} 150 LogoServiceFactory::~LogoServiceFactory() {}
161 151
162 KeyedService* LogoServiceFactory::BuildServiceInstanceFor( 152 KeyedService* LogoServiceFactory::BuildServiceInstanceFor(
163 content::BrowserContext* context) const { 153 content::BrowserContext* context) const {
164 Profile* profile = static_cast<Profile*>(context); 154 Profile* profile = static_cast<Profile*>(context);
165 DCHECK(!profile->IsOffTheRecord()); 155 DCHECK(!profile->IsOffTheRecord());
166 return new LogoService(profile); 156 return new LogoService(profile);
167 } 157 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/apps/drive/drive_app_converter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698