Chromium Code Reviews| 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/file_manager_util.h" | 4 #include "chrome/browser/chromeos/extensions/file_manager/file_manager_util.h" |
| 5 | 5 |
| 6 #include "ash/shell.h" | 6 #include "ash/shell.h" |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.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/drive/drive.pb.h" | 16 #include "chrome/browser/chromeos/drive/drive.pb.h" |
| 17 #include "chrome/browser/chromeos/drive/drive_integration_service.h" | 17 #include "chrome/browser/chromeos/drive/drive_integration_service.h" |
| 18 #include "chrome/browser/chromeos/drive/file_system.h" | 18 #include "chrome/browser/chromeos/drive/file_system.h" |
| 19 #include "chrome/browser/chromeos/drive/file_system_util.h" | 19 #include "chrome/browser/chromeos/drive/file_system_util.h" |
| 20 #include "chrome/browser/chromeos/extensions/file_manager/file_browser_handler.h " | 20 #include "chrome/browser/chromeos/extensions/file_manager/file_browser_handler.h " |
| 21 #include "chrome/browser/chromeos/extensions/file_manager/file_handler_util.h" | 21 #include "chrome/browser/chromeos/extensions/file_manager/file_handler_util.h" |
| 22 #include "chrome/browser/chromeos/media/media_player.h" | 22 #include "chrome/browser/chromeos/media/media_player.h" |
| 23 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" | |
| 23 #include "chrome/browser/extensions/crx_installer.h" | 24 #include "chrome/browser/extensions/crx_installer.h" |
| 24 #include "chrome/browser/extensions/extension_install_prompt.h" | 25 #include "chrome/browser/extensions/extension_install_prompt.h" |
| 25 #include "chrome/browser/extensions/extension_service.h" | 26 #include "chrome/browser/extensions/extension_service.h" |
| 26 #include "chrome/browser/extensions/extension_system.h" | 27 #include "chrome/browser/extensions/extension_system.h" |
| 27 #include "chrome/browser/google_apis/task_util.h" | 28 #include "chrome/browser/google_apis/task_util.h" |
| 28 #include "chrome/browser/plugins/plugin_prefs.h" | 29 #include "chrome/browser/plugins/plugin_prefs.h" |
| 29 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
| 30 #include "chrome/browser/profiles/profile_manager.h" | 31 #include "chrome/browser/profiles/profile_manager.h" |
| 31 #include "chrome/browser/ui/browser.h" | 32 #include "chrome/browser/ui/browser.h" |
| 32 #include "chrome/browser/ui/browser_finder.h" | 33 #include "chrome/browser/ui/browser_finder.h" |
| 33 #include "chrome/browser/ui/browser_iterator.h" | 34 #include "chrome/browser/ui/browser_iterator.h" |
| 34 #include "chrome/browser/ui/browser_tabstrip.h" | 35 #include "chrome/browser/ui/browser_tabstrip.h" |
| 35 #include "chrome/browser/ui/browser_window.h" | 36 #include "chrome/browser/ui/browser_window.h" |
| 36 #include "chrome/browser/ui/extensions/application_launch.h" | 37 #include "chrome/browser/ui/extensions/application_launch.h" |
| 37 #include "chrome/browser/ui/host_desktop.h" | 38 #include "chrome/browser/ui/host_desktop.h" |
| 38 #include "chrome/browser/ui/simple_message_box.h" | 39 #include "chrome/browser/ui/simple_message_box.h" |
| 39 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 40 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 40 #include "chrome/common/chrome_paths.h" | 41 #include "chrome/common/chrome_paths.h" |
| 41 #include "chrome/common/chrome_switches.h" | 42 #include "chrome/common/chrome_switches.h" |
| 42 #include "chrome/common/url_constants.h" | 43 #include "chrome/common/url_constants.h" |
| 43 #include "chromeos/chromeos_switches.h" | 44 #include "chromeos/chromeos_switches.h" |
| 44 #include "content/public/browser/browser_thread.h" | 45 #include "content/public/browser/browser_thread.h" |
| 45 #include "content/public/browser/plugin_service.h" | 46 #include "content/public/browser/plugin_service.h" |
| 46 #include "content/public/browser/storage_partition.h" | 47 #include "content/public/browser/storage_partition.h" |
| 47 #include "content/public/browser/user_metrics.h" | 48 #include "content/public/browser/user_metrics.h" |
| 48 #include "content/public/browser/web_contents.h" | 49 #include "content/public/browser/web_contents.h" |
| 49 #include "content/public/common/pepper_plugin_info.h" | 50 #include "content/public/common/pepper_plugin_info.h" |
| 50 #include "grit/generated_resources.h" | 51 #include "grit/generated_resources.h" |
| 51 #include "net/base/escape.h" | 52 #include "net/base/escape.h" |
| 53 #include "net/base/mime_util.h" | |
| 52 #include "net/base/net_util.h" | 54 #include "net/base/net_util.h" |
| 53 #include "ui/base/l10n/l10n_util.h" | 55 #include "ui/base/l10n/l10n_util.h" |
| 54 #include "ui/gfx/screen.h" | 56 #include "ui/gfx/screen.h" |
| 55 #include "webkit/browser/fileapi/file_system_context.h" | 57 #include "webkit/browser/fileapi/file_system_context.h" |
| 56 #include "webkit/browser/fileapi/file_system_mount_point_provider.h" | 58 #include "webkit/browser/fileapi/file_system_mount_point_provider.h" |
| 57 #include "webkit/browser/fileapi/file_system_operation.h" | 59 #include "webkit/browser/fileapi/file_system_operation.h" |
| 58 #include "webkit/browser/fileapi/file_system_url.h" | 60 #include "webkit/browser/fileapi/file_system_url.h" |
| 59 #include "webkit/common/fileapi/file_system_util.h" | 61 #include "webkit/common/fileapi/file_system_util.h" |
| 60 #include "webkit/plugins/webplugininfo.h" | 62 #include "webkit/plugins/webplugininfo.h" |
| 61 | 63 |
| 62 using base::DictionaryValue; | 64 using base::DictionaryValue; |
| 63 using base::ListValue; | 65 using base::ListValue; |
| 64 using content::BrowserContext; | 66 using content::BrowserContext; |
| 65 using content::BrowserThread; | 67 using content::BrowserThread; |
| 66 using content::PluginService; | 68 using content::PluginService; |
| 67 using content::UserMetricsAction; | 69 using content::UserMetricsAction; |
| 70 using extensions::app_file_handler_util::FindFileHandlersForFiles; | |
| 71 using extensions::app_file_handler_util::PathAndMimeTypeSet; | |
| 68 using extensions::Extension; | 72 using extensions::Extension; |
| 69 using file_handler_util::FileTaskExecutor; | 73 using file_handler_util::FileTaskExecutor; |
| 70 using fileapi::FileSystemURL; | 74 using fileapi::FileSystemURL; |
| 71 | 75 |
| 72 const char kFileBrowserDomain[] = "hhaomjibdihmijegdhdafkllkbggdgoj"; | 76 const char kFileBrowserDomain[] = "hhaomjibdihmijegdhdafkllkbggdgoj"; |
| 73 | 77 |
| 74 const char kFileBrowserGalleryTaskId[] = "gallery"; | 78 const char kFileBrowserGalleryTaskId[] = "gallery"; |
| 75 const char kFileBrowserMountArchiveTaskId[] = "mount-archive"; | 79 const char kFileBrowserMountArchiveTaskId[] = "mount-archive"; |
| 76 const char kFileBrowserWatchTaskId[] = "watch"; | 80 const char kFileBrowserWatchTaskId[] = "watch"; |
| 77 const char kFileBrowserPlayTaskId[] = "play"; | 81 const char kFileBrowserPlayTaskId[] = "play"; |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 if (!external_provider) | 311 if (!external_provider) |
| 308 return false; | 312 return false; |
| 309 external_provider->GrantFullAccessToExtension(GetFileBrowserUrl().host()); | 313 external_provider->GrantFullAccessToExtension(GetFileBrowserUrl().host()); |
| 310 return true; | 314 return true; |
| 311 } | 315 } |
| 312 | 316 |
| 313 // Executes handler specifed with |extension_id| and |action_id| for |url|. | 317 // Executes handler specifed with |extension_id| and |action_id| for |url|. |
| 314 void ExecuteHandler(Profile* profile, | 318 void ExecuteHandler(Profile* profile, |
| 315 std::string extension_id, | 319 std::string extension_id, |
| 316 std::string action_id, | 320 std::string action_id, |
| 317 const GURL& url) { | 321 const GURL& url, |
| 322 const std::string& task_type) { | |
| 318 // If File Browser has not been open yet then it did not request access | 323 // If File Browser has not been open yet then it did not request access |
| 319 // to the file system. Do it now. | 324 // to the file system. Do it now. |
| 320 if (!GrantFileSystemAccessToFileBrowser(profile)) | 325 if (!GrantFileSystemAccessToFileBrowser(profile)) |
| 321 return; | 326 return; |
| 322 | 327 |
| 323 GURL site = extensions::ExtensionSystem::Get(profile)->extension_service()-> | 328 GURL site = extensions::ExtensionSystem::Get(profile)->extension_service()-> |
| 324 GetSiteForExtensionId(kFileBrowserDomain); | 329 GetSiteForExtensionId(kFileBrowserDomain); |
| 325 fileapi::FileSystemContext* file_system_context = | 330 fileapi::FileSystemContext* file_system_context = |
| 326 BrowserContext::GetStoragePartitionForSite(profile, site)-> | 331 BrowserContext::GetStoragePartitionForSite(profile, site)-> |
| 327 GetFileSystemContext(); | 332 GetFileSystemContext(); |
| 328 | 333 |
| 329 // We are executing the task on behalf of File Browser extension. | 334 // We are executing the task on behalf of File Browser extension. |
| 330 const GURL source_url = GetFileBrowserUrl(); | 335 const GURL source_url = GetFileBrowserUrl(); |
| 331 std::vector<FileSystemURL> urls; | 336 std::vector<FileSystemURL> urls; |
| 332 urls.push_back(file_system_context->CrackURL(url)); | 337 urls.push_back(file_system_context->CrackURL(url)); |
| 333 scoped_refptr<FileTaskExecutor> executor = FileTaskExecutor::Create(profile, | 338 scoped_refptr<FileTaskExecutor> executor = FileTaskExecutor::Create(profile, |
| 334 source_url, kFileBrowserDomain, 0 /* no tab id */, extension_id, | 339 source_url, kFileBrowserDomain, 0 /* no tab id */, extension_id, |
| 335 file_handler_util::kTaskFile, action_id); | 340 task_type, action_id); |
| 336 executor->Execute(urls); | 341 executor->Execute(urls); |
| 337 } | 342 } |
| 338 | 343 |
| 339 // The |mode| argument is only for legacy Files.app. Files.app V2 has the | 344 // The |mode| argument is only for legacy Files.app. Files.app V2 has the |
| 340 // reusing logic in background.js. | 345 // reusing logic in background.js. |
| 341 void OpenFileBrowserImpl(const base::FilePath& path, | 346 void OpenFileBrowserImpl(const base::FilePath& path, |
| 342 TAB_REUSE_MODE mode, | 347 TAB_REUSE_MODE mode, |
| 343 const std::string& action_id) { | 348 const std::string& action_id) { |
| 344 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); | 349 content::RecordAction(UserMetricsAction("ShowFileBrowserFullTab")); |
| 345 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); | 350 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); |
| 346 | 351 |
| 347 if (IsFileManagerPackaged() && !path.value().empty()) { | 352 if (IsFileManagerPackaged() && !path.value().empty()) { |
| 348 GURL url; | 353 GURL url; |
| 349 if (!ConvertFileToFileSystemUrl(profile, path, kFileBrowserDomain, &url)) | 354 if (!ConvertFileToFileSystemUrl(profile, path, kFileBrowserDomain, &url)) |
| 350 return; | 355 return; |
| 351 | 356 |
| 352 // Some values of |action_id| are not listed in the manifest and are used | 357 // Some values of |action_id| are not listed in the manifest and are used |
| 353 // to parametrize the behavior when opening the Files app window. | 358 // to parametrize the behavior when opening the Files app window. |
| 354 ExecuteHandler(profile, kFileBrowserDomain, action_id, url); | 359 ExecuteHandler(profile, kFileBrowserDomain, action_id, url, |
| 360 file_handler_util::kTaskFile); | |
| 355 return; | 361 return; |
| 356 } | 362 } |
| 357 | 363 |
| 358 if (FileManagerTabExists(path, mode)) | 364 if (FileManagerTabExists(path, mode)) |
| 359 return; | 365 return; |
| 360 | 366 |
| 361 std::string url = chrome::kChromeUIFileManagerURL; | 367 std::string url = chrome::kChromeUIFileManagerURL; |
| 362 if (action_id.size()) { | 368 if (action_id.size()) { |
| 363 DictionaryValue arg_value; | 369 DictionaryValue arg_value; |
| 364 arg_value.SetString("action", action_id); | 370 arg_value.SetString("action", action_id); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 402 for (int idx = 0; idx < tab_strip->count(); idx++) { | 408 for (int idx = 0; idx < tab_strip->count(); idx++) { |
| 403 content::WebContents* web_contents = tab_strip->GetWebContentsAt(idx); | 409 content::WebContents* web_contents = tab_strip->GetWebContentsAt(idx); |
| 404 const GURL& url = web_contents->GetURL(); | 410 const GURL& url = web_contents->GetURL(); |
| 405 if (url == target_url) | 411 if (url == target_url) |
| 406 return browser; | 412 return browser; |
| 407 } | 413 } |
| 408 } | 414 } |
| 409 return NULL; | 415 return NULL; |
| 410 } | 416 } |
| 411 | 417 |
| 412 bool ExecuteDefaultHandler(Profile* profile, const base::FilePath& path) { | 418 bool ExecuteDefaultAppHandler(Profile* profile, |
| 413 GURL url; | 419 const base::FilePath& path, |
| 414 if (!ConvertFileToFileSystemUrl(profile, path, kFileBrowserDomain, &url)) | 420 const GURL& url, |
| 421 const std::string& mime_type, | |
| 422 const std::string& default_task_id) { | |
| 423 ExtensionService* service = profile->GetExtensionService(); | |
| 424 if (!service) | |
| 415 return false; | 425 return false; |
| 416 | 426 |
| 417 const FileBrowserHandler* handler; | 427 PathAndMimeTypeSet files; |
| 418 if (!file_handler_util::GetTaskForURLAndPath(profile, url, path, &handler)) | 428 files.insert(std::make_pair(path, mime_type)); |
| 419 return false; | 429 const extensions::FileHandlerInfo* first_handler = NULL; |
| 430 const extensions::Extension* extension_for_first_handler = NULL; | |
| 420 | 431 |
| 421 std::string extension_id = handler->extension_id(); | 432 // If we find the default handler, we execute it immediately, but otherwise, |
| 422 std::string action_id = handler->id(); | 433 // we remember the first handler, and if there was no default handler, simply |
| 434 // execute the first one. | |
| 435 for (ExtensionSet::const_iterator iter = service->extensions()->begin(); | |
| 436 iter != service->extensions()->end(); | |
| 437 ++iter) { | |
| 438 const Extension* extension = *iter; | |
| 439 | |
| 440 // We don't support using hosted apps to open files. | |
|
mtomasz
2013/06/07 02:36:00
This comment is misleading. is_platform_app disall
Sam McNally
2013/06/07 05:29:13
This is copied from the check in file_manager_priv
| |
| 441 if (!extension->is_platform_app()) | |
| 442 continue; | |
| 443 | |
| 444 // We only support apps that specify "incognito: split" if in incognito | |
|
mtomasz
2013/06/07 02:36:00
I'm wondering if this behavior is documented somew
Sam McNally
2013/06/07 05:29:13
Same as above. This check may be unnecessary thoug
| |
| 445 // mode. | |
| 446 if (profile->IsOffTheRecord() && | |
| 447 !service->IsIncognitoEnabled(extension->id())) | |
| 448 continue; | |
| 449 | |
| 450 typedef std::vector<const extensions::FileHandlerInfo*> FileHandlerList; | |
| 451 FileHandlerList file_handlers = FindFileHandlersForFiles(*extension, files); | |
| 452 for (FileHandlerList::iterator i = file_handlers.begin(); | |
| 453 i != file_handlers.end(); ++i) { | |
| 454 const extensions::FileHandlerInfo* handler = *i; | |
| 455 std::string task_id = file_handler_util::MakeTaskID(extension->id(), | |
| 456 file_handler_util::kTaskApp, handler->id); | |
| 457 if (task_id == default_task_id) { | |
| 458 ExecuteHandler(profile, extension->id(), handler->id, url, | |
| 459 file_handler_util::kTaskApp); | |
| 460 return true; | |
| 461 | |
| 462 } else if (!first_handler) { | |
| 463 first_handler = handler; | |
| 464 extension_for_first_handler = extension; | |
| 465 } | |
| 466 } | |
| 467 } | |
| 468 if (first_handler) { | |
| 469 ExecuteHandler(profile, extension_for_first_handler->id(), | |
| 470 first_handler->id, url, file_handler_util::kTaskApp); | |
| 471 return true; | |
| 472 } | |
| 473 return false; | |
| 474 } | |
| 475 | |
| 476 bool ExecuteExtensionHandler(Profile* profile, | |
| 477 const base::FilePath& path, | |
| 478 const FileBrowserHandler& handler, | |
| 479 const GURL& url) { | |
| 480 std::string extension_id = handler.extension_id(); | |
| 481 std::string action_id = handler.id(); | |
| 423 Browser* browser = chrome::FindLastActiveWithProfile(profile, | 482 Browser* browser = chrome::FindLastActiveWithProfile(profile, |
| 424 chrome::HOST_DESKTOP_TYPE_ASH); | 483 chrome::HOST_DESKTOP_TYPE_ASH); |
| 425 | 484 |
| 426 // If there is no browsers for the profile, bail out. Return true so warning | 485 // If there is no browsers for the profile, bail out. Return true so warning |
| 427 // about file type not being supported is not displayed. | 486 // about file type not being supported is not displayed. |
| 428 if (!browser) | 487 if (!browser) |
| 429 return true; | 488 return true; |
| 430 | 489 |
| 431 if (extension_id == kFileBrowserDomain) { | 490 if (extension_id == kFileBrowserDomain) { |
| 432 if (IsFileManagerPackaged()) { | 491 if (IsFileManagerPackaged()) { |
| 433 if (action_id == kFileBrowserGalleryTaskId || | 492 if (action_id == kFileBrowserGalleryTaskId || |
| 434 action_id == kFileBrowserMountArchiveTaskId || | 493 action_id == kFileBrowserMountArchiveTaskId || |
| 435 action_id == kFileBrowserPlayTaskId || | 494 action_id == kFileBrowserPlayTaskId || |
| 436 action_id == kFileBrowserWatchTaskId) { | 495 action_id == kFileBrowserWatchTaskId) { |
| 437 ExecuteHandler(profile, extension_id, action_id, url); | 496 ExecuteHandler(profile, extension_id, action_id, url, |
| 497 file_handler_util::kTaskFile); | |
| 438 return true; | 498 return true; |
| 439 } | 499 } |
| 440 return ExecuteBuiltinHandler(browser, path, action_id); | 500 return ExecuteBuiltinHandler(browser, path, action_id); |
| 441 } | 501 } |
| 442 | 502 |
| 443 // Only two of the built-in File Browser tasks require opening the File | 503 // Only two of the built-in File Browser tasks require opening the File |
| 444 // Browser tab. | 504 // Browser tab. |
| 445 if (action_id == kFileBrowserGalleryTaskId || | 505 if (action_id == kFileBrowserGalleryTaskId || |
| 446 action_id == kFileBrowserMountArchiveTaskId) { | 506 action_id == kFileBrowserMountArchiveTaskId) { |
| 447 // Tab reuse currently does not work for these two tasks. | 507 // Tab reuse currently does not work for these two tasks. |
| 448 // |gallery| tries to put the file url into the tab url but it does not | 508 // |gallery| tries to put the file url into the tab url but it does not |
| 449 // work on Chrome OS. | 509 // work on Chrome OS. |
| 450 // |mount-archive| does not even try. | 510 // |mount-archive| does not even try. |
| 451 OpenFileBrowserImpl(path, REUSE_SAME_PATH, ""); | 511 OpenFileBrowserImpl(path, REUSE_SAME_PATH, ""); |
| 452 return true; | 512 return true; |
| 453 } | 513 } |
| 454 return ExecuteBuiltinHandler(browser, path, action_id); | 514 return ExecuteBuiltinHandler(browser, path, action_id); |
| 455 } | 515 } |
| 456 | 516 |
| 457 ExecuteHandler(profile, extension_id, action_id, url); | 517 ExecuteHandler(profile, extension_id, action_id, url, |
| 518 file_handler_util::kTaskFile); | |
| 458 return true; | 519 return true; |
| 459 } | 520 } |
| 460 | 521 |
| 522 bool ExecuteDefaultHandler(Profile* profile, const base::FilePath& path) { | |
| 523 GURL url; | |
| 524 if (!ConvertFileToFileSystemUrl(profile, path, kFileBrowserDomain, &url)) | |
| 525 return false; | |
| 526 | |
| 527 std::string mime_type = GetMimeTypeForPath(path); | |
| 528 std::string default_task_id = file_handler_util::GetDefaultTaskIdFromPrefs( | |
| 529 profile, mime_type, path.Extension()); | |
| 530 const FileBrowserHandler* handler; | |
| 531 | |
| 532 // We choose the file handler from the following in decreasing priority or | |
| 533 // fail if none support the file type: | |
| 534 // 1. default extension | |
|
mtomasz
2013/06/07 02:36:00
default extensions before apps, but non-default ap
Sam McNally
2013/06/07 05:29:13
Yes, but there can be at most one default handler.
| |
| 535 // 2. default app | |
| 536 // 3. a fallback handler (e.g. opening in the browser) | |
| 537 // 4. non-default app | |
| 538 // 5. non-default extension | |
| 539 // Note that there can be at most one of default extension and default app. | |
| 540 if (!file_handler_util::GetTaskForURLAndPath(profile, url, path, &handler)) { | |
| 541 return ExecuteDefaultAppHandler( | |
| 542 profile, path, url, mime_type, default_task_id); | |
| 543 } | |
| 544 | |
| 545 std::string handler_task_id = file_handler_util::MakeTaskID( | |
| 546 handler->extension_id(), file_handler_util::kTaskFile, handler->id()); | |
| 547 if (handler_task_id != default_task_id && | |
| 548 !file_handler_util::IsFallbackTask(handler) && | |
| 549 ExecuteDefaultAppHandler( | |
| 550 profile, path, url, mime_type, default_task_id)) { | |
| 551 return true; | |
| 552 } | |
| 553 return ExecuteExtensionHandler(profile, path, *handler, url); | |
| 554 } | |
| 555 | |
| 461 // Reads the alternate URL from a GDoc file. When it fails, returns a file URL | 556 // Reads the alternate URL from a GDoc file. When it fails, returns a file URL |
| 462 // for |file_path| as fallback. | 557 // for |file_path| as fallback. |
| 463 // Note that an alternate url is a URL to open a hosted document. | 558 // Note that an alternate url is a URL to open a hosted document. |
| 464 GURL ReadUrlFromGDocOnBlockingPool(const base::FilePath& file_path) { | 559 GURL ReadUrlFromGDocOnBlockingPool(const base::FilePath& file_path) { |
| 465 GURL url = drive::util::ReadUrlFromGDocFile(file_path); | 560 GURL url = drive::util::ReadUrlFromGDocFile(file_path); |
| 466 if (url.is_empty()) | 561 if (url.is_empty()) |
| 467 url = net::FilePathToFileURL(file_path); | 562 url = net::FilePathToFileURL(file_path); |
| 468 return url; | 563 return url; |
| 469 } | 564 } |
| 470 | 565 |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 882 | 977 |
| 883 // If a bundled plugin is enabled, we should open pdf/swf files in a tab. | 978 // If a bundled plugin is enabled, we should open pdf/swf files in a tab. |
| 884 bool ShouldBeOpenedWithPlugin(Profile* profile, const char* file_extension) { | 979 bool ShouldBeOpenedWithPlugin(Profile* profile, const char* file_extension) { |
| 885 if (LowerCaseEqualsASCII(file_extension, kPdfExtension)) | 980 if (LowerCaseEqualsASCII(file_extension, kPdfExtension)) |
| 886 return IsPdfPluginEnabled(profile); | 981 return IsPdfPluginEnabled(profile); |
| 887 if (LowerCaseEqualsASCII(file_extension, kSwfExtension)) | 982 if (LowerCaseEqualsASCII(file_extension, kSwfExtension)) |
| 888 return IsFlashPluginEnabled(profile); | 983 return IsFlashPluginEnabled(profile); |
| 889 return false; | 984 return false; |
| 890 } | 985 } |
| 891 | 986 |
| 987 std::string GetMimeTypeForPath(const base::FilePath& file_path) { | |
| 988 const base::FilePath::StringType file_extension = | |
| 989 StringToLowerASCII(file_path.Extension()); | |
| 990 | |
| 991 // TODO(thorogood): Rearchitect this call so it can run on the File thread; | |
| 992 // GetMimeTypeFromFile requires this on Linux. Right now, we use | |
| 993 // Chrome-level knowledge only. | |
| 994 std::string mime_type; | |
| 995 if (file_extension.empty() || | |
| 996 !net::GetWellKnownMimeTypeFromExtension(file_extension.substr(1), | |
| 997 &mime_type)) { | |
| 998 // If the file doesn't have an extension or its mime-type cannot be | |
| 999 // determined, then indicate that it has the empty mime-type. This will | |
| 1000 // only be matched if the Web Intents accepts "*" or "*/*". | |
| 1001 return ""; | |
| 1002 } else { | |
| 1003 return mime_type; | |
| 1004 } | |
| 1005 } | |
| 1006 | |
| 892 } // namespace file_manager_util | 1007 } // namespace file_manager_util |
| OLD | NEW |