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 #ifndef EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ | 5 #ifndef EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
6 #define EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ | 6 #define EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> { | 169 class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> { |
170 public: | 170 public: |
171 typedef std::map<int, linked_ptr<T> > ApiResourceMap; | 171 typedef std::map<int, linked_ptr<T> > ApiResourceMap; |
172 // Lookup map from extension id's to allocated resource id's. | 172 // Lookup map from extension id's to allocated resource id's. |
173 typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap; | 173 typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap; |
174 | 174 |
175 explicit ApiResourceData(const content::BrowserThread::ID thread_id) | 175 explicit ApiResourceData(const content::BrowserThread::ID thread_id) |
176 : next_id_(1), thread_id_(thread_id) {} | 176 : next_id_(1), thread_id_(thread_id) {} |
177 | 177 |
178 int Add(T* api_resource) { | 178 int Add(T* api_resource) { |
179 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 179 DCHECK_CURRENTLY_ON(thread_id_); |
180 int id = GenerateId(); | 180 int id = GenerateId(); |
181 if (id > 0) { | 181 if (id > 0) { |
182 linked_ptr<T> resource_ptr(api_resource); | 182 linked_ptr<T> resource_ptr(api_resource); |
183 api_resource_map_[id] = resource_ptr; | 183 api_resource_map_[id] = resource_ptr; |
184 | 184 |
185 const std::string& extension_id = api_resource->owner_extension_id(); | 185 const std::string& extension_id = api_resource->owner_extension_id(); |
186 if (extension_resource_map_.find(extension_id) == | 186 if (extension_resource_map_.find(extension_id) == |
187 extension_resource_map_.end()) { | 187 extension_resource_map_.end()) { |
188 extension_resource_map_[extension_id] = base::hash_set<int>(); | 188 extension_resource_map_[extension_id] = base::hash_set<int>(); |
189 } | 189 } |
190 extension_resource_map_[extension_id].insert(id); | 190 extension_resource_map_[extension_id].insert(id); |
191 | 191 |
192 return id; | 192 return id; |
193 } | 193 } |
194 return 0; | 194 return 0; |
195 } | 195 } |
196 | 196 |
197 void Remove(const std::string& extension_id, int api_resource_id) { | 197 void Remove(const std::string& extension_id, int api_resource_id) { |
198 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 198 DCHECK_CURRENTLY_ON(thread_id_); |
199 if (GetOwnedResource(extension_id, api_resource_id) != NULL) { | 199 if (GetOwnedResource(extension_id, api_resource_id) != NULL) { |
200 DCHECK(extension_resource_map_.find(extension_id) != | 200 DCHECK(extension_resource_map_.find(extension_id) != |
201 extension_resource_map_.end()); | 201 extension_resource_map_.end()); |
202 extension_resource_map_[extension_id].erase(api_resource_id); | 202 extension_resource_map_[extension_id].erase(api_resource_id); |
203 api_resource_map_.erase(api_resource_id); | 203 api_resource_map_.erase(api_resource_id); |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 T* Get(const std::string& extension_id, int api_resource_id) { | 207 T* Get(const std::string& extension_id, int api_resource_id) { |
208 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 208 DCHECK_CURRENTLY_ON(thread_id_); |
209 return GetOwnedResource(extension_id, api_resource_id); | 209 return GetOwnedResource(extension_id, api_resource_id); |
210 } | 210 } |
211 | 211 |
212 base::hash_set<int>* GetResourceIds(const std::string& extension_id) { | 212 base::hash_set<int>* GetResourceIds(const std::string& extension_id) { |
213 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 213 DCHECK_CURRENTLY_ON(thread_id_); |
214 return GetOwnedResourceIds(extension_id); | 214 return GetOwnedResourceIds(extension_id); |
215 } | 215 } |
216 | 216 |
217 void InitiateExtensionUnloadedCleanup(const std::string& extension_id) { | 217 void InitiateExtensionUnloadedCleanup(const std::string& extension_id) { |
218 content::BrowserThread::PostTask( | 218 content::BrowserThread::PostTask( |
219 thread_id_, | 219 thread_id_, |
220 FROM_HERE, | 220 FROM_HERE, |
221 base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension, | 221 base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension, |
222 this, | 222 this, |
223 extension_id)); | 223 extension_id)); |
(...skipping 20 matching lines...) Expand all Loading... |
244 | 244 |
245 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { | 245 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { |
246 linked_ptr<T> ptr = api_resource_map_[api_resource_id]; | 246 linked_ptr<T> ptr = api_resource_map_[api_resource_id]; |
247 T* resource = ptr.get(); | 247 T* resource = ptr.get(); |
248 if (resource && extension_id == resource->owner_extension_id()) | 248 if (resource && extension_id == resource->owner_extension_id()) |
249 return resource; | 249 return resource; |
250 return NULL; | 250 return NULL; |
251 } | 251 } |
252 | 252 |
253 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { | 253 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { |
254 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 254 DCHECK_CURRENTLY_ON(thread_id_); |
255 if (extension_resource_map_.find(extension_id) == | 255 if (extension_resource_map_.find(extension_id) == |
256 extension_resource_map_.end()) | 256 extension_resource_map_.end()) |
257 return NULL; | 257 return NULL; |
258 | 258 |
259 return &extension_resource_map_[extension_id]; | 259 return &extension_resource_map_[extension_id]; |
260 } | 260 } |
261 | 261 |
262 void CleanupResourcesFromUnloadedExtension( | 262 void CleanupResourcesFromUnloadedExtension( |
263 const std::string& extension_id) { | 263 const std::string& extension_id) { |
264 CleanupResourcesFromExtension(extension_id, true); | 264 CleanupResourcesFromExtension(extension_id, true); |
265 } | 265 } |
266 | 266 |
267 void CleanupResourcesFromSuspendedExtension( | 267 void CleanupResourcesFromSuspendedExtension( |
268 const std::string& extension_id) { | 268 const std::string& extension_id) { |
269 CleanupResourcesFromExtension(extension_id, false); | 269 CleanupResourcesFromExtension(extension_id, false); |
270 } | 270 } |
271 | 271 |
272 void CleanupResourcesFromExtension(const std::string& extension_id, | 272 void CleanupResourcesFromExtension(const std::string& extension_id, |
273 bool remove_all) { | 273 bool remove_all) { |
274 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 274 DCHECK_CURRENTLY_ON(thread_id_); |
275 | 275 |
276 if (extension_resource_map_.find(extension_id) == | 276 if (extension_resource_map_.find(extension_id) == |
277 extension_resource_map_.end()) { | 277 extension_resource_map_.end()) { |
278 return; | 278 return; |
279 } | 279 } |
280 | 280 |
281 // Remove all resources, or the non persistent ones only if |remove_all| | 281 // Remove all resources, or the non persistent ones only if |remove_all| |
282 // is false. | 282 // is false. |
283 base::hash_set<int>& resource_ids = extension_resource_map_[extension_id]; | 283 base::hash_set<int>& resource_ids = extension_resource_map_[extension_id]; |
284 for (base::hash_set<int>::iterator it = resource_ids.begin(); | 284 for (base::hash_set<int>::iterator it = resource_ids.begin(); |
(...skipping 15 matching lines...) Expand all Loading... |
300 } | 300 } |
301 } // end for | 301 } // end for |
302 | 302 |
303 // Remove extension entry if we removed all its resources. | 303 // Remove extension entry if we removed all its resources. |
304 if (resource_ids.size() == 0) { | 304 if (resource_ids.size() == 0) { |
305 extension_resource_map_.erase(extension_id); | 305 extension_resource_map_.erase(extension_id); |
306 } | 306 } |
307 } | 307 } |
308 | 308 |
309 void Cleanup() { | 309 void Cleanup() { |
310 DCHECK(content::BrowserThread::CurrentlyOn(thread_id_)); | 310 DCHECK_CURRENTLY_ON(thread_id_); |
311 | 311 |
312 api_resource_map_.clear(); | 312 api_resource_map_.clear(); |
313 extension_resource_map_.clear(); | 313 extension_resource_map_.clear(); |
314 } | 314 } |
315 | 315 |
316 int GenerateId() { return next_id_++; } | 316 int GenerateId() { return next_id_++; } |
317 | 317 |
318 int next_id_; | 318 int next_id_; |
319 const content::BrowserThread::ID thread_id_; | 319 const content::BrowserThread::ID thread_id_; |
320 ApiResourceMap api_resource_map_; | 320 ApiResourceMap api_resource_map_; |
321 ExtensionToResourceMap extension_resource_map_; | 321 ExtensionToResourceMap extension_resource_map_; |
322 }; | 322 }; |
323 | 323 |
324 content::BrowserThread::ID thread_id_; | 324 content::BrowserThread::ID thread_id_; |
325 content::NotificationRegistrar registrar_; | 325 content::NotificationRegistrar registrar_; |
326 scoped_refptr<ApiResourceData> data_; | 326 scoped_refptr<ApiResourceData> data_; |
327 }; | 327 }; |
328 | 328 |
329 } // namespace extensions | 329 } // namespace extensions |
330 | 330 |
331 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ | 331 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ |
OLD | NEW |