| 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 <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 // Fake implementation of the registry, since it's already tested separately. | 85 // Fake implementation of the registry, since it's already tested separately. |
| 86 // For simplicity it can remember at most only one file system. | 86 // For simplicity it can remember at most only one file system. |
| 87 class FakeRegistry : public RegistryInterface { | 87 class FakeRegistry : public RegistryInterface { |
| 88 public: | 88 public: |
| 89 FakeRegistry() {} | 89 FakeRegistry() {} |
| 90 virtual ~FakeRegistry() {} | 90 virtual ~FakeRegistry() {} |
| 91 | 91 |
| 92 // RegistryInterface overrides. | 92 // RegistryInterface overrides. |
| 93 virtual void RememberFileSystem( | 93 virtual void RememberFileSystem( |
| 94 const ProvidedFileSystemInfo& file_system_info, | 94 const ProvidedFileSystemInfo& file_system_info, |
| 95 const ObservedEntries& observed_entries) override { | 95 const Watchers& watchers) override { |
| 96 file_system_info_.reset(new ProvidedFileSystemInfo(file_system_info)); | 96 file_system_info_.reset(new ProvidedFileSystemInfo(file_system_info)); |
| 97 observed_entries_.reset(new ObservedEntries(observed_entries)); | 97 watchers_.reset(new Watchers(watchers)); |
| 98 } | 98 } |
| 99 | 99 |
| 100 virtual void ForgetFileSystem(const std::string& extension_id, | 100 virtual void ForgetFileSystem(const std::string& extension_id, |
| 101 const std::string& file_system_id) override { | 101 const std::string& file_system_id) override { |
| 102 if (!file_system_info_.get() || !observed_entries_.get()) | 102 if (!file_system_info_.get() || !watchers_.get()) |
| 103 return; | 103 return; |
| 104 if (file_system_info_->extension_id() == extension_id && | 104 if (file_system_info_->extension_id() == extension_id && |
| 105 file_system_info_->file_system_id() == file_system_id) { | 105 file_system_info_->file_system_id() == file_system_id) { |
| 106 file_system_info_.reset(); | 106 file_system_info_.reset(); |
| 107 observed_entries_.reset(); | 107 watchers_.reset(); |
| 108 } | 108 } |
| 109 } | 109 } |
| 110 | 110 |
| 111 virtual scoped_ptr<RestoredFileSystems> RestoreFileSystems( | 111 virtual scoped_ptr<RestoredFileSystems> RestoreFileSystems( |
| 112 const std::string& extension_id) override { | 112 const std::string& extension_id) override { |
| 113 scoped_ptr<RestoredFileSystems> result(new RestoredFileSystems); | 113 scoped_ptr<RestoredFileSystems> result(new RestoredFileSystems); |
| 114 | 114 |
| 115 if (file_system_info_.get() && observed_entries_.get()) { | 115 if (file_system_info_.get() && watchers_.get()) { |
| 116 RestoredFileSystem restored_file_system; | 116 RestoredFileSystem restored_file_system; |
| 117 restored_file_system.extension_id = file_system_info_->extension_id(); | 117 restored_file_system.extension_id = file_system_info_->extension_id(); |
| 118 | 118 |
| 119 MountOptions options; | 119 MountOptions options; |
| 120 options.file_system_id = file_system_info_->file_system_id(); | 120 options.file_system_id = file_system_info_->file_system_id(); |
| 121 options.display_name = file_system_info_->display_name(); | 121 options.display_name = file_system_info_->display_name(); |
| 122 options.writable = file_system_info_->writable(); | 122 options.writable = file_system_info_->writable(); |
| 123 options.supports_notify_tag = file_system_info_->supports_notify_tag(); | 123 options.supports_notify_tag = file_system_info_->supports_notify_tag(); |
| 124 restored_file_system.options = options; | 124 restored_file_system.options = options; |
| 125 restored_file_system.observed_entries = *observed_entries_.get(); | 125 restored_file_system.watchers = *watchers_.get(); |
| 126 | 126 |
| 127 result->push_back(restored_file_system); | 127 result->push_back(restored_file_system); |
| 128 } | 128 } |
| 129 | 129 |
| 130 return result; | 130 return result; |
| 131 } | 131 } |
| 132 | 132 |
| 133 virtual void UpdateObservedEntryTag( | 133 virtual void UpdateWatcherTag(const ProvidedFileSystemInfo& file_system_info, |
| 134 const ProvidedFileSystemInfo& file_system_info, | 134 const Watcher& watcher) override { |
| 135 const ObservedEntry& observed_entry) override { | 135 ASSERT_TRUE(watchers_.get()); |
| 136 ASSERT_TRUE(observed_entries_.get()); | 136 const Watchers::iterator it = |
| 137 const ObservedEntries::iterator it = observed_entries_->find( | 137 watchers_->find(WatcherKey(watcher.entry_path, watcher.recursive)); |
| 138 ObservedEntryKey(observed_entry.entry_path, observed_entry.recursive)); | 138 ASSERT_NE(watchers_->end(), it); |
| 139 ASSERT_NE(observed_entries_->end(), it); | 139 it->second.last_tag = watcher.last_tag; |
| 140 it->second.last_tag = observed_entry.last_tag; | |
| 141 } | 140 } |
| 142 | 141 |
| 143 ProvidedFileSystemInfo* const file_system_info() const { | 142 ProvidedFileSystemInfo* const file_system_info() const { |
| 144 return file_system_info_.get(); | 143 return file_system_info_.get(); |
| 145 } | 144 } |
| 146 ObservedEntries* const observed_entries() const { | 145 Watchers* const watchers() const { return watchers_.get(); } |
| 147 return observed_entries_.get(); | |
| 148 } | |
| 149 | 146 |
| 150 private: | 147 private: |
| 151 scoped_ptr<ProvidedFileSystemInfo> file_system_info_; | 148 scoped_ptr<ProvidedFileSystemInfo> file_system_info_; |
| 152 scoped_ptr<ObservedEntries> observed_entries_; | 149 scoped_ptr<Watchers> watchers_; |
| 153 | 150 |
| 154 DISALLOW_COPY_AND_ASSIGN(FakeRegistry); | 151 DISALLOW_COPY_AND_ASSIGN(FakeRegistry); |
| 155 }; | 152 }; |
| 156 | 153 |
| 157 // Creates a fake extension with the specified |extension_id|. | 154 // Creates a fake extension with the specified |extension_id|. |
| 158 scoped_refptr<extensions::Extension> CreateFakeExtension( | 155 scoped_refptr<extensions::Extension> CreateFakeExtension( |
| 159 const std::string& extension_id) { | 156 const std::string& extension_id) { |
| 160 base::DictionaryValue manifest; | 157 base::DictionaryValue manifest; |
| 161 std::string error; | 158 std::string error; |
| 162 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, | 159 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 191 | 188 |
| 192 service_.reset(new Service(profile_, extension_registry_.get())); | 189 service_.reset(new Service(profile_, extension_registry_.get())); |
| 193 service_->SetFileSystemFactoryForTesting( | 190 service_->SetFileSystemFactoryForTesting( |
| 194 base::Bind(&FakeProvidedFileSystem::Create)); | 191 base::Bind(&FakeProvidedFileSystem::Create)); |
| 195 extension_ = CreateFakeExtension(kExtensionId); | 192 extension_ = CreateFakeExtension(kExtensionId); |
| 196 | 193 |
| 197 registry_ = new FakeRegistry; | 194 registry_ = new FakeRegistry; |
| 198 // Passes ownership to the service instance. | 195 // Passes ownership to the service instance. |
| 199 service_->SetRegistryForTesting(make_scoped_ptr(registry_)); | 196 service_->SetRegistryForTesting(make_scoped_ptr(registry_)); |
| 200 | 197 |
| 201 fake_observed_entry_.entry_path = | 198 fake_watcher_.entry_path = base::FilePath(FILE_PATH_LITERAL("/a/b/c")); |
| 202 base::FilePath(FILE_PATH_LITERAL("/a/b/c")); | 199 fake_watcher_.recursive = true; |
| 203 fake_observed_entry_.recursive = true; | 200 fake_watcher_.last_tag = "hello-world"; |
| 204 fake_observed_entry_.last_tag = "hello-world"; | |
| 205 } | 201 } |
| 206 | 202 |
| 207 content::TestBrowserThreadBundle thread_bundle_; | 203 content::TestBrowserThreadBundle thread_bundle_; |
| 208 scoped_ptr<TestingProfileManager> profile_manager_; | 204 scoped_ptr<TestingProfileManager> profile_manager_; |
| 209 TestingProfile* profile_; | 205 TestingProfile* profile_; |
| 210 FakeUserManager* user_manager_; | 206 FakeUserManager* user_manager_; |
| 211 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; | 207 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; |
| 212 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; | 208 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; |
| 213 scoped_ptr<Service> service_; | 209 scoped_ptr<Service> service_; |
| 214 scoped_refptr<extensions::Extension> extension_; | 210 scoped_refptr<extensions::Extension> extension_; |
| 215 FakeRegistry* registry_; // Owned by Service. | 211 FakeRegistry* registry_; // Owned by Service. |
| 216 ObservedEntry fake_observed_entry_; | 212 Watcher fake_watcher_; |
| 217 }; | 213 }; |
| 218 | 214 |
| 219 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { | 215 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { |
| 220 LoggingObserver observer; | 216 LoggingObserver observer; |
| 221 service_->AddObserver(&observer); | 217 service_->AddObserver(&observer); |
| 222 | 218 |
| 223 EXPECT_TRUE(service_->MountFileSystem( | 219 EXPECT_TRUE(service_->MountFileSystem( |
| 224 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 220 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 225 | 221 |
| 226 ASSERT_EQ(1u, observer.mounts.size()); | 222 ASSERT_EQ(1u, observer.mounts.size()); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 | 389 |
| 394 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { | 390 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { |
| 395 LoggingObserver observer; | 391 LoggingObserver observer; |
| 396 service_->AddObserver(&observer); | 392 service_->AddObserver(&observer); |
| 397 | 393 |
| 398 // Remember a fake file system first in order to be able to restore it. | 394 // Remember a fake file system first in order to be able to restore it. |
| 399 MountOptions options(kFileSystemId, kDisplayName); | 395 MountOptions options(kFileSystemId, kDisplayName); |
| 400 options.supports_notify_tag = true; | 396 options.supports_notify_tag = true; |
| 401 ProvidedFileSystemInfo file_system_info( | 397 ProvidedFileSystemInfo file_system_info( |
| 402 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); | 398 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); |
| 403 ObservedEntries fake_observed_entries; | 399 Watchers fake_watchers; |
| 404 fake_observed_entries[ObservedEntryKey(fake_observed_entry_.entry_path, | 400 fake_watchers[WatcherKey(fake_watcher_.entry_path, fake_watcher_.recursive)] = |
| 405 fake_observed_entry_.recursive)] = | 401 fake_watcher_; |
| 406 fake_observed_entry_; | 402 registry_->RememberFileSystem(file_system_info, fake_watchers); |
| 407 registry_->RememberFileSystem(file_system_info, fake_observed_entries); | |
| 408 | 403 |
| 409 EXPECT_EQ(0u, observer.mounts.size()); | 404 EXPECT_EQ(0u, observer.mounts.size()); |
| 410 | 405 |
| 411 // Directly call the observer's method. | 406 // Directly call the observer's method. |
| 412 service_->OnExtensionLoaded(profile_, extension_.get()); | 407 service_->OnExtensionLoaded(profile_, extension_.get()); |
| 413 | 408 |
| 414 ASSERT_EQ(1u, observer.mounts.size()); | 409 ASSERT_EQ(1u, observer.mounts.size()); |
| 415 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 410 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
| 416 | 411 |
| 417 EXPECT_EQ(file_system_info.extension_id(), | 412 EXPECT_EQ(file_system_info.extension_id(), |
| 418 observer.mounts[0].file_system_info().extension_id()); | 413 observer.mounts[0].file_system_info().extension_id()); |
| 419 EXPECT_EQ(file_system_info.file_system_id(), | 414 EXPECT_EQ(file_system_info.file_system_id(), |
| 420 observer.mounts[0].file_system_info().file_system_id()); | 415 observer.mounts[0].file_system_info().file_system_id()); |
| 421 EXPECT_EQ(file_system_info.writable(), | 416 EXPECT_EQ(file_system_info.writable(), |
| 422 observer.mounts[0].file_system_info().writable()); | 417 observer.mounts[0].file_system_info().writable()); |
| 423 EXPECT_EQ(file_system_info.supports_notify_tag(), | 418 EXPECT_EQ(file_system_info.supports_notify_tag(), |
| 424 observer.mounts[0].file_system_info().supports_notify_tag()); | 419 observer.mounts[0].file_system_info().supports_notify_tag()); |
| 425 | 420 |
| 426 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 421 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
| 427 service_->GetProvidedFileSystemInfoList(); | 422 service_->GetProvidedFileSystemInfoList(); |
| 428 ASSERT_EQ(1u, file_system_info_list.size()); | 423 ASSERT_EQ(1u, file_system_info_list.size()); |
| 429 | 424 |
| 430 ProvidedFileSystemInterface* const file_system = | 425 ProvidedFileSystemInterface* const file_system = |
| 431 service_->GetProvidedFileSystem(kExtensionId, kFileSystemId); | 426 service_->GetProvidedFileSystem(kExtensionId, kFileSystemId); |
| 432 ASSERT_TRUE(file_system); | 427 ASSERT_TRUE(file_system); |
| 433 | 428 |
| 434 const ObservedEntries* const observed_entries = | 429 const Watchers* const watchers = file_system->GetWatchers(); |
| 435 file_system->GetObservedEntries(); | 430 ASSERT_TRUE(watchers); |
| 436 ASSERT_TRUE(observed_entries); | 431 ASSERT_EQ(1u, watchers->size()); |
| 437 ASSERT_EQ(1u, observed_entries->size()); | |
| 438 | 432 |
| 439 const ObservedEntries::const_iterator restored_observed_entry_it = | 433 const Watchers::const_iterator restored_watcher_it = watchers->find( |
| 440 observed_entries->find(ObservedEntryKey(fake_observed_entry_.entry_path, | 434 WatcherKey(fake_watcher_.entry_path, fake_watcher_.recursive)); |
| 441 fake_observed_entry_.recursive)); | 435 ASSERT_NE(watchers->end(), restored_watcher_it); |
| 442 ASSERT_NE(observed_entries->end(), restored_observed_entry_it); | |
| 443 | 436 |
| 444 EXPECT_EQ(fake_observed_entry_.entry_path, | 437 EXPECT_EQ(fake_watcher_.entry_path, restored_watcher_it->second.entry_path); |
| 445 restored_observed_entry_it->second.entry_path); | 438 EXPECT_EQ(fake_watcher_.recursive, restored_watcher_it->second.recursive); |
| 446 EXPECT_EQ(fake_observed_entry_.recursive, | 439 EXPECT_EQ(fake_watcher_.last_tag, restored_watcher_it->second.last_tag); |
| 447 restored_observed_entry_it->second.recursive); | |
| 448 EXPECT_EQ(fake_observed_entry_.last_tag, | |
| 449 restored_observed_entry_it->second.last_tag); | |
| 450 | 440 |
| 451 service_->RemoveObserver(&observer); | 441 service_->RemoveObserver(&observer); |
| 452 } | 442 } |
| 453 | 443 |
| 454 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { | 444 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { |
| 455 LoggingObserver observer; | 445 LoggingObserver observer; |
| 456 service_->AddObserver(&observer); | 446 service_->AddObserver(&observer); |
| 457 | 447 |
| 458 EXPECT_FALSE(registry_->file_system_info()); | 448 EXPECT_FALSE(registry_->file_system_info()); |
| 459 EXPECT_FALSE(registry_->observed_entries()); | 449 EXPECT_FALSE(registry_->watchers()); |
| 460 | 450 |
| 461 EXPECT_TRUE(service_->MountFileSystem( | 451 EXPECT_TRUE(service_->MountFileSystem( |
| 462 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 452 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 463 ASSERT_EQ(1u, observer.mounts.size()); | 453 ASSERT_EQ(1u, observer.mounts.size()); |
| 464 | 454 |
| 465 ASSERT_TRUE(registry_->file_system_info()); | 455 ASSERT_TRUE(registry_->file_system_info()); |
| 466 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id()); | 456 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id()); |
| 467 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id()); | 457 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id()); |
| 468 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name()); | 458 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name()); |
| 469 EXPECT_FALSE(registry_->file_system_info()->writable()); | 459 EXPECT_FALSE(registry_->file_system_info()->writable()); |
| 470 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag()); | 460 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag()); |
| 471 ASSERT_TRUE(registry_->observed_entries()); | 461 ASSERT_TRUE(registry_->watchers()); |
| 472 | 462 |
| 473 service_->RemoveObserver(&observer); | 463 service_->RemoveObserver(&observer); |
| 474 } | 464 } |
| 475 | 465 |
| 476 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { | 466 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { |
| 477 LoggingObserver observer; | 467 LoggingObserver observer; |
| 478 service_->AddObserver(&observer); | 468 service_->AddObserver(&observer); |
| 479 | 469 |
| 480 { | 470 { |
| 481 EXPECT_FALSE(registry_->file_system_info()); | 471 EXPECT_FALSE(registry_->file_system_info()); |
| 482 EXPECT_FALSE(registry_->observed_entries()); | 472 EXPECT_FALSE(registry_->watchers()); |
| 483 EXPECT_TRUE(service_->MountFileSystem( | 473 EXPECT_TRUE(service_->MountFileSystem( |
| 484 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 474 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 485 | 475 |
| 486 EXPECT_EQ(1u, observer.mounts.size()); | 476 EXPECT_EQ(1u, observer.mounts.size()); |
| 487 EXPECT_TRUE(registry_->file_system_info()); | 477 EXPECT_TRUE(registry_->file_system_info()); |
| 488 EXPECT_TRUE(registry_->observed_entries()); | 478 EXPECT_TRUE(registry_->watchers()); |
| 489 } | 479 } |
| 490 | 480 |
| 491 { | 481 { |
| 492 EXPECT_TRUE(service_->UnmountFileSystem( | 482 EXPECT_TRUE(service_->UnmountFileSystem( |
| 493 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); | 483 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); |
| 494 | 484 |
| 495 EXPECT_EQ(1u, observer.unmounts.size()); | 485 EXPECT_EQ(1u, observer.unmounts.size()); |
| 496 EXPECT_TRUE(registry_->file_system_info()); | 486 EXPECT_TRUE(registry_->file_system_info()); |
| 497 EXPECT_TRUE(registry_->observed_entries()); | 487 EXPECT_TRUE(registry_->watchers()); |
| 498 } | 488 } |
| 499 | 489 |
| 500 service_->RemoveObserver(&observer); | 490 service_->RemoveObserver(&observer); |
| 501 } | 491 } |
| 502 | 492 |
| 503 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { | 493 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { |
| 504 LoggingObserver observer; | 494 LoggingObserver observer; |
| 505 service_->AddObserver(&observer); | 495 service_->AddObserver(&observer); |
| 506 | 496 |
| 507 { | 497 { |
| 508 EXPECT_FALSE(registry_->file_system_info()); | 498 EXPECT_FALSE(registry_->file_system_info()); |
| 509 EXPECT_FALSE(registry_->observed_entries()); | 499 EXPECT_FALSE(registry_->watchers()); |
| 510 EXPECT_TRUE(service_->MountFileSystem( | 500 EXPECT_TRUE(service_->MountFileSystem( |
| 511 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 501 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 512 | 502 |
| 513 EXPECT_EQ(1u, observer.mounts.size()); | 503 EXPECT_EQ(1u, observer.mounts.size()); |
| 514 EXPECT_TRUE(registry_->file_system_info()); | 504 EXPECT_TRUE(registry_->file_system_info()); |
| 515 EXPECT_TRUE(registry_->observed_entries()); | 505 EXPECT_TRUE(registry_->watchers()); |
| 516 } | 506 } |
| 517 | 507 |
| 518 { | 508 { |
| 519 EXPECT_TRUE(service_->UnmountFileSystem( | 509 EXPECT_TRUE(service_->UnmountFileSystem( |
| 520 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); | 510 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); |
| 521 | 511 |
| 522 EXPECT_EQ(1u, observer.unmounts.size()); | 512 EXPECT_EQ(1u, observer.unmounts.size()); |
| 523 EXPECT_FALSE(registry_->file_system_info()); | 513 EXPECT_FALSE(registry_->file_system_info()); |
| 524 EXPECT_FALSE(registry_->observed_entries()); | 514 EXPECT_FALSE(registry_->watchers()); |
| 525 } | 515 } |
| 526 | 516 |
| 527 service_->RemoveObserver(&observer); | 517 service_->RemoveObserver(&observer); |
| 528 } | 518 } |
| 529 | 519 |
| 530 } // namespace file_system_provider | 520 } // namespace file_system_provider |
| 531 } // namespace chromeos | 521 } // namespace chromeos |
| OLD | NEW |