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

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: Small changes based on review from Antony 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 21 matching lines...) Expand all
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::Delegate {
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 : image_decoded_callback_(image_decoded_callback),
45 image_decoded_callback_(image_decoded_callback),
46 weak_ptr_factory_(this) { 44 weak_ptr_factory_(this) {
47 // If the ImageDecoder crashes or otherwise never completes, call 45 // If the ImageDecoder crashes or otherwise never completes, call
48 // OnImageDecodeTimedOut() eventually to ensure that image_decoded_callback_ 46 // OnImageDecodeTimedOut() eventually to ensure that image_decoded_callback_
49 // is run. 47 // is run.
50 base::MessageLoopProxy::current()->PostDelayedTask( 48 base::MessageLoopProxy::current()->PostDelayedTask(
51 FROM_HERE, 49 FROM_HERE, base::Bind(&LogoDecoderDelegate::OnDecodeImageFailed,
52 base::Bind(&LogoDecoderDelegate::OnDecodeImageFailed, 50 weak_ptr_factory_.GetWeakPtr()),
53 weak_ptr_factory_.GetWeakPtr(),
54 (const ImageDecoder*) NULL),
55 base::TimeDelta::FromSeconds(kDecodeLogoTimeoutSeconds)); 51 base::TimeDelta::FromSeconds(kDecodeLogoTimeoutSeconds));
56 } 52 }
57 53
58 ~LogoDecoderDelegate() override { image_decoder_->set_delegate(NULL); } 54 ~LogoDecoderDelegate() override {}
dcheng 2015/03/13 14:55:11 This is an example of an instance where cancellati
Theresa 2015/03/13 15:22:16 Could delegates be stored as weak ptrs in image_de
59 55
60 // ImageDecoder::Delegate: 56 // ImageDecoder::Delegate:
61 void OnImageDecoded(const ImageDecoder* decoder, 57 void OnImageDecoded(const SkBitmap& decoded_image) override {
62 const SkBitmap& decoded_image) override {
63 image_decoded_callback_.Run(decoded_image); 58 image_decoded_callback_.Run(decoded_image);
64 delete this; 59 delete this;
65 } 60 }
66 61
67 void OnDecodeImageFailed(const ImageDecoder* decoder) override { 62 void OnDecodeImageFailed() override {
68 image_decoded_callback_.Run(SkBitmap()); 63 image_decoded_callback_.Run(SkBitmap());
69 delete this; 64 delete this;
70 } 65 }
71 66
72 private: 67 private:
73 scoped_refptr<ImageDecoder> image_decoder_;
74 base::Callback<void(const SkBitmap&)> image_decoded_callback_; 68 base::Callback<void(const SkBitmap&)> image_decoded_callback_;
75 base::WeakPtrFactory<LogoDecoderDelegate> weak_ptr_factory_; 69 base::WeakPtrFactory<LogoDecoderDelegate> weak_ptr_factory_;
76 70
77 DISALLOW_COPY_AND_ASSIGN(LogoDecoderDelegate); 71 DISALLOW_COPY_AND_ASSIGN(LogoDecoderDelegate);
78 }; 72 };
79 73
80 class ChromeLogoDelegate : public search_provider_logos::LogoDelegate { 74 class ChromeLogoDelegate : public search_provider_logos::LogoDelegate {
81 public: 75 public:
82 ChromeLogoDelegate() {} 76 ChromeLogoDelegate() {}
83 ~ChromeLogoDelegate() override {} 77 ~ChromeLogoDelegate() override {}
84 78
85 // search_provider_logos::LogoDelegate: 79 // search_provider_logos::LogoDelegate:
86 void DecodeUntrustedImage( 80 void DecodeUntrustedImage(
87 const scoped_refptr<base::RefCountedString>& encoded_image, 81 const scoped_refptr<base::RefCountedString>& encoded_image,
88 base::Callback<void(const SkBitmap&)> image_decoded_callback) override { 82 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 = 83 LogoDecoderDelegate* delegate =
94 new LogoDecoderDelegate(image_decoder, image_decoded_callback); 84 new LogoDecoderDelegate(image_decoded_callback);
95 image_decoder->set_delegate(delegate); 85 ImageDecoder::GetInstance()->Start(
96 image_decoder->Start(base::MessageLoopProxy::current()); 86 delegate, encoded_image->data(), ImageDecoder::DEFAULT_CODEC,
87 base::MessageLoopProxy::current(), 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
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 }
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