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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_
7
8#include <string>
9
10#include "base/compiler_specific.h"
11#include "base/macros.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/weak_ptr.h"
14#include "base/scoped_observer.h"
15#include "components/gcm_driver/gcm_app_handler.h"
16#include "components/gcm_driver/gcm_client.h"
17#include "extensions/browser/browser_context_keyed_api_factory.h"
18#include "extensions/browser/extension_registry_observer.h"
19
20class Profile;
21
22namespace content {
23class BrowserContext;
24}
25
26namespace gcm {
27class GCMDriver;
28class GCMProfileService;
29}
30
31namespace extensions {
32
33class ExtensionRegistry;
34class GcmJsEventRouter;
35
36// Defines the interface to provide handling logic for a given app.
37class ExtensionGCMAppHandler : public gcm::GCMAppHandler,
38                               public BrowserContextKeyedAPI,
39                               public ExtensionRegistryObserver {
40 public:
41  explicit ExtensionGCMAppHandler(content::BrowserContext* context);
42  virtual ~ExtensionGCMAppHandler();
43
44  // BrowserContextKeyedAPI implementation.
45  static BrowserContextKeyedAPIFactory<ExtensionGCMAppHandler>*
46  GetFactoryInstance();
47
48  // gcm::GCMAppHandler implementation.
49  virtual void ShutdownHandler() OVERRIDE;
50  virtual void OnMessage(
51      const std::string& app_id,
52      const gcm::GCMClient::IncomingMessage& message) OVERRIDE;
53  virtual void OnMessagesDeleted(const std::string& app_id) OVERRIDE;
54  virtual void OnSendError(
55      const std::string& app_id,
56      const gcm::GCMClient::SendErrorDetails& send_error_details) OVERRIDE;
57  virtual void OnSendAcknowledged(const std::string& app_id,
58                                  const std::string& message_id) OVERRIDE;
59
60 protected:
61  // Could be overridden by testing purpose.
62  virtual void OnUnregisterCompleted(const std::string& app_id,
63                                     gcm::GCMClient::Result result);
64  virtual void AddAppHandler(const std::string& app_id);
65  virtual void RemoveAppHandler(const std::string& app_id);
66
67  gcm::GCMDriver* GetGCMDriver() const;
68
69private:
70  friend class BrowserContextKeyedAPIFactory<ExtensionGCMAppHandler>;
71
72  // ExtensionRegistryObserver implementation.
73  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
74                                 const Extension* extension) OVERRIDE;
75  virtual void OnExtensionUnloaded(
76      content::BrowserContext* browser_context,
77      const Extension* extension,
78      UnloadedExtensionInfo::Reason reason) OVERRIDE;
79  virtual void OnExtensionUninstalled(
80      content::BrowserContext* browser_context,
81      const Extension* extension,
82      extensions::UninstallReason reason) OVERRIDE;
83
84  void AddDummyAppHandler();
85  void RemoveDummyAppHandler();
86
87  // BrowserContextKeyedAPI implementation.
88  static const char* service_name() { return "ExtensionGCMAppHandler"; }
89  static const bool kServiceIsNULLWhileTesting = true;
90
91  Profile* profile_;
92
93  // Listen to extension load, unloaded notifications.
94  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
95      extension_registry_observer_;
96
97  scoped_ptr<extensions::GcmJsEventRouter> js_event_router_;
98
99  base::WeakPtrFactory<ExtensionGCMAppHandler> weak_factory_;
100
101  DISALLOW_COPY_AND_ASSIGN(ExtensionGCMAppHandler);
102};
103
104}  // namespace extensions
105
106#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_
107