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

Side by Side Diff: chrome/browser/ui/app_list/arc/arc_app_icon.cc

Issue 2763753003: [Merge To M58]Fix Default icon issue when cached icon file is corrupted. (Closed)
Patch Set: Rebase. Created 3 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/ui/app_list/arc/arc_app_icon.h" 5 #include "chrome/browser/ui/app_list/arc/arc_app_icon.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 class ArcAppIcon::DecodeRequest : public ImageDecoder::ImageRequest { 164 class ArcAppIcon::DecodeRequest : public ImageDecoder::ImageRequest {
165 public: 165 public:
166 DecodeRequest(const base::WeakPtr<ArcAppIcon>& host, 166 DecodeRequest(const base::WeakPtr<ArcAppIcon>& host,
167 int dimension, 167 int dimension,
168 ui::ScaleFactor scale_factor); 168 ui::ScaleFactor scale_factor);
169 ~DecodeRequest() override; 169 ~DecodeRequest() override;
170 170
171 // ImageDecoder::ImageRequest 171 // ImageDecoder::ImageRequest
172 void OnImageDecoded(const SkBitmap& bitmap) override; 172 void OnImageDecoded(const SkBitmap& bitmap) override;
173 void OnDecodeImageFailed() override; 173 void OnDecodeImageFailed() override;
174
174 private: 175 private:
175 base::WeakPtr<ArcAppIcon> host_; 176 base::WeakPtr<ArcAppIcon> host_;
176 int dimension_; 177 int dimension_;
177 ui::ScaleFactor scale_factor_; 178 ui::ScaleFactor scale_factor_;
178 179
179 DISALLOW_COPY_AND_ASSIGN(DecodeRequest); 180 DISALLOW_COPY_AND_ASSIGN(DecodeRequest);
180 }; 181 };
181 182
182 //////////////////////////////////////////////////////////////////////////////// 183 ////////////////////////////////////////////////////////////////////////////////
183 // ArcAppIcon::DecodeRequest 184 // ArcAppIcon::DecodeRequest
(...skipping 14 matching lines...) Expand all
198 199
199 if (!host_) 200 if (!host_)
200 return; 201 return;
201 202
202 int expected_dim = static_cast<int>( 203 int expected_dim = static_cast<int>(
203 ui::GetScaleForScaleFactor(scale_factor_) * dimension_ + 0.5f); 204 ui::GetScaleForScaleFactor(scale_factor_) * dimension_ + 0.5f);
204 if (bitmap.width() != expected_dim || bitmap.height() != expected_dim) { 205 if (bitmap.width() != expected_dim || bitmap.height() != expected_dim) {
205 VLOG(2) << "Decoded ARC icon has unexpected dimension " 206 VLOG(2) << "Decoded ARC icon has unexpected dimension "
206 << bitmap.width() << "x" << bitmap.height() << ". Expected " 207 << bitmap.width() << "x" << bitmap.height() << ". Expected "
207 << expected_dim << "x" << "."; 208 << expected_dim << "x" << ".";
209
210 host_->MaybeRequestIcon(scale_factor_);
208 host_->DiscardDecodeRequest(this); 211 host_->DiscardDecodeRequest(this);
209 return; 212 return;
210 } 213 }
211 214
212 gfx::ImageSkia image_skia; 215 gfx::ImageSkia image_skia;
213 image_skia.AddRepresentation(gfx::ImageSkiaRep( 216 image_skia.AddRepresentation(gfx::ImageSkiaRep(
214 bitmap, 217 bitmap,
215 ui::GetScaleForScaleFactor(scale_factor_))); 218 ui::GetScaleForScaleFactor(scale_factor_)));
216
217 host_->Update(&image_skia); 219 host_->Update(&image_skia);
218 host_->DiscardDecodeRequest(this); 220 host_->DiscardDecodeRequest(this);
219 } 221 }
220 222
221 void ArcAppIcon::DecodeRequest::OnDecodeImageFailed() { 223 void ArcAppIcon::DecodeRequest::OnDecodeImageFailed() {
222 VLOG(2) << "Failed to decode ARC icon."; 224 VLOG(2) << "Failed to decode ARC icon.";
223 225
224 if (!host_) 226 if (!host_)
225 return; 227 return;
226 228
229 host_->MaybeRequestIcon(scale_factor_);
227 host_->DiscardDecodeRequest(this); 230 host_->DiscardDecodeRequest(this);
228 } 231 }
229 232
230 //////////////////////////////////////////////////////////////////////////////// 233 ////////////////////////////////////////////////////////////////////////////////
231 // ArcAppIcon 234 // ArcAppIcon
232 235
233 // static 236 // static
234 void ArcAppIcon::DisableSafeDecodingForTesting() { 237 void ArcAppIcon::DisableSafeDecodingForTesting() {
235 disable_safe_decoding = true; 238 disable_safe_decoding = true;
236 } 239 }
(...skipping 25 matching lines...) Expand all
262 return; 265 return;
263 266
264 base::PostTaskWithTraitsAndReplyWithResult( 267 base::PostTaskWithTraitsAndReplyWithResult(
265 FROM_HERE, base::TaskTraits().MayBlock().WithPriority( 268 FROM_HERE, base::TaskTraits().MayBlock().WithPriority(
266 base::TaskPriority::BACKGROUND), 269 base::TaskPriority::BACKGROUND),
267 base::Bind(&ArcAppIcon::ReadOnFileThread, scale_factor, path, 270 base::Bind(&ArcAppIcon::ReadOnFileThread, scale_factor, path,
268 prefs->MaybeGetIconPathForDefaultApp(app_id_, scale_factor)), 271 prefs->MaybeGetIconPathForDefaultApp(app_id_, scale_factor)),
269 base::Bind(&ArcAppIcon::OnIconRead, weak_ptr_factory_.GetWeakPtr())); 272 base::Bind(&ArcAppIcon::OnIconRead, weak_ptr_factory_.GetWeakPtr()));
270 } 273 }
271 274
272 void ArcAppIcon::RequestIcon(ui::ScaleFactor scale_factor) { 275 void ArcAppIcon::MaybeRequestIcon(ui::ScaleFactor scale_factor) {
273 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 276 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
274 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context_); 277 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context_);
275 DCHECK(prefs); 278 DCHECK(prefs);
276 279
277 // ArcAppListPrefs notifies ArcAppModelBuilder via Observer when icon is ready 280 // ArcAppListPrefs notifies ArcAppModelBuilder via Observer when icon is ready
278 // and ArcAppModelBuilder refreshes the icon of the corresponding item by 281 // and ArcAppModelBuilder refreshes the icon of the corresponding item by
279 // calling LoadScaleFactor. 282 // calling LoadScaleFactor.
280 prefs->RequestIcon(app_id_, scale_factor); 283 prefs->MaybeRequestIcon(app_id_, scale_factor);
281 } 284 }
282 285
283 // static 286 // static
284 std::unique_ptr<ArcAppIcon::ReadResult> ArcAppIcon::ReadOnFileThread( 287 std::unique_ptr<ArcAppIcon::ReadResult> ArcAppIcon::ReadOnFileThread(
285 ui::ScaleFactor scale_factor, 288 ui::ScaleFactor scale_factor,
286 const base::FilePath& path, 289 const base::FilePath& path,
287 const base::FilePath& default_app_path) { 290 const base::FilePath& default_app_path) {
288 DCHECK(!path.empty()); 291 DCHECK(!path.empty());
289 292
290 base::FilePath path_to_read; 293 base::FilePath path_to_read;
291 if (base::PathExists(path)) { 294 if (base::PathExists(path)) {
292 path_to_read = path; 295 path_to_read = path;
293 } else { 296 } else {
294 if (default_app_path.empty() || !base::PathExists(default_app_path)) { 297 if (default_app_path.empty() || !base::PathExists(default_app_path)) {
295 return base::WrapUnique(new ArcAppIcon::ReadResult( 298 return base::MakeUnique<ArcAppIcon::ReadResult>(false, true, scale_factor,
296 false, true, scale_factor, std::string())); 299 std::string());
297 } 300 }
298 path_to_read = default_app_path; 301 path_to_read = default_app_path;
299 } 302 }
300 303
304 bool request_to_install = path_to_read != path;
305
301 // Read the file from disk. 306 // Read the file from disk.
302 std::string unsafe_icon_data; 307 std::string unsafe_icon_data;
303 if (!base::ReadFileToString(path_to_read, &unsafe_icon_data)) { 308 if (!base::ReadFileToString(path_to_read, &unsafe_icon_data) ||
309 unsafe_icon_data.empty()) {
304 VLOG(2) << "Failed to read an ARC icon from file " << path.MaybeAsASCII(); 310 VLOG(2) << "Failed to read an ARC icon from file " << path.MaybeAsASCII();
305 return base::WrapUnique(new ArcAppIcon::ReadResult( 311
306 true, path_to_read != path, scale_factor, std::string())); 312 // If |unsafe_icon_data| is empty typically means we have a file corruption
313 // on cached icon file. Send request to re install the icon.
314 request_to_install |= unsafe_icon_data.empty();
315 return base::MakeUnique<ArcAppIcon::ReadResult>(
316 true, request_to_install, scale_factor, std::string());
307 } 317 }
308 318
309 return base::WrapUnique(new ArcAppIcon::ReadResult(false, 319 return base::MakeUnique<ArcAppIcon::ReadResult>(
310 path_to_read != path, 320 false, request_to_install, scale_factor, unsafe_icon_data);
311 scale_factor,
312 unsafe_icon_data));
313 } 321 }
314 322
315 void ArcAppIcon::OnIconRead( 323 void ArcAppIcon::OnIconRead(
316 std::unique_ptr<ArcAppIcon::ReadResult> read_result) { 324 std::unique_ptr<ArcAppIcon::ReadResult> read_result) {
317 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 325 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
318 326
319 if (read_result->request_to_install) 327 if (read_result->request_to_install)
320 RequestIcon(read_result->scale_factor); 328 MaybeRequestIcon(read_result->scale_factor);
321 329
322 if (!read_result->unsafe_icon_data.empty()) { 330 if (!read_result->unsafe_icon_data.empty()) {
323 decode_requests_.push_back(base::MakeUnique<DecodeRequest>( 331 decode_requests_.push_back(base::MakeUnique<DecodeRequest>(
324 weak_ptr_factory_.GetWeakPtr(), resource_size_in_dip_, 332 weak_ptr_factory_.GetWeakPtr(), resource_size_in_dip_,
325 read_result->scale_factor)); 333 read_result->scale_factor));
326 if (disable_safe_decoding) { 334 if (disable_safe_decoding) {
327 SkBitmap bitmap; 335 SkBitmap bitmap;
328 if (!read_result->unsafe_icon_data.empty() && 336 if (!read_result->unsafe_icon_data.empty() &&
329 gfx::PNGCodec::Decode( 337 gfx::PNGCodec::Decode(
330 reinterpret_cast<const unsigned char*>( 338 reinterpret_cast<const unsigned char*>(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 void ArcAppIcon::DiscardDecodeRequest(DecodeRequest* request) { 370 void ArcAppIcon::DiscardDecodeRequest(DecodeRequest* request) {
363 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 371 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
364 372
365 auto it = std::find_if(decode_requests_.begin(), decode_requests_.end(), 373 auto it = std::find_if(decode_requests_.begin(), decode_requests_.end(),
366 [request](const std::unique_ptr<DecodeRequest>& ptr) { 374 [request](const std::unique_ptr<DecodeRequest>& ptr) {
367 return ptr.get() == request; 375 return ptr.get() == request;
368 }); 376 });
369 CHECK(it != decode_requests_.end()); 377 CHECK(it != decode_requests_.end());
370 decode_requests_.erase(it); 378 decode_requests_.erase(it);
371 } 379 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/app_list/arc/arc_app_icon.h ('k') | chrome/browser/ui/app_list/arc/arc_app_list_prefs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698