Make the Native File System API work with special volumes on Chrome OS.

At a high level, this enables creating handles from either local paths
or external paths. An external path is a path that can be used as
virtual path in a kFileSystemTypeExternal file system URL. These
external paths are intentionally not wrapped in an isolated file system,
as doing so would make it much harder to keep track of this virtual path,
and we need the virtual path to be able to serialize these handles to
IndexedDB.

(local paths are still wrapped in an isolated file system, although some
of the previous CLs that enabled not using one in this case has made
that no longer needed either. In the future I hope to be able to
eliminate/replace isolated file systems entirely).

This adds a PathType enum/parameter to CreateFile/DirectoryEntryFromPath
methods in NFSEntryFactory/NFSManagerImpl. This parameter makes it clear
if the path is a local path or an external path.

And changes the result FileSystemChooser returns from simply being a
base::FilePath to being a combination of a FilePath and a PathType.
This is then used by NFSManagerImpl to create the right type of
FileSystemURL/entry.

Currently all the permissions code still just deals with raw
base::FilePaths without indication if a path is a virtual/external or
local path. This shouldn't matter, since on ChromeOS (the only place
we use external paths) these paths will never overlap anyway, but we
might want to revisit this in the future.

This could have been implemented by having FileSystemChooser return the
appropriate FileSystemURL directly (and changing the NFSEntryFactory API
to be in terms of FileSystemURL); that was not done because in my ideal
end state FileSystemURL wouldn't be used anywhere in the native file
system code. I.e. it would purely be an implementation detail, but the
interface between the native file system code and file system backends
wouldn't depend on it anymore. Still working out the details for that.

Bug: 1093653
Change-Id: I201703d427a5368e67b0410428f366d1dca91aa8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2354596
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Luciano Pacheco <lucmult@chromium.org>
Reviewed-by: Sadrul Chowdhury <sadrul@chromium.org>
Reviewed-by: Trent Apted <tapted@chromium.org>
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#810080}
16 files changed
tree: 3c1d88790b4d2d79b647942fff66dd3cb9072aa8
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. DIR_METADATA
  68. ENG_REVIEW_OWNERS
  69. LICENSE
  70. LICENSE.chromium_os
  71. OWNERS
  72. PRESUBMIT.py
  73. PRESUBMIT_test.py
  74. PRESUBMIT_test_mocks.py
  75. README.md
  76. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.