Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 class ArcAppIcon::DecodeRequest : public ImageDecoder::ImageRequest { | 165 class ArcAppIcon::DecodeRequest : public ImageDecoder::ImageRequest { |
| 166 public: | 166 public: |
| 167 DecodeRequest(const base::WeakPtr<ArcAppIcon>& host, | 167 DecodeRequest(const base::WeakPtr<ArcAppIcon>& host, |
| 168 int dimension, | 168 int dimension, |
| 169 ui::ScaleFactor scale_factor); | 169 ui::ScaleFactor scale_factor); |
| 170 ~DecodeRequest() override; | 170 ~DecodeRequest() override; |
| 171 | 171 |
| 172 // ImageDecoder::ImageRequest | 172 // ImageDecoder::ImageRequest |
| 173 void OnImageDecoded(const SkBitmap& bitmap) override; | 173 void OnImageDecoded(const SkBitmap& bitmap) override; |
| 174 void OnDecodeImageFailed() override; | 174 void OnDecodeImageFailed() override; |
| 175 | |
| 175 private: | 176 private: |
| 176 base::WeakPtr<ArcAppIcon> host_; | 177 base::WeakPtr<ArcAppIcon> host_; |
| 177 int dimension_; | 178 int dimension_; |
| 178 ui::ScaleFactor scale_factor_; | 179 ui::ScaleFactor scale_factor_; |
| 179 | 180 |
| 180 DISALLOW_COPY_AND_ASSIGN(DecodeRequest); | 181 DISALLOW_COPY_AND_ASSIGN(DecodeRequest); |
| 181 }; | 182 }; |
| 182 | 183 |
| 183 //////////////////////////////////////////////////////////////////////////////// | 184 //////////////////////////////////////////////////////////////////////////////// |
| 184 // ArcAppIcon::DecodeRequest | 185 // ArcAppIcon::DecodeRequest |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 199 | 200 |
| 200 if (!host_) | 201 if (!host_) |
| 201 return; | 202 return; |
| 202 | 203 |
| 203 int expected_dim = static_cast<int>( | 204 int expected_dim = static_cast<int>( |
| 204 ui::GetScaleForScaleFactor(scale_factor_) * dimension_ + 0.5f); | 205 ui::GetScaleForScaleFactor(scale_factor_) * dimension_ + 0.5f); |
| 205 if (bitmap.width() != expected_dim || bitmap.height() != expected_dim) { | 206 if (bitmap.width() != expected_dim || bitmap.height() != expected_dim) { |
| 206 VLOG(2) << "Decoded ARC icon has unexpected dimension " | 207 VLOG(2) << "Decoded ARC icon has unexpected dimension " |
| 207 << bitmap.width() << "x" << bitmap.height() << ". Expected " | 208 << bitmap.width() << "x" << bitmap.height() << ". Expected " |
| 208 << expected_dim << "x" << "."; | 209 << expected_dim << "x" << "."; |
| 210 | |
| 211 host_->MaybeRequestIcon(scale_factor_); | |
| 209 host_->DiscardDecodeRequest(this); | 212 host_->DiscardDecodeRequest(this); |
| 210 return; | 213 return; |
| 211 } | 214 } |
| 212 | 215 |
| 213 gfx::ImageSkia image_skia; | 216 gfx::ImageSkia image_skia; |
| 214 image_skia.AddRepresentation(gfx::ImageSkiaRep( | 217 image_skia.AddRepresentation(gfx::ImageSkiaRep( |
| 215 bitmap, | 218 bitmap, |
| 216 ui::GetScaleForScaleFactor(scale_factor_))); | 219 ui::GetScaleForScaleFactor(scale_factor_))); |
| 217 | |
| 218 host_->Update(&image_skia); | 220 host_->Update(&image_skia); |
| 219 host_->DiscardDecodeRequest(this); | 221 host_->DiscardDecodeRequest(this); |
| 220 } | 222 } |
| 221 | 223 |
| 222 void ArcAppIcon::DecodeRequest::OnDecodeImageFailed() { | 224 void ArcAppIcon::DecodeRequest::OnDecodeImageFailed() { |
| 223 VLOG(2) << "Failed to decode ARC icon."; | 225 VLOG(2) << "Failed to decode ARC icon."; |
| 224 | 226 |
| 225 if (!host_) | 227 if (!host_) |
| 226 return; | 228 return; |
| 227 | 229 |
| 230 host_->MaybeRequestIcon(scale_factor_); | |
| 228 host_->DiscardDecodeRequest(this); | 231 host_->DiscardDecodeRequest(this); |
| 229 } | 232 } |
| 230 | 233 |
| 231 //////////////////////////////////////////////////////////////////////////////// | 234 //////////////////////////////////////////////////////////////////////////////// |
| 232 // ArcAppIcon | 235 // ArcAppIcon |
| 233 | 236 |
| 234 // static | 237 // static |
| 235 void ArcAppIcon::DisableSafeDecodingForTesting() { | 238 void ArcAppIcon::DisableSafeDecodingForTesting() { |
| 236 disable_safe_decoding = true; | 239 disable_safe_decoding = true; |
| 237 } | 240 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 263 return; | 266 return; |
| 264 | 267 |
| 265 base::PostTaskWithTraitsAndReplyWithResult( | 268 base::PostTaskWithTraitsAndReplyWithResult( |
| 266 FROM_HERE, base::TaskTraits().MayBlock().WithPriority( | 269 FROM_HERE, base::TaskTraits().MayBlock().WithPriority( |
| 267 base::TaskPriority::BACKGROUND), | 270 base::TaskPriority::BACKGROUND), |
| 268 base::Bind(&ArcAppIcon::ReadOnFileThread, scale_factor, path, | 271 base::Bind(&ArcAppIcon::ReadOnFileThread, scale_factor, path, |
| 269 prefs->MaybeGetIconPathForDefaultApp(app_id_, scale_factor)), | 272 prefs->MaybeGetIconPathForDefaultApp(app_id_, scale_factor)), |
| 270 base::Bind(&ArcAppIcon::OnIconRead, weak_ptr_factory_.GetWeakPtr())); | 273 base::Bind(&ArcAppIcon::OnIconRead, weak_ptr_factory_.GetWeakPtr())); |
| 271 } | 274 } |
| 272 | 275 |
| 273 void ArcAppIcon::RequestIcon(ui::ScaleFactor scale_factor) { | 276 void ArcAppIcon::MaybeRequestIcon(ui::ScaleFactor scale_factor) { |
| 274 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 277 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 275 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context_); | 278 ArcAppListPrefs* prefs = ArcAppListPrefs::Get(context_); |
| 276 DCHECK(prefs); | 279 DCHECK(prefs); |
| 277 | 280 |
| 278 // ArcAppListPrefs notifies ArcAppModelBuilder via Observer when icon is ready | 281 // ArcAppListPrefs notifies ArcAppModelBuilder via Observer when icon is ready |
| 279 // and ArcAppModelBuilder refreshes the icon of the corresponding item by | 282 // and ArcAppModelBuilder refreshes the icon of the corresponding item by |
| 280 // calling LoadScaleFactor. | 283 // calling LoadScaleFactor. |
| 281 prefs->RequestIcon(app_id_, scale_factor); | 284 prefs->MaybeRequestIcon(app_id_, scale_factor); |
| 282 } | 285 } |
| 283 | 286 |
| 284 // static | 287 // static |
| 285 std::unique_ptr<ArcAppIcon::ReadResult> ArcAppIcon::ReadOnFileThread( | 288 std::unique_ptr<ArcAppIcon::ReadResult> ArcAppIcon::ReadOnFileThread( |
| 286 ui::ScaleFactor scale_factor, | 289 ui::ScaleFactor scale_factor, |
| 287 const base::FilePath& path, | 290 const base::FilePath& path, |
| 288 const base::FilePath& default_app_path) { | 291 const base::FilePath& default_app_path) { |
| 289 DCHECK(!path.empty()); | 292 DCHECK(!path.empty()); |
| 290 | 293 |
| 291 base::FilePath path_to_read; | 294 base::FilePath path_to_read; |
| 292 if (base::PathExists(path)) { | 295 if (base::PathExists(path)) { |
| 293 path_to_read = path; | 296 path_to_read = path; |
| 294 } else { | 297 } else { |
| 295 if (default_app_path.empty() || !base::PathExists(default_app_path)) { | 298 if (default_app_path.empty() || !base::PathExists(default_app_path)) { |
| 296 return base::WrapUnique(new ArcAppIcon::ReadResult( | 299 return base::WrapUnique(new ArcAppIcon::ReadResult( |
| 297 false, true, scale_factor, std::string())); | 300 false, true, scale_factor, std::string())); |
| 298 } | 301 } |
| 299 path_to_read = default_app_path; | 302 path_to_read = default_app_path; |
| 300 } | 303 } |
| 301 | 304 |
| 305 bool request_to_install = path_to_read != path; | |
| 306 | |
| 302 // Read the file from disk. | 307 // Read the file from disk. |
| 303 std::string unsafe_icon_data; | 308 std::string unsafe_icon_data; |
| 304 if (!base::ReadFileToString(path_to_read, &unsafe_icon_data)) { | 309 if (!base::ReadFileToString(path_to_read, &unsafe_icon_data) || |
| 310 unsafe_icon_data.empty()) { | |
| 305 VLOG(2) << "Failed to read an ARC icon from file " << path.MaybeAsASCII(); | 311 VLOG(2) << "Failed to read an ARC icon from file " << path.MaybeAsASCII(); |
| 312 | |
| 313 // If unsafe_icon_data is empty typically means we have a file corruption on | |
|
Luis Héctor Chávez
2017/03/15 20:28:51
nit: |unsafe_icon_data|
lgcheng
2017/03/15 22:05:33
Done.
| |
| 314 // cached icon file. Send request to re install the icon. | |
| 315 request_to_install = request_to_install || unsafe_icon_data.empty(); | |
|
Luis Héctor Chávez
2017/03/15 20:28:51
nit: request_to_install |= unsafe_icon_data.empty(
xiyuan
2017/03/15 20:30:26
nit: request_to_install |= unsafe_icon_data.empty(
lgcheng
2017/03/15 22:05:33
Done.
| |
| 306 return base::WrapUnique(new ArcAppIcon::ReadResult( | 316 return base::WrapUnique(new ArcAppIcon::ReadResult( |
| 307 true, path_to_read != path, scale_factor, std::string())); | 317 true, request_to_install, scale_factor, std::string())); |
| 308 } | 318 } |
| 309 | 319 |
| 310 return base::WrapUnique(new ArcAppIcon::ReadResult(false, | 320 return base::WrapUnique(new ArcAppIcon::ReadResult( |
|
xiyuan
2017/03/15 20:30:26
nit: base::MakeUnique<ArcAppIcon::ReadResult>(...)
lgcheng
2017/03/15 22:05:33
Done.
| |
| 311 path_to_read != path, | 321 false, request_to_install, scale_factor, unsafe_icon_data)); |
| 312 scale_factor, | |
| 313 unsafe_icon_data)); | |
| 314 } | 322 } |
| 315 | 323 |
| 316 void ArcAppIcon::OnIconRead( | 324 void ArcAppIcon::OnIconRead( |
| 317 std::unique_ptr<ArcAppIcon::ReadResult> read_result) { | 325 std::unique_ptr<ArcAppIcon::ReadResult> read_result) { |
| 318 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 326 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 319 | 327 |
| 320 if (read_result->request_to_install) | 328 if (read_result->request_to_install) |
| 321 RequestIcon(read_result->scale_factor); | 329 MaybeRequestIcon(read_result->scale_factor); |
| 322 | 330 |
| 323 if (!read_result->unsafe_icon_data.empty()) { | 331 if (!read_result->unsafe_icon_data.empty()) { |
| 324 decode_requests_.push_back(base::MakeUnique<DecodeRequest>( | 332 decode_requests_.push_back(base::MakeUnique<DecodeRequest>( |
| 325 weak_ptr_factory_.GetWeakPtr(), resource_size_in_dip_, | 333 weak_ptr_factory_.GetWeakPtr(), resource_size_in_dip_, |
| 326 read_result->scale_factor)); | 334 read_result->scale_factor)); |
| 327 if (disable_safe_decoding) { | 335 if (disable_safe_decoding) { |
| 328 SkBitmap bitmap; | 336 SkBitmap bitmap; |
| 329 if (!read_result->unsafe_icon_data.empty() && | 337 if (!read_result->unsafe_icon_data.empty() && |
| 330 gfx::PNGCodec::Decode( | 338 gfx::PNGCodec::Decode( |
| 331 reinterpret_cast<const unsigned char*>( | 339 reinterpret_cast<const unsigned char*>( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 363 void ArcAppIcon::DiscardDecodeRequest(DecodeRequest* request) { | 371 void ArcAppIcon::DiscardDecodeRequest(DecodeRequest* request) { |
| 364 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 372 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 365 | 373 |
| 366 auto it = std::find_if(decode_requests_.begin(), decode_requests_.end(), | 374 auto it = std::find_if(decode_requests_.begin(), decode_requests_.end(), |
| 367 [request](const std::unique_ptr<DecodeRequest>& ptr) { | 375 [request](const std::unique_ptr<DecodeRequest>& ptr) { |
| 368 return ptr.get() == request; | 376 return ptr.get() == request; |
| 369 }); | 377 }); |
| 370 CHECK(it != decode_requests_.end()); | 378 CHECK(it != decode_requests_.end()); |
| 371 decode_requests_.erase(it); | 379 decode_requests_.erase(it); |
| 372 } | 380 } |
| OLD | NEW |