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

Side by Side Diff: apps/launcher.cc

Issue 277873002: Use file thread when converting paths to absolute when loading apps. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 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 | « no previous file | 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "apps/launcher.h" 5 #include "apps/launcher.h"
6 6
7 #include "apps/browser/api/app_runtime/app_runtime_api.h" 7 #include "apps/browser/api/app_runtime/app_runtime_api.h"
8 #include "apps/browser/file_handler_util.h" 8 #include "apps/browser/file_handler_util.h"
9 #include "apps/common/api/app_runtime.h" 9 #include "apps/common/api/app_runtime.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 using extensions::Extension; 56 using extensions::Extension;
57 using extensions::ExtensionHost; 57 using extensions::ExtensionHost;
58 using extensions::ExtensionSystem; 58 using extensions::ExtensionSystem;
59 59
60 namespace apps { 60 namespace apps {
61 61
62 namespace { 62 namespace {
63 63
64 const char kFallbackMimeType[] = "application/octet-stream"; 64 const char kFallbackMimeType[] = "application/octet-stream";
65 65
66 bool MakePathAbsolute(const base::FilePath& current_directory, 66 bool DoMakePathAbsolute(const base::FilePath& current_directory,
67 base::FilePath* file_path) { 67 base::FilePath* file_path) {
68 DCHECK(file_path); 68 DCHECK(file_path);
69 if (file_path->IsAbsolute()) 69 if (file_path->IsAbsolute())
70 return true; 70 return true;
71 71
72 if (current_directory.empty()) { 72 if (current_directory.empty()) {
73 *file_path = base::MakeAbsoluteFilePath(*file_path); 73 *file_path = base::MakeAbsoluteFilePath(*file_path);
74 return !file_path->empty(); 74 return !file_path->empty();
75 } 75 }
76 76
77 if (!current_directory.IsAbsolute()) 77 if (!current_directory.IsAbsolute())
78 return false; 78 return false;
79 79
80 *file_path = current_directory.Append(*file_path); 80 *file_path = current_directory.Append(*file_path);
81 return true; 81 return true;
82 } 82 }
83 83
84 bool GetAbsolutePathFromCommandLine(const CommandLine& command_line,
85 const base::FilePath& current_directory,
86 base::FilePath* path) {
87 if (!command_line.GetArgs().size())
88 return false;
89
90 base::FilePath relative_path(command_line.GetArgs()[0]);
91 base::FilePath absolute_path(relative_path);
92 if (!MakePathAbsolute(current_directory, &absolute_path)) {
93 LOG(WARNING) << "Cannot make absolute path from " << relative_path.value();
94 return false;
95 }
96 *path = absolute_path;
97 return true;
98 }
99
100 // Helper method to launch the platform app |extension| with no data. This 84 // Helper method to launch the platform app |extension| with no data. This
101 // should be called in the fallback case, where it has been impossible to 85 // should be called in the fallback case, where it has been impossible to
102 // load or obtain file launch data. 86 // load or obtain file launch data.
103 void LaunchPlatformAppWithNoData(Profile* profile, const Extension* extension) { 87 void LaunchPlatformAppWithNoData(Profile* profile, const Extension* extension) {
104 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 88 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
105 AppEventRouter::DispatchOnLaunchedEvent(profile, extension); 89 AppEventRouter::DispatchOnLaunchedEvent(profile, extension);
106 } 90 }
107 91
108 // Class to handle launching of platform apps to open a specific path. 92 // Class to handle launching of platform apps to open a specific path.
109 // An instance of this class is created for each launch. The lifetime of these 93 // An instance of this class is created for each launch. The lifetime of these
(...skipping 30 matching lines...) Expand all
140 } 124 }
141 125
142 OnFileValid(); 126 OnFileValid();
143 } 127 }
144 128
145 void LaunchWithHandler(const std::string& handler_id) { 129 void LaunchWithHandler(const std::string& handler_id) {
146 handler_id_ = handler_id; 130 handler_id_ = handler_id;
147 Launch(); 131 Launch();
148 } 132 }
149 133
134 void LaunchWithRelativePath(const base::FilePath& current_directory) {
135 BrowserThread::PostTask(
136 BrowserThread::FILE,
137 FROM_HERE,
138 base::Bind(&PlatformAppPathLauncher::MakePathAbsolute,
139 this,
140 current_directory));
141 }
142
150 private: 143 private:
151 friend class base::RefCountedThreadSafe<PlatformAppPathLauncher>; 144 friend class base::RefCountedThreadSafe<PlatformAppPathLauncher>;
152 145
153 virtual ~PlatformAppPathLauncher() {} 146 virtual ~PlatformAppPathLauncher() {}
154 147
148 void MakePathAbsolute(const base::FilePath& current_directory) {
149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
tapted 2014/05/12 00:27:45 oh! I forgot - there's now also DCHECK_CURRENTLY_O
benwells 2014/05/12 05:51:05 Nice, I didn't know about that.
150
151 if (!DoMakePathAbsolute(current_directory, &file_path_)) {
152 LOG(WARNING) << "Cannot make absolute path from " << file_path_.value();
153 file_path_ = base::FilePath();
154 }
155
156 BrowserThread::PostTask(BrowserThread::UI,
157 FROM_HERE,
158 base::Bind(&PlatformAppPathLauncher::Launch, this));
159 }
160
155 void OnFileValid() { 161 void OnFileValid() {
156 #if defined(OS_CHROMEOS) 162 #if defined(OS_CHROMEOS)
157 if (drive::util::IsUnderDriveMountPoint(file_path_)) { 163 if (drive::util::IsUnderDriveMountPoint(file_path_)) {
158 PlatformAppPathLauncher::GetMimeTypeAndLaunchForDriveFile(); 164 PlatformAppPathLauncher::GetMimeTypeAndLaunchForDriveFile();
159 return; 165 return;
160 } 166 }
161 #endif 167 #endif
162 168
163 BrowserThread::PostTask( 169 BrowserThread::PostTask(
164 BrowserThread::FILE, 170 BrowserThread::FILE,
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 host->render_process_host()->GetID(), 309 host->render_process_host()->GetID(),
304 file_path_, 310 file_path_,
305 false); 311 false);
306 AppEventRouter::DispatchOnLaunchedEventWithFileEntry( 312 AppEventRouter::DispatchOnLaunchedEventWithFileEntry(
307 profile_, extension_, handler_id_, mime_type, file_entry); 313 profile_, extension_, handler_id_, mime_type, file_entry);
308 } 314 }
309 315
310 // The profile the app should be run in. 316 // The profile the app should be run in.
311 Profile* profile_; 317 Profile* profile_;
312 // The extension providing the app. 318 // The extension providing the app.
313 const Extension* extension_; 319 const Extension* extension_;
tapted 2014/05/12 00:07:51 should this be a scoped_refptr?
benwells 2014/05/12 00:18:51 I don't think so. My understanding is that extensi
benwells 2014/05/12 05:51:05 As discussed, added a TODO for this.
314 // The path to be passed through to the app. 320 // The path to be passed through to the app.
315 const base::FilePath file_path_; 321 base::FilePath file_path_;
316 // The ID of the file handler used to launch the app. 322 // The ID of the file handler used to launch the app.
317 std::string handler_id_; 323 std::string handler_id_;
318 324
319 DISALLOW_COPY_AND_ASSIGN(PlatformAppPathLauncher); 325 DISALLOW_COPY_AND_ASSIGN(PlatformAppPathLauncher);
320 }; 326 };
321 327
322 } // namespace 328 } // namespace
323 329
324 void LaunchPlatformAppWithCommandLine(Profile* profile, 330 void LaunchPlatformAppWithCommandLine(Profile* profile,
325 const Extension* extension, 331 const Extension* extension,
326 const CommandLine& command_line, 332 const CommandLine& command_line,
327 const base::FilePath& current_directory) { 333 const base::FilePath& current_directory) {
328 // An app with "kiosk_only" should not be installed and launched 334 // An app with "kiosk_only" should not be installed and launched
329 // outside of ChromeOS kiosk mode in the first place. This is a defensive 335 // outside of ChromeOS kiosk mode in the first place. This is a defensive
330 // check in case this scenario does occur. 336 // check in case this scenario does occur.
331 if (extensions::KioskModeInfo::IsKioskOnly(extension)) { 337 if (extensions::KioskModeInfo::IsKioskOnly(extension)) {
332 bool in_kiosk_mode = false; 338 bool in_kiosk_mode = false;
333 #if defined(OS_CHROMEOS) 339 #if defined(OS_CHROMEOS)
334 chromeos::UserManager* user_manager = chromeos::UserManager::Get(); 340 chromeos::UserManager* user_manager = chromeos::UserManager::Get();
335 in_kiosk_mode = user_manager && user_manager->IsLoggedInAsKioskApp(); 341 in_kiosk_mode = user_manager && user_manager->IsLoggedInAsKioskApp();
336 #endif 342 #endif
337 if (!in_kiosk_mode) { 343 if (!in_kiosk_mode) {
338 LOG(ERROR) << "App with 'kiosk_only' attribute must be run in " 344 LOG(ERROR) << "App with 'kiosk_only' attribute must be run in "
339 << " ChromeOS kiosk mode."; 345 << " ChromeOS kiosk mode.";
340 NOTREACHED(); 346 NOTREACHED();
341 return; 347 return;
342 } 348 }
343 } 349 }
344 350
345 base::FilePath path; 351 if (!command_line.GetArgs().size()) {
tapted 2014/05/12 00:07:51 nit: if (command_line.GetArgs().empty()) {
benwells 2014/05/12 05:51:05 Done.
346 if (!GetAbsolutePathFromCommandLine(command_line, current_directory, &path)) {
347 LaunchPlatformAppWithNoData(profile, extension); 352 LaunchPlatformAppWithNoData(profile, extension);
348 return; 353 return;
349 } 354 }
350 355
351 // TODO(benwells): add a command-line argument to provide a handler ID. 356 base::FilePath file_path(command_line.GetArgs()[0]);
352 LaunchPlatformAppWithPath(profile, extension, path); 357 // launcher will be freed when nothing has a reference to it. The message
tapted 2014/05/12 00:07:51 nit: this comment seems like it should be on the c
benwells 2014/05/12 00:18:51 Yep, I'll move it. I remember adding this comment
benwells 2014/05/12 05:51:05 Actually there is already a comment there :)
358 // queue will retain a reference for any outstanding task, so when the
359 // launcher has finished it will be freed.
360 scoped_refptr<PlatformAppPathLauncher> launcher =
361 new PlatformAppPathLauncher(profile, extension, file_path);
362 launcher->LaunchWithRelativePath(current_directory);
tapted 2014/05/12 00:07:51 You could also do base::PostTaskAndReplyWithRes
353 } 363 }
354 364
355 void LaunchPlatformAppWithPath(Profile* profile, 365 void LaunchPlatformAppWithPath(Profile* profile,
356 const Extension* extension, 366 const Extension* extension,
357 const base::FilePath& file_path) { 367 const base::FilePath& file_path) {
358 // launcher will be freed when nothing has a reference to it. The message 368 // launcher will be freed when nothing has a reference to it. The message
359 // queue will retain a reference for any outstanding task, so when the 369 // queue will retain a reference for any outstanding task, so when the
360 // launcher has finished it will be freed. 370 // launcher has finished it will be freed.
361 scoped_refptr<PlatformAppPathLauncher> launcher = 371 scoped_refptr<PlatformAppPathLauncher> launcher =
362 new PlatformAppPathLauncher(profile, extension, file_path); 372 new PlatformAppPathLauncher(profile, extension, file_path);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 void LaunchPlatformAppWithUrl(Profile* profile, 415 void LaunchPlatformAppWithUrl(Profile* profile,
406 const Extension* extension, 416 const Extension* extension,
407 const std::string& handler_id, 417 const std::string& handler_id,
408 const GURL& url, 418 const GURL& url,
409 const GURL& referrer_url) { 419 const GURL& referrer_url) {
410 AppEventRouter::DispatchOnLaunchedEventWithUrl( 420 AppEventRouter::DispatchOnLaunchedEventWithUrl(
411 profile, extension, handler_id, url, referrer_url); 421 profile, extension, handler_id, url, referrer_url);
412 } 422 }
413 423
414 } // namespace apps 424 } // namespace apps
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698