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

Side by Side Diff: chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc

Issue 2691943010: Fix a data race on the ref count of AddToHomescreenDataFetcher (Closed)
Patch Set: fix Created 3 years, 10 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 | « chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/android/webapps/add_to_homescreen_data_fetcher.h" 5 #include "chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/location.h" 11 #include "base/location.h"
dominickn 2017/02/16 23:24:45 Nit: #include "base/task_runner_util.h" for base::
tzik 2017/02/17 04:58:20 Done.
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/threading/sequenced_worker_pool.h" 13 #include "base/threading/sequenced_worker_pool.h"
14 #include "chrome/browser/android/offline_pages/offline_page_utils.h" 14 #include "chrome/browser/android/offline_pages/offline_page_utils.h"
15 #include "chrome/browser/android/shortcut_helper.h" 15 #include "chrome/browser/android/shortcut_helper.h"
16 #include "chrome/browser/android/webapk/webapk_web_manifest_checker.h" 16 #include "chrome/browser/android/webapk/webapk_web_manifest_checker.h"
17 #include "chrome/browser/favicon/favicon_service_factory.h" 17 #include "chrome/browser/favicon/favicon_service_factory.h"
18 #include "chrome/browser/installable/installable_manager.h" 18 #include "chrome/browser/installable/installable_manager.h"
19 #include "chrome/browser/manifest/manifest_icon_selector.h" 19 #include "chrome/browser/manifest/manifest_icon_selector.h"
20 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
21 #include "chrome/common/chrome_constants.h" 21 #include "chrome/common/chrome_constants.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 AddToHomescreenDataFetcher::AddToHomescreenDataFetcher( 67 AddToHomescreenDataFetcher::AddToHomescreenDataFetcher(
68 content::WebContents* web_contents, 68 content::WebContents* web_contents,
69 int ideal_icon_size_in_px, 69 int ideal_icon_size_in_px,
70 int minimum_icon_size_in_px, 70 int minimum_icon_size_in_px,
71 int ideal_splash_image_size_in_px, 71 int ideal_splash_image_size_in_px,
72 int minimum_splash_image_size_in_px, 72 int minimum_splash_image_size_in_px,
73 int badge_size_in_px, 73 int badge_size_in_px,
74 bool check_webapk_compatibility, 74 bool check_webapk_compatibility,
75 Observer* observer) 75 Observer* observer)
76 : WebContentsObserver(web_contents), 76 : WebContentsObserver(web_contents),
77 background_task_runner_(
78 content::BrowserThread::GetBlockingPool()
79 ->GetTaskRunnerWithShutdownBehavior(
80 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)),
77 weak_observer_(observer), 81 weak_observer_(observer),
78 shortcut_info_(GetShortcutUrl(web_contents->GetBrowserContext(), 82 shortcut_info_(GetShortcutUrl(web_contents->GetBrowserContext(),
79 web_contents->GetLastCommittedURL())), 83 web_contents->GetLastCommittedURL())),
80 data_timeout_timer_(false, false), 84 data_timeout_timer_(false, false),
81 ideal_icon_size_in_px_(ideal_icon_size_in_px), 85 ideal_icon_size_in_px_(ideal_icon_size_in_px),
82 minimum_icon_size_in_px_(minimum_icon_size_in_px), 86 minimum_icon_size_in_px_(minimum_icon_size_in_px),
83 ideal_splash_image_size_in_px_(ideal_splash_image_size_in_px), 87 ideal_splash_image_size_in_px_(ideal_splash_image_size_in_px),
84 minimum_splash_image_size_in_px_(minimum_splash_image_size_in_px), 88 minimum_splash_image_size_in_px_(minimum_splash_image_size_in_px),
85 badge_size_in_px_(badge_size_in_px), 89 badge_size_in_px_(badge_size_in_px),
86 check_webapk_compatibility_(check_webapk_compatibility), 90 check_webapk_compatibility_(check_webapk_compatibility),
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 shortcut_info_.url, icon_types, threshold_to_get_any_largest_icon, 283 shortcut_info_.url, icon_types, threshold_to_get_any_largest_icon,
280 base::Bind(&AddToHomescreenDataFetcher::OnFaviconFetched, this), 284 base::Bind(&AddToHomescreenDataFetcher::OnFaviconFetched, this),
281 &favicon_task_tracker_); 285 &favicon_task_tracker_);
282 } 286 }
283 287
284 void AddToHomescreenDataFetcher::OnFaviconFetched( 288 void AddToHomescreenDataFetcher::OnFaviconFetched(
285 const favicon_base::FaviconRawBitmapResult& bitmap_result) { 289 const favicon_base::FaviconRawBitmapResult& bitmap_result) {
286 if (!web_contents() || !weak_observer_ || is_icon_saved_) 290 if (!web_contents() || !weak_observer_ || is_icon_saved_)
287 return; 291 return;
288 292
289 content::BrowserThread::GetBlockingPool()->PostWorkerTaskWithShutdownBehavior( 293 base::PostTaskAndReplyWithResult(
290 FROM_HERE, base::Bind(&AddToHomescreenDataFetcher:: 294 background_task_runner_.get(), FROM_HERE,
291 CreateLauncherIconFromFaviconInBackground, 295 base::Bind(&AddToHomescreenDataFetcher::
292 this, bitmap_result), 296 CreateLauncherIconFromFaviconInBackground,
293 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 297 base::Unretained(this), bitmap_result),
dominickn 2017/02/16 23:24:45 Is it safe to use base::Unretained here? AddToHome
tzik 2017/02/17 04:58:20 Yes, it's safe, since a reference is implicitly re
298 base::Bind(&AddToHomescreenDataFetcher::NotifyObserver, this));
294 } 299 }
295 300
296 void AddToHomescreenDataFetcher::CreateLauncherIconFromFaviconInBackground( 301 SkBitmap AddToHomescreenDataFetcher::CreateLauncherIconFromFaviconInBackground(
297 const favicon_base::FaviconRawBitmapResult& bitmap_result) { 302 const favicon_base::FaviconRawBitmapResult& bitmap_result) {
298 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); 303 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
299 304
300 SkBitmap raw_icon; 305 SkBitmap raw_icon;
301 if (bitmap_result.is_valid()) { 306 if (bitmap_result.is_valid()) {
302 gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(), 307 gfx::PNGCodec::Decode(bitmap_result.bitmap_data->front(),
303 bitmap_result.bitmap_data->size(), &raw_icon); 308 bitmap_result.bitmap_data->size(), &raw_icon);
304 } 309 }
305 310
306 shortcut_info_.best_primary_icon_url = bitmap_result.icon_url; 311 shortcut_info_.best_primary_icon_url = bitmap_result.icon_url;
307 CreateLauncherIconInBackground(raw_icon); 312 return CreateLauncherIconInBackground(raw_icon);
308 } 313 }
309 314
310 void AddToHomescreenDataFetcher::CreateLauncherIcon(const SkBitmap& raw_icon) { 315 void AddToHomescreenDataFetcher::CreateLauncherIcon(const SkBitmap& raw_icon) {
311 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 316 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
312 content::BrowserThread::GetBlockingPool()->PostWorkerTaskWithShutdownBehavior( 317 base::PostTaskAndReplyWithResult(
313 FROM_HERE, 318 background_task_runner_.get(), FROM_HERE,
314 base::Bind(&AddToHomescreenDataFetcher::CreateLauncherIconInBackground, 319 base::Bind(&AddToHomescreenDataFetcher::CreateLauncherIconInBackground,
315 this, raw_icon), 320 base::Unretained(this), raw_icon),
316 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 321 base::Bind(&AddToHomescreenDataFetcher::NotifyObserver, this));
317 } 322 }
318 323
319 void AddToHomescreenDataFetcher::CreateLauncherIconInBackground( 324 SkBitmap AddToHomescreenDataFetcher::CreateLauncherIconInBackground(
320 const SkBitmap& raw_icon) { 325 const SkBitmap& raw_icon) {
321 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); 326 DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
322 327
323 SkBitmap primary_icon; 328 SkBitmap primary_icon;
324 bool is_generated = false; 329 bool is_generated = false;
325 if (weak_observer_) { 330 if (weak_observer_) {
326 primary_icon = weak_observer_->FinalizeLauncherIconInBackground( 331 primary_icon = weak_observer_->FinalizeLauncherIconInBackground(
327 raw_icon, shortcut_info_.url, &is_generated); 332 raw_icon, shortcut_info_.url, &is_generated);
328 } 333 }
329 334
330 if (is_generated) 335 if (is_generated)
331 shortcut_info_.best_primary_icon_url = GURL(); 336 shortcut_info_.best_primary_icon_url = GURL();
332 337
333 content::BrowserThread::PostTask( 338 return primary_icon;
334 content::BrowserThread::UI, FROM_HERE,
335 base::Bind(&AddToHomescreenDataFetcher::NotifyObserver, this,
336 primary_icon));
337 } 339 }
338 340
339 void AddToHomescreenDataFetcher::NotifyObserver(const SkBitmap& primary_icon) { 341 void AddToHomescreenDataFetcher::NotifyObserver(const SkBitmap& primary_icon) {
340 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 342 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
341 if (!web_contents() || !weak_observer_ || is_icon_saved_) 343 if (!web_contents() || !weak_observer_ || is_icon_saved_)
342 return; 344 return;
343 345
344 is_icon_saved_ = true; 346 is_icon_saved_ = true;
345 primary_icon_ = primary_icon; 347 primary_icon_ = primary_icon;
346 is_ready_ = true; 348 is_ready_ = true;
347 weak_observer_->OnDataAvailable(shortcut_info_, primary_icon_, badge_icon_); 349 weak_observer_->OnDataAvailable(shortcut_info_, primary_icon_, badge_icon_);
348 } 350 }
OLDNEW
« no previous file with comments | « chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698