// Copyright (c) 2017 The Chromium Embedded Framework 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 CEF_LIBCEF_BROWSER_EXTENSION_IMPL_H_
#define CEF_LIBCEF_BROWSER_EXTENSION_IMPL_H_
#pragma once

#include <memory>

#include "include/cef_extension.h"
#include "include/cef_extension_handler.h"
#include "include/cef_request_context.h"

namespace extensions {
class Extension;
}

// CefNavigationEntry implementation
class CefExtensionImpl : public CefExtension {
 public:
  CefExtensionImpl(const extensions::Extension* extension,
                   CefRequestContext* loader_context,
                   CefRefPtr<CefExtensionHandler> handler);

  // CefExtension methods.
  CefString GetIdentifier() override;
  CefString GetPath() override;
  CefRefPtr<CefDictionaryValue> GetManifest() override;
  bool IsSame(CefRefPtr<CefExtension> that) override;
  CefRefPtr<CefExtensionHandler> GetHandler() override;
  CefRefPtr<CefRequestContext> GetLoaderContext() override;
  bool IsLoaded() override;
  void Unload() override;

  void OnExtensionLoaded();
  void OnExtensionUnloaded();

  // Use this instead of the GetLoaderContext version during
  // CefRequestContext destruction.
  CefRequestContext* loader_context() const { return loader_context_; }

 private:
  CefString id_;
  CefString path_;
  CefRefPtr<CefDictionaryValue> manifest_;

  CefRequestContext* loader_context_;
  CefRefPtr<CefExtensionHandler> handler_;

  // Only accessed on the UI thread.
  bool unloaded_ = false;

  IMPLEMENT_REFCOUNTING(CefExtensionImpl);
  DISALLOW_COPY_AND_ASSIGN(CefExtensionImpl);
};

#endif  // CEF_LIBCEF_BROWSER_EXTENSION_IMPL_H_