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

Side by Side Diff: chrome/browser/web_applications/web_app.cc

Issue 2721553002: Make web_app::ShortcutInfo RefCountedThreadSafe (1) (Closed)
Patch Set: TestBrowserThreadBundle for mac test fix 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/web_applications/web_app.h" 5 #include "chrome/browser/web_applications/web_app.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 base::FilePath GetShortcutDataDir(const web_app::ShortcutInfo& shortcut_info) { 82 base::FilePath GetShortcutDataDir(const web_app::ShortcutInfo& shortcut_info) {
83 return web_app::GetWebAppDataDirectory(shortcut_info.profile_path, 83 return web_app::GetWebAppDataDirectory(shortcut_info.profile_path,
84 shortcut_info.extension_id, 84 shortcut_info.extension_id,
85 shortcut_info.url); 85 shortcut_info.url);
86 } 86 }
87 87
88 void UpdateAllShortcutsForShortcutInfo( 88 void UpdateAllShortcutsForShortcutInfo(
89 const base::string16& old_app_title, 89 const base::string16& old_app_title,
90 const base::Closure& callback, 90 const base::Closure& callback,
91 std::unique_ptr<web_app::ShortcutInfo> shortcut_info) { 91 scoped_refptr<web_app::ShortcutInfo> shortcut_info) {
92 base::FilePath shortcut_data_dir = GetShortcutDataDir(*shortcut_info); 92 base::FilePath shortcut_data_dir = GetShortcutDataDir(*shortcut_info);
93 base::Closure task = base::Bind(&web_app::internals::UpdatePlatformShortcuts, 93 base::Closure task =
94 shortcut_data_dir, old_app_title, 94 base::Bind(&web_app::internals::UpdatePlatformShortcuts,
95 base::Passed(&shortcut_info)); 95 shortcut_data_dir, old_app_title, std::move(shortcut_info));
96 if (callback.is_null()) { 96 if (callback.is_null()) {
97 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); 97 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task);
98 } else { 98 } else {
99 BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, task, 99 BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE, task,
100 callback); 100 callback);
101 } 101 }
102 } 102 }
103 103
104 void OnImageLoaded(std::unique_ptr<web_app::ShortcutInfo> shortcut_info, 104 void OnImageLoaded(scoped_refptr<web_app::ShortcutInfo> shortcut_info,
105 web_app::ShortcutInfoCallback callback, 105 web_app::ShortcutInfoCallback callback,
106 const gfx::ImageFamily& image_family) { 106 const gfx::ImageFamily& image_family) {
107 // If the image failed to load (e.g. if the resource being loaded was empty) 107 // If the image failed to load (e.g. if the resource being loaded was empty)
108 // use the standard application icon. 108 // use the standard application icon.
109 if (image_family.empty()) { 109 if (image_family.empty()) {
110 gfx::Image default_icon = 110 gfx::Image default_icon =
111 ResourceBundle::GetSharedInstance().GetImageNamed(IDR_APP_DEFAULT_ICON); 111 ResourceBundle::GetSharedInstance().GetImageNamed(IDR_APP_DEFAULT_ICON);
112 int size = kDesiredSizes[kNumDesiredSizes - 1]; 112 int size = kDesiredSizes[kNumDesiredSizes - 1];
113 SkBitmap bmp = skia::ImageOperations::Resize( 113 SkBitmap bmp = skia::ImageOperations::Resize(
114 *default_icon.ToSkBitmap(), skia::ImageOperations::RESIZE_BEST, 114 *default_icon.ToSkBitmap(), skia::ImageOperations::RESIZE_BEST,
115 size, size); 115 size, size);
116 gfx::ImageSkia image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bmp); 116 gfx::ImageSkia image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bmp);
117 // We are on the UI thread, and this image is needed from the FILE thread, 117 // We are on the UI thread, and this image is needed from the FILE thread,
118 // for creating shortcut icon files. 118 // for creating shortcut icon files.
119 image_skia.MakeThreadSafe(); 119 image_skia.MakeThreadSafe();
120 shortcut_info->favicon.Add(gfx::Image(image_skia)); 120 shortcut_info->favicon.Add(gfx::Image(image_skia));
121 } else { 121 } else {
122 shortcut_info->favicon = image_family; 122 shortcut_info->favicon = image_family;
123 } 123 }
124 124
125 callback.Run(std::move(shortcut_info)); 125 callback.Run(std::move(shortcut_info));
126 } 126 }
127 127
128 void ScheduleCreatePlatformShortcut( 128 void ScheduleCreatePlatformShortcut(
129 web_app::ShortcutCreationReason reason, 129 web_app::ShortcutCreationReason reason,
130 const web_app::ShortcutLocations& locations, 130 const web_app::ShortcutLocations& locations,
131 std::unique_ptr<web_app::ShortcutInfo> shortcut_info) { 131 scoped_refptr<web_app::ShortcutInfo> shortcut_info) {
132 base::FilePath shortcut_data_dir = GetShortcutDataDir(*shortcut_info); 132 base::FilePath shortcut_data_dir = GetShortcutDataDir(*shortcut_info);
133 BrowserThread::PostTask( 133 BrowserThread::PostTask(
134 BrowserThread::FILE, FROM_HERE, 134 BrowserThread::FILE, FROM_HERE,
135 base::Bind( 135 base::Bind(
136 base::IgnoreResult(&web_app::internals::CreatePlatformShortcuts), 136 base::IgnoreResult(&web_app::internals::CreatePlatformShortcuts),
137 shortcut_data_dir, base::Passed(&shortcut_info), locations, reason)); 137 shortcut_data_dir, std::move(shortcut_info), locations, reason));
138 } 138 }
139 139
140 } // namespace 140 } // namespace
141 141
142 namespace web_app { 142 namespace web_app {
143 143
144 // The following string is used to build the directory name for 144 // The following string is used to build the directory name for
145 // shortcuts to chrome applications (the kind which are installed 145 // shortcuts to chrome applications (the kind which are installed
146 // from a CRX). Application shortcuts to URLs use the {host}_{path} 146 // from a CRX). Application shortcuts to URLs use the {host}_{path}
147 // for the name of this directory. Hosts can't include an underscore. 147 // for the name of this directory. Hosts can't include an underscore.
(...skipping 18 matching lines...) Expand all
166 ShortcutInfo::ShortcutInfo() {} 166 ShortcutInfo::ShortcutInfo() {}
167 ShortcutInfo::~ShortcutInfo() {} 167 ShortcutInfo::~ShortcutInfo() {}
168 168
169 ShortcutLocations::ShortcutLocations() 169 ShortcutLocations::ShortcutLocations()
170 : on_desktop(false), 170 : on_desktop(false),
171 applications_menu_location(APP_MENU_LOCATION_NONE), 171 applications_menu_location(APP_MENU_LOCATION_NONE),
172 in_quick_launch_bar(false) { 172 in_quick_launch_bar(false) {
173 } 173 }
174 174
175 #if defined(TOOLKIT_VIEWS) 175 #if defined(TOOLKIT_VIEWS)
176 std::unique_ptr<ShortcutInfo> GetShortcutInfoForTab( 176 scoped_refptr<ShortcutInfo> GetShortcutInfoForTab(
177 content::WebContents* web_contents) { 177 content::WebContents* web_contents) {
178 const favicon::FaviconDriver* favicon_driver = 178 const favicon::FaviconDriver* favicon_driver =
179 favicon::ContentFaviconDriver::FromWebContents(web_contents); 179 favicon::ContentFaviconDriver::FromWebContents(web_contents);
180 const extensions::TabHelper* extensions_tab_helper = 180 const extensions::TabHelper* extensions_tab_helper =
181 extensions::TabHelper::FromWebContents(web_contents); 181 extensions::TabHelper::FromWebContents(web_contents);
182 const WebApplicationInfo& app_info = extensions_tab_helper->web_app_info(); 182 const WebApplicationInfo& app_info = extensions_tab_helper->web_app_info();
183 183
184 std::unique_ptr<ShortcutInfo> info(new ShortcutInfo); 184 scoped_refptr<ShortcutInfo> info(new ShortcutInfo);
185 info->url = app_info.app_url.is_empty() ? web_contents->GetURL() : 185 info->url = app_info.app_url.is_empty() ? web_contents->GetURL() :
186 app_info.app_url; 186 app_info.app_url;
187 info->title = app_info.title.empty() ? 187 info->title = app_info.title.empty() ?
188 (web_contents->GetTitle().empty() ? base::UTF8ToUTF16(info->url.spec()) : 188 (web_contents->GetTitle().empty() ? base::UTF8ToUTF16(info->url.spec()) :
189 web_contents->GetTitle()) : 189 web_contents->GetTitle()) :
190 app_info.title; 190 app_info.title;
191 info->description = app_info.description; 191 info->description = app_info.description;
192 info->favicon.Add(favicon_driver->GetFavicon()); 192 info->favicon.Add(favicon_driver->GetFavicon());
193 193
194 Profile* profile = 194 Profile* profile =
195 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 195 Profile::FromBrowserContext(web_contents->GetBrowserContext());
196 info->profile_path = profile->GetPath(); 196 info->profile_path = profile->GetPath();
197 197
198 return info; 198 return info;
199 } 199 }
200 #endif 200 #endif
201 201
202 #if !defined(OS_WIN) 202 #if !defined(OS_WIN)
203 void UpdateShortcutForTabContents(content::WebContents* web_contents) {} 203 void UpdateShortcutForTabContents(content::WebContents* web_contents) {}
204 #endif 204 #endif
205 205
206 std::unique_ptr<ShortcutInfo> ShortcutInfoForExtensionAndProfile( 206 scoped_refptr<ShortcutInfo> ShortcutInfoForExtensionAndProfile(
207 const extensions::Extension* app, 207 const extensions::Extension* app,
208 Profile* profile) { 208 Profile* profile) {
209 std::unique_ptr<ShortcutInfo> shortcut_info(new ShortcutInfo); 209 scoped_refptr<ShortcutInfo> shortcut_info(new ShortcutInfo);
210 shortcut_info->extension_id = app->id(); 210 shortcut_info->extension_id = app->id();
211 shortcut_info->is_platform_app = app->is_platform_app(); 211 shortcut_info->is_platform_app = app->is_platform_app();
212 212
213 // Some default-installed apps are converted into bookmark apps on Chrome 213 // Some default-installed apps are converted into bookmark apps on Chrome
214 // first run. These should not be considered as being created (by the user) 214 // first run. These should not be considered as being created (by the user)
215 // from a web page. 215 // from a web page.
216 shortcut_info->from_bookmark = 216 shortcut_info->from_bookmark =
217 app->from_bookmark() && !app->was_installed_by_default(); 217 app->from_bookmark() && !app->was_installed_by_default();
218 218
219 shortcut_info->url = extensions::AppLaunchInfo::GetLaunchWebURL(app); 219 shortcut_info->url = extensions::AppLaunchInfo::GetLaunchWebURL(app);
220 shortcut_info->title = base::UTF8ToUTF16(app->name()); 220 shortcut_info->title = base::UTF8ToUTF16(app->name());
221 shortcut_info->description = base::UTF8ToUTF16(app->description()); 221 shortcut_info->description = base::UTF8ToUTF16(app->description());
222 shortcut_info->extension_path = app->path(); 222 shortcut_info->extension_path = app->path();
223 shortcut_info->profile_path = profile->GetPath(); 223 shortcut_info->profile_path = profile->GetPath();
224 shortcut_info->profile_name = 224 shortcut_info->profile_name =
225 profile->GetPrefs()->GetString(prefs::kProfileName); 225 profile->GetPrefs()->GetString(prefs::kProfileName);
226 shortcut_info->version_for_display = app->GetVersionForDisplay(); 226 shortcut_info->version_for_display = app->GetVersionForDisplay();
227 return shortcut_info; 227 return shortcut_info;
228 } 228 }
229 229
230 void GetShortcutInfoForApp(const extensions::Extension* extension, 230 void GetShortcutInfoForApp(const extensions::Extension* extension,
231 Profile* profile, 231 Profile* profile,
232 const ShortcutInfoCallback& callback) { 232 const ShortcutInfoCallback& callback) {
233 std::unique_ptr<web_app::ShortcutInfo> shortcut_info( 233 scoped_refptr<web_app::ShortcutInfo> shortcut_info(
234 web_app::ShortcutInfoForExtensionAndProfile(extension, profile)); 234 web_app::ShortcutInfoForExtensionAndProfile(extension, profile));
235 235
236 std::vector<extensions::ImageLoader::ImageRepresentation> info_list; 236 std::vector<extensions::ImageLoader::ImageRepresentation> info_list;
237 for (size_t i = 0; i < kNumDesiredSizes; ++i) { 237 for (size_t i = 0; i < kNumDesiredSizes; ++i) {
238 int size = kDesiredSizes[i]; 238 int size = kDesiredSizes[i];
239 extensions::ExtensionResource resource = 239 extensions::ExtensionResource resource =
240 extensions::IconsInfo::GetIconResource( 240 extensions::IconsInfo::GetIconResource(
241 extension, size, ExtensionIconSet::MATCH_EXACTLY); 241 extension, size, ExtensionIconSet::MATCH_EXACTLY);
242 if (!resource.empty()) { 242 if (!resource.empty()) {
243 info_list.push_back(extensions::ImageLoader::ImageRepresentation( 243 info_list.push_back(extensions::ImageLoader::ImageRepresentation(
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 379
380 std::string GetExtensionIdFromApplicationName(const std::string& app_name) { 380 std::string GetExtensionIdFromApplicationName(const std::string& app_name) {
381 std::string prefix(kCrxAppPrefix); 381 std::string prefix(kCrxAppPrefix);
382 if (app_name.substr(0, prefix.length()) != prefix) 382 if (app_name.substr(0, prefix.length()) != prefix)
383 return std::string(); 383 return std::string();
384 return app_name.substr(prefix.length()); 384 return app_name.substr(prefix.length());
385 } 385 }
386 386
387 void CreateShortcutsWithInfo(ShortcutCreationReason reason, 387 void CreateShortcutsWithInfo(ShortcutCreationReason reason,
388 const ShortcutLocations& locations, 388 const ShortcutLocations& locations,
389 std::unique_ptr<ShortcutInfo> shortcut_info) { 389 scoped_refptr<ShortcutInfo> shortcut_info) {
390 DCHECK_CURRENTLY_ON(BrowserThread::UI); 390 DCHECK_CURRENTLY_ON(BrowserThread::UI);
391 391
392 // If the shortcut is for an application shortcut with the new bookmark app 392 // If the shortcut is for an application shortcut with the new bookmark app
393 // flow disabled, there will be no corresponding extension. 393 // flow disabled, there will be no corresponding extension.
394 if (!shortcut_info->extension_id.empty()) { 394 if (!shortcut_info->extension_id.empty()) {
395 // It's possible for the extension to be deleted before we get here. 395 // It's possible for the extension to be deleted before we get here.
396 // For example, creating a hosted app from a website. Double check that 396 // For example, creating a hosted app from a website. Double check that
397 // it still exists. 397 // it still exists.
398 Profile* profile = g_browser_process->profile_manager()->GetProfileByPath( 398 Profile* profile = g_browser_process->profile_manager()->GetProfileByPath(
399 shortcut_info->profile_path); 399 shortcut_info->profile_path);
(...skipping 20 matching lines...) Expand all
420 if (!ShouldCreateShortcutFor(reason, profile, app)) 420 if (!ShouldCreateShortcutFor(reason, profile, app))
421 return; 421 return;
422 422
423 GetShortcutInfoForApp( 423 GetShortcutInfoForApp(
424 app, profile, base::Bind(&CreateShortcutsWithInfo, reason, locations)); 424 app, profile, base::Bind(&CreateShortcutsWithInfo, reason, locations));
425 } 425 }
426 426
427 void DeleteAllShortcuts(Profile* profile, const extensions::Extension* app) { 427 void DeleteAllShortcuts(Profile* profile, const extensions::Extension* app) {
428 DCHECK_CURRENTLY_ON(BrowserThread::UI); 428 DCHECK_CURRENTLY_ON(BrowserThread::UI);
429 429
430 std::unique_ptr<ShortcutInfo> shortcut_info( 430 scoped_refptr<ShortcutInfo> shortcut_info(
431 ShortcutInfoForExtensionAndProfile(app, profile)); 431 ShortcutInfoForExtensionAndProfile(app, profile));
432 base::FilePath shortcut_data_dir = GetShortcutDataDir(*shortcut_info); 432 base::FilePath shortcut_data_dir = GetShortcutDataDir(*shortcut_info);
433 BrowserThread::PostTask( 433 BrowserThread::PostTask(
434 BrowserThread::FILE, FROM_HERE, 434 BrowserThread::FILE, FROM_HERE,
435 base::Bind(&web_app::internals::DeletePlatformShortcuts, 435 base::Bind(&web_app::internals::DeletePlatformShortcuts,
436 shortcut_data_dir, base::Passed(&shortcut_info))); 436 shortcut_data_dir, base::Passed(&shortcut_info)));
437 } 437 }
438 438
439 void UpdateAllShortcuts(const base::string16& old_app_title, 439 void UpdateAllShortcuts(const base::string16& old_app_title,
440 Profile* profile, 440 Profile* profile,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 484
485 #if defined(OS_LINUX) 485 #if defined(OS_LINUX)
486 std::string GetWMClassFromAppName(std::string app_name) { 486 std::string GetWMClassFromAppName(std::string app_name) {
487 base::i18n::ReplaceIllegalCharactersInPath(&app_name, '_'); 487 base::i18n::ReplaceIllegalCharactersInPath(&app_name, '_');
488 base::TrimString(app_name, "_", &app_name); 488 base::TrimString(app_name, "_", &app_name);
489 return app_name; 489 return app_name;
490 } 490 }
491 #endif 491 #endif
492 492
493 } // namespace web_app 493 } // namespace web_app
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698