Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Unified Diff: chrome/browser/chromeos/file_system_provider/service.cc

Issue 213123008: [fsp] Unmount file systems when the providing extension gets unloaded. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/file_system_provider/service.cc
diff --git a/chrome/browser/chromeos/file_system_provider/service.cc b/chrome/browser/chromeos/file_system_provider/service.cc
index bd1b520e80342d7aa987e80ce6e8c5beb35f1196..86cf81a1a6979cde30cc4385f3602df4de914689 100644
--- a/chrome/browser/chromeos/file_system_provider/service.cc
+++ b/chrome/browser/chromeos/file_system_provider/service.cc
@@ -16,7 +16,9 @@
#include "chrome/browser/chromeos/login/user_manager.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
+#include "extensions/common/extension.h"
#include "webkit/browser/fileapi/external_mount_points.h"
namespace chromeos {
@@ -47,9 +49,14 @@ base::FilePath GetMountPointPath(Profile* profile,
} // namespace
-Service::Service(Profile* profile)
- : profile_(profile), next_id_(1), weak_ptr_factory_(this) {
+Service::Service(Profile* profile,
+ extensions::ExtensionRegistry* extension_registry)
+ : profile_(profile),
+ extension_registry_(extension_registry),
+ next_id_(1),
+ weak_ptr_factory_(this) {
AddObserver(&request_manager_);
+ extension_registry_->AddObserver(this);
}
Service::~Service() { STLDeleteValues(&file_system_map_); }
@@ -226,7 +233,30 @@ ProvidedFileSystemInterface* Service::GetProvidedFileSystem(
return file_system_it->second;
}
-void Service::Shutdown() { RemoveObserver(&request_manager_); }
+void Service::Shutdown() {
+ RemoveObserver(&request_manager_);
+ extension_registry_->RemoveObserver(this);
+}
+
+void Service::OnExtensionUnloaded(const extensions::Extension* extension) {
+ // Unmount all of the provided file systems associated with this extension.
+ ProvidedFileSystemMap::iterator it = file_system_map_.begin();
+ while (it != file_system_map_.end()) {
+ const ProvidedFileSystemInfo& file_system_info =
+ it->second->GetFileSystemInfo();
+ LOG(ERROR) << extension->id() << " vs. " << file_system_info.extension_id();
hashimoto 2014/03/27 09:18:49 No need to corrupt the feedback log with this info
mtomasz 2014/03/28 06:01:10 Done.
+ if (file_system_info.extension_id() == extension->id()) {
+ // Advance the iterator beforehand, otherwise it will become invalidated
+ // by the UnmountFileSystem() call.
+ ++it;
+ bool result = UnmountFileSystem(file_system_info.extension_id(),
+ file_system_info.file_system_id());
+ DCHECK(result);
+ } else {
+ ++it;
hashimoto 2014/03/27 09:18:49 nit: How about moving this ++it to above the if-st
mtomasz 2014/03/28 06:01:10 Good idea. Done.
+ }
+ }
+}
void Service::OnRequestUnmountStatus(
const ProvidedFileSystemInfo& file_system_info,

Powered by Google App Engine
This is Rietveld 408576698