// 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_
