/*
 * 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.
 */
#include "cobalt/csp/media_list_directive.h"

namespace cobalt {
namespace csp {

MediaListDirective::MediaListDirective(const std::string& name,
                                       const std::string& value,
                                       ContentSecurityPolicy* policy)
    : Directive(name, value, policy) {
  Parse(base::StringPiece(value));
}

bool MediaListDirective::Allows(const std::string& type) const {
  return plugin_types_.find(type) != plugin_types_.end();
}

void MediaListDirective::Parse(const base::StringPiece& str) {
  const char* begin = str.begin();
  const char* end = str.end();
  const char* position = begin;

  // 'plugin-types ____;' OR 'plugin-types;'
  if (position == end) {
    policy()->ReportInvalidPluginTypes(std::string());
    return;
  }

  while (position < end) {
    // _____ OR _____mime1/mime1
    // ^        ^
    SkipWhile<IsAsciiWhitespace>(&position, end);
    if (position == end) {
      return;
    }

    // mime1/mime1 mime2/mime2
    // ^
    begin = position;
    if (!SkipExactly<IsMediaTypeCharacter>(&position, end)) {
      SkipWhile<IsNotAsciiWhitespace>(&position, end);
      policy()->ReportInvalidPluginTypes(ToString(begin, position));
      continue;
    }
    SkipWhile<IsMediaTypeCharacter>(&position, end);

    // mime1/mime1 mime2/mime2
    //      ^
    if (!SkipExactly(&position, end, '/')) {
      SkipWhile<IsNotAsciiWhitespace>(&position, end);
      policy()->ReportInvalidPluginTypes(ToString(begin, position));
      continue;
    }

    // mime1/mime1 mime2/mime2
    //       ^
    if (!SkipExactly<IsMediaTypeCharacter>(&position, end)) {
      SkipWhile<IsNotAsciiWhitespace>(&position, end);
      policy()->ReportInvalidPluginTypes(ToString(begin, position));
      continue;
    }
    SkipWhile<IsMediaTypeCharacter>(&position, end);

    // mime1/mime1 mime2/mime2 OR mime1/mime1  OR mime1/mime1/error
    //            ^                          ^               ^
    if (position < end && IsNotAsciiWhitespace(*position)) {
      SkipWhile<IsNotAsciiWhitespace>(&position, end);
      policy()->ReportInvalidPluginTypes(ToString(begin, position));
      continue;
    }
    plugin_types_.insert(ToString(begin, position));

    DCHECK(position == end || IsAsciiWhitespace(*position));
  }
}

}  // namespace csp
}  // namespace cobalt
