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

Side by Side Diff: chrome/common/extensions/manifest_handler.cc

Issue 12084034: Change manifest handler interface to always (implicitly) pass the entire manifest to handlers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tts, TODO Created 7 years, 10 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/common/extensions/manifest_handler.h" 5 #include "chrome/common/extensions/manifest_handler.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/memory/linked_ptr.h" 10 #include "base/memory/linked_ptr.h"
11 #include "chrome/common/extensions/manifest.h"
11 12
12 namespace extensions { 13 namespace extensions {
13 14
14 namespace { 15 namespace {
15 16
16 class ManifestHandlerRegistry { 17 class ManifestHandlerRegistry {
17 public: 18 public:
18 void RegisterManifestHandler(const std::string& key, 19 void RegisterManifestHandler(const std::string& key,
19 ManifestHandler* handler); 20 ManifestHandler* handler);
20 ManifestHandler* GetManifestHandler(const std::string& key); 21 bool ParseExtension(Extension* extension, string16* error);
21 std::vector<std::string> GetManifestHandlerKeys();
22 22
23 private: 23 private:
24 friend struct base::DefaultLazyInstanceTraits<ManifestHandlerRegistry>; 24 friend struct base::DefaultLazyInstanceTraits<ManifestHandlerRegistry>;
25 typedef std::map<std::string, linked_ptr<ManifestHandler> > 25 typedef std::map<std::string, linked_ptr<ManifestHandler> >
26 ManifestHandlerMap; 26 ManifestHandlerMap;
27 27
28 ManifestHandlerMap handlers_; 28 ManifestHandlerMap handlers_;
29 }; 29 };
30 30
31 void ManifestHandlerRegistry::RegisterManifestHandler( 31 void ManifestHandlerRegistry::RegisterManifestHandler(
32 const std::string& key, ManifestHandler* handler) { 32 const std::string& key, ManifestHandler* handler) {
33 handlers_[key] = make_linked_ptr(handler); 33 handlers_[key] = make_linked_ptr(handler);
34 } 34 }
35 35
36 ManifestHandler* ManifestHandlerRegistry::GetManifestHandler( 36 bool ManifestHandlerRegistry::ParseExtension(Extension* extension,
37 const std::string& key) { 37 string16* error) {
38 ManifestHandlerMap::iterator iter = handlers_.find(key); 38 std::set<ManifestHandler*> handler_set;
39 if (iter != handlers_.end())
40 return iter->second.get();
41 // TODO(yoz): The NOTREACHED only makes sense as long as
42 // GetManifestHandlerKeys is how we're getting the available
43 // manifest handlers.
44 NOTREACHED();
45 return NULL;
46 }
47
48 std::vector<std::string> ManifestHandlerRegistry::GetManifestHandlerKeys() {
49 std::vector<std::string> keys;
50 for (ManifestHandlerMap::iterator iter = handlers_.begin(); 39 for (ManifestHandlerMap::iterator iter = handlers_.begin();
51 iter != handlers_.end(); ++iter) { 40 iter != handlers_.end(); ++iter) {
52 keys.push_back(iter->first); 41 ManifestHandler* handler = iter->second.get();
42 if (extension->manifest()->HasPath(iter->first) ||
43 handler->AlwaysParseForType(extension->GetType()))
44 handler_set.insert(iter->second.get());
53 } 45 }
54 return keys; 46
47 // TODO(yoz): Some handlers may depend on other handlers having already
48 // parsed their keys. Reorder the handlers so that handlers needed earlier
49 // come first in the returned container.
50 for (std::set<ManifestHandler*>::iterator iter = handler_set.begin();
51 iter != handler_set.end(); ++iter) {
52 if (!(*iter)->Parse(extension, error))
53 return false;
54 }
55 return true;
55 } 56 }
56 57
57 static base::LazyInstance<ManifestHandlerRegistry> g_registry = 58 static base::LazyInstance<ManifestHandlerRegistry> g_registry =
58 LAZY_INSTANCE_INITIALIZER; 59 LAZY_INSTANCE_INITIALIZER;
59 60
60 } // namespace 61 } // namespace
61 62
62 ManifestHandler::ManifestHandler() { 63 ManifestHandler::ManifestHandler() {
63 } 64 }
64 65
65 ManifestHandler::~ManifestHandler() { 66 ManifestHandler::~ManifestHandler() {
66 } 67 }
67 68
68 bool ManifestHandler::HasNoKey(Extension* extension, string16* error) { 69 bool ManifestHandler::AlwaysParseForType(Extension::Type type) {
69 return true; 70 return false;
70 } 71 }
71 72
72 // static 73 // static
73 void ManifestHandler::Register(const std::string& key, 74 void ManifestHandler::Register(const std::string& key,
74 ManifestHandler* handler) { 75 ManifestHandler* handler) {
75 g_registry.Get().RegisterManifestHandler(key, handler); 76 g_registry.Get().RegisterManifestHandler(key, handler);
76 } 77 }
77 78
78 // static 79 // static
79 ManifestHandler* ManifestHandler::Get(const std::string& key) { 80 bool ManifestHandler::ParseExtension(Extension* extension, string16* error) {
80 return g_registry.Get().GetManifestHandler(key); 81 return g_registry.Get().ParseExtension(extension, error);
81 }
82
83 // static
84 std::vector<std::string> ManifestHandler::GetKeys() {
85 return g_registry.Get().GetManifestHandlerKeys();
86 } 82 }
87 83
88 } // namespace extensions 84 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698