OLD | NEW |
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 #include "chrome/browser/chromeos/extensions/file_manager_util.h" | 4 #include "chrome/browser/chromeos/extensions/file_manager_util.h" |
5 | 5 |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/path_service.h" | 12 #include "base/path_service.h" |
13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
14 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
15 #include "base/values.h" | 15 #include "base/values.h" |
16 #include "chrome/browser/chromeos/extensions/file_handler_util.h" | 16 #include "chrome/browser/chromeos/extensions/file_handler_util.h" |
17 #include "chrome/browser/chromeos/gdata/gdata_operation_registry.h" | 17 #include "chrome/browser/chromeos/gdata/gdata_operation_registry.h" |
18 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" | 18 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" |
19 #include "chrome/browser/chromeos/gdata/gdata_util.h" | 19 #include "chrome/browser/chromeos/gdata/gdata_util.h" |
20 #include "chrome/browser/extensions/crx_installer.h" | 20 #include "chrome/browser/extensions/crx_installer.h" |
21 #include "chrome/browser/extensions/extension_install_ui.h" | 21 #include "chrome/browser/extensions/extension_install_ui.h" |
22 #include "chrome/browser/extensions/extension_service.h" | 22 #include "chrome/browser/extensions/extension_service.h" |
23 #include "chrome/browser/plugin_prefs.h" | 23 #include "chrome/browser/plugin_prefs.h" |
24 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
| 25 #include "chrome/browser/profiles/profile_manager.h" |
25 #include "chrome/browser/simple_message_box.h" | 26 #include "chrome/browser/simple_message_box.h" |
| 27 #include "chrome/browser/tabs/tab_strip_model.h" |
26 #include "chrome/browser/ui/browser.h" | 28 #include "chrome/browser/ui/browser.h" |
27 #include "chrome/browser/ui/browser_list.h" | 29 #include "chrome/browser/ui/browser_list.h" |
28 #include "chrome/browser/ui/browser_window.h" | 30 #include "chrome/browser/ui/browser_window.h" |
| 31 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
29 #include "chrome/common/extensions/file_browser_handler.h" | 32 #include "chrome/common/extensions/file_browser_handler.h" |
30 #include "chrome/common/chrome_paths.h" | 33 #include "chrome/common/chrome_paths.h" |
31 #include "chrome/common/url_constants.h" | 34 #include "chrome/common/url_constants.h" |
32 #include "content/public/browser/browser_thread.h" | 35 #include "content/public/browser/browser_thread.h" |
33 #include "content/public/browser/plugin_service.h" | 36 #include "content/public/browser/plugin_service.h" |
34 #include "content/public/browser/user_metrics.h" | 37 #include "content/public/browser/user_metrics.h" |
| 38 #include "content/public/browser/web_contents.h" |
35 #include "grit/generated_resources.h" | 39 #include "grit/generated_resources.h" |
36 #include "net/base/escape.h" | 40 #include "net/base/escape.h" |
37 #include "net/base/net_util.h" | 41 #include "net/base/net_util.h" |
38 #include "ui/base/l10n/l10n_util.h" | 42 #include "ui/base/l10n/l10n_util.h" |
39 #include "webkit/fileapi/file_system_context.h" | 43 #include "webkit/fileapi/file_system_context.h" |
40 #include "webkit/fileapi/file_system_mount_point_provider.h" | 44 #include "webkit/fileapi/file_system_mount_point_provider.h" |
41 #include "webkit/fileapi/file_system_util.h" | 45 #include "webkit/fileapi/file_system_util.h" |
42 #include "webkit/plugins/webplugininfo.h" | 46 #include "webkit/plugins/webplugininfo.h" |
43 | 47 |
44 #if defined(OS_CHROMEOS) | 48 #if defined(OS_CHROMEOS) |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 IDS_FILE_BROWSER_SELECT_OPEN_MULTI_FILE_TITLE); | 363 IDS_FILE_BROWSER_SELECT_OPEN_MULTI_FILE_TITLE); |
360 break; | 364 break; |
361 | 365 |
362 default: | 366 default: |
363 NOTREACHED(); | 367 NOTREACHED(); |
364 } | 368 } |
365 | 369 |
366 return title; | 370 return title; |
367 } | 371 } |
368 | 372 |
369 void ViewRemovableDrive(const FilePath& dir) { | 373 enum TAB_REUSE_MODE { |
370 Browser* browser = BrowserList::GetLastActive(); | 374 REUSE_ANY_FILE_MANAGER, |
371 if (!browser) | 375 REUSE_SAME_PATH, |
| 376 REUSE_NEVER |
| 377 }; |
| 378 |
| 379 bool FileManageTabExists(const FilePath& path, TAB_REUSE_MODE mode) { |
| 380 if (mode == REUSE_NEVER) |
| 381 return false; |
| 382 |
| 383 // We always open full-tab File Manager via chrome://files URL, never |
| 384 // chrome-extension://, so we only check against chrome://files |
| 385 const GURL origin(chrome::kChromeUIFileManagerURL); |
| 386 const std::string ref = std::string("/") + path.value(); |
| 387 |
| 388 for (BrowserList::const_iterator browser_iterator = BrowserList::begin(); |
| 389 browser_iterator != BrowserList::end(); ++browser_iterator) { |
| 390 Browser* browser = *browser_iterator; |
| 391 TabStripModel* tab_strip = browser->tabstrip_model(); |
| 392 for (int idx = 0; idx < tab_strip->count(); idx++) { |
| 393 content::WebContents* web_contents = |
| 394 tab_strip->GetTabContentsAt(idx)->web_contents(); |
| 395 const GURL& url = web_contents->GetURL(); |
| 396 if (origin == url.GetOrigin()) { |
| 397 if (mode == REUSE_ANY_FILE_MANAGER || ref == url.ref()) { |
| 398 if (mode == REUSE_SAME_PATH && tab_strip->active_index() != idx) { |
| 399 browser->window()->Show(); |
| 400 tab_strip->ActivateTabAt(idx, false); |
| 401 } |
| 402 return true; |
| 403 } |
| 404 } |
| 405 } |
| 406 } |
| 407 |
| 408 return false; |
| 409 } |
| 410 |
| 411 void OpenFileBrowser(const FilePath& path, |
| 412 TAB_REUSE_MODE mode, |
| 413 const std::string& flag_name) { |
| 414 if (FileManageTabExists(path, mode)) |
372 return; | 415 return; |
373 | 416 |
| 417 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); |
| 418 |
374 FilePath virtual_path; | 419 FilePath virtual_path; |
375 if (!ConvertFileToRelativeFileSystemPath(browser->profile(), dir, | 420 if (!ConvertFileToRelativeFileSystemPath(profile, path, &virtual_path)) |
376 &virtual_path)) { | |
377 return; | 421 return; |
378 } | |
379 | |
380 DictionaryValue arg_value; | |
381 arg_value.SetBoolean("mountTriggered", true); | |
382 | |
383 std::string json_args; | |
384 base::JSONWriter::Write(&arg_value, &json_args); | |
385 | 422 |
386 std::string url = chrome::kChromeUIFileManagerURL; | 423 std::string url = chrome::kChromeUIFileManagerURL; |
387 url += "?" + json_args + "#/" + | 424 if (flag_name.size()) { |
388 net::EscapeUrlEncodedData(virtual_path.value(), false); | 425 DictionaryValue arg_value; |
| 426 arg_value.SetBoolean(flag_name, "true"); |
| 427 std::string query; |
| 428 base::JSONWriter::Write(&arg_value, &query); |
| 429 url += "?" + net::EscapeUrlEncodedData(query, false); |
| 430 } |
| 431 url += "#/" + net::EscapeUrlEncodedData(virtual_path.value(), false); |
| 432 |
| 433 ExtensionService* service = profile->GetExtensionService(); |
| 434 if (!service) |
| 435 return; |
| 436 |
| 437 const Extension* extension = |
| 438 service->GetExtensionById(kFileBrowserDomain, false); |
| 439 if (!extension) |
| 440 return; |
| 441 |
| 442 extension_misc::LaunchContainer launch_container = |
| 443 service->extension_prefs()-> |
| 444 GetLaunchContainer(extension, ExtensionPrefs::LAUNCH_DEFAULT); |
389 | 445 |
390 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); | 446 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); |
391 browser->ShowSingletonTabRespectRef(GURL(url)); | 447 Browser::OpenApplication( |
| 448 profile, extension, launch_container, GURL(url), NEW_FOREGROUND_TAB); |
392 } | 449 } |
393 | 450 |
394 void OpenFileBrowser(const FilePath& full_path) { | 451 void ViewRemovableDrive(const FilePath& path) { |
395 Browser* browser = BrowserList::GetLastActive(); | 452 OpenFileBrowser(path, REUSE_ANY_FILE_MANAGER, "mountTriggered"); |
396 if (!browser) | |
397 return; | |
398 | |
399 FilePath virtual_path; | |
400 if (!ConvertFileToRelativeFileSystemPath(browser->profile(), full_path, | |
401 &virtual_path)) { | |
402 return; | |
403 } | |
404 | |
405 std::string url = chrome::kChromeUIFileManagerURL; | |
406 url += "#/" + net::EscapeUrlEncodedData(virtual_path.value(), false); | |
407 | |
408 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); | |
409 browser->ShowSingletonTabRespectRef(GURL(url)); | |
410 } | 453 } |
411 | 454 |
412 void ViewFolder(const FilePath& dir) { | 455 void ShowFileInFolder(const FilePath& path) { |
413 OpenFileBrowser(dir); | 456 // This action changes the selection so we do not reuse existing tabs. |
| 457 OpenFileBrowser(path, REUSE_NEVER, "selectOnly"); |
| 458 } |
| 459 |
| 460 void ViewFolder(const FilePath& path) { |
| 461 OpenFileBrowser(path, REUSE_SAME_PATH, ""); |
414 } | 462 } |
415 | 463 |
416 class StandaloneExecutor : public FileTaskExecutor { | 464 class StandaloneExecutor : public FileTaskExecutor { |
417 public: | 465 public: |
418 StandaloneExecutor(Profile * profile, | 466 StandaloneExecutor(Profile * profile, |
419 const GURL& source_url, | 467 const GURL& source_url, |
420 const std::string& extension_id, | 468 const std::string& extension_id, |
421 const std::string& action_id) | 469 const std::string& action_id) |
422 : FileTaskExecutor(profile, source_url, extension_id, action_id) | 470 : FileTaskExecutor(profile, source_url, extension_id, action_id) |
423 {} | 471 {} |
424 | 472 |
425 protected : | 473 protected : |
426 // FileTaskExecutor overrides. | 474 // FileTaskExecutor overrides. |
427 virtual Browser* browser() { return BrowserList::GetLastActive(); } | 475 virtual Browser* browser() { |
| 476 return Browser::GetOrCreateTabbedBrowser(profile()); |
| 477 } |
428 virtual void Done(bool) {} | 478 virtual void Done(bool) {} |
429 }; | 479 }; |
430 | 480 |
431 bool TryOpeningFileBrowser(const FilePath& full_path) { | 481 bool TryOpeningFileBrowser(Profile* profile, const FilePath& path) { |
432 Browser* browser = BrowserList::GetLastActive(); | |
433 if (!browser) | |
434 return false; | |
435 | |
436 Profile* profile = browser->profile(); | |
437 | |
438 GURL url; | 482 GURL url; |
439 if (!ConvertFileToFileSystemUrl(profile, full_path, | 483 if (!ConvertFileToFileSystemUrl(profile, path, |
440 GetFileBrowserExtensionUrl().GetOrigin(), &url)) | 484 GetFileBrowserExtensionUrl().GetOrigin(), &url)) |
441 return false; | 485 return false; |
442 | 486 |
443 const FileBrowserHandler* handler; | 487 const FileBrowserHandler* handler; |
444 if (!file_handler_util::GetDefaultTask(profile, url, &handler)) | 488 if (!file_handler_util::GetDefaultTask(profile, url, &handler)) |
445 return false; | 489 return false; |
446 | 490 |
447 std::string extension_id = handler->extension_id(); | 491 std::string extension_id = handler->extension_id(); |
448 std::string action_id = handler->id(); | 492 std::string action_id = handler->id(); |
449 if (extension_id == kFileBrowserDomain) { | 493 if (extension_id == kFileBrowserDomain) { |
450 // Only two of the built-in File Browser tasks require opening the File | 494 // Only two of the built-in File Browser tasks require opening the File |
451 // Browser tab. Others just end up calling TryViewingFile. | 495 // Browser tab. Others just end up calling TryViewingFile. |
452 if (action_id == kFileBrowserGalleryTaskId || | 496 if (action_id == kFileBrowserGalleryTaskId || |
453 action_id == kFileBrowserMountArchiveTaskId) { | 497 action_id == kFileBrowserMountArchiveTaskId) { |
454 OpenFileBrowser(full_path); | 498 // Tab reuse currently does not work for these two tasks. |
| 499 // |gallery| tries to put the file url into the tab url but it does not |
| 500 // work on Chrome OS. |
| 501 // |mount-archive| does not even try. |
| 502 OpenFileBrowser(path, REUSE_SAME_PATH, ""); |
455 return true; | 503 return true; |
456 } | 504 } |
457 } else { | 505 } else { |
458 // We are executing the task on behalf of File Browser extension. | 506 // We are executing the task on behalf of File Browser extension. |
459 const GURL source_url(kBaseFileBrowserUrl); | 507 const GURL source_url(kBaseFileBrowserUrl); |
460 | 508 |
461 // If File Browser has not been open yet then it did not request access | 509 // If File Browser has not been open yet then it did not request access |
462 // to the file system. Do it now. | 510 // to the file system. Do it now. |
463 fileapi::ExternalFileSystemMountPointProvider* external_provider = | 511 fileapi::ExternalFileSystemMountPointProvider* external_provider = |
464 BrowserContext::GetFileSystemContext(profile)->external_provider(); | 512 BrowserContext::GetFileSystemContext(profile)->external_provider(); |
465 if (!external_provider) | 513 if (!external_provider) |
466 return false; | 514 return false; |
467 external_provider->GrantFullAccessToExtension(source_url.host()); | 515 external_provider->GrantFullAccessToExtension(source_url.host()); |
468 | 516 |
469 std::vector<GURL> urls; | 517 std::vector<GURL> urls; |
470 urls.push_back(url); | 518 urls.push_back(url); |
471 scoped_refptr<StandaloneExecutor> executor = new StandaloneExecutor( | 519 scoped_refptr<StandaloneExecutor> executor = new StandaloneExecutor( |
472 profile, source_url, extension_id, action_id); | 520 profile, source_url, extension_id, action_id); |
473 executor->Execute(urls); | 521 executor->Execute(urls); |
474 return true; | 522 return true; |
475 } | 523 } |
476 return false; | 524 return false; |
477 } | 525 } |
478 | 526 |
479 void ViewFile(const FilePath& full_path, bool enqueue) { | 527 void ViewFile(const FilePath& path) { |
480 if (!TryOpeningFileBrowser(full_path) && !TryViewingFile(full_path)) { | 528 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); |
481 Browser* browser = BrowserList::GetLastActive(); | 529 if (!TryOpeningFileBrowser(profile, path) && |
482 if (!browser) | 530 !TryViewingFile(profile, path)) { |
483 return; | 531 Browser* browser = Browser::GetOrCreateTabbedBrowser(profile); |
484 browser::ShowErrorBox( | 532 browser::ShowErrorBox( |
485 browser->window()->GetNativeHandle(), | 533 browser->window()->GetNativeHandle(), |
486 l10n_util::GetStringFUTF16( | 534 l10n_util::GetStringFUTF16( |
487 IDS_FILE_BROWSER_ERROR_VIEWING_FILE_TITLE, | 535 IDS_FILE_BROWSER_ERROR_VIEWING_FILE_TITLE, |
488 UTF8ToUTF16(full_path.BaseName().value())), | 536 UTF8ToUTF16(path.BaseName().value())), |
489 l10n_util::GetStringUTF16( | 537 l10n_util::GetStringUTF16( |
490 IDS_FILE_BROWSER_ERROR_VIEWING_FILE)); | 538 IDS_FILE_BROWSER_ERROR_VIEWING_FILE)); |
491 } | 539 } |
492 } | 540 } |
493 | 541 |
494 // Reads an entire file into a string. Fails is the file is 4K or longer. | 542 // Reads an entire file into a string. Fails is the file is 4K or longer. |
495 bool ReadSmallFileToString(const FilePath& path, std::string* contents) { | 543 bool ReadSmallFileToString(const FilePath& path, std::string* contents) { |
496 FILE* file = file_util::OpenFile(path, "rb"); | 544 FILE* file = file_util::OpenFile(path, "rb"); |
497 if (!file) { | 545 if (!file) { |
498 return false; | 546 return false; |
499 } | 547 } |
500 | 548 |
501 char buf[1 << 12]; // 4K | 549 char buf[1 << 12]; // 4K |
502 size_t len = fread(buf, 1, sizeof(buf), file); | 550 size_t len = fread(buf, 1, sizeof(buf), file); |
503 if (len > 0) { | 551 if (len > 0) { |
504 contents->append(buf, len); | 552 contents->append(buf, len); |
505 } | 553 } |
506 file_util::CloseFile(file); | 554 file_util::CloseFile(file); |
507 | 555 |
508 return len < sizeof(buf); | 556 return len < sizeof(buf); |
509 } | 557 } |
510 | 558 |
511 void OpenUrlOnUIThread(const GURL& url) { | 559 void OpenUrlOnUIThread(const GURL& url) { |
512 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 560 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
513 Browser* browser = BrowserList::GetLastActive(); | 561 Browser* browser = Browser::GetOrCreateTabbedBrowser( |
514 if (!browser) | 562 ProfileManager::GetDefaultProfileOrOffTheRecord()); |
515 return; | |
516 browser->AddSelectedTabWithURL(url, content::PAGE_TRANSITION_LINK); | 563 browser->AddSelectedTabWithURL(url, content::PAGE_TRANSITION_LINK); |
517 } | 564 } |
518 | 565 |
519 // Reads JSON from a Google Docs file, extracts a document url and opens it | 566 // Reads JSON from a Google Docs file, extracts a document url and opens it |
520 // in a tab. | 567 // in a tab. |
521 void ReadUrlFromGDocOnFileThread(const FilePath& file_path) { | 568 void ReadUrlFromGDocOnFileThread(const FilePath& file_path) { |
522 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 569 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
523 std::string contents; | 570 std::string contents; |
524 if (!ReadSmallFileToString(file_path, &contents)) { | 571 if (!ReadSmallFileToString(file_path, &contents)) { |
525 LOG(ERROR) << "Error reading " << file_path.value(); | 572 LOG(ERROR) << "Error reading " << file_path.value(); |
526 return; | 573 return; |
527 } | 574 } |
528 | 575 |
529 scoped_ptr<base::Value> root_value; | 576 scoped_ptr<base::Value> root_value; |
530 root_value.reset(base::JSONReader::Read(contents)); | 577 root_value.reset(base::JSONReader::Read(contents)); |
531 | 578 |
532 DictionaryValue* dictionary_value; | 579 DictionaryValue* dictionary_value; |
533 std::string edit_url_string; | 580 std::string edit_url_string; |
534 if (!root_value.get() || | 581 if (!root_value.get() || |
535 !root_value->GetAsDictionary(&dictionary_value) || | 582 !root_value->GetAsDictionary(&dictionary_value) || |
536 !dictionary_value->GetString("url", &edit_url_string)) { | 583 !dictionary_value->GetString("url", &edit_url_string)) { |
537 LOG(ERROR) << "Invalid JSON in " << file_path.value(); | 584 LOG(ERROR) << "Invalid JSON in " << file_path.value(); |
538 return; | 585 return; |
539 } | 586 } |
540 | 587 |
541 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 588 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
542 base::Bind(OpenUrlOnUIThread, GURL(edit_url_string))); | 589 base::Bind(OpenUrlOnUIThread, GURL(edit_url_string))); |
543 } | 590 } |
544 | 591 |
545 bool TryViewingFile(const FilePath& full_path) { | 592 bool TryViewingFile(Profile* profile, const FilePath& path) { |
546 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 593 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
547 | 594 |
548 // There is nothing we can do if the browser is not present. | 595 Browser* browser = Browser::GetOrCreateTabbedBrowser(profile); |
549 Browser* browser = BrowserList::GetLastActive(); | |
550 if (!browser) | |
551 return true; | |
552 | 596 |
553 std::string file_extension = full_path.Extension(); | 597 std::string file_extension = path.Extension(); |
554 // For things supported natively by the browser, we should open it | 598 // For things supported natively by the browser, we should open it |
555 // in a tab. | 599 // in a tab. |
556 if (IsSupportedBrowserExtension(file_extension.data()) || | 600 if (IsSupportedBrowserExtension(file_extension.data()) || |
557 ShouldBeOpenedWithPdfPlugin(file_extension.data())) { | 601 ShouldBeOpenedWithPdfPlugin(profile, file_extension.data())) { |
558 GURL page_url = net::FilePathToFileURL(full_path); | 602 GURL page_url = net::FilePathToFileURL(path); |
559 #if defined(OS_CHROMEOS) | 603 #if defined(OS_CHROMEOS) |
560 // Override gdata resource to point to internal handler instead of file: | 604 // Override gdata resource to point to internal handler instead of file: |
561 // URL. | 605 // URL. |
562 // There is nothing we can do if the browser is not present. | 606 if (gdata::util::GetSpecialRemoteRootPath().IsParent(path)) { |
563 if (gdata::util::GetSpecialRemoteRootPath().IsParent(full_path)) { | |
564 gdata::GDataSystemService* system_service = | 607 gdata::GDataSystemService* system_service = |
565 gdata::GDataSystemServiceFactory::GetForProfile(browser->profile()); | 608 gdata::GDataSystemServiceFactory::GetForProfile(profile); |
566 if (!system_service) | 609 if (!system_service) |
567 return false; | 610 return false; |
568 | 611 |
569 GetFilePropertiesDelegate delegate; | 612 GetFilePropertiesDelegate delegate; |
570 system_service->file_system()->FindFileByPathSync( | 613 system_service->file_system()->FindFileByPathSync( |
571 gdata::util::ExtractGDataPath(full_path), &delegate); | 614 gdata::util::ExtractGDataPath(path), &delegate); |
572 if (delegate.resource_id().empty()) | 615 if (delegate.resource_id().empty()) |
573 return false; | 616 return false; |
574 page_url = gdata::util::GetFileResourceUrl(delegate.resource_id(), | 617 page_url = gdata::util::GetFileResourceUrl(delegate.resource_id(), |
575 delegate.file_name()); | 618 delegate.file_name()); |
576 } | 619 } |
577 #endif | 620 #endif |
578 browser->AddSelectedTabWithURL(page_url, | 621 browser->AddSelectedTabWithURL(page_url, |
579 content::PAGE_TRANSITION_LINK); | 622 content::PAGE_TRANSITION_LINK); |
580 return true; | 623 return true; |
581 } | 624 } |
582 | 625 |
583 if (IsSupportedGDocsExtension(file_extension.data())) { | 626 if (IsSupportedGDocsExtension(file_extension.data())) { |
584 if (gdata::util::GetSpecialRemoteRootPath().IsParent(full_path)) { | 627 if (gdata::util::GetSpecialRemoteRootPath().IsParent(path)) { |
585 // The file is on Google Docs. Get the Docs from the GData service. | 628 // The file is on Google Docs. Get the Docs from the GData service. |
586 gdata::GDataSystemService* system_service = | 629 gdata::GDataSystemService* system_service = |
587 gdata::GDataSystemServiceFactory::GetForProfile(browser->profile()); | 630 gdata::GDataSystemServiceFactory::GetForProfile(profile); |
588 if (!system_service) | 631 if (!system_service) |
589 return false; | 632 return false; |
590 | 633 |
591 GetFilePropertiesDelegate delegate; | 634 GetFilePropertiesDelegate delegate; |
592 system_service->file_system()->FindFileByPathSync( | 635 system_service->file_system()->FindFileByPathSync( |
593 gdata::util::ExtractGDataPath(full_path), &delegate); | 636 gdata::util::ExtractGDataPath(path), &delegate); |
594 if (delegate.edit_url().spec().empty()) | 637 if (delegate.edit_url().spec().empty()) |
595 return false; | 638 return false; |
596 | 639 |
597 browser->AddSelectedTabWithURL(delegate.edit_url(), | 640 browser->AddSelectedTabWithURL(delegate.edit_url(), |
598 content::PAGE_TRANSITION_LINK); | 641 content::PAGE_TRANSITION_LINK); |
599 } else { | 642 } else { |
600 // The file is local (downloaded from an attachment or otherwise copied). | 643 // The file is local (downloaded from an attachment or otherwise copied). |
601 // Parse the file to extract the Docs url and open this url. | 644 // Parse the file to extract the Docs url and open this url. |
602 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 645 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
603 base::Bind(&ReadUrlFromGDocOnFileThread, full_path)); | 646 base::Bind(&ReadUrlFromGDocOnFileThread, path)); |
604 } | 647 } |
605 return true; | 648 return true; |
606 } | 649 } |
607 | 650 |
608 #if defined(OS_CHROMEOS) | 651 #if defined(OS_CHROMEOS) |
609 if (IsSupportedAVExtension(file_extension.data())) { | 652 if (IsSupportedAVExtension(file_extension.data())) { |
| 653 GURL url; |
| 654 if (!ConvertFileToFileSystemUrl(profile, path, |
| 655 GetFileBrowserExtensionUrl().GetOrigin(), &url)) |
| 656 return false; |
610 MediaPlayer* mediaplayer = MediaPlayer::GetInstance(); | 657 MediaPlayer* mediaplayer = MediaPlayer::GetInstance(); |
611 mediaplayer->PopupMediaPlayer(browser); | 658 mediaplayer->PopupMediaPlayer(); |
612 mediaplayer->ForcePlayMediaFile(browser->profile(), full_path); | 659 mediaplayer->ForcePlayMediaURL(url); |
613 return true; | 660 return true; |
614 } | 661 } |
615 #endif // OS_CHROMEOS | 662 #endif // OS_CHROMEOS |
616 | 663 |
617 if (IsCRXFile(file_extension.data())) { | 664 if (IsCRXFile(file_extension.data())) { |
618 InstallCRX(browser->profile(), full_path); | 665 InstallCRX(profile, path); |
619 return true; | 666 return true; |
620 } | 667 } |
621 | 668 |
622 // Unknown file type. Record UMA and show an error message. | 669 // Unknown file type. Record UMA and show an error message. |
623 size_t extension_index = UMAExtensionIndex(file_extension.data(), | 670 size_t extension_index = UMAExtensionIndex(file_extension.data(), |
624 kUMATrackingExtensions, | 671 kUMATrackingExtensions, |
625 arraysize(kUMATrackingExtensions)); | 672 arraysize(kUMATrackingExtensions)); |
626 UMA_HISTOGRAM_ENUMERATION("FileBrowser.OpeningFileType", | 673 UMA_HISTOGRAM_ENUMERATION("FileBrowser.OpeningFileType", |
627 extension_index, | 674 extension_index, |
628 arraysize(kUMATrackingExtensions) - 1); | 675 arraysize(kUMATrackingExtensions) - 1); |
629 return false; | 676 return false; |
630 } | 677 } |
631 | 678 |
632 void InstallCRX(Profile* profile, const FilePath& full_path) { | 679 void InstallCRX(Profile* profile, const FilePath& path) { |
633 ExtensionService* service = profile->GetExtensionService(); | 680 ExtensionService* service = profile->GetExtensionService(); |
634 CHECK(service); | 681 CHECK(service); |
635 if (!service) | 682 if (!service) |
636 return; | 683 return; |
637 | 684 |
638 scoped_refptr<CrxInstaller> installer(CrxInstaller::Create(service, | 685 scoped_refptr<CrxInstaller> installer(CrxInstaller::Create(service, |
639 new ExtensionInstallUI(profile))); | 686 new ExtensionInstallUI(profile))); |
640 installer->set_is_gallery_install(false); | 687 installer->set_is_gallery_install(false); |
641 installer->set_allow_silent_install(false); | 688 installer->set_allow_silent_install(false); |
642 installer->InstallCrx(full_path); | 689 installer->InstallCrx(path); |
643 } | 690 } |
644 | 691 |
645 // If pdf plugin is enabled, we should open pdf files in a tab. | 692 // If pdf plugin is enabled, we should open pdf files in a tab. |
646 bool ShouldBeOpenedWithPdfPlugin(const char* file_extension) { | 693 bool ShouldBeOpenedWithPdfPlugin(Profile* profile, const char* file_extension) { |
647 if (base::strcasecmp(file_extension, kPdfExtension) != 0) | 694 if (base::strcasecmp(file_extension, kPdfExtension) != 0) |
648 return false; | 695 return false; |
649 | 696 |
650 Browser* browser = BrowserList::GetLastActive(); | |
651 if (!browser) | |
652 return false; | |
653 | |
654 FilePath pdf_path; | 697 FilePath pdf_path; |
655 PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path); | 698 PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_path); |
656 | 699 |
657 webkit::WebPluginInfo plugin; | 700 webkit::WebPluginInfo plugin; |
658 if (!PluginService::GetInstance()->GetPluginInfoByPath(pdf_path, &plugin)) | 701 if (!PluginService::GetInstance()->GetPluginInfoByPath(pdf_path, &plugin)) |
659 return false; | 702 return false; |
660 | 703 |
661 PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(browser->profile()); | 704 PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile); |
662 if (!plugin_prefs) | 705 if (!plugin_prefs) |
663 return false; | 706 return false; |
664 | 707 |
665 return plugin_prefs->IsPluginEnabled(plugin); | 708 return plugin_prefs->IsPluginEnabled(plugin); |
666 } | 709 } |
667 | 710 |
668 ListValue* ProgressStatusVectorToListValue( | 711 ListValue* ProgressStatusVectorToListValue( |
669 Profile* profile, const GURL& origin_url, | 712 Profile* profile, const GURL& origin_url, |
670 const std::vector<GDataOperationRegistry::ProgressStatus>& list) { | 713 const std::vector<GDataOperationRegistry::ProgressStatus>& list) { |
671 scoped_ptr<ListValue> result_list(new ListValue()); | 714 scoped_ptr<ListValue> result_list(new ListValue()); |
672 for (std::vector< | 715 for (std::vector< |
673 GDataOperationRegistry::ProgressStatus>::const_iterator iter = | 716 GDataOperationRegistry::ProgressStatus>::const_iterator iter = |
674 list.begin(); | 717 list.begin(); |
675 iter != list.end(); ++iter) { | 718 iter != list.end(); ++iter) { |
676 result_list->Append( | 719 result_list->Append( |
677 ProgessStatusToDictionaryValue(profile, origin_url, *iter)); | 720 ProgessStatusToDictionaryValue(profile, origin_url, *iter)); |
678 } | 721 } |
679 return result_list.release(); | 722 return result_list.release(); |
680 } | 723 } |
681 | 724 |
682 } // namespace file_manager_util | 725 } // namespace file_manager_util |
OLD | NEW |