// Copyright 2015 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.

#include "cobalt/dom/font_face_updater.h"

#include <string>
#include <utility>

#include "cobalt/cssom/css_font_face_rule.h"
#include "cobalt/cssom/css_media_rule.h"
#include "cobalt/cssom/css_rule_list.h"
#include "cobalt/cssom/css_style_rule.h"
#include "cobalt/cssom/css_style_sheet.h"
#include "cobalt/cssom/font_style_value.h"
#include "cobalt/cssom/font_weight_value.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/local_src_value.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/property_value_visitor.h"
#include "cobalt/cssom/string_value.h"
#include "cobalt/cssom/style_sheet_list.h"
#include "cobalt/cssom/unicode_range_value.h"
#include "cobalt/cssom/url_src_value.h"
#include "cobalt/cssom/url_value.h"

namespace cobalt {
namespace dom {

namespace {

////////////////////////////////////////////////////////////////////////////////
// FontFaceProvider
////////////////////////////////////////////////////////////////////////////////

// Visit a single font face rule, generating a FontFaceStyleSet::Entry from its
// values and verifying that it is valid.
// TODO: Handle unicode ranges.
class FontFaceProvider : public cssom::NotReachedPropertyValueVisitor {
 public:
  explicit FontFaceProvider(const GURL& base_url) : base_url_(base_url) {
    style_set_entry_ = base::MakeRefCounted<FontFaceStyleSet::Entry>();
  }

  void VisitFontStyle(cssom::FontStyleValue* font_style) override;
  void VisitFontWeight(cssom::FontWeightValue* font_weight) override;
  void VisitKeyword(cssom::KeywordValue* keyword) override;
  void VisitLocalSrc(cssom::LocalSrcValue* local_src) override;
  void VisitPropertyList(cssom::PropertyListValue* property_list) override;
  void VisitString(cssom::StringValue* percentage) override;
  void VisitUnicodeRange(cssom::UnicodeRangeValue* unicode_range) override;
  void VisitUrlSrc(cssom::UrlSrcValue* url_src) override;
  void VisitURL(cssom::URLValue* url) override;

  bool IsFontFaceValid() const;

  const std::string& font_family() const { return font_family_; }
  const scoped_refptr<FontFaceStyleSet::Entry> style_set_entry() const {
    return style_set_entry_;
  }

 private:
  const GURL& base_url_;

  std::string font_family_;
  scoped_refptr<FontFaceStyleSet::Entry> style_set_entry_;

