/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* DOM object holding utility CSS functions */

#ifndef mozilla_dom_CSS_h_
#define mozilla_dom_CSS_h_

#include "mozilla/dom/CSSUnitValueBindingFwd.h"
#include "nsStringFwd.h"

template <class T>
struct already_AddRefed;

namespace mozilla {

class ErrorResult;

namespace dom {

class GlobalObject;
class HighlightRegistry;
struct PropertyDefinition;

class CSS {
 public:
  CSS() = delete;

  static bool Supports(const GlobalObject&, const nsACString& aProperty,
                       const nsACString& aValue);

  static bool Supports(const GlobalObject&, const nsACString& aDeclaration);

  static void Escape(const GlobalObject&, const nsAString& aIdent,
                     nsAString& aReturn);

  static HighlightRegistry* GetHighlights(const GlobalObject& aGlobal,
                                          ErrorResult& aRv);

  static void RegisterProperty(const GlobalObject&, const PropertyDefinition&,
                               ErrorResult&);

  // start of CSS Typed OM Web IDL declarations

  static already_AddRefed<CSSUnitValue> Number(const GlobalObject& aGlobal,
                                               double aValue);

  static already_AddRefed<CSSUnitValue> Percent(const GlobalObject& aGlobal,
                                                double aValue);

  // <length>
  static already_AddRefed<CSSUnitValue> Cap(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Ch(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Em(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Ex(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Ic(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Lh(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Rcap(const GlobalObject& aGlobal,
                                             double aValue);
  static already_AddRefed<CSSUnitValue> Rch(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Rem(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Rex(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Ric(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Rlh(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Vw(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Vh(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Vi(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Vb(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Vmin(const GlobalObject& aGlobal,
                                             double aValue);
  static already_AddRefed<CSSUnitValue> Vmax(const GlobalObject& aGlobal,
                                             double aValue);
  static already_AddRefed<CSSUnitValue> Svw(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Svh(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Svi(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Svb(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Svmin(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Svmax(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Lvw(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Lvh(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Lvi(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Lvb(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Lvmin(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Lvmax(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Dvw(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Dvh(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Dvi(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Dvb(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Dvmin(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Dvmax(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Cqw(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Cqh(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Cqi(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Cqb(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Cqmin(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Cqmax(const GlobalObject& aGlobal,
                                              double aValue);
  static already_AddRefed<CSSUnitValue> Cm(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Mm(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Q(const GlobalObject& aGlobal,
                                          double aValue);
  static already_AddRefed<CSSUnitValue> In(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Pt(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Pc(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> Px(const GlobalObject& aGlobal,
                                           double aValue);

  // <angle>
  static already_AddRefed<CSSUnitValue> Deg(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Grad(const GlobalObject& aGlobal,
                                             double aValue);
  static already_AddRefed<CSSUnitValue> Rad(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Turn(const GlobalObject& aGlobal,
                                             double aValue);

  // <time>
  static already_AddRefed<CSSUnitValue> S(const GlobalObject& aGlobal,
                                          double aValue);
  static already_AddRefed<CSSUnitValue> Ms(const GlobalObject& aGlobal,
                                           double aValue);

  // <frequency>
  static already_AddRefed<CSSUnitValue> Hz(const GlobalObject& aGlobal,
                                           double aValue);
  static already_AddRefed<CSSUnitValue> KHz(const GlobalObject& aGlobal,
                                            double aValue);

  // <resolution>
  static already_AddRefed<CSSUnitValue> Dpi(const GlobalObject& aGlobal,
                                            double aValue);
  static already_AddRefed<CSSUnitValue> Dpcm(const GlobalObject& aGlobal,
                                             double aValue);
  static already_AddRefed<CSSUnitValue> Dppx(const GlobalObject& aGlobal,
                                             double aValue);

  // <flex>
  static already_AddRefed<CSSUnitValue> Fr(const GlobalObject& aGlobal,
                                           double aValue);

  // end of CSS Typed OM Web IDL declarations
};

}  // namespace dom
}  // namespace mozilla

#endif  // mozilla_dom_CSS_h_
