// 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 CONTENT_RENDERER_MEDIA_CRYPTO_PEPPER_CDM_WRAPPER_IMPL_H_
#define CONTENT_RENDERER_MEDIA_CRYPTO_PEPPER_CDM_WRAPPER_IMPL_H_

#if !defined(ENABLE_PEPPER_CDMS)
#error This file should only be included when ENABLE_PEPPER_CDMS is defined
#endif

#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "content/renderer/media/crypto/pepper_cdm_wrapper.h"

namespace blink {
class WebHelperPlugin;
class WebLocalFrame;
}

namespace content {

class ContentDecryptorDelegate;
class PepperPluginInstanceImpl;

// Deleter for blink::WebHelperPlugin.
struct WebHelperPluginDeleter {
  void operator()(blink::WebHelperPlugin* plugin) const;
};

// Implements a wrapper on blink::WebHelperPlugin so that the plugin gets
// destroyed properly. It owns all the objects derived from WebHelperPlugin
// (WebPlugin, PepperPluginInstanceImpl, ContentDecryptionDelegate), and will
// free them as necessary when this wrapper is destroyed. In particular, it
// takes a reference to PepperPluginInstanceImpl so it won't go away until
// this object is destroyed.
//
// Implemented so that lower layers in Chromium don't need to be aware of
// blink:: objects.
class PepperCdmWrapperImpl : public PepperCdmWrapper {
 public:
  static scoped_ptr<PepperCdmWrapper> Create(blink::WebLocalFrame* frame,
                                             const std::string& pluginType,
                                             const GURL& security_origin);

  ~PepperCdmWrapperImpl() override;

  // Returns the ContentDecryptorDelegate* associated with this plugin.
  ContentDecryptorDelegate* GetCdmDelegate() override;

 private:
  typedef scoped_ptr<blink::WebHelperPlugin, WebHelperPluginDeleter>
      ScopedHelperPlugin;

  // Takes ownership of |helper_plugin| and |plugin_instance|.
  PepperCdmWrapperImpl(
      ScopedHelperPlugin helper_plugin,
      const scoped_refptr<PepperPluginInstanceImpl>& plugin_instance);

  ScopedHelperPlugin helper_plugin_;
  scoped_refptr<PepperPluginInstanceImpl> plugin_instance_;

  DISALLOW_COPY_AND_ASSIGN(PepperCdmWrapperImpl);
};

}  // namespace content

#endif  // CONTENT_RENDERER_MEDIA_CRYPTO_PEPPER_CDM_WRAPPER_IMPL_H_