  DISALLOW_COPY_AND_ASSIGN(FontFaceProvider);
};

void FontFaceProvider::VisitFontStyle(cssom::FontStyleValue* font_style) {
  style_set_entry_->style.slant =
      font_style->value() == cssom::FontStyleValue::kItalic
          ? render_tree::FontStyle::kItalicSlant
          : render_tree::FontStyle::kUprightSlant;
}

void FontFaceProvider::VisitFontWeight(cssom::FontWeightValue* font_weight) {
  switch (font_weight->value()) {
    case cssom::FontWeightValue::kThinAka100:
      style_set_entry_->style.weight = render_tree::FontStyle::kThinWeight;
      break;
    case cssom::FontWeightValue::kExtraLightAka200:
      style_set_entry_->style.weight =
          render_tree::FontStyle::kExtraLightWeight;
      break;
    case cssom::FontWeightValue::kLightAka300:
      style_set_entry_->style.weight = render_tree::FontStyle::kLightWeight;
      break;
    case cssom::FontWeightValue::kNormalAka400:
      style_set_entry_->style.weight = render_tree::FontStyle::kNormalWeight;
      break;
    case cssom::FontWeightValue::kMediumAka500:
      style_set_entry_->style.weight = render_tree::FontStyle::kMediumWeight;
      break;
    case cssom::FontWeightValue::kSemiBoldAka600:
      style_set_entry_->style.weight = render_tree::FontStyle::kSemiBoldWeight;
      break;
    case cssom::FontWeightValue::kBoldAka700:
      style_set_entry_->style.weight = render_tree::FontStyle::kBoldWeight;
      break;
    case cssom::FontWeightValue::kExtraBoldAka800:
      style_set_entry_->style.weight = render_tree::FontStyle::kExtraBoldWeight;
      break;
    case cssom::FontWeightValue::kBlackAka900:
      style_set_entry_->style.weight = render_tree::FontStyle::kBlackWeight;
      break;
  }
}

void FontFaceProvider::VisitKeyword(cssom::KeywordValue* keyword) {
  switch (keyword->value()) {
    case cssom::KeywordValue::kCursive:
    case cssom::KeywordValue::kFantasy:
    case cssom::KeywordValue::kMonospace:
    case cssom::KeywordValue::kSansSerif:
    case cssom::KeywordValue::kSerif:
      font_family_ = keyword->ToString();
      break;
    // Inherit and Initial are valid font-family values. However, they are
    // meaningless in the context of an @font-face rule, as a font-family will
    // never attempt a lookup with that value. Clear the font-family name if
    // they are encountered so that the font face rule won't be created.
    case cssom::KeywordValue::kInherit:
    case cssom::KeywordValue::kInitial:
      font_family_.clear();
      break;
    case cssom::KeywordValue::kAbsolute:
    case cssom::KeywordValue::kAlternate:
    case cssom::KeywordValue::kAlternateReverse:
    case cssom::KeywordValue::kAuto:
    case cssom::KeywordValue::kBackwards:
    case cssom::KeywordValue::kBaseline:
    case cssom::KeywordValue::kBlock:
    case cssom::KeywordValue::kBoth:
    case cssom::KeywordValue::kBottom:
    case cssom::KeywordValue::kBreakWord:
    case cssom::KeywordValue::kCenter:
    case cssom::KeywordValue::kClip:
    case cssom::KeywordValue::kCollapse:
    case cssom::KeywordValue::kColumn:
    case cssom::KeywordValue::kColumnReverse:
    case cssom::KeywordValue::kContain:
    case cssom::KeywordValue::kContent:
    case cssom::KeywordValue::kCover:
    case cssom::KeywordValue::kCurrentColor:
    case cssom::KeywordValue::kEllipsis:
    case cssom::KeywordValue::kEnd:
    case cssom::KeywordValue::kEquirectangular:
    case cssom::KeywordValue::kFixed:
    case cssom::KeywordValue::kFlex:
    case cssom::KeywordValue::kFlexEnd:
    case cssom::KeywordValue::kFlexStart:
    case cssom::KeywordValue::kForwards:
    case cssom::KeywordValue::kHidden:
    case cssom::KeywordValue::kInfinite:
    case cssom::KeywordValue::kInline:
    case cssom::KeywordValue::kInlineBlock:
    case cssom::KeywordValue::kInlineFlex:
    case cssom::KeywordValue::kLeft:
    case cssom::KeywordValue::kLineThrough:
    case cssom::KeywordValue::kMiddle:
    case cssom::KeywordValue::kMonoscopic:
    case cssom::KeywordValue::kNone:
    case cssom::KeywordValue::kNoRepeat:
    case cssom::KeywordValue::kNormal:
    case cssom::KeywordValue::kNowrap:
    case cssom::KeywordValue::kPre:
    case cssom::KeywordValue::kPreLine:
    case cssom::KeywordValue::kPreWrap:
    case cssom::KeywordValue::kRelative:
    case cssom::KeywordValue::kRepeat:
    case cssom::KeywordValue::kReverse:
    case cssom::KeywordValue::kRight:
    case cssom::KeywordValue::kRow:
    case cssom::KeywordValue::kRowReverse:
    case cssom::KeywordValue::kScroll:
    case cssom::KeywordValue::kSolid:
    case cssom::KeywordValue::kSpaceAround:
    case cssom::KeywordValue::kSpaceBetween:
    case cssom::KeywordValue::kStart:
    case cssom::KeywordValue::kStatic:
    case cssom::KeywordValue::kStereoscopicLeftRight:
    case cssom::KeywordValue::kStereoscopicTopBottom:
    case cssom::KeywordValue::kStretch:
    case cssom::KeywordValue::kTop:
    case cssom::KeywordValue::kUppercase:
    case cssom::KeywordValue::kVisible:
    case cssom::KeywordValue::kWrap:
    case cssom::KeywordValue::kWrapReverse:
      NOTREACHED();
  }
}

void FontFaceProvider::VisitLocalSrc(cssom::LocalSrcValue* local_src) {
  style_set_entry_->sources.push_back(FontFaceSource(local_src->value()));
}

void FontFaceProvider::VisitPropertyList(
    cssom::PropertyListValue* property_list) {
  for (size_t i = 0; i < property_list->value().size(); ++i) {
    property_list->value()[i]->Accept(this);
  }
}

void FontFaceProvider::VisitString(cssom::StringValue* string) {
  font_family_ = string->value();
}

void FontFaceProvider::VisitUnicodeRange(
    cssom::UnicodeRangeValue* unicode_range) {
  FontFaceStyleSet::Entry::UnicodeRange range = {
      static_cast<uint32>(unicode_range->start()),
      static_cast<uint32>(unicode_range->end())};
  style_set_entry_->unicode_range.insert(range);
}

// Check for a supported format. If no format hints are supplied, then the user
// agent should download the font resource.
//  https://www.w3.org/TR/css3-fonts/#descdef-src
void FontFaceProvider::VisitUrlSrc(cssom::UrlSrcValue* url_src) {
  if (url_src->format().empty() || url_src->format() == "truetype" ||
      url_src->format() == "opentype" || url_src->format() == "woff" ||
      url_src->format() == "woff2") {
    url_src->url()->Accept(this);
  }
}

// The URL may be relative, in which case it is resolved relative to the
// location of the style sheet containing the @font-face rule.
//   https://www.w3.org/TR/css3-fonts/#descdef-src
void FontFaceProvider::VisitURL(cssom::URLValue* url) {
  GURL gurl = url->is_absolute() ? GURL(url->value()) : url->Resolve(base_url_);
  if (gurl.is_valid()) {
    style_set_entry_->sources.push_back(FontFaceSource(gurl));
  }
}

// The font family and src are required for the @font-face rule to be valid.
//  https://www.w3.org/TR/css3-fonts/#descdef-font-family
//  https://www.w3.org/TR/css3-fonts/#descdef-src
bool FontFaceProvider::IsFontFaceValid() const {
  return !font_family_.empty() && !style_set_entry_->sources.empty();
}

}  // namespace

//////////////////////////////////////////////////////////////////////////
// FontFaceUpdater
//////////////////////////////////////////////////////////////////////////

FontFaceUpdater::FontFaceUpdater(const GURL& document_base_url,
                                 FontCache* const cache)
    : document_base_url_(document_base_url),
      cache_(cache),
      font_face_map_(new FontCache::FontFaceMap()) {}

FontFaceUpdater::~FontFaceUpdater() {
  cache_->SetFontFaceMap(std::move(font_face_map_));
}

void FontFaceUpdater::ProcessCSSStyleSheet(
    const scoped_refptr<cssom::CSSStyleSheet>& style_sheet) {
  if (style_sheet && style_sheet->css_rules_same_origin()) {
    style_sheet->css_rules_same_origin()->Accept(this);
  }
}

void FontFaceUpdater::ProcessStyleSheetList(
    const scoped_refptr<cssom::StyleSheetList>& style_sheet_list) {
  for (unsigned int style_sheet_index = 0;
       style_sheet_index < style_sheet_list->length(); ++style_sheet_index) {
    scoped_refptr<cssom::CSSStyleSheet> style_sheet =
        style_sheet_list->Item(style_sheet_index)->AsCSSStyleSheet();
    // ProcessCSSStyleSheet handles a NULL CSSStyleSheet.
    ProcessCSSStyleSheet(style_sheet);
  }
}

void FontFaceUpdater::VisitCSSFontFaceRule(
    cssom::CSSFontFaceRule* css_font_face_rule) {
  // The URL may be relative, in which case it is resolved relative to the
  // location of the style sheet containing the @font-face rule.
  //   https://www.w3.org/TR/css3-fonts/#descdef-src
  // In the case where the style sheet URL is empty, treat the document base URL
  // as the style sheet's URL. While the spec is not clear on the expected
  // behavior for this case, this mimics WebKit's functionality.
  const GURL& style_sheet_url =
      css_font_face_rule->parent_style_sheet()->LocationUrl();
  const GURL& base_url =
      !style_sheet_url.is_empty() ? style_sheet_url : document_base_url_;

  FontFaceProvider font_face_provider(base_url);

  if (css_font_face_rule->data()->family()) {
    css_font_face_rule->data()->family()->Accept(&font_face_provider);
  }
  if (css_font_face_rule->data()->src()) {
    css_font_face_rule->data()->src()->Accept(&font_face_provider);
  }
  if (css_font_face_rule->data()->style()) {
    css_font_face_rule->data()->style()->Accept(&font_face_provider);
  }
  if (css_font_face_rule->data()->weight()) {
    css_font_face_rule->data()->weight()->Accept(&font_face_provider);
  }
  if (css_font_face_rule->data()->unicode_range()) {
    css_font_face_rule->data()->unicode_range()->Accept(&font_face_provider);
  }

  if (font_face_provider.IsFontFaceValid()) {
    (*font_face_map_)[font_face_provider.font_family()].AddEntry(
        font_face_provider.style_set_entry());
  }
}

}  // namespace dom
}  // namespace cobalt
