// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_EME_MEDIA_ENCRYPTED_EVENT_H_
#define COBALT_DOM_EME_MEDIA_ENCRYPTED_EVENT_H_

#include <memory>
#include <string>

#include "base/memory/ref_counted.h"
#include "cobalt/dom/eme/media_encrypted_event_init.h"
#include "cobalt/script/array_buffer.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/web/event.h"

namespace cobalt {
namespace dom {
namespace eme {

// The MediaEncryptedEvent object is used for the encrypted event.
//   https://www.w3.org/TR/encrypted-media/#mediaencryptedevent
class MediaEncryptedEvent : public web::Event {
 public:
  // Web API: MediaEncryptedEvent
  //

  MediaEncryptedEvent(script::EnvironmentSettings* environment_settings,
                      const std::string& type);
  MediaEncryptedEvent(script::EnvironmentSettings* environment_settings,
                      const std::string& type,
                      const MediaEncryptedEventInit& event_init_dict);

  const std::string& init_data_type() const { return init_data_type_; }
  script::Handle<script::ArrayBuffer> init_data() const {
    if (!init_data_reference_) {
      return script::Handle<script::ArrayBuffer>();
    }
    return script::Handle<script::ArrayBuffer>(*init_data_reference_);
  }

  DEFINE_WRAPPABLE_TYPE(MediaEncryptedEvent);

 private:
  std::string init_data_type_;
  std::unique_ptr<script::ScriptValue<script::ArrayBuffer>::Reference>
      init_data_reference_;
};

}  // namespace eme
}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_EME_MEDIA_ENCRYPTED_EVENT_H_
