| 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/extensions/extension_storage_monitor.h" | 5 #include "chrome/browser/extensions/extension_storage_monitor.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 content::Details<const Extension>(details).ptr(); | 204 content::Details<const Extension>(details).ptr(); |
| 205 RemoveNotificationForExtension(extension->id()); | 205 RemoveNotificationForExtension(extension->id()); |
| 206 break; | 206 break; |
| 207 } | 207 } |
| 208 case chrome::NOTIFICATION_PROFILE_DESTROYED: { | 208 case chrome::NOTIFICATION_PROFILE_DESTROYED: { |
| 209 StopMonitoringAll(); | 209 StopMonitoringAll(); |
| 210 break; | 210 break; |
| 211 } | 211 } |
| 212 default: | 212 default: |
| 213 NOTREACHED(); | 213 NOTREACHED(); |
| 214 }; | 214 } |
| 215 } | 215 } |
| 216 | 216 |
| 217 void ExtensionStorageMonitor::OnExtensionLoaded( | 217 void ExtensionStorageMonitor::OnExtensionLoaded( |
| 218 content::BrowserContext* browser_context, | 218 content::BrowserContext* browser_context, |
| 219 const Extension* extension) { | 219 const Extension* extension) { |
| 220 DCHECK(extension); | 220 DCHECK(extension); |
| 221 StartMonitoringStorage(extension); | 221 StartMonitoringStorage(extension); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void ExtensionStorageMonitor::OnExtensionUnloaded( | 224 void ExtensionStorageMonitor::OnExtensionUnloaded( |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 | 317 |
| 318 void ExtensionStorageMonitor::OnNotificationButtonClick( | 318 void ExtensionStorageMonitor::OnNotificationButtonClick( |
| 319 const std::string& extension_id, int button_index) { | 319 const std::string& extension_id, int button_index) { |
| 320 switch (button_index) { | 320 switch (button_index) { |
| 321 case BUTTON_DISABLE_NOTIFICATION: { | 321 case BUTTON_DISABLE_NOTIFICATION: { |
| 322 DisableStorageMonitoring(extension_id); | 322 DisableStorageMonitoring(extension_id); |
| 323 break; | 323 break; |
| 324 } | 324 } |
| 325 default: | 325 default: |
| 326 NOTREACHED(); | 326 NOTREACHED(); |
| 327 }; | 327 } |
| 328 } | 328 } |
| 329 | 329 |
| 330 void ExtensionStorageMonitor::DisableStorageMonitoring( | 330 void ExtensionStorageMonitor::DisableStorageMonitoring( |
| 331 const std::string& extension_id) { | 331 const std::string& extension_id) { |
| 332 StopMonitoringStorage(extension_id); | 332 StopMonitoringStorage(extension_id); |
| 333 | 333 |
| 334 ExtensionPrefs* prefs = ExtensionPrefs::Get(context_); | 334 ExtensionPrefs* prefs = ExtensionPrefs::Get(context_); |
| 335 DCHECK(prefs); | 335 DCHECK(prefs); |
| 336 prefs->SetStorageNotificationEnabled(extension_id, false); | 336 prefs->SetStorageNotificationEnabled(extension_id, false); |
| 337 | 337 |
| 338 message_center::MessageCenter::Get()->RemoveNotification( | 338 message_center::MessageCenter::Get()->RemoveNotification( |
| 339 GetNotificationId(extension_id), false); | 339 GetNotificationId(extension_id), false); |
| 340 } | 340 } |
| 341 | 341 |
| 342 void ExtensionStorageMonitor::StartMonitoringStorage( | 342 void ExtensionStorageMonitor::StartMonitoringStorage( |
| 343 const Extension* extension) { | 343 const Extension* extension) { |
| 344 if (!extension->HasAPIPermission(APIPermission::kUnlimitedStorage)) | 344 if (!extension->HasAPIPermission(APIPermission::kUnlimitedStorage)) |
| 345 return; | 345 return; |
| 346 | 346 |
| 347 // Do not monitor storage for component extensions. | 347 // Do not monitor storage for component extensions. |
| 348 if (extension->location() == Manifest::COMPONENT) | 348 if (extension->location() == Manifest::COMPONENT) |
| 349 return; | 349 return; |
| 350 | 350 |
| 351 // First apply this feature only to experimental ephemeral apps. If it works | |
| 352 // well, roll it out to all extensions and apps. | |
| 353 if (!extension->is_ephemeral() && !enable_for_all_extensions_) | |
| 354 return; | |
| 355 | |
| 356 ExtensionPrefs* prefs = ExtensionPrefs::Get(context_); | 351 ExtensionPrefs* prefs = ExtensionPrefs::Get(context_); |
| 357 DCHECK(prefs); | 352 DCHECK(prefs); |
| 353 |
| 354 // First apply this feature only to experimental ephemeral apps. If it works |
| 355 // well, roll it out to all extensions and apps. |
| 356 bool is_ephemeral = prefs->IsEphemeralApp(extension->id()); |
| 357 if (!is_ephemeral && !enable_for_all_extensions_) |
| 358 return; |
| 359 |
| 358 if (!prefs->IsStorageNotificationEnabled(extension->id())) | 360 if (!prefs->IsStorageNotificationEnabled(extension->id())) |
| 359 return; | 361 return; |
| 360 | 362 |
| 361 // Lazily create the storage monitor proxy on the IO thread. | 363 // Lazily create the storage monitor proxy on the IO thread. |
| 362 if (!storage_observer_.get()) { | 364 if (!storage_observer_.get()) { |
| 363 storage_observer_ = | 365 storage_observer_ = |
| 364 new StorageEventObserver(weak_ptr_factory_.GetWeakPtr()); | 366 new StorageEventObserver(weak_ptr_factory_.GetWeakPtr()); |
| 365 } | 367 } |
| 366 | 368 |
| 367 GURL site_url = | 369 GURL site_url = |
| 368 extensions::util::GetSiteForExtensionId(extension->id(), context_); | 370 extensions::util::GetSiteForExtensionId(extension->id(), context_); |
| 369 content::StoragePartition* storage_partition = | 371 content::StoragePartition* storage_partition = |
| 370 content::BrowserContext::GetStoragePartitionForSite(context_, site_url); | 372 content::BrowserContext::GetStoragePartitionForSite(context_, site_url); |
| 371 DCHECK(storage_partition); | 373 DCHECK(storage_partition); |
| 372 scoped_refptr<quota::QuotaManager> quota_manager( | 374 scoped_refptr<quota::QuotaManager> quota_manager( |
| 373 storage_partition->GetQuotaManager()); | 375 storage_partition->GetQuotaManager()); |
| 374 | 376 |
| 375 GURL storage_origin(site_url.GetOrigin()); | 377 GURL storage_origin(site_url.GetOrigin()); |
| 376 if (extension->is_hosted_app()) | 378 if (extension->is_hosted_app()) |
| 377 storage_origin = AppLaunchInfo::GetLaunchWebURL(extension).GetOrigin(); | 379 storage_origin = AppLaunchInfo::GetLaunchWebURL(extension).GetOrigin(); |
| 378 | 380 |
| 379 int next_threshold = prefs->GetNextStorageThreshold(extension->id()); | 381 int next_threshold = prefs->GetNextStorageThreshold(extension->id()); |
| 380 if (next_threshold == 0) { | 382 if (next_threshold == 0) { |
| 381 // The next threshold is written to the prefs after the initial threshold is | 383 // The next threshold is written to the prefs after the initial threshold is |
| 382 // exceeded. | 384 // exceeded. |
| 383 next_threshold = extension->is_ephemeral() ? initial_ephemeral_threshold_ | 385 next_threshold = is_ephemeral ? initial_ephemeral_threshold_ |
| 384 : initial_extension_threshold_; | 386 : initial_extension_threshold_; |
| 385 } | 387 } |
| 386 | 388 |
| 387 BrowserThread::PostTask( | 389 BrowserThread::PostTask( |
| 388 BrowserThread::IO, | 390 BrowserThread::IO, |
| 389 FROM_HERE, | 391 FROM_HERE, |
| 390 base::Bind(&StorageEventObserver::StartObservingForExtension, | 392 base::Bind(&StorageEventObserver::StartObservingForExtension, |
| 391 storage_observer_, | 393 storage_observer_, |
| 392 quota_manager, | 394 quota_manager, |
| 393 extension->id(), | 395 extension->id(), |
| 394 storage_origin, | 396 storage_origin, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 message_center::MessageCenter* center = message_center::MessageCenter::Get(); | 447 message_center::MessageCenter* center = message_center::MessageCenter::Get(); |
| 446 DCHECK(center); | 448 DCHECK(center); |
| 447 for (std::set<std::string>::iterator it = notified_extension_ids_.begin(); | 449 for (std::set<std::string>::iterator it = notified_extension_ids_.begin(); |
| 448 it != notified_extension_ids_.end(); ++it) { | 450 it != notified_extension_ids_.end(); ++it) { |
| 449 center->RemoveNotification(GetNotificationId(*it), false); | 451 center->RemoveNotification(GetNotificationId(*it), false); |
| 450 } | 452 } |
| 451 notified_extension_ids_.clear(); | 453 notified_extension_ids_.clear(); |
| 452 } | 454 } |
| 453 | 455 |
| 454 } // namespace extensions | 456 } // namespace extensions |
| OLD | NEW |