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

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: Add ImageDecoder->RemoveDelegate 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
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 {
55 ImageDecoder::GetInstance()->RemoveDelegate(this);
dcheng 2015/03/19 14:25:46 I don't know that having GetInstance() everywhere
Theresa 2015/03/19 21:54:56 Done. I agree, it's not particularly helpful to ex
56 }
59 57
60 // ImageDecoder::Delegate: 58 // ImageDecoder::Delegate:
61 void OnImageDecoded(const ImageDecoder* decoder, 59 void OnImageDecoded(const SkBitmap& decoded_image) override {
62 const SkBitmap& decoded_image) override {
63 image_decoded_callback_.Run(decoded_image); 60 image_decoded_callback_.Run(decoded_image);
64 delete this; 61 delete this;
65 } 62 }
66 63
67 void OnDecodeImageFailed(const ImageDecoder* decoder) override { 64 void OnDecodeImageFailed() override {
68 image_decoded_callback_.Run(SkBitmap()); 65 image_decoded_callback_.Run(SkBitmap());
69 delete this; 66 delete this;
70 } 67 }
71 68
72 private: 69 private:
73 scoped_refptr<ImageDecoder> image_decoder_;
74 base::Callback<void(const SkBitmap&)> image_decoded_callback_; 70 base::Callback<void(const SkBitmap&)> image_decoded_callback_;
75 base::WeakPtrFactory<LogoDecoderDelegate> weak_ptr_factory_; 71 base::WeakPtrFactory<LogoDecoderDelegate> weak_ptr_factory_;
76 72
77 DISALLOW_COPY_AND_ASSIGN(LogoDecoderDelegate); 73 DISALLOW_COPY_AND_ASSIGN(LogoDecoderDelegate);
78 }; 74 };
79 75
80 class ChromeLogoDelegate : public search_provider_logos::LogoDelegate { 76 class ChromeLogoDelegate : public search_provider_logos::LogoDelegate {
81 public: 77 public:
82 ChromeLogoDelegate() {} 78 ChromeLogoDelegate() {}
83 ~ChromeLogoDelegate() override {} 79 ~ChromeLogoDelegate() override {}
84 80
85 // search_provider_logos::LogoDelegate: 81 // search_provider_logos::LogoDelegate:
86 void DecodeUntrustedImage( 82 void DecodeUntrustedImage(
87 const scoped_refptr<base::RefCountedString>& encoded_image, 83 const scoped_refptr<base::RefCountedString>& encoded_image,
88 base::Callback<void(const SkBitmap&)> image_decoded_callback) override { 84 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 = 85 LogoDecoderDelegate* delegate =
94 new LogoDecoderDelegate(image_decoder, image_decoded_callback); 86 new LogoDecoderDelegate(image_decoded_callback);
95 image_decoder->set_delegate(delegate); 87 ImageDecoder::GetInstance()->Start(
96 image_decoder->Start(base::MessageLoopProxy::current()); 88 delegate, encoded_image->data(), ImageDecoder::DEFAULT_CODEC,
89 base::MessageLoopProxy::current(), false);
97 } 90 }
98 91
99 private: 92 private:
100 DISALLOW_COPY_AND_ASSIGN(ChromeLogoDelegate); 93 DISALLOW_COPY_AND_ASSIGN(ChromeLogoDelegate);
101 }; 94 };
102 95
103 } // namespace 96 } // namespace
104 97
105 // LogoService ---------------------------------------------------------------- 98 // LogoService ----------------------------------------------------------------
106 99
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 } 151 }
159 152
160 LogoServiceFactory::~LogoServiceFactory() {} 153 LogoServiceFactory::~LogoServiceFactory() {}
161 154
162 KeyedService* LogoServiceFactory::BuildServiceInstanceFor( 155 KeyedService* LogoServiceFactory::BuildServiceInstanceFor(
163 content::BrowserContext* context) const { 156 content::BrowserContext* context) const {
164 Profile* profile = static_cast<Profile*>(context); 157 Profile* profile = static_cast<Profile*>(context);
165 DCHECK(!profile->IsOffTheRecord()); 158 DCHECK(!profile->IsOffTheRecord());
166 return new LogoService(profile); 159 return new LogoService(profile);
167 } 160 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698