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

Side by Side Diff: chrome/browser/chromeos/extensions/file_browser_event_router.cc

Issue 7745051: Added refresh on filesystem change (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Rollback one file Created 9 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extensions/file_browser_event_router.h" 5 #include "chrome/browser/chromeos/extensions/file_browser_event_router.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/json/json_writer.h" 8 #include "base/json/json_writer.h"
9 #include "base/memory/singleton.h" 9 #include "base/memory/singleton.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 chromeos::MountLibrary* lib = 119 chromeos::MountLibrary* lib =
120 chromeos::CrosLibrary::Get()->GetMountLibrary(); 120 chromeos::CrosLibrary::Get()->GetMountLibrary();
121 lib->RemoveObserver(this); 121 lib->RemoveObserver(this);
122 lib->AddObserver(this); 122 lib->AddObserver(this);
123 lib->RequestMountInfoRefresh(); 123 lib->RequestMountInfoRefresh();
124 } 124 }
125 } 125 }
126 126
127 // File watch setup routines. 127 // File watch setup routines.
128 bool ExtensionFileBrowserEventRouter::AddFileWatch( 128 bool ExtensionFileBrowserEventRouter::AddFileWatch(
129 const FilePath& local_path, 129 const FilePath& local_path,
130 const FilePath& virtual_path, 130 const FilePath& virtual_path,
131 const std::string& extension_id) { 131 const std::string& extension_id) {
132 base::AutoLock lock(lock_); 132 base::AutoLock lock(lock_);
zel 2011/09/12 15:58:42 one space only?
Dmitry Zvorygin 2011/09/14 10:15:49 Done.
133 WatcherMap::iterator iter = file_watchers_.find(local_path); 133 WatcherMap::iterator iter = file_watchers_.find(local_path);
134 if (iter == file_watchers_.end()) { 134 if (iter == file_watchers_.end()) {
135 FileWatcherExtensions* watch = new FileWatcherExtensions(virtual_path, 135 scoped_ptr<FileWatcherExtensions>
136 extension_id); 136 watch(new FileWatcherExtensions(virtual_path, extension_id));
137 file_watchers_[local_path] = watch; 137
138 if (!watch->file_watcher->Watch(local_path, delegate_.get())) { 138 if (watch->file_watcher->Watch(local_path, delegate_.get()))
139 delete iter->second; 139 file_watchers_[local_path] = watch.release();
140 file_watchers_.erase(iter); 140 else
141 return false; 141 return false;
142 } 142 } else {
143 } else { 143 iter->second->AddExtension(extension_id);
144 iter->second->extensions.insert(extension_id); 144 }
145 } 145 return true;
146 return true;
147 } 146 }
148 147
149 void ExtensionFileBrowserEventRouter::RemoveFileWatch( 148 void ExtensionFileBrowserEventRouter::RemoveFileWatch(
150 const FilePath& local_path, 149 const FilePath& local_path,
151 const std::string& extension_id) { 150 const std::string& extension_id) {
152 base::AutoLock lock(lock_); 151 base::AutoLock lock(lock_);
153 WatcherMap::iterator iter = file_watchers_.find(local_path); 152 WatcherMap::iterator iter = file_watchers_.find(local_path);
154 if (iter == file_watchers_.end()) 153 if (iter == file_watchers_.end())
155 return; 154 return;
156 // Remove the renderer process for this watch. 155 // Remove the renderer process for this watch.
157 iter->second->extensions.erase(extension_id); 156 iter->second->RemoveExtension(extension_id);
158 if (iter->second->extensions.empty()) { 157 if (iter->second->GetRefCount() == 0) {
159 delete iter->second; 158 delete iter->second;
160 file_watchers_.erase(iter); 159 file_watchers_.erase(iter);
161 } 160 }
162 } 161 }
163 162
164 void ExtensionFileBrowserEventRouter::DiskChanged( 163 void ExtensionFileBrowserEventRouter::DiskChanged(
165 chromeos::MountLibraryEventType event, 164 chromeos::MountLibraryEventType event,
166 const chromeos::MountLibrary::Disk* disk) { 165 const chromeos::MountLibrary::Disk* disk) {
167 if (event == chromeos::MOUNT_DISK_ADDED) { 166 if (event == chromeos::MOUNT_DISK_ADDED) {
168 OnDiskAdded(disk); 167 OnDiskAdded(disk);
(...skipping 28 matching lines...) Expand all
197 196
198 void ExtensionFileBrowserEventRouter::HandleFileWatchNotification( 197 void ExtensionFileBrowserEventRouter::HandleFileWatchNotification(
199 const FilePath& local_path, bool got_error) { 198 const FilePath& local_path, bool got_error) {
200 base::AutoLock lock(lock_); 199 base::AutoLock lock(lock_);
201 WatcherMap::const_iterator iter = file_watchers_.find(local_path); 200 WatcherMap::const_iterator iter = file_watchers_.find(local_path);
202 if (iter == file_watchers_.end()) { 201 if (iter == file_watchers_.end()) {
203 NOTREACHED(); 202 NOTREACHED();
204 return; 203 return;
205 } 204 }
206 DispatchFolderChangeEvent(iter->second->virtual_path, got_error, 205 DispatchFolderChangeEvent(iter->second->virtual_path, got_error,
207 iter->second->extensions); 206 iter->second->GetExtensions());
208 } 207 }
209 208
210 void ExtensionFileBrowserEventRouter::DispatchFolderChangeEvent( 209 void ExtensionFileBrowserEventRouter::DispatchFolderChangeEvent(
211 const FilePath& virtual_path, bool got_error, 210 const FilePath& virtual_path, bool got_error,
212 const std::set<std::string>& extensions) { 211 const ExtensionFileBrowserEventRouter::ExtensionUsageRegistry& extensions) {
213 if (!profile_) { 212 if (!profile_) {
214 NOTREACHED(); 213 NOTREACHED();
215 return; 214 return;
216 } 215 }
217 216
218 for (std::set<std::string>::const_iterator iter = extensions.begin(); 217 for (ExtensionUsageRegistry::const_iterator iter = extensions.begin();
219 iter != extensions.end(); ++iter) { 218 iter != extensions.end(); ++iter) {
220 GURL target_origin_url(Extension::GetBaseURLFromExtensionId( 219 GURL target_origin_url(Extension::GetBaseURLFromExtensionId(
221 *iter)); 220 iter->first));
222 GURL base_url = fileapi::GetFileSystemRootURI(target_origin_url, 221 GURL base_url = fileapi::GetFileSystemRootURI(target_origin_url,
223 fileapi::kFileSystemTypeExternal); 222 fileapi::kFileSystemTypeExternal);
224 GURL target_file_url = GURL(base_url.spec() + virtual_path.value()); 223 GURL target_file_url = GURL(base_url.spec() + virtual_path.value());
225 ListValue args; 224 ListValue args;
226 DictionaryValue* watch_info = new DictionaryValue(); 225 DictionaryValue* watch_info = new DictionaryValue();
227 args.Append(watch_info); 226 args.Append(watch_info);
228 watch_info->SetString("fileUrl", target_file_url.spec()); 227 watch_info->SetString("fileUrl", target_file_url.spec());
229 watch_info->SetString("eventType", 228 watch_info->SetString("eventType",
230 got_error ? kPathWatchError : kPathChanged); 229 got_error ? kPathWatchError : kPathChanged);
231 230
232 std::string args_json; 231 std::string args_json;
233 base::JSONWriter::Write(&args, false /* pretty_print */, &args_json); 232 base::JSONWriter::Write(&args, false /* pretty_print */, &args_json);
234 233
235 profile_->GetExtensionEventRouter()->DispatchEventToExtension( 234 profile_->GetExtensionEventRouter()->DispatchEventToExtension(
236 *iter, extension_event_names::kOnFileChanged, args_json, 235 iter->first, extension_event_names::kOnFileChanged, args_json,
237 NULL, GURL()); 236 NULL, GURL());
238 } 237 }
239 } 238 }
240 239
241 void ExtensionFileBrowserEventRouter::DispatchMountEvent( 240 void ExtensionFileBrowserEventRouter::DispatchMountEvent(
242 const chromeos::MountLibrary::Disk* disk, bool added) { 241 const chromeos::MountLibrary::Disk* disk, bool added) {
243 if (!profile_) { 242 if (!profile_) {
244 NOTREACHED(); 243 NOTREACHED();
245 return; 244 return;
246 } 245 }
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 &FileWatcherDelegate::HandleFileWatchOnUIThread, 504 &FileWatcherDelegate::HandleFileWatchOnUIThread,
506 local_path, 505 local_path,
507 true)); // got_error 506 true)); // got_error
508 } 507 }
509 508
510 void 509 void
511 ExtensionFileBrowserEventRouter::FileWatcherDelegate::HandleFileWatchOnUIThread( 510 ExtensionFileBrowserEventRouter::FileWatcherDelegate::HandleFileWatchOnUIThread(
512 const FilePath& local_path, bool got_error) { 511 const FilePath& local_path, bool got_error) {
513 router_->HandleFileWatchNotification(local_path, got_error); 512 router_->HandleFileWatchNotification(local_path, got_error);
514 } 513 }
514
515
516 ExtensionFileBrowserEventRouter::FileWatcherExtensions::FileWatcherExtensions(
517 const FilePath& path, const std::string& extension_id) {
518 file_watcher.reset(new base::files::FilePathWatcher());
519 virtual_path = path;
520 AddExtension(extension_id);
521 }
522
523 void ExtensionFileBrowserEventRouter::FileWatcherExtensions::AddExtension(
524 const std::string& extension_id) {
525 ExtensionUsageRegistry::iterator it = extensions.find(extension_id);
526 if (it != extensions.end()) {
527 it->second++;
528 } else {
529 extensions.insert(ExtensionUsageRegistry::value_type(extension_id, 1));
530 }
531
532 ref_count++;
533 }
534
535 void ExtensionFileBrowserEventRouter::FileWatcherExtensions::RemoveExtension(
536 const std::string& extension_id) {
537 ExtensionUsageRegistry::iterator it = extensions.find(extension_id);
538
539 if (it != extensions.end()) {
540 // If entry found - decrease it's count and remove if necessary
541 if (0 == it->second--) {
542 extensions.erase(it);
543 }
544
545 ref_count--;
546 } else {
547 // Might be reference counting problem - e.g. if some component of
548 // extension subscribes/unsubscribes correctly, but other component
549 // only unsubscribes, developer of first one might receive this message
550 LOG(FATAL) << " Extension [" << extension_id
551 << "] tries to unsubscribe from folder [" << local_path.value()
552 << "] it isn't subscribed";
553 }
554 }
555
556 const ExtensionFileBrowserEventRouter::ExtensionUsageRegistry&
557 ExtensionFileBrowserEventRouter::FileWatcherExtensions::GetExtensions() const {
558 return extensions;
559 }
560
561 unsigned int
562 ExtensionFileBrowserEventRouter::FileWatcherExtensions::GetRefCount() const {
563 return ref_count;
564 }
565
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698