// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_LOCAL_FONT_FACE_SOURCE_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_LOCAL_FONT_FACE_SOURCE_H_

#include "base/memory/weak_ptr.h"
#include "third_party/blink/renderer/core/css/css_font_face_source.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"

namespace blink {

class CSSFontFace;
class FontSelector;

// LocalFontFaceSource represents a src: local(<unique_name>) font face
// source. It operates in one of two ways: Synchronous or asynchronous,
// depending on what the platform implementation of FontUniqueNameLookup
// supports. If it operates in synchronous mode, IsLocalNonBlocking() return
// true and lookups are performed immediately. If IsLocalNonBlocking() returns
// false, a fallback font is returned from GetFontData() until
// FontUniqueNameLookup is ready (which is signalled by a callback). When
// FontUniqueNameLookup becomes ready, LocalFontFaceSource can lookup fonts
// synchronously and a relayout is triggered.
class LocalFontFaceSource final : public CSSFontFaceSource,
                                  public GarbageCollectedMixin {
 public:
  LocalFontFaceSource(CSSFontFace*, FontSelector*, const String& font_name);
  ~LocalFontFaceSource() override;

  // Returns whether this font can be immediately retrieved using a non-blocking
  // font lookup, or whether it may need to be retrieved asynchronously,
  // behaving similar to a RemoteFontFaceSource. This is needed on Windows 7 and
  // 8 where the font lookup map needs to be built first.
  bool IsLocalNonBlocking() const override;
  bool IsLocalFontAvailable(const FontDescription&) const override;
  bool IsLoaded() const override;
  bool IsLoading() const override;
  bool IsValid() const override;

  void BeginLoadIfNeeded() override;

  void Trace(Visitor* visitor) const override;

  void NotifyFontUniqueNameLookupReady();

 protected:
  scoped_refptr<SimpleFontData> CreateLoadingFallbackFontData(
      const FontDescription&);

 private:
  scoped_refptr<SimpleFontData> CreateFontData(
      const FontDescription&,
      const FontSelectionCapabilities&) override;

  void ReportFontLookup(const FontDescription& font_description,
                        SimpleFontData* font_data,
                        bool is_loading_fallback = false) override;

  class LocalFontHistograms {
    DISALLOW_NEW();

   public:
    LocalFontHistograms() : reported_(false) {}
    void Record(bool load_success);

   private:
    bool reported_;
  };

  Member<CSSFontFace> face_;
  Member<FontSelector> font_selector_;

  AtomicString font_name_;
  LocalFontHistograms histograms_;
};

}  // namespace blink

#endif
