text: // Copyright 2014 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_
  #define CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_
  
  #include <memory>
  #include <string>
  
  #include "base/compiler_specific.h"
  #include "base/macros.h"
  #include "base/memory/weak_ptr.h"
  #include "base/scoped_observer.h"
  #include "components/gcm_driver/common/gcm_messages.h"
  #include "components/gcm_driver/gcm_app_handler.h"
  #include "components/gcm_driver/gcm_client.h"
  #include "components/gcm_driver/instance_id/instance_id.h"
  #include "extensions/browser/browser_context_keyed_api_factory.h"
  #include "extensions/browser/extension_registry_observer.h"
  
  class Profile;
  
  namespace content {
  class BrowserContext;
  }
  
  namespace gcm {
  class GCMDriver;
  class GCMProfileService;
  }
  namespace instance_id {
  class InstanceIDDriver;
  }
  
  namespace extensions {
  
  class ExtensionRegistry;
  class GcmJsEventRouter;
  
  // Defines the interface to provide handling logic for a given app.
  class ExtensionGCMAppHandler : public gcm::GCMAppHandler,
                                 public BrowserContextKeyedAPI,
                                 public ExtensionRegistryObserver {
   public:
    explicit ExtensionGCMAppHandler(content::BrowserContext* context);
    ~ExtensionGCMAppHandler() override;
  
    // BrowserContextKeyedAPI implementation.
    static BrowserContextKeyedAPIFactory<ExtensionGCMAppHandler>*
    GetFactoryInstance();
  
    // gcm::GCMAppHandler implementation.
    void ShutdownHandler() override;
    void OnStoreReset() override;
    void OnMessage(const std::string& app_id,
                   const gcm::IncomingMessage& message) override;
    void OnMessagesDeleted(const std::string& app_id) override;
    void OnSendError(
        const std::string& app_id,
        const gcm::GCMClient::SendErrorDetails& send_error_details) override;
    void OnSendAcknowledged(const std::string& app_id,
                            const std::string& message_id) override;
  
   protected:
    // Could be overridden by testing purpose.
    virtual void OnUnregisterCompleted(const std::string& app_id,
                                       gcm::GCMClient::Result result);
    virtual void OnDeleteIDCompleted(const std::string& app_id,
                                     instance_id::InstanceID::Result result);
    virtual void AddAppHandler(const std::string& app_id);
    virtual void RemoveAppHandler(const std::string& app_id);
  
    gcm::GCMDriver* GetGCMDriver() const;
    instance_id::InstanceIDDriver* GetInstanceIDDriver() const;
  
   private:
    friend class BrowserContextKeyedAPIFactory<ExtensionGCMAppHandler>;
  
    // ExtensionRegistryObserver implementation.
    void OnExtensionLoaded(content::BrowserContext* browser_context,
                           const Extension* extension) override;
    void OnExtensionUnloaded(content::BrowserContext* browser_context,
                             const Extension* extension,
                             UnloadedExtensionInfo::Reason reason) override;
    void OnExtensionUninstalled(content::BrowserContext* browser_context,
                                const Extension* extension,
                                extensions::UninstallReason reason) override;
  
    void RemoveInstanceID(const std::string& app_id);
    void AddDummyAppHandler();
    void RemoveDummyAppHandler();
  
    // BrowserContextKeyedAPI implementation.
    static const char* service_name() { return "ExtensionGCMAppHandler"; }
    static const bool kServiceIsNULLWhileTesting = true;
  
    Profile* profile_;
  
    // Listen to extension load, unloaded notifications.
    ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
        extension_registry_observer_;
  
    std::unique_ptr<extensions::GcmJsEventRouter> js_event_router_;
  
    base::WeakPtrFactory<ExtensionGCMAppHandler> weak_factory_;
  
    DISALLOW_COPY_AND_ASSIGN(ExtensionGCMAppHandler);
  };
  
  }  // namespace extensions
  
  #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_
  