- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / declarative / rules_registry_service.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_RULES_REGISTRY_SERVICE_H__
6 #define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_RULES_REGISTRY_SERVICE_H__
7
8 #include <map>
9 #include <string>
10 #include <vector>
11
12 #include "base/callback_forward.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_vector.h"
15 #include "chrome/browser/extensions/api/declarative/rules_registry.h"
16 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "content/public/browser/notification_observer.h"
19 #include "content/public/browser/notification_registrar.h"
20
21 class Profile;
22
23 namespace content {
24 class NotificationSource;
25 class NotificationSource;
26 }
27
28 namespace extensions {
29 class ContentRulesRegistry;
30 class RulesRegistry;
31 class RulesRegistryStorageDelegate;
32 }
33
34 namespace extensions {
35
36 // This class owns all RulesRegistries implementations of an ExtensionService.
37 // This class lives on the UI thread.
38 class RulesRegistryService : public ProfileKeyedAPI,
39                              public content::NotificationObserver {
40  public:
41   explicit RulesRegistryService(Profile* profile);
42   virtual ~RulesRegistryService();
43
44   // Unregisters refptrs to concrete RulesRegistries at other objects that were
45   // created by us so that the RulesRegistries can be released.
46   virtual void Shutdown() OVERRIDE;
47
48   // ProfileKeyedAPI implementation.
49   static ProfileKeyedAPIFactory<RulesRegistryService>* GetFactoryInstance();
50
51   // Convenience method to get the RulesRegistryService for a profile.
52   static RulesRegistryService* Get(Profile* profile);
53
54   // Registers the default RulesRegistries used in Chromium.
55   void RegisterDefaultRulesRegistries();
56
57   // Registers a RulesRegistry and wraps it in an InitializingRulesRegistry.
58   void RegisterRulesRegistry(scoped_refptr<RulesRegistry> rule_registry);
59
60   // Returns the RulesRegistry for |event_name| or NULL if no such registry
61   // has been registered.
62   scoped_refptr<RulesRegistry> GetRulesRegistry(
63       const std::string& event_name) const;
64
65   // Accessors for each type of rules registry.
66   ContentRulesRegistry* content_rules_registry() const {
67     return content_rules_registry_;
68   }
69
70   // For testing.
71   void SimulateExtensionUnloaded(const std::string& extension_id);
72  private:
73   friend class ProfileKeyedAPIFactory<RulesRegistryService>;
74
75   // Maps event names to RuleRegistries that handle these events.
76   typedef std::map<std::string, scoped_refptr<RulesRegistry> >
77       RulesRegistryMap;
78
79   // Notifies all RulesRegistries that |extension_id| was unloaded.
80   // It is not guaranteed that this notification is processed synchronously.
81   // If extensions live on another thread, the notification is posted.
82   void OnExtensionUnloaded(const std::string& extension_id);
83
84   // Implementation of content::NotificationObserver.
85   virtual void Observe(int type,
86                        const content::NotificationSource& source,
87                        const content::NotificationDetails& details) OVERRIDE;
88
89   // ProfileKeyedAPI implementation.
90   static const char* service_name() {
91     return "RulesRegistryService";
92   }
93   static const bool kServiceHasOwnInstanceInIncognito = true;
94   static const bool kServiceIsNULLWhileTesting = true;
95
96   RulesRegistryMap rule_registries_;
97
98   // We own the parts of the registries which need to run on the UI thread.
99   ScopedVector<RulesCacheDelegate> cache_delegates_;
100
101   // Weak pointer into rule_registries_ to make it easier to handle content rule
102   // conditions.
103   ContentRulesRegistry* content_rules_registry_;
104
105   content::NotificationRegistrar registrar_;
106
107   Profile* profile_;
108
109   DISALLOW_COPY_AND_ASSIGN(RulesRegistryService);
110 };
111
112 }  // namespace extensions
113
114 #endif  // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_RULES_REGISTRY_SERVICE_H__