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

Side by Side Diff: chrome/browser/extensions/platform_app_launcher.cc

Issue 14607023: Add support for persistent file access in apps. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase Created 7 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 | « chrome/browser/extensions/platform_app_launcher.h ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/extensions/platform_app_launcher.h" 5 #include "chrome/browser/extensions/platform_app_launcher.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #if defined(OS_WIN) 43 #if defined(OS_WIN)
44 #include "win8/util/win8_util.h" 44 #include "win8/util/win8_util.h"
45 #endif 45 #endif
46 46
47 using content::BrowserThread; 47 using content::BrowserThread;
48 using extensions::app_file_handler_util::FileHandlerForId; 48 using extensions::app_file_handler_util::FileHandlerForId;
49 using extensions::app_file_handler_util::FileHandlerCanHandleFile; 49 using extensions::app_file_handler_util::FileHandlerCanHandleFile;
50 using extensions::app_file_handler_util::FirstFileHandlerForFile; 50 using extensions::app_file_handler_util::FirstFileHandlerForFile;
51 using extensions::app_file_handler_util::CreateFileEntry; 51 using extensions::app_file_handler_util::CreateFileEntry;
52 using extensions::app_file_handler_util::GrantedFileEntry; 52 using extensions::app_file_handler_util::GrantedFileEntry;
53 using extensions::app_file_handler_util::SavedFileEntry;
54 53
55 namespace extensions { 54 namespace extensions {
56 55
57 namespace { 56 namespace {
58 57
59 const char kFallbackMimeType[] = "application/octet-stream"; 58 const char kFallbackMimeType[] = "application/octet-stream";
60 59
61 bool MakePathAbsolute(const base::FilePath& current_directory, 60 bool MakePathAbsolute(const base::FilePath& current_directory,
62 base::FilePath* file_path) { 61 base::FilePath* file_path) {
63 DCHECK(file_path); 62 DCHECK(file_path);
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 // The extension providing the app. 271 // The extension providing the app.
273 const Extension* extension_; 272 const Extension* extension_;
274 // The path to be passed through to the app. 273 // The path to be passed through to the app.
275 const base::FilePath file_path_; 274 const base::FilePath file_path_;
276 // The ID of the file handler used to launch the app. 275 // The ID of the file handler used to launch the app.
277 std::string handler_id_; 276 std::string handler_id_;
278 277
279 DISALLOW_COPY_AND_ASSIGN(PlatformAppPathLauncher); 278 DISALLOW_COPY_AND_ASSIGN(PlatformAppPathLauncher);
280 }; 279 };
281 280
282 class SavedFileEntryLauncher
283 : public base::RefCountedThreadSafe<SavedFileEntryLauncher> {
284 public:
285 SavedFileEntryLauncher(
286 Profile* profile,
287 const Extension* extension,
288 const std::vector<SavedFileEntry>& file_entries)
289 : profile_(profile),
290 extension_(extension),
291 file_entries_(file_entries) {}
292
293 void Launch() {
294 // Access needs to be granted to the file or filesystem for the process
295 // associated with the extension. To do this the ExtensionHost is needed.
296 // This might not be available, or it might be in the process of being
297 // unloaded, in which case the lazy background task queue is used to load
298 // he extension and then call back to us.
299 extensions::LazyBackgroundTaskQueue* queue =
300 ExtensionSystem::Get(profile_)->lazy_background_task_queue();
301 if (queue->ShouldEnqueueTask(profile_, extension_)) {
302 queue->AddPendingTask(profile_, extension_->id(), base::Bind(
303 &SavedFileEntryLauncher::GrantAccessToFilesAndLaunch,
304 this));
305 return;
306 }
307 ExtensionProcessManager* process_manager =
308 ExtensionSystem::Get(profile_)->process_manager();
309 extensions::ExtensionHost* host =
310 process_manager->GetBackgroundHostForExtension(extension_->id());
311 DCHECK(host);
312 GrantAccessToFilesAndLaunch(host);
313 }
314
315 private:
316 friend class base::RefCountedThreadSafe<SavedFileEntryLauncher>;
317 ~SavedFileEntryLauncher() {}
318
319 void GrantAccessToFilesAndLaunch(ExtensionHost* host) {
320 // If there was an error loading the app page, |host| will be NULL.
321 if (!host) {
322 LOG(ERROR) << "Could not load app page for " << extension_->id();
323 return;
324 }
325
326 int renderer_id = host->render_process_host()->GetID();
327 std::vector<GrantedFileEntry> granted_file_entries;
328 for (std::vector<SavedFileEntry>::const_iterator it =
329 file_entries_.begin(); it != file_entries_.end(); ++it) {
330 GrantedFileEntry file_entry = CreateFileEntry(
331 profile_, extension_->id(), renderer_id, it->path, it->writable);
332 file_entry.id = it->id;
333 granted_file_entries.push_back(file_entry);
334
335 // Record that we have granted this file permission.
336 app_file_handler_util::AddSavedFileEntry(
337 ExtensionPrefs::Get(profile_),
338 host->extension()->id(),
339 it->id,
340 it->path,
341 it->writable);
342 }
343 extensions::AppEventRouter::DispatchOnRestartedEvent(
344 profile_, extension_, granted_file_entries);
345 }
346
347 // The profile the app should be run in.
348 Profile* profile_;
349 // The extension providing the app.
350 const Extension* extension_;
351
352 std::vector<SavedFileEntry> file_entries_;
353 };
354
355 } // namespace 281 } // namespace
356 282
357 void LaunchPlatformApp(Profile* profile, 283 void LaunchPlatformApp(Profile* profile,
358 const Extension* extension, 284 const Extension* extension,
359 const CommandLine* command_line, 285 const CommandLine* command_line,
360 const base::FilePath& current_directory) { 286 const base::FilePath& current_directory) {
361 #if defined(OS_WIN) 287 #if defined(OS_WIN)
362 // On Windows 8's single window Metro mode we can not launch platform apps. 288 // On Windows 8's single window Metro mode we can not launch platform apps.
363 // Offer to switch Chrome to desktop mode. 289 // Offer to switch Chrome to desktop mode.
364 if (win8::IsSingleWindowMetroMode()) { 290 if (win8::IsSingleWindowMetroMode()) {
(...skipping 28 matching lines...) Expand all
393 319
394 void LaunchPlatformAppWithFileHandler(Profile* profile, 320 void LaunchPlatformAppWithFileHandler(Profile* profile,
395 const Extension* extension, 321 const Extension* extension,
396 const std::string& handler_id, 322 const std::string& handler_id,
397 const base::FilePath& file_path) { 323 const base::FilePath& file_path) {
398 scoped_refptr<PlatformAppPathLauncher> launcher = 324 scoped_refptr<PlatformAppPathLauncher> launcher =
399 new PlatformAppPathLauncher(profile, extension, file_path); 325 new PlatformAppPathLauncher(profile, extension, file_path);
400 launcher->LaunchWithHandler(handler_id); 326 launcher->LaunchWithHandler(handler_id);
401 } 327 }
402 328
403 void RestartPlatformAppWithFileEntries( 329 void RestartPlatformApp(Profile* profile, const Extension* extension) {
404 Profile* profile,
405 const Extension* extension,
406 const std::vector<SavedFileEntry>& file_entries) {
407 extensions::EventRouter* event_router = 330 extensions::EventRouter* event_router =
408 ExtensionSystem::Get(profile)->event_router(); 331 ExtensionSystem::Get(profile)->event_router();
409 bool listening_to_restart = event_router-> 332 bool listening_to_restart = event_router->
410 ExtensionHasEventListener(extension->id(), event_names::kOnRestarted); 333 ExtensionHasEventListener(extension->id(), event_names::kOnRestarted);
411 334
412 if (listening_to_restart) { 335 if (listening_to_restart) {
413 scoped_refptr<SavedFileEntryLauncher> launcher = new SavedFileEntryLauncher( 336 extensions::AppEventRouter::DispatchOnRestartedEvent(profile, extension);
414 profile, extension, file_entries);
415 launcher->Launch();
416 return; 337 return;
417 } 338 }
418 339
419 ExtensionPrefs* extension_prefs = ExtensionSystem::Get(profile)-> 340 ExtensionPrefs* extension_prefs = ExtensionSystem::Get(profile)->
420 extension_service()->extension_prefs(); 341 extension_service()->extension_prefs();
421 bool had_windows = extension_prefs->HasWindows(extension->id()); 342 bool had_windows = extension_prefs->HasWindows(extension->id());
422 extension_prefs->SetHasWindows(extension->id(), false); 343 extension_prefs->SetHasWindows(extension->id(), false);
423 bool listening_to_launch = event_router-> 344 bool listening_to_launch = event_router->
424 ExtensionHasEventListener(extension->id(), event_names::kOnLaunched); 345 ExtensionHasEventListener(extension->id(), event_names::kOnLaunched);
425 346
426 if (listening_to_launch && had_windows) 347 if (listening_to_launch && had_windows)
427 LaunchPlatformAppWithNoData(profile, extension); 348 LaunchPlatformAppWithNoData(profile, extension);
428 } 349 }
429 350
430 } // namespace extensions 351 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/platform_app_launcher.h ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698