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

#ifndef COBALT_DOM_FONT_FACE_UPDATER_H_
#define COBALT_DOM_FONT_FACE_UPDATER_H_

#include <memory>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "cobalt/cssom/css_rule_visitor.h"
#include "cobalt/dom/font_cache.h"
#include "url/gurl.h"

namespace cobalt {

namespace cssom {

class CSSStyleSheet;
class StyleSheetList;

}  // cssom

namespace dom {

// Collect valid FontFaces from CSSStyleSheets and StyleSheetLists and provide
// them to the FontCache, which replaces its previous set with them.
class FontFaceUpdater : public cssom::CSSRuleVisitor {
 public:
  FontFaceUpdater(const GURL& document_base_url, FontCache* const cache);
  ~FontFaceUpdater();

  void ProcessCSSStyleSheet(
      const scoped_refptr<cssom::CSSStyleSheet>& style_sheet);
  void ProcessStyleSheetList(
      const scoped_refptr<cssom::StyleSheetList>& style_sheet_list);

 private:
  void VisitCSSStyleRule(cssom::CSSStyleRule* css_style_rule) override {}
  void VisitCSSFontFaceRule(
      cssom::CSSFontFaceRule* css_font_face_rule) override;
  void VisitCSSMediaRule(cssom::CSSMediaRule* css_media_rule) override {}
  void VisitCSSKeyframeRule(
      cssom::CSSKeyframeRule* css_keyframe_rule) override {}
  void VisitCSSKeyframesRule(
      cssom::CSSKeyframesRule* css_keyframes_rule) override {}

  const GURL& document_base_url_;
  FontCache* const cache_;
  std::unique_ptr<FontCache::FontFaceMap> font_face_map_;

  DISALLOW_COPY_AND_ASSIGN(FontFaceUpdater);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_FONT_FACE_UPDATER_H_
