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

Unified Diff: chrome/browser/extensions/api/storage/managed_value_store_cache.cc

Issue 14587009: Added a PolicyManifestHandler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix win build Created 7 years, 7 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/extensions/api/storage/managed_value_store_cache.cc
diff --git a/chrome/browser/extensions/api/storage/managed_value_store_cache.cc b/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
index 3dfbf7e0b26bf4f0ac9ae5ce186927a8527a5db8..325012b9681f586e003f0f5a95e433b94c672c7c 100644
--- a/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
+++ b/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
@@ -26,7 +26,9 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/value_store/value_store_change.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/common/extensions/extension_set.h"
+#include "chrome/common/extensions/manifest.h"
#include "chrome/common/extensions/permissions/api_permission.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_observer.h"
@@ -53,16 +55,25 @@ class ManagedValueStoreCache::ExtensionTracker
const content::NotificationDetails& details) OVERRIDE;
private:
+ // Loads the schemas of the |extensions| and passes a PolicyDomainDescriptor
+ // to RegisterDomain().
+ static void LoadSchemas(scoped_ptr<ExtensionSet> extensions,
+ base::WeakPtr<ExtensionTracker> self);
+ void RegisterDomain(
+ scoped_refptr<const policy::PolicyDomainDescriptor> descriptor);
+
Profile* profile_;
bool is_ready_;
content::NotificationRegistrar registrar_;
+ base::WeakPtrFactory<ExtensionTracker> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(ExtensionTracker);
};
ManagedValueStoreCache::ExtensionTracker::ExtensionTracker(Profile* profile)
: profile_(profile),
- is_ready_(false) {
+ is_ready_(false),
+ weak_factory_(this) {
registrar_.Add(this,
chrome::NOTIFICATION_EXTENSIONS_READY,
content::Source<Profile>(profile_));
@@ -84,20 +95,77 @@ void ManagedValueStoreCache::ExtensionTracker::Observe(
if (!is_ready_)
return;
- // TODO(joaodasilva): this currently only registers extensions that use
- // the storage API, but that still includes a lot of extensions that don't
- // use the storage.managed namespace. Use the presence of a schema for the
- // managed namespace in the manifest as a better signal, once available.
scoped_refptr<policy::PolicyDomainDescriptor> descriptor(
new policy::PolicyDomainDescriptor(policy::POLICY_DOMAIN_EXTENSIONS));
const ExtensionSet* set =
ExtensionSystem::Get(profile_)->extension_service()->extensions();
+ scoped_ptr<ExtensionSet> managed_extensions(new ExtensionSet());
for (ExtensionSet::const_iterator it = set->begin(); it != set->end(); ++it) {
Mattias Nissler (ping if slow) 2013/05/15 10:37:39 It seems this loop is not really needed, you could
not at google - send to devlin 2013/05/16 16:34:15 One advantage of filtering here is that the method
Joao da Silva 2013/05/19 13:21:35 It's expected that most extensions won't have the
Joao da Silva 2013/05/19 13:21:35 |managed_extensions| could be created only when th
- // TODO(joaodasilva): pass the parsed schema here, once available.
+ if ((*it)->manifest()->HasPath(
+ extension_manifest_keys::kStorageManagedSchema)) {
+ managed_extensions->Insert(*it);
+ }
+
+ // TODO(joaodasilva): also load extensions that use the storage API for now,
+ // to support the Legacy Browser Support extension. Remove this for M30.
+ // http://crbug.com/240704
if ((*it)->HasAPIPermission(APIPermission::kStorage))
- descriptor->AddComponent((*it)->id(), scoped_ptr<policy::PolicySchema>());
+ managed_extensions->Insert(*it);
}
+ // The 2nd check needs to be performed on the FILE thread.
Mattias Nissler (ping if slow) 2013/05/15 10:37:39 What is the 2nd check? Just spell it out :)
Joao da Silva 2013/05/19 13:21:35 Done.
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ base::Bind(&ExtensionTracker::LoadSchemas,
+ base::Passed(&managed_extensions),
+ weak_factory_.GetWeakPtr()));
+}
+
+// static
+void ManagedValueStoreCache::ExtensionTracker::LoadSchemas(
+ scoped_ptr<ExtensionSet> extensions,
+ base::WeakPtr<ExtensionTracker> self) {
+ scoped_refptr<policy::PolicyDomainDescriptor> descriptor =
+ new policy::PolicyDomainDescriptor(policy::POLICY_DOMAIN_EXTENSIONS);
+
+ for (ExtensionSet::const_iterator it = extensions->begin();
+ it != extensions->end(); ++it) {
+ std::string path;
+ if (!(*it)->manifest()->GetString(
+ extension_manifest_keys::kStorageManagedSchema, &path)) {
+ // TODO(joaodasilva): Remove this for M30. http://crbug.com/240704
+ if ((*it)->HasAPIPermission(APIPermission::kStorage)) {
+ descriptor->AddComponent((*it)->id(),
+ scoped_ptr<policy::PolicySchema>());
+ } else {
+ NOTREACHED();
+ }
+ continue;
+ }
+ // The extension should have been validated, so assume the schema exists
+ // and is valid.
+ std::string content;
+ if (!file_util::ReadFileToString((*it)->path().AppendASCII(path),
Mattias Nissler (ping if slow) 2013/05/15 10:37:39 I was momentarily confused by the two |path|s here
Joao da Silva 2013/05/19 13:21:35 Done.
+ &content)) {
+ NOTREACHED();
+ continue;
+ }
+ std::string error;
+ scoped_ptr<policy::PolicySchema> schema =
+ policy::PolicySchema::Parse(content, &error);
+ if (schema)
+ descriptor->AddComponent((*it)->id(), schema.Pass());
+ else
+ NOTREACHED();
Mattias Nissler (ping if slow) 2013/05/15 10:37:39 Is this really a NOTREACHED()? Won't we hit this i
not at google - send to devlin 2013/05/16 16:34:15 Hopefully we are doing the schema validation at ex
Joao da Silva 2013/05/19 13:21:35 As Benjamin suspects, this is a NOTREACHED because
+ }
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&ExtensionTracker::RegisterDomain, self, descriptor));
+}
+
+void ManagedValueStoreCache::ExtensionTracker::RegisterDomain(
+ scoped_refptr<const policy::PolicyDomainDescriptor> descriptor) {
policy::ProfilePolicyConnector* connector =
policy::ProfilePolicyConnectorFactory::GetForProfile(profile_);
connector->policy_service()->RegisterPolicyDomain(descriptor);
« no previous file with comments | « no previous file | chrome/browser/policy/browser_policy_connector.cc » ('j') | chrome/browser/policy/policy_manifest_handler.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698