layout/style/ServoCSSParser.h
author Nika Layzell <nika@thelayzells.com>
Tue, 25 Sep 2018 17:34:53 +0200
changeset 507828 5e6dae0c1e5a4939ccd406f14607f7fafffd45a7
parent 507497 9ec6a81e695aef5d519d0e8a79927a9d6e915c03
child 508163 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1448426 - Wrap windows.h to avoid problematic define statements, r=froydnj,glandium By default, windows.h exposes a large number of problematic define statements which are UpperCamelCase, such as a define from `CreateWindow` to `CreateWindow{A,W}`. As many of these names are generic (e.g. CreateFile, CreateWindow), they can mess up Gecko code that may legitimately have its own methods with the same names. The header also defines some traditional SCREAMING_SNAKE_CASE defines which can mess up our code by conflicting with local values. This patch adds a simple code generator which generates wrappers for these defines, and uses them to wrap the windows.h wrapper using the `stl_wrappers` mechanism, allowing us to use windows.h in more places. Differential Revision: https://phabricator.services.mozilla.com/D10932

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */

/* CSS parsing utility functions */

#ifndef mozilla_ServoCSSParser_h
#define mozilla_ServoCSSParser_h

#include "mozilla/gfx/Types.h"
#include "mozilla/RefPtr.h"
#include "mozilla/ServoStyleConsts.h"
#include "mozilla/ServoTypes.h"
#include "nsColor.h"
#include "nsCSSPropertyID.h"
#include "nsDOMCSSDeclaration.h"
#include "nsStringFwd.h"

class nsCSSValue;
class nsIDocument;
struct nsCSSRect;
struct nsTimingFunction;
struct RawServoDeclarationBlock;

using RawGeckoGfxMatrix4x4 = mozilla::gfx::Float[16];

namespace mozilla {
namespace css {
class Loader;
} // namespace css
} // namespace mozilla

namespace mozilla {

class ServoStyleSet;
class SharedFontList;
struct URLExtraData;

class ServoCSSParser
{
public:
  using ParsingEnvironment = nsDOMCSSDeclaration::ParsingEnvironment;

  /**
   * Returns whether the specified string can be parsed as a valid CSS
   * <color> value.
   *
   * This includes Mozilla-specific keywords such as -moz-default-color.
   */
  static bool IsValidCSSColor(const nsAString& aValue);

  /**
   * Computes an nscolor from the given CSS <color> value.
   *
   * @param aStyleSet The style set whose nsPresContext will be used to
   *   compute system colors and other special color values.
   * @param aCurrentColor The color value that currentcolor should compute to.
   * @param aValue The CSS <color> value.
   * @param aResultColor The resulting computed color value.
   * @param aWasCurrentColor Whether aValue was currentcolor. Can be nullptr
   *   if the caller doesn't care.
   * @param aLoader The CSS loader for document we're parsing a color for,
   *   so that parse errors can be reported to the console. If nullptr, errors
   *   won't be reported to the console.
   * @return Whether aValue was successfully parsed and aResultColor was set.
   */
  static bool ComputeColor(ServoStyleSet* aStyleSet,
                           nscolor aCurrentColor,
                           const nsAString& aValue,
                           nscolor* aResultColor,
                           bool* aWasCurrentColor = nullptr,
                           css::Loader* aLoader = nullptr);

  /**
   * Parse a string representing a CSS property value into a
   * RawServoDeclarationBlock.
   *
   * @param aProperty The property to be parsed.
   * @param aValue The specified value.
   * @param aParsingEnvironment All the parsing environment data we need.
   * @param aParsingMode The paring mode we apply.
   * @return The parsed value as a RawServoDeclarationBlock. We put the value
   *   in a declaration block since that is how we represent specified values
   *   in Servo.
   */
  static already_AddRefed<RawServoDeclarationBlock> ParseProperty(
    nsCSSPropertyID aProperty,
    const nsAString& aValue,
    const ParsingEnvironment& aParsingEnvironment,
    ParsingMode aParsingMode = ParsingMode::Default);

  /**
   * Parse a animation timing function.
   *
   * @param aValue The specified value.
   * @param aUrl The parser url extra data.
   * @param aResult The output timing function. (output)
   * @return Whether the value was successfully parsed.
   */
  static bool ParseEasing(const nsAString& aValue,
                          URLExtraData* aUrl,
                          nsTimingFunction& aResult);

  /**
   * Parse a specified transform list into a gfx matrix.
   *
   * @param aValue The specified value.
   * @param aContains3DTransform The output flag indicates whether this is any
   *   3d transform function. (output)
   * @param aResult The output matrix. (output)
   * @return Whether the value was successfully parsed.
   */
  static bool ParseTransformIntoMatrix(const nsAString& aValue,
                                       bool& aContains3DTransform,
                                       RawGeckoGfxMatrix4x4& aResult);

  /**
   * Parse a font shorthand for FontFaceSet matching, so we only care about
   * FontFamily, FontStyle, FontStretch, and FontWeight.
   *
   * @param aValue The specified value.
   * @param aUrl The parser url extra data.
   * @param aList The parsed FontFamily list. (output)
   * @param aStyle The parsed FontStyle. (output)
   * @param aStretch The parsed FontStretch. (output)
   * @param aWeight The parsed FontWeight. (output)
   * @return Whether the value was successfully parsed.
   */
  static bool ParseFontShorthandForMatching(const nsAString& aValue,
                                            URLExtraData* aUrl,
                                            RefPtr<SharedFontList>& aList,
                                            StyleComputedFontStyleDescriptor& aStyle,
                                            float& aStretch,
                                            float& aWeight);

  /**
   * Get a URLExtraData from |nsIDocument|.
   *
   * @param aDocument The current document.
   * @return The URLExtraData object.
   */
  static already_AddRefed<URLExtraData> GetURLExtraData(nsIDocument* aDocument);

  /**
   * Get a ParsingEnvironment from |nsIDocument|.
   *
   * @param aDocument The current document.
   * @return The ParsingEnvironment object.
   */
  static ParsingEnvironment GetParsingEnvironment(nsIDocument* aDocument);
};

} // namespace mozilla

#endif // mozilla_ServoCSSParser_h