| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/extensions_service.h" | 5 #include "chrome/browser/extensions/extensions_service.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/histogram.h" | 10 #include "base/histogram.h" |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 NewRunnableMethod( | 571 NewRunnableMethod( |
| 572 backend_.get(), | 572 backend_.get(), |
| 573 &ExtensionsServiceBackend::CheckExternalUninstall, | 573 &ExtensionsServiceBackend::CheckExternalUninstall, |
| 574 scoped_refptr<ExtensionsService>(this), | 574 scoped_refptr<ExtensionsService>(this), |
| 575 info.extension_id, | 575 info.extension_id, |
| 576 info.extension_location)); | 576 info.extension_location)); |
| 577 } | 577 } |
| 578 } | 578 } |
| 579 | 579 |
| 580 void ExtensionsService::NotifyExtensionLoaded(Extension* extension) { | 580 void ExtensionsService::NotifyExtensionLoaded(Extension* extension) { |
| 581 LOG(INFO) << "Sending EXTENSION_LOADED"; | 581 // The ChromeURLRequestContexts need to be first to know that the extension |
| 582 | |
| 583 // The ChromeURLRequestContext needs to be first to know that the extension | |
| 584 // was loaded, otherwise a race can arise where a renderer that is created | 582 // was loaded, otherwise a race can arise where a renderer that is created |
| 585 // for the extension may try to load an extension URL with an extension id | 583 // for the extension may try to load an extension URL with an extension id |
| 586 // that the request context doesn't yet know about. | 584 // that the request context doesn't yet know about. The profile is responsible |
| 587 if (profile_ && !profile_->IsOffTheRecord()) { | 585 // for ensuring its URLRequestContexts appropriately discover the loaded |
| 588 ChromeURLRequestContextGetter* context_getter = | 586 // extension. |
| 589 static_cast<ChromeURLRequestContextGetter*>( | 587 if (profile_) { |
| 590 profile_->GetRequestContext()); | 588 profile_->RegisterExtensionWithRequestContexts(extension); |
| 591 if (context_getter) { | |
| 592 ChromeThread::PostTask( | |
| 593 ChromeThread::IO, FROM_HERE, | |
| 594 NewRunnableMethod( | |
| 595 context_getter, | |
| 596 &ChromeURLRequestContextGetter::OnNewExtensions, | |
| 597 extension->id(), | |
| 598 new ChromeURLRequestContext::ExtensionInfo( | |
| 599 extension->path(), | |
| 600 extension->default_locale(), | |
| 601 std::vector<URLPattern>(), | |
| 602 extension->api_permissions()))); | |
| 603 } | |
| 604 | 589 |
| 605 // Check if this permission requires unlimited storage quota | 590 // Check if this permission requires unlimited storage quota |
| 606 if (extension->HasApiPermission(Extension::kUnlimitedStoragePermission)) { | 591 if (extension->HasApiPermission(Extension::kUnlimitedStoragePermission)) { |
| 607 string16 origin_identifier = | 592 string16 origin_identifier = |
| 608 webkit_database::DatabaseUtil::GetOriginIdentifier(extension->url()); | 593 webkit_database::DatabaseUtil::GetOriginIdentifier(extension->url()); |
| 609 ChromeThread::PostTask( | 594 ChromeThread::PostTask( |
| 610 ChromeThread::FILE, FROM_HERE, | 595 ChromeThread::FILE, FROM_HERE, |
| 611 NewRunnableMethod( | 596 NewRunnableMethod( |
| 612 profile_->GetDatabaseTracker(), | 597 profile_->GetDatabaseTracker(), |
| 613 &webkit_database::DatabaseTracker::SetOriginQuotaInMemory, | 598 &webkit_database::DatabaseTracker::SetOriginQuotaInMemory, |
| 614 origin_identifier, | 599 origin_identifier, |
| 615 kint64max)); | 600 kint64max)); |
| 616 } | 601 } |
| 617 } | 602 } |
| 618 | 603 |
| 604 LOG(INFO) << "Sending EXTENSION_LOADED"; |
| 605 |
| 619 NotificationService::current()->Notify( | 606 NotificationService::current()->Notify( |
| 620 NotificationType::EXTENSION_LOADED, | 607 NotificationType::EXTENSION_LOADED, |
| 621 Source<Profile>(profile_), | 608 Source<Profile>(profile_), |
| 622 Details<Extension>(extension)); | 609 Details<Extension>(extension)); |
| 623 } | 610 } |
| 624 | 611 |
| 625 void ExtensionsService::NotifyExtensionUnloaded(Extension* extension) { | 612 void ExtensionsService::NotifyExtensionUnloaded(Extension* extension) { |
| 626 LOG(INFO) << "Sending EXTENSION_UNLOADED"; | 613 LOG(INFO) << "Sending EXTENSION_UNLOADED"; |
| 627 | 614 |
| 628 NotificationService::current()->Notify( | 615 NotificationService::current()->Notify( |
| 629 NotificationType::EXTENSION_UNLOADED, | 616 NotificationType::EXTENSION_UNLOADED, |
| 630 Source<Profile>(profile_), | 617 Source<Profile>(profile_), |
| 631 Details<Extension>(extension)); | 618 Details<Extension>(extension)); |
| 632 | 619 |
| 633 if (profile_ && !profile_->IsOffTheRecord()) { | 620 if (profile_) { |
| 634 ChromeURLRequestContextGetter* context_getter = | 621 profile_->UnregisterExtensionWithRequestContexts(extension); |
| 635 static_cast<ChromeURLRequestContextGetter*>( | 622 |
| 636 profile_->GetRequestContext()); | 623 // Check if this permission required unlimited storage quota, reset its |
| 637 if (context_getter) { | 624 // in-memory quota. |
| 625 if (extension->HasApiPermission(Extension::kUnlimitedStoragePermission)) { |
| 626 string16 origin_identifier = |
| 627 webkit_database::DatabaseUtil::GetOriginIdentifier(extension->url()); |
| 638 ChromeThread::PostTask( | 628 ChromeThread::PostTask( |
| 639 ChromeThread::IO, FROM_HERE, | 629 ChromeThread::FILE, FROM_HERE, |
| 640 NewRunnableMethod( | 630 NewRunnableMethod( |
| 641 context_getter, | 631 profile_->GetDatabaseTracker(), |
| 642 &ChromeURLRequestContextGetter::OnUnloadedExtension, | 632 &webkit_database::DatabaseTracker::ResetOriginQuotaInMemory, |
| 643 extension->id())); | 633 origin_identifier)); |
| 644 } | 634 } |
| 645 } | 635 } |
| 646 } | 636 } |
| 647 | 637 |
| 648 void ExtensionsService::UpdateExtensionBlacklist( | 638 void ExtensionsService::UpdateExtensionBlacklist( |
| 649 const std::vector<std::string>& blacklist) { | 639 const std::vector<std::string>& blacklist) { |
| 650 // Use this set to indicate if an extension in the blacklist has been used. | 640 // Use this set to indicate if an extension in the blacklist has been used. |
| 651 std::set<std::string> blacklist_set; | 641 std::set<std::string> blacklist_set; |
| 652 for (unsigned int i = 0; i < blacklist.size(); ++i) { | 642 for (unsigned int i = 0; i < blacklist.size(); ++i) { |
| 653 if (Extension::IdIsValid(blacklist[i])) { | 643 if (Extension::IdIsValid(blacklist[i])) { |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1247 // Finish installing on UI thread. | 1237 // Finish installing on UI thread. |
| 1248 ChromeThread::PostTask( | 1238 ChromeThread::PostTask( |
| 1249 ChromeThread::UI, FROM_HERE, | 1239 ChromeThread::UI, FROM_HERE, |
| 1250 NewRunnableMethod( | 1240 NewRunnableMethod( |
| 1251 frontend_, | 1241 frontend_, |
| 1252 &ExtensionsService::ContinueLoadAllExtensions, | 1242 &ExtensionsService::ContinueLoadAllExtensions, |
| 1253 extensions_to_reload, | 1243 extensions_to_reload, |
| 1254 start_time, | 1244 start_time, |
| 1255 true)); | 1245 true)); |
| 1256 } | 1246 } |
| OLD | NEW |