OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/chromeos/file_system_provider/service.h" | 5 #include "chrome/browser/chromeos/file_system_provider/service.h" |
6 | 6 |
7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
9 #include "base/prefs/scoped_user_pref_update.h" | 9 #include "base/prefs/scoped_user_pref_update.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 storage::FileSystemMountOption( | 153 storage::FileSystemMountOption( |
154 storage::FlushPolicy::FLUSH_ON_COMPLETION), | 154 storage::FlushPolicy::FLUSH_ON_COMPLETION), |
155 mount_path)) { | 155 mount_path)) { |
156 FOR_EACH_OBSERVER( | 156 FOR_EACH_OBSERVER( |
157 Observer, observers_, | 157 Observer, observers_, |
158 OnProvidedFileSystemMount(ProvidedFileSystemInfo(), context, | 158 OnProvidedFileSystemMount(ProvidedFileSystemInfo(), context, |
159 base::File::FILE_ERROR_INVALID_OPERATION)); | 159 base::File::FILE_ERROR_INVALID_OPERATION)); |
160 return base::File::FILE_ERROR_INVALID_OPERATION; | 160 return base::File::FILE_ERROR_INVALID_OPERATION; |
161 } | 161 } |
162 | 162 |
| 163 ProvidingExtensionInfo provider_info; |
| 164 // TODO(mtomasz): Set up a testing extension in unit tests. |
| 165 GetProvidingExtensionInfo(extension_id, &provider_info); |
163 // Store the file system descriptor. Use the mount point name as the file | 166 // Store the file system descriptor. Use the mount point name as the file |
164 // system provider file system id. | 167 // system provider file system id. |
165 // Examples: | 168 // Examples: |
166 // file_system_id = hello_world | 169 // file_system_id = hello_world |
167 // mount_point_name = b33f1337-hello_world-5aa5 | 170 // mount_point_name = b33f1337-hello_world-5aa5 |
168 // writable = false | 171 // writable = false |
169 // supports_notify_tag = false | 172 // supports_notify_tag = false |
170 // mount_path = /provided/b33f1337-hello_world-5aa5 | 173 // mount_path = /provided/b33f1337-hello_world-5aa5 |
171 ProvidedFileSystemInfo file_system_info(extension_id, options, mount_path); | 174 // configurable = true |
| 175 // source = SOURCE_FILE |
| 176 ProvidedFileSystemInfo file_system_info( |
| 177 extension_id, options, mount_path, |
| 178 provider_info.capabilities.configurable(), |
| 179 provider_info.capabilities.source()); |
172 | 180 |
173 ProvidedFileSystemInterface* file_system = | 181 ProvidedFileSystemInterface* file_system = |
174 file_system_factory_.Run(profile_, file_system_info); | 182 file_system_factory_.Run(profile_, file_system_info); |
175 DCHECK(file_system); | 183 DCHECK(file_system); |
176 file_system_map_[FileSystemKey(extension_id, options.file_system_id)] = | 184 file_system_map_[FileSystemKey(extension_id, options.file_system_id)] = |
177 file_system; | 185 file_system; |
178 mount_point_name_to_key_map_[mount_point_name] = | 186 mount_point_name_to_key_map_[mount_point_name] = |
179 FileSystemKey(extension_id, options.file_system_id); | 187 FileSystemKey(extension_id, options.file_system_id); |
180 registry_->RememberFileSystem(file_system_info, *file_system->GetWatchers()); | 188 registry_->RememberFileSystem(file_system_info, *file_system->GetWatchers()); |
181 | 189 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 } | 311 } |
304 | 312 |
305 std::vector<ProvidingExtensionInfo> Service::GetProvidingExtensionInfoList() | 313 std::vector<ProvidingExtensionInfo> Service::GetProvidingExtensionInfoList() |
306 const { | 314 const { |
307 extensions::ExtensionRegistry* const registry = | 315 extensions::ExtensionRegistry* const registry = |
308 extensions::ExtensionRegistry::Get(profile_); | 316 extensions::ExtensionRegistry::Get(profile_); |
309 DCHECK(registry); | 317 DCHECK(registry); |
310 | 318 |
311 std::vector<ProvidingExtensionInfo> result; | 319 std::vector<ProvidingExtensionInfo> result; |
312 for (const auto& extension : registry->enabled_extensions()) { | 320 for (const auto& extension : registry->enabled_extensions()) { |
313 if (!extension->permissions_data()->HasAPIPermission( | |
314 extensions::APIPermission::kFileSystemProvider)) { | |
315 continue; | |
316 } | |
317 | |
318 ProvidingExtensionInfo info; | 321 ProvidingExtensionInfo info; |
319 info.extension_id = extension->id(); | 322 if (GetProvidingExtensionInfo(extension->id(), &info)) |
320 info.name = extension->name(); | 323 result.push_back(info); |
321 const extensions::FileSystemProviderCapabilities* const capabilities = | |
322 extensions::FileSystemProviderCapabilities::Get(extension.get()); | |
323 DCHECK(capabilities); | |
324 info.capabilities = *capabilities; | |
325 result.push_back(info); | |
326 } | 324 } |
327 | 325 |
328 return result; | 326 return result; |
329 } | 327 } |
330 | 328 |
| 329 bool Service::GetProvidingExtensionInfo(const std::string& extension_id, |
| 330 ProvidingExtensionInfo* result) const { |
| 331 DCHECK(result); |
| 332 extensions::ExtensionRegistry* const registry = |
| 333 extensions::ExtensionRegistry::Get(profile_); |
| 334 DCHECK(registry); |
| 335 |
| 336 const extensions::Extension* const extension = registry->GetExtensionById( |
| 337 extension_id, extensions::ExtensionRegistry::ENABLED); |
| 338 if (!extension || |
| 339 !extension->permissions_data()->HasAPIPermission( |
| 340 extensions::APIPermission::kFileSystemProvider)) { |
| 341 return false; |
| 342 } |
| 343 |
| 344 result->extension_id = extension->id(); |
| 345 result->name = extension->name(); |
| 346 const extensions::FileSystemProviderCapabilities* const capabilities = |
| 347 extensions::FileSystemProviderCapabilities::Get(extension); |
| 348 DCHECK(capabilities); |
| 349 result->capabilities = *capabilities; |
| 350 |
| 351 return true; |
| 352 } |
| 353 |
331 void Service::OnExtensionUnloaded( | 354 void Service::OnExtensionUnloaded( |
332 content::BrowserContext* browser_context, | 355 content::BrowserContext* browser_context, |
333 const extensions::Extension* extension, | 356 const extensions::Extension* extension, |
334 extensions::UnloadedExtensionInfo::Reason reason) { | 357 extensions::UnloadedExtensionInfo::Reason reason) { |
335 // Unmount all of the provided file systems associated with this extension. | 358 // Unmount all of the provided file systems associated with this extension. |
336 ProvidedFileSystemMap::iterator it = file_system_map_.begin(); | 359 ProvidedFileSystemMap::iterator it = file_system_map_.begin(); |
337 while (it != file_system_map_.end()) { | 360 while (it != file_system_map_.end()) { |
338 const ProvidedFileSystemInfo& file_system_info = | 361 const ProvidedFileSystemInfo& file_system_info = |
339 it->second->GetFileSystemInfo(); | 362 it->second->GetFileSystemInfo(); |
340 // Advance the iterator beforehand, otherwise it will become invalidated | 363 // Advance the iterator beforehand, otherwise it will become invalidated |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 } | 452 } |
430 | 453 |
431 void Service::OnWatcherListChanged( | 454 void Service::OnWatcherListChanged( |
432 const ProvidedFileSystemInfo& file_system_info, | 455 const ProvidedFileSystemInfo& file_system_info, |
433 const Watchers& watchers) { | 456 const Watchers& watchers) { |
434 registry_->RememberFileSystem(file_system_info, watchers); | 457 registry_->RememberFileSystem(file_system_info, watchers); |
435 } | 458 } |
436 | 459 |
437 } // namespace file_system_provider | 460 } // namespace file_system_provider |
438 } // namespace chromeos | 461 } // namespace chromeos |
OLD | NEW |