// Copyright 2015 Google Inc. 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_SECURITY_POLICY_VIOLATION_EVENT_H_
#define COBALT_DOM_SECURITY_POLICY_VIOLATION_EVENT_H_

#include <string>

#include "cobalt/dom/event.h"

namespace cobalt {
namespace dom {

// https://www.w3.org/TR/CSP/#securitypolicyviolationevent-interface
class SecurityPolicyViolationEvent : public Event {
 public:
  explicit SecurityPolicyViolationEvent(const std::string& type);

  SecurityPolicyViolationEvent(const std::string& document_uri,
                               const std::string& referrer,
                               const std::string& blocked_uri,
                               const std::string& violated_directive,
                               const std::string& effective_directive,
                               const std::string& original_policy,
                               const std::string& source_file, int status_code,
                               int line_number, int column_number);

  const std::string& document_uri() const { return document_uri_; }
  const std::string& referrer() const { return referrer_; }
  const std::string& blocked_uri() const { return blocked_uri_; }
  const std::string& violated_directive() const { return violated_directive_; }
  const std::string& effective_directive() const {
    return effective_directive_;
  }
  const std::string& original_policy() const { return original_policy_; }
  const std::string& source_file() const { return source_file_; }
  int status_code() const { return status_code_; }
  int line_number() const { return line_number_; }
  int column_number() const { return column_number_; }

  DEFINE_WRAPPABLE_TYPE(SecurityPolicyViolationEvent);

 private:
  std::string document_uri_;
  std::string referrer_;
  std::string blocked_uri_;
  std::string violated_directive_;
  std::string effective_directive_;
  std::string original_policy_;
  std::string source_file_;
  int status_code_;
  int line_number_;
  int column_number_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_SECURITY_POLICY_VIOLATION_EVENT_H_
