/*
 * 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/cssom/user_agent_style_sheet.h"

#include <string>

#include "cobalt/cssom/embedded_resources.h"  // Generated file.

namespace cobalt {
namespace cssom {

scoped_refptr<CSSStyleSheet> ParseUserAgentStyleSheet(CSSParser* css_parser) {
  const char kUserAgentStyleSheetFileName[] = "user_agent_style_sheet.css";

  // Parse the user agent style sheet from the given file that was compiled
  // into a header and included.  We embed it in the binary via C++ header file
  // so that we can avoid the time it would take to perform a disk read
  // when it needs to be created (e.g. when creating a new DOM Document). The
  // cost of doing this is that we end up with the contents of the file in
  // memory at all times, even after it is parsed here.
  GeneratedResourceMap resource_map;
  CSSOMEmbeddedResources::GenerateMap(resource_map);
  FileContents html_css_file_contents =
      resource_map[kUserAgentStyleSheetFileName];

  scoped_refptr<CSSStyleSheet> user_agent_style_sheet =
      css_parser->ParseStyleSheet(
          std::string(
              reinterpret_cast<const char*>(html_css_file_contents.data),
              static_cast<size_t>(html_css_file_contents.size)),
          base::SourceLocation(kUserAgentStyleSheetFileName, 1, 1));
  user_agent_style_sheet->set_origin(kNormalUserAgent);
  return user_agent_style_sheet;
}

}  // namespace cssom
}  // namespace cobalt
