LCOV - code coverage report
Current view: top level - layout/style - nsCSSProps.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 10 109 9.2 %
Date: 2018-08-07 16:42:27 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
       2             : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
       3             : /* This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : 
       7             : /*
       8             :  * methods for dealing with CSS properties and tables of the keyword
       9             :  * values they accept
      10             :  */
      11             : 
      12             : #include "nsCSSProps.h"
      13             : 
      14             : #include "mozilla/ArrayUtils.h"
      15             : #include "mozilla/Casting.h"
      16             : 
      17             : #include "nsCSSKeywords.h"
      18             : #include "nsLayoutUtils.h"
      19             : #include "nsStyleConsts.h"
      20             : #include "nsIWidget.h"
      21             : #include "nsThemeConstants.h"  // For system widget appearance types
      22             : 
      23             : #include "mozilla/dom/Animation.h"
      24             : #include "mozilla/dom/AnimationEffectBinding.h" // for PlaybackDirection
      25             : #include "mozilla/LookAndFeel.h" // for system colors
      26             : 
      27             : #include "nsString.h"
      28             : #include "nsStaticNameTable.h"
      29             : 
      30             : #include "mozilla/Preferences.h"
      31             : #include "mozilla/StaticPrefs.h"
      32             : 
      33             : using namespace mozilla;
      34             : 
      35             : typedef nsCSSProps::KTableEntry KTableEntry;
      36             : 
      37             : // required to make the symbol external, so that TestCSSPropertyLookup.cpp can link with it
      38             : extern const char* const kCSSRawProperties[];
      39             : 
      40             : // define an array of all CSS properties
      41             : const char* const kCSSRawProperties[eCSSProperty_COUNT_with_aliases] = {
      42             : #define CSS_PROP_LONGHAND(name_, ...) #name_,
      43             : #define CSS_PROP_SHORTHAND(name_, ...) #name_,
      44             : #define CSS_PROP_ALIAS(name_, ...) #name_,
      45             : #include "mozilla/ServoCSSPropList.h"
      46             : #undef CSS_PROP_ALIAS
      47             : #undef CSS_PROP_SHORTHAND
      48             : #undef CSS_PROP_LONGHAND
      49             : };
      50             : 
      51             : using namespace mozilla;
      52             : 
      53             : static int32_t gPropertyTableRefCount;
      54             : static nsStaticCaseInsensitiveNameTable* gPropertyTable;
      55             : static nsStaticCaseInsensitiveNameTable* gFontDescTable;
      56             : static nsStaticCaseInsensitiveNameTable* gCounterDescTable;
      57             : static nsDataHashtable<nsCStringHashKey,nsCSSPropertyID>* gPropertyIDLNameTable;
      58             : 
      59             : static const char* const kCSSRawFontDescs[] = {
      60             : #define CSS_FONT_DESC(name_, method_) #name_,
      61             : #include "nsCSSFontDescList.h"
      62             : #undef CSS_FONT_DESC
      63             : };
      64             : 
      65             : static const char* const kCSSRawCounterDescs[] = {
      66             : #define CSS_COUNTER_DESC(name_, method_) #name_,
      67             : #include "nsCSSCounterDescList.h"
      68             : #undef CSS_COUNTER_DESC
      69             : };
      70             : 
      71             : // We need eCSSAliasCount so we can make gAliases nonzero size when there
      72             : // are no aliases.
      73             : enum {
      74             :   eCSSAliasCount = eCSSProperty_COUNT_with_aliases - eCSSProperty_COUNT
      75             : };
      76             : 
      77             : // The names are in kCSSRawProperties.
      78             : static nsCSSPropertyID gAliases[eCSSAliasCount != 0 ? eCSSAliasCount : 1] = {
      79             : #define CSS_PROP_ALIAS(aliasname_, aliasid_, propid_, aliasmethod_, pref_)  \
      80             :   eCSSProperty_##propid_ ,
      81             : #include "mozilla/ServoCSSPropList.h"
      82             : #undef CSS_PROP_ALIAS
      83             : };
      84             : 
      85           0 : static nsStaticCaseInsensitiveNameTable*
      86             : CreateStaticTable(const char* const aRawTable[], int32_t aLength)
      87           0 : {
      88             :   auto table = new nsStaticCaseInsensitiveNameTable(aRawTable, aLength);
      89             : #ifdef DEBUG
      90           0 :   // Partially verify the entries.
      91           0 :   for (int32_t index = 0; index < aLength; ++index) {
      92           0 :     nsAutoCString temp(aRawTable[index]);
      93             :     MOZ_ASSERT(-1 == temp.FindChar('_'),
      94             :                "underscore char in case insensitive name table");
      95             :   }
      96           0 : #endif
      97             :   return table;
      98             : }
      99             : 
     100           0 : void
     101             : nsCSSProps::AddRefTable(void)
     102           0 : {
     103           0 :   if (0 == gPropertyTableRefCount++) {
     104           0 :     MOZ_ASSERT(!gPropertyTable, "pre existing array!");
     105           0 :     MOZ_ASSERT(!gFontDescTable, "pre existing array!");
     106           0 :     MOZ_ASSERT(!gCounterDescTable, "pre existing array!");
     107             :     MOZ_ASSERT(!gPropertyIDLNameTable, "pre existing array!");
     108           0 : 
     109             :     gPropertyTable = CreateStaticTable(
     110           0 :         kCSSRawProperties, eCSSProperty_COUNT_with_aliases);
     111           0 :     gFontDescTable = CreateStaticTable(kCSSRawFontDescs, eCSSFontDesc_COUNT);
     112             :     gCounterDescTable = CreateStaticTable(
     113             :         kCSSRawCounterDescs, eCSSCounterDesc_COUNT);
     114           0 : 
     115           0 :     gPropertyIDLNameTable = new nsDataHashtable<nsCStringHashKey,nsCSSPropertyID>;
     116           0 :     for (nsCSSPropertyID p = nsCSSPropertyID(0);
     117           0 :          size_t(p) < ArrayLength(kIDLNameTable);
     118           0 :          p = nsCSSPropertyID(p + 1)) {
     119           0 :       if (kIDLNameTable[p]) {
     120             :         gPropertyIDLNameTable->Put(nsDependentCString(kIDLNameTable[p]), p);
     121             :       }
     122             :     }
     123             : 
     124           0 :     static bool prefObserversInited = false;
     125           0 :     if (!prefObserversInited) {
     126         130 :       prefObserversInited = true;
     127         130 :       for (const PropertyPref* pref = kPropertyPrefTable;
     128         129 :            pref->mPropID != eCSSProperty_UNKNOWN; pref++) {
     129         129 :         bool* enabled = &gPropertyEnabled[pref->mPropID];
     130             :         Preferences::AddBoolVarCache(enabled, pref->mPref);
     131             :       }
     132             :     }
     133           1 :   }
     134             : }
     135             : 
     136             : #undef  DEBUG_SHORTHANDS_CONTAINING
     137             : 
     138           0 : void
     139             : nsCSSProps::ReleaseTable(void)
     140           0 : {
     141           0 :   if (0 == --gPropertyTableRefCount) {
     142           0 :     delete gPropertyTable;
     143             :     gPropertyTable = nullptr;
     144           0 : 
     145           0 :     delete gFontDescTable;
     146             :     gFontDescTable = nullptr;
     147           0 : 
     148           0 :     delete gCounterDescTable;
     149             :     gCounterDescTable = nullptr;
     150           0 : 
     151           0 :     delete gPropertyIDLNameTable;
     152             :     gPropertyIDLNameTable = nullptr;
     153           0 :   }
     154             : }
     155             : 
     156           0 : /* static */ bool
     157             : nsCSSProps::IsCustomPropertyName(const nsAString& aProperty)
     158           0 : {
     159           0 :   return aProperty.Length() >= CSS_CUSTOM_NAME_PREFIX_LENGTH &&
     160             :          StringBeginsWith(aProperty, NS_LITERAL_STRING("--"));
     161             : }
     162             : 
     163          61 : nsCSSPropertyID
     164             : nsCSSProps::LookupProperty(const nsAString& aProperty, EnabledState aEnabled)
     165           0 : {
     166             :   if (IsCustomPropertyName(aProperty)) {
     167             :     return eCSSPropertyExtra_variable;
     168             :   }
     169             : 
     170             :   // This is faster than converting and calling
     171             :   // LookupProperty(nsACString&).  The table will do its own
     172           0 :   // converting and avoid a PromiseFlatCString() call.
     173           0 :   MOZ_ASSERT(gPropertyTable, "no lookup table, needs addref");
     174          60 :   nsCSSPropertyID res = nsCSSPropertyID(gPropertyTable->Lookup(aProperty));
     175          60 :   if (MOZ_LIKELY(res < eCSSProperty_COUNT)) {
     176           0 :     if (res != eCSSProperty_UNKNOWN && !IsEnabled(res, aEnabled)) {
     177             :       res = eCSSProperty_UNKNOWN;
     178             :     }
     179             :     return res;
     180             :   }
     181             :   MOZ_ASSERT(eCSSAliasCount != 0,
     182             :              "'res' must be an alias at this point so we better have some!");
     183             :   // We intentionally don't support CSSEnabledState::eInUASheets or
     184             :   // CSSEnabledState::eInChrome for aliases yet because it's unlikely
     185           0 :   // there will be a need for it.
     186           0 :   if (IsEnabled(res) || aEnabled == CSSEnabledState::eIgnoreEnabledState) {
     187           0 :     res = gAliases[res - eCSSProperty_COUNT];
     188             :     MOZ_ASSERT(0 <= res && res < eCSSProperty_COUNT,
     189           0 :                "aliases must not point to other aliases");
     190             :     if (IsEnabled(res) || aEnabled == CSSEnabledState::eIgnoreEnabledState) {
     191             :       return res;
     192             :     }
     193             :   }
     194             :   return eCSSProperty_UNKNOWN;
     195             : }
     196             : 
     197           0 : nsCSSPropertyID
     198             : nsCSSProps::LookupPropertyByIDLName(const nsACString& aPropertyIDLName,
     199             :                                     EnabledState aEnabled)
     200             : {
     201           0 :   nsCSSPropertyID res;
     202             :   if (!gPropertyIDLNameTable->Get(aPropertyIDLName, &res)) {
     203             :     return eCSSProperty_UNKNOWN;
     204           0 :   }
     205           0 :   MOZ_ASSERT(res < eCSSProperty_COUNT);
     206             :   if (!IsEnabled(res, aEnabled)) {
     207             :     return eCSSProperty_UNKNOWN;
     208           0 :   }
     209             :   return res;
     210             : }
     211             : 
     212           0 : nsCSSPropertyID
     213             : nsCSSProps::LookupPropertyByIDLName(const nsAString& aPropertyIDLName,
     214             :                                     EnabledState aEnabled)
     215           0 : {
     216           0 :   MOZ_ASSERT(gPropertyIDLNameTable, "no lookup table, needs addref");
     217           0 :   return LookupPropertyByIDLName(NS_ConvertUTF16toUTF8(aPropertyIDLName),
     218             :                                  aEnabled);
     219             : }
     220             : 
     221           0 : nsCSSFontDesc
     222             : nsCSSProps::LookupFontDesc(const nsAString& aFontDesc)
     223           0 : {
     224           0 :   MOZ_ASSERT(gFontDescTable, "no lookup table, needs addref");
     225             :   nsCSSFontDesc which = nsCSSFontDesc(gFontDescTable->Lookup(aFontDesc));
     226           0 : 
     227           0 :   if (which == eCSSFontDesc_Display &&
     228           0 :       !StaticPrefs::layout_css_font_display_enabled()) {
     229             :     which = eCSSFontDesc_UNKNOWN;
     230           0 :   }
     231             :   return which;
     232             : }
     233             : 
     234          12 : const nsCString&
     235             : nsCSSProps::GetStringValue(nsCSSPropertyID aProperty)
     236          12 : {
     237           0 :   MOZ_ASSERT(gPropertyTable, "no lookup table, needs addref");
     238           0 :   if (gPropertyTable) {
     239             :     return gPropertyTable->GetStringValue(int32_t(aProperty));
     240           0 :   } else {
     241             :     static nsDependentCString sNullStr("");
     242             :     return sNullStr;
     243             :   }
     244             : }
     245             : 
     246           0 : const nsCString&
     247             : nsCSSProps::GetStringValue(nsCSSFontDesc aFontDescID)
     248           0 : {
     249           0 :   MOZ_ASSERT(gFontDescTable, "no lookup table, needs addref");
     250           0 :   if (gFontDescTable) {
     251             :     return gFontDescTable->GetStringValue(int32_t(aFontDescID));
     252           0 :   } else {
     253             :     static nsDependentCString sNullStr("");
     254             :     return sNullStr;
     255             :   }
     256             : }
     257             : 
     258           0 : const nsCString&
     259             : nsCSSProps::GetStringValue(nsCSSCounterDesc aCounterDesc)
     260           0 : {
     261           0 :   MOZ_ASSERT(gCounterDescTable, "no lookup table, needs addref");
     262           0 :   if (gCounterDescTable) {
     263             :     return gCounterDescTable->GetStringValue(int32_t(aCounterDesc));
     264           0 :   } else {
     265             :     static nsDependentCString sNullStr("");
     266             :     return sNullStr;
     267             :   }
     268             : }
     269             : 
     270             : /***************************************************************************/
     271             : 
     272             : const KTableEntry nsCSSProps::kAnimationDirectionKTable[] = {
     273             :   { eCSSKeyword_normal, static_cast<uint32_t>(dom::PlaybackDirection::Normal) },
     274             :   { eCSSKeyword_reverse, static_cast<uint32_t>(dom::PlaybackDirection::Reverse) },
     275             :   { eCSSKeyword_alternate, static_cast<uint32_t>(dom::PlaybackDirection::Alternate) },
     276             :   { eCSSKeyword_alternate_reverse, static_cast<uint32_t>(dom::PlaybackDirection::Alternate_reverse) },
     277             :   { eCSSKeyword_UNKNOWN, -1 }
     278             : };
     279             : 
     280             : const KTableEntry nsCSSProps::kAnimationFillModeKTable[] = {
     281             :   { eCSSKeyword_none, static_cast<uint32_t>(dom::FillMode::None) },
     282             :   { eCSSKeyword_forwards, static_cast<uint32_t>(dom::FillMode::Forwards) },
     283             :   { eCSSKeyword_backwards, static_cast<uint32_t>(dom::FillMode::Backwards) },
     284             :   { eCSSKeyword_both, static_cast<uint32_t>(dom::FillMode::Both) },
     285             :   { eCSSKeyword_UNKNOWN, -1 }
     286             : };
     287             : 
     288             : const KTableEntry nsCSSProps::kAnimationPlayStateKTable[] = {
     289             :   { eCSSKeyword_running, NS_STYLE_ANIMATION_PLAY_STATE_RUNNING },
     290             :   { eCSSKeyword_paused, NS_STYLE_ANIMATION_PLAY_STATE_PAUSED },
     291             :   { eCSSKeyword_UNKNOWN, -1 }
     292             : };
     293             : 
     294             : const KTableEntry nsCSSProps::kAppearanceKTable[] = {
     295             :   { eCSSKeyword_none,                   NS_THEME_NONE },
     296             :   { eCSSKeyword_button,                 NS_THEME_BUTTON },
     297             :   { eCSSKeyword_radio,                  NS_THEME_RADIO },
     298             :   { eCSSKeyword_checkbox,               NS_THEME_CHECKBOX },
     299             :   { eCSSKeyword_button_bevel,           NS_THEME_BUTTON_BEVEL },
     300             :   { eCSSKeyword_toolbox,                NS_THEME_TOOLBOX },
     301             :   { eCSSKeyword_toolbar,                NS_THEME_TOOLBAR },
     302             :   { eCSSKeyword_toolbarbutton,          NS_THEME_TOOLBARBUTTON },
     303             :   { eCSSKeyword_toolbargripper,         NS_THEME_TOOLBARGRIPPER },
     304             :   { eCSSKeyword_dualbutton,             NS_THEME_DUALBUTTON },
     305             :   { eCSSKeyword_toolbarbutton_dropdown, NS_THEME_TOOLBARBUTTON_DROPDOWN },
     306             :   { eCSSKeyword_button_arrow_up,        NS_THEME_BUTTON_ARROW_UP },
     307             :   { eCSSKeyword_button_arrow_down,      NS_THEME_BUTTON_ARROW_DOWN },
     308             :   { eCSSKeyword_button_arrow_next,      NS_THEME_BUTTON_ARROW_NEXT },
     309             :   { eCSSKeyword_button_arrow_previous,  NS_THEME_BUTTON_ARROW_PREVIOUS },
     310             :   { eCSSKeyword_meterbar,               NS_THEME_METERBAR },
     311             :   { eCSSKeyword_meterchunk,             NS_THEME_METERCHUNK },
     312             :   { eCSSKeyword_number_input,           NS_THEME_NUMBER_INPUT },
     313             :   { eCSSKeyword_separator,              NS_THEME_SEPARATOR },
     314             :   { eCSSKeyword_splitter,               NS_THEME_SPLITTER },
     315             :   { eCSSKeyword_statusbar,              NS_THEME_STATUSBAR },
     316             :   { eCSSKeyword_statusbarpanel,         NS_THEME_STATUSBARPANEL },
     317             :   { eCSSKeyword_resizerpanel,           NS_THEME_RESIZERPANEL },
     318             :   { eCSSKeyword_resizer,                NS_THEME_RESIZER },
     319             :   { eCSSKeyword_listbox,                NS_THEME_LISTBOX },
     320             :   { eCSSKeyword_listitem,               NS_THEME_LISTITEM },
     321             :   { eCSSKeyword_treeview,               NS_THEME_TREEVIEW },
     322             :   { eCSSKeyword_treeitem,               NS_THEME_TREEITEM },
     323             :   { eCSSKeyword_treetwisty,             NS_THEME_TREETWISTY },
     324             :   { eCSSKeyword_treetwistyopen,         NS_THEME_TREETWISTYOPEN },
     325             :   { eCSSKeyword_treeline,               NS_THEME_TREELINE },
     326             :   { eCSSKeyword_treeheader,             NS_THEME_TREEHEADER },
     327             :   { eCSSKeyword_treeheadercell,         NS_THEME_TREEHEADERCELL },
     328             :   { eCSSKeyword_treeheadersortarrow,    NS_THEME_TREEHEADERSORTARROW },
     329             :   { eCSSKeyword_progressbar,            NS_THEME_PROGRESSBAR },
     330             :   { eCSSKeyword_progresschunk,          NS_THEME_PROGRESSCHUNK },
     331             :   { eCSSKeyword_progressbar_vertical,   NS_THEME_PROGRESSBAR_VERTICAL },
     332             :   { eCSSKeyword_progresschunk_vertical, NS_THEME_PROGRESSCHUNK_VERTICAL },
     333             :   { eCSSKeyword_tab,                    NS_THEME_TAB },
     334             :   { eCSSKeyword_tabpanels,              NS_THEME_TABPANELS },
     335             :   { eCSSKeyword_tabpanel,               NS_THEME_TABPANEL },
     336             :   { eCSSKeyword_tab_scroll_arrow_back,  NS_THEME_TAB_SCROLL_ARROW_BACK },
     337             :   { eCSSKeyword_tab_scroll_arrow_forward, NS_THEME_TAB_SCROLL_ARROW_FORWARD },
     338             :   { eCSSKeyword_tooltip,                NS_THEME_TOOLTIP },
     339             :   { eCSSKeyword_inner_spin_button,      NS_THEME_INNER_SPIN_BUTTON },
     340             :   { eCSSKeyword_spinner,                NS_THEME_SPINNER },
     341             :   { eCSSKeyword_spinner_upbutton,       NS_THEME_SPINNER_UPBUTTON },
     342             :   { eCSSKeyword_spinner_downbutton,     NS_THEME_SPINNER_DOWNBUTTON },
     343             :   { eCSSKeyword_spinner_textfield,      NS_THEME_SPINNER_TEXTFIELD },
     344             :   { eCSSKeyword_scrollbar,              NS_THEME_SCROLLBAR },
     345             :   { eCSSKeyword_scrollbar_small,        NS_THEME_SCROLLBAR_SMALL },
     346             :   { eCSSKeyword_scrollbar_horizontal,   NS_THEME_SCROLLBAR_HORIZONTAL },
     347             :   { eCSSKeyword_scrollbar_vertical,     NS_THEME_SCROLLBAR_VERTICAL },
     348             :   { eCSSKeyword_scrollbarbutton_up,     NS_THEME_SCROLLBARBUTTON_UP },
     349             :   { eCSSKeyword_scrollbarbutton_down,   NS_THEME_SCROLLBARBUTTON_DOWN },
     350             :   { eCSSKeyword_scrollbarbutton_left,   NS_THEME_SCROLLBARBUTTON_LEFT },
     351             :   { eCSSKeyword_scrollbarbutton_right,  NS_THEME_SCROLLBARBUTTON_RIGHT },
     352             :   { eCSSKeyword_scrollbartrack_horizontal,    NS_THEME_SCROLLBARTRACK_HORIZONTAL },
     353             :   { eCSSKeyword_scrollbartrack_vertical,      NS_THEME_SCROLLBARTRACK_VERTICAL },
     354             :   { eCSSKeyword_scrollbarthumb_horizontal,    NS_THEME_SCROLLBARTHUMB_HORIZONTAL },
     355             :   { eCSSKeyword_scrollbarthumb_vertical,      NS_THEME_SCROLLBARTHUMB_VERTICAL },
     356             :   { eCSSKeyword_textfield,              NS_THEME_TEXTFIELD },
     357             :   { eCSSKeyword_textfield_multiline,    NS_THEME_TEXTFIELD_MULTILINE },
     358             :   { eCSSKeyword_caret,                  NS_THEME_CARET },
     359             :   { eCSSKeyword_searchfield,            NS_THEME_SEARCHFIELD },
     360             :   { eCSSKeyword_menulist,               NS_THEME_MENULIST },
     361             :   { eCSSKeyword_menulist_button,        NS_THEME_MENULIST_BUTTON },
     362             :   { eCSSKeyword_menulist_text,          NS_THEME_MENULIST_TEXT },
     363             :   { eCSSKeyword_menulist_textfield,     NS_THEME_MENULIST_TEXTFIELD },
     364             :   { eCSSKeyword_range,                  NS_THEME_RANGE },
     365             :   { eCSSKeyword_range_thumb,            NS_THEME_RANGE_THUMB },
     366             :   { eCSSKeyword_scale_horizontal,       NS_THEME_SCALE_HORIZONTAL },
     367             :   { eCSSKeyword_scale_vertical,         NS_THEME_SCALE_VERTICAL },
     368             :   { eCSSKeyword_scalethumb_horizontal,  NS_THEME_SCALETHUMB_HORIZONTAL },
     369             :   { eCSSKeyword_scalethumb_vertical,    NS_THEME_SCALETHUMB_VERTICAL },
     370             :   { eCSSKeyword_scalethumbstart,        NS_THEME_SCALETHUMBSTART },
     371             :   { eCSSKeyword_scalethumbend,          NS_THEME_SCALETHUMBEND },
     372             :   { eCSSKeyword_scalethumbtick,         NS_THEME_SCALETHUMBTICK },
     373             :   { eCSSKeyword_groupbox,               NS_THEME_GROUPBOX },
     374             :   { eCSSKeyword_checkbox_container,     NS_THEME_CHECKBOX_CONTAINER },
     375             :   { eCSSKeyword_radio_container,        NS_THEME_RADIO_CONTAINER },
     376             :   { eCSSKeyword_checkbox_label,         NS_THEME_CHECKBOX_LABEL },
     377             :   { eCSSKeyword_radio_label,            NS_THEME_RADIO_LABEL },
     378             :   { eCSSKeyword_button_focus,           NS_THEME_BUTTON_FOCUS },
     379             :   // Even though window is meant for OS window styling, web developers use
     380             :   // `window` on <select> to remove the dropmarker. Care should be taken when
     381             :   // changing -moz-appearance:window to avoid web compatibility regressions.
     382             :   // See https://bugzilla.mozilla.org/show_bug.cgi?id=1466715#c10
     383             :   { eCSSKeyword_window,                 NS_THEME_WINDOW },
     384             :   { eCSSKeyword_dialog,                 NS_THEME_DIALOG },
     385             :   { eCSSKeyword_menubar,                NS_THEME_MENUBAR },
     386             :   { eCSSKeyword_menupopup,              NS_THEME_MENUPOPUP },
     387             :   { eCSSKeyword_menuitem,               NS_THEME_MENUITEM },
     388             :   { eCSSKeyword_checkmenuitem,          NS_THEME_CHECKMENUITEM },
     389             :   { eCSSKeyword_radiomenuitem,          NS_THEME_RADIOMENUITEM },
     390             :   { eCSSKeyword_menucheckbox,           NS_THEME_MENUCHECKBOX },
     391             :   { eCSSKeyword_menuradio,              NS_THEME_MENURADIO },
     392             :   { eCSSKeyword_menuseparator,          NS_THEME_MENUSEPARATOR },
     393             :   { eCSSKeyword_menuarrow,              NS_THEME_MENUARROW },
     394             :   { eCSSKeyword_menuimage,              NS_THEME_MENUIMAGE },
     395             :   { eCSSKeyword_menuitemtext,           NS_THEME_MENUITEMTEXT },
     396             :   { eCSSKeyword__moz_win_media_toolbox, NS_THEME_WIN_MEDIA_TOOLBOX },
     397             :   { eCSSKeyword__moz_win_communications_toolbox, NS_THEME_WIN_COMMUNICATIONS_TOOLBOX },
     398             :   { eCSSKeyword__moz_win_browsertabbar_toolbox,  NS_THEME_WIN_BROWSERTABBAR_TOOLBOX },
     399             :   { eCSSKeyword__moz_win_glass,         NS_THEME_WIN_GLASS },
     400             :   { eCSSKeyword__moz_win_borderless_glass,      NS_THEME_WIN_BORDERLESS_GLASS },
     401             :   { eCSSKeyword__moz_mac_fullscreen_button,     NS_THEME_MAC_FULLSCREEN_BUTTON },
     402             :   { eCSSKeyword__moz_mac_help_button,           NS_THEME_MAC_HELP_BUTTON },
     403             :   { eCSSKeyword__moz_window_titlebar,           NS_THEME_WINDOW_TITLEBAR },
     404             :   { eCSSKeyword__moz_window_titlebar_maximized, NS_THEME_WINDOW_TITLEBAR_MAXIMIZED },
     405             :   { eCSSKeyword__moz_window_frame_left,         NS_THEME_WINDOW_FRAME_LEFT },
     406             :   { eCSSKeyword__moz_window_frame_right,        NS_THEME_WINDOW_FRAME_RIGHT },
     407             :   { eCSSKeyword__moz_window_frame_bottom,       NS_THEME_WINDOW_FRAME_BOTTOM },
     408             :   { eCSSKeyword__moz_window_button_close,       NS_THEME_WINDOW_BUTTON_CLOSE },
     409             :   { eCSSKeyword__moz_window_button_minimize,    NS_THEME_WINDOW_BUTTON_MINIMIZE },
     410             :   { eCSSKeyword__moz_window_button_maximize,    NS_THEME_WINDOW_BUTTON_MAXIMIZE },
     411             :   { eCSSKeyword__moz_window_button_restore,     NS_THEME_WINDOW_BUTTON_RESTORE },
     412             :   { eCSSKeyword__moz_window_button_box,         NS_THEME_WINDOW_BUTTON_BOX },
     413             :   { eCSSKeyword__moz_window_button_box_maximized, NS_THEME_WINDOW_BUTTON_BOX_MAXIMIZED },
     414             :   { eCSSKeyword__moz_win_exclude_glass,         NS_THEME_WIN_EXCLUDE_GLASS },
     415             :   { eCSSKeyword__moz_mac_vibrancy_light,        NS_THEME_MAC_VIBRANCY_LIGHT },
     416             :   { eCSSKeyword__moz_mac_vibrancy_dark,         NS_THEME_MAC_VIBRANCY_DARK },
     417             :   { eCSSKeyword__moz_mac_vibrant_titlebar_light, NS_THEME_MAC_VIBRANT_TITLEBAR_LIGHT },
     418             :   { eCSSKeyword__moz_mac_vibrant_titlebar_dark,  NS_THEME_MAC_VIBRANT_TITLEBAR_DARK },
     419             :   { eCSSKeyword__moz_mac_disclosure_button_open,   NS_THEME_MAC_DISCLOSURE_BUTTON_OPEN },
     420             :   { eCSSKeyword__moz_mac_disclosure_button_closed, NS_THEME_MAC_DISCLOSURE_BUTTON_CLOSED },
     421             :   { eCSSKeyword__moz_gtk_info_bar,              NS_THEME_GTK_INFO_BAR },
     422             :   { eCSSKeyword__moz_mac_source_list,           NS_THEME_MAC_SOURCE_LIST },
     423             :   { eCSSKeyword__moz_mac_source_list_selection, NS_THEME_MAC_SOURCE_LIST_SELECTION },
     424             :   { eCSSKeyword__moz_mac_active_source_list_selection, NS_THEME_MAC_ACTIVE_SOURCE_LIST_SELECTION },
     425             :   { eCSSKeyword_UNKNOWN,                        -1 }
     426             : };
     427             : 
     428             : const KTableEntry nsCSSProps::kBackfaceVisibilityKTable[] = {
     429             :   { eCSSKeyword_visible, NS_STYLE_BACKFACE_VISIBILITY_VISIBLE },
     430             :   { eCSSKeyword_hidden, NS_STYLE_BACKFACE_VISIBILITY_HIDDEN },
     431             :   { eCSSKeyword_UNKNOWN, -1 }
     432             : };
     433             : 
     434             : const KTableEntry nsCSSProps::kTransformStyleKTable[] = {
     435             :   { eCSSKeyword_flat, NS_STYLE_TRANSFORM_STYLE_FLAT },
     436             :   { eCSSKeyword_preserve_3d, NS_STYLE_TRANSFORM_STYLE_PRESERVE_3D },
     437             :   { eCSSKeyword_UNKNOWN, -1 }
     438             : };
     439             : 
     440             : const KTableEntry nsCSSProps::kImageLayerAttachmentKTable[] = {
     441             :   { eCSSKeyword_fixed, StyleImageLayerAttachment::Fixed },
     442             :   { eCSSKeyword_scroll, StyleImageLayerAttachment::Scroll },
     443             :   { eCSSKeyword_local, StyleImageLayerAttachment::Local },
     444             :   { eCSSKeyword_UNKNOWN, -1 }
     445             : };
     446             : 
     447             : const KTableEntry nsCSSProps::kBackgroundOriginKTable[] = {
     448             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
     449             :   { eCSSKeyword_padding_box, StyleGeometryBox::PaddingBox },
     450             :   { eCSSKeyword_content_box, StyleGeometryBox::ContentBox },
     451             :   { eCSSKeyword_UNKNOWN, -1 }
     452             : };
     453             : 
     454             : KTableEntry nsCSSProps::kBackgroundClipKTable[] = {
     455             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
     456             :   { eCSSKeyword_padding_box, StyleGeometryBox::PaddingBox },
     457             :   { eCSSKeyword_content_box, StyleGeometryBox::ContentBox },
     458             :   { eCSSKeyword_text, StyleGeometryBox::Text },
     459             :   { eCSSKeyword_UNKNOWN, -1 }
     460             : };
     461             : 
     462             : const KTableEntry nsCSSProps::kMaskOriginKTable[] = {
     463             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
     464             :   { eCSSKeyword_padding_box, StyleGeometryBox::PaddingBox },
     465             :   { eCSSKeyword_content_box, StyleGeometryBox::ContentBox },
     466             :   { eCSSKeyword_fill_box, StyleGeometryBox::FillBox },
     467             :   { eCSSKeyword_stroke_box, StyleGeometryBox::StrokeBox },
     468             :   { eCSSKeyword_view_box, StyleGeometryBox::ViewBox },
     469             :   { eCSSKeyword_UNKNOWN, -1 }
     470             : };
     471             : 
     472             : const KTableEntry nsCSSProps::kMaskClipKTable[] = {
     473             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
     474             :   { eCSSKeyword_padding_box, StyleGeometryBox::PaddingBox },
     475             :   { eCSSKeyword_content_box, StyleGeometryBox::ContentBox },
     476             :   { eCSSKeyword_fill_box, StyleGeometryBox::FillBox },
     477             :   { eCSSKeyword_stroke_box, StyleGeometryBox::StrokeBox },
     478             :   { eCSSKeyword_view_box, StyleGeometryBox::ViewBox },
     479             :   { eCSSKeyword_no_clip, StyleGeometryBox::NoClip },
     480             :   { eCSSKeyword_UNKNOWN, -1 }
     481             : };
     482             : 
     483             : const KTableEntry nsCSSProps::kImageLayerRepeatKTable[] = {
     484             :   { eCSSKeyword_no_repeat,  StyleImageLayerRepeat::NoRepeat },
     485             :   { eCSSKeyword_repeat,     StyleImageLayerRepeat::Repeat },
     486             :   { eCSSKeyword_repeat_x,   StyleImageLayerRepeat::RepeatX },
     487             :   { eCSSKeyword_repeat_y,   StyleImageLayerRepeat::RepeatY },
     488             :   { eCSSKeyword_round,      StyleImageLayerRepeat::Round},
     489             :   { eCSSKeyword_space,      StyleImageLayerRepeat::Space},
     490             :   { eCSSKeyword_UNKNOWN, -1 }
     491             : };
     492             : 
     493             : const KTableEntry nsCSSProps::kImageLayerModeKTable[] = {
     494             :   { eCSSKeyword_alpha, NS_STYLE_MASK_MODE_ALPHA },
     495             :   { eCSSKeyword_luminance, NS_STYLE_MASK_MODE_LUMINANCE },
     496             :   { eCSSKeyword_match_source, NS_STYLE_MASK_MODE_MATCH_SOURCE },
     497             :   { eCSSKeyword_UNKNOWN, -1 }
     498             : };
     499             : 
     500             : const KTableEntry nsCSSProps::kImageLayerCompositeKTable[] = {
     501             :   { eCSSKeyword_add, NS_STYLE_MASK_COMPOSITE_ADD },
     502             :   { eCSSKeyword_subtract, NS_STYLE_MASK_COMPOSITE_SUBTRACT },
     503             :   { eCSSKeyword_intersect, NS_STYLE_MASK_COMPOSITE_INTERSECT },
     504             :   { eCSSKeyword_exclude, NS_STYLE_MASK_COMPOSITE_EXCLUDE },
     505             :   { eCSSKeyword_UNKNOWN, -1 }
     506             : };
     507             : 
     508             : const KTableEntry nsCSSProps::kBlendModeKTable[] = {
     509             :     { eCSSKeyword_normal,      NS_STYLE_BLEND_NORMAL },
     510             :     { eCSSKeyword_multiply,    NS_STYLE_BLEND_MULTIPLY },
     511             :     { eCSSKeyword_screen,      NS_STYLE_BLEND_SCREEN },
     512             :     { eCSSKeyword_overlay,     NS_STYLE_BLEND_OVERLAY },
     513             :     { eCSSKeyword_darken,      NS_STYLE_BLEND_DARKEN },
     514             :     { eCSSKeyword_lighten,     NS_STYLE_BLEND_LIGHTEN },
     515             :     { eCSSKeyword_color_dodge, NS_STYLE_BLEND_COLOR_DODGE },
     516             :     { eCSSKeyword_color_burn,  NS_STYLE_BLEND_COLOR_BURN },
     517             :     { eCSSKeyword_hard_light,  NS_STYLE_BLEND_HARD_LIGHT },
     518             :     { eCSSKeyword_soft_light,  NS_STYLE_BLEND_SOFT_LIGHT },
     519             :     { eCSSKeyword_difference,  NS_STYLE_BLEND_DIFFERENCE },
     520             :     { eCSSKeyword_exclusion,   NS_STYLE_BLEND_EXCLUSION },
     521             :     { eCSSKeyword_hue,         NS_STYLE_BLEND_HUE },
     522             :     { eCSSKeyword_saturation,  NS_STYLE_BLEND_SATURATION },
     523             :     { eCSSKeyword_color,       NS_STYLE_BLEND_COLOR },
     524             :     { eCSSKeyword_luminosity,  NS_STYLE_BLEND_LUMINOSITY },
     525             :     { eCSSKeyword_UNKNOWN,     -1 }
     526             : };
     527             : 
     528             : const KTableEntry nsCSSProps::kBorderCollapseKTable[] = {
     529             :   { eCSSKeyword_collapse,  NS_STYLE_BORDER_COLLAPSE },
     530             :   { eCSSKeyword_separate,  NS_STYLE_BORDER_SEPARATE },
     531             :   { eCSSKeyword_UNKNOWN,   -1 }
     532             : };
     533             : 
     534             : const KTableEntry nsCSSProps::kBorderImageRepeatKTable[] = {
     535             :   { eCSSKeyword_stretch, StyleBorderImageRepeat::Stretch },
     536             :   { eCSSKeyword_repeat, StyleBorderImageRepeat::Repeat },
     537             :   { eCSSKeyword_round, StyleBorderImageRepeat::Round },
     538             :   { eCSSKeyword_space, StyleBorderImageRepeat::Space },
     539             :   { eCSSKeyword_UNKNOWN, -1 }
     540             : };
     541             : 
     542             : const KTableEntry nsCSSProps::kBorderStyleKTable[] = {
     543             :   { eCSSKeyword_none,   NS_STYLE_BORDER_STYLE_NONE },
     544             :   { eCSSKeyword_hidden, NS_STYLE_BORDER_STYLE_HIDDEN },
     545             :   { eCSSKeyword_dotted, NS_STYLE_BORDER_STYLE_DOTTED },
     546             :   { eCSSKeyword_dashed, NS_STYLE_BORDER_STYLE_DASHED },
     547             :   { eCSSKeyword_solid,  NS_STYLE_BORDER_STYLE_SOLID },
     548             :   { eCSSKeyword_double, NS_STYLE_BORDER_STYLE_DOUBLE },
     549             :   { eCSSKeyword_groove, NS_STYLE_BORDER_STYLE_GROOVE },
     550             :   { eCSSKeyword_ridge,  NS_STYLE_BORDER_STYLE_RIDGE },
     551             :   { eCSSKeyword_inset,  NS_STYLE_BORDER_STYLE_INSET },
     552             :   { eCSSKeyword_outset, NS_STYLE_BORDER_STYLE_OUTSET },
     553             :   { eCSSKeyword_UNKNOWN, -1 }
     554             : };
     555             : 
     556             : const KTableEntry nsCSSProps::kBoxDecorationBreakKTable[] = {
     557             :   { eCSSKeyword_slice, StyleBoxDecorationBreak::Slice },
     558             :   { eCSSKeyword_clone, StyleBoxDecorationBreak::Clone },
     559             :   { eCSSKeyword_UNKNOWN, -1 }
     560             : };
     561             : 
     562             : const KTableEntry nsCSSProps::kBoxShadowTypeKTable[] = {
     563             :   { eCSSKeyword_inset, uint8_t(StyleBoxShadowType::Inset) },
     564             :   { eCSSKeyword_UNKNOWN, -1 }
     565             : };
     566             : 
     567             : const KTableEntry nsCSSProps::kBoxSizingKTable[] = {
     568             :   { eCSSKeyword_content_box,  StyleBoxSizing::Content },
     569             :   { eCSSKeyword_border_box,   StyleBoxSizing::Border },
     570             :   { eCSSKeyword_UNKNOWN,      -1 }
     571             : };
     572             : 
     573             : const KTableEntry nsCSSProps::kCaptionSideKTable[] = {
     574             :   { eCSSKeyword_top,                  NS_STYLE_CAPTION_SIDE_TOP },
     575             :   { eCSSKeyword_right,                NS_STYLE_CAPTION_SIDE_RIGHT },
     576             :   { eCSSKeyword_bottom,               NS_STYLE_CAPTION_SIDE_BOTTOM },
     577             :   { eCSSKeyword_left,                 NS_STYLE_CAPTION_SIDE_LEFT },
     578             :   { eCSSKeyword_top_outside,          NS_STYLE_CAPTION_SIDE_TOP_OUTSIDE },
     579             :   { eCSSKeyword_bottom_outside,       NS_STYLE_CAPTION_SIDE_BOTTOM_OUTSIDE },
     580             :   { eCSSKeyword_UNKNOWN,              -1 }
     581             : };
     582             : 
     583             : const KTableEntry nsCSSProps::kClearKTable[] = {
     584             :   { eCSSKeyword_none, StyleClear::None },
     585             :   { eCSSKeyword_left, StyleClear::Left },
     586             :   { eCSSKeyword_right, StyleClear::Right },
     587             :   { eCSSKeyword_inline_start, StyleClear::InlineStart },
     588             :   { eCSSKeyword_inline_end, StyleClear::InlineEnd },
     589             :   { eCSSKeyword_both, StyleClear::Both },
     590             :   { eCSSKeyword_UNKNOWN, -1 }
     591             : };
     592             : 
     593             : const KTableEntry nsCSSProps::kCounterSystemKTable[] = {
     594             :   { eCSSKeyword_cyclic, NS_STYLE_COUNTER_SYSTEM_CYCLIC },
     595             :   { eCSSKeyword_numeric, NS_STYLE_COUNTER_SYSTEM_NUMERIC },
     596             :   { eCSSKeyword_alphabetic, NS_STYLE_COUNTER_SYSTEM_ALPHABETIC },
     597             :   { eCSSKeyword_symbolic, NS_STYLE_COUNTER_SYSTEM_SYMBOLIC },
     598             :   { eCSSKeyword_additive, NS_STYLE_COUNTER_SYSTEM_ADDITIVE },
     599             :   { eCSSKeyword_fixed, NS_STYLE_COUNTER_SYSTEM_FIXED },
     600             :   { eCSSKeyword_extends, NS_STYLE_COUNTER_SYSTEM_EXTENDS },
     601             :   { eCSSKeyword_UNKNOWN, -1 }
     602             : };
     603             : 
     604             : const KTableEntry nsCSSProps::kCursorKTable[] = {
     605             :   // CSS 2.0
     606             :   { eCSSKeyword_auto, NS_STYLE_CURSOR_AUTO },
     607             :   { eCSSKeyword_crosshair, NS_STYLE_CURSOR_CROSSHAIR },
     608             :   { eCSSKeyword_default, NS_STYLE_CURSOR_DEFAULT },
     609             :   { eCSSKeyword_pointer, NS_STYLE_CURSOR_POINTER },
     610             :   { eCSSKeyword_move, NS_STYLE_CURSOR_MOVE },
     611             :   { eCSSKeyword_e_resize, NS_STYLE_CURSOR_E_RESIZE },
     612             :   { eCSSKeyword_ne_resize, NS_STYLE_CURSOR_NE_RESIZE },
     613             :   { eCSSKeyword_nw_resize, NS_STYLE_CURSOR_NW_RESIZE },
     614             :   { eCSSKeyword_n_resize, NS_STYLE_CURSOR_N_RESIZE },
     615             :   { eCSSKeyword_se_resize, NS_STYLE_CURSOR_SE_RESIZE },
     616             :   { eCSSKeyword_sw_resize, NS_STYLE_CURSOR_SW_RESIZE },
     617             :   { eCSSKeyword_s_resize, NS_STYLE_CURSOR_S_RESIZE },
     618             :   { eCSSKeyword_w_resize, NS_STYLE_CURSOR_W_RESIZE },
     619             :   { eCSSKeyword_text, NS_STYLE_CURSOR_TEXT },
     620             :   { eCSSKeyword_wait, NS_STYLE_CURSOR_WAIT },
     621             :   { eCSSKeyword_help, NS_STYLE_CURSOR_HELP },
     622             :   // CSS 2.1
     623             :   { eCSSKeyword_progress, NS_STYLE_CURSOR_SPINNING },
     624             :   // CSS3 basic user interface module
     625             :   { eCSSKeyword_copy, NS_STYLE_CURSOR_COPY },
     626             :   { eCSSKeyword_alias, NS_STYLE_CURSOR_ALIAS },
     627             :   { eCSSKeyword_context_menu, NS_STYLE_CURSOR_CONTEXT_MENU },
     628             :   { eCSSKeyword_cell, NS_STYLE_CURSOR_CELL },
     629             :   { eCSSKeyword_not_allowed, NS_STYLE_CURSOR_NOT_ALLOWED },
     630             :   { eCSSKeyword_col_resize, NS_STYLE_CURSOR_COL_RESIZE },
     631             :   { eCSSKeyword_row_resize, NS_STYLE_CURSOR_ROW_RESIZE },
     632             :   { eCSSKeyword_no_drop, NS_STYLE_CURSOR_NO_DROP },
     633             :   { eCSSKeyword_vertical_text, NS_STYLE_CURSOR_VERTICAL_TEXT },
     634             :   { eCSSKeyword_all_scroll, NS_STYLE_CURSOR_ALL_SCROLL },
     635             :   { eCSSKeyword_nesw_resize, NS_STYLE_CURSOR_NESW_RESIZE },
     636             :   { eCSSKeyword_nwse_resize, NS_STYLE_CURSOR_NWSE_RESIZE },
     637             :   { eCSSKeyword_ns_resize, NS_STYLE_CURSOR_NS_RESIZE },
     638             :   { eCSSKeyword_ew_resize, NS_STYLE_CURSOR_EW_RESIZE },
     639             :   { eCSSKeyword_none, NS_STYLE_CURSOR_NONE },
     640             :   { eCSSKeyword_grab, NS_STYLE_CURSOR_GRAB },
     641             :   { eCSSKeyword_grabbing, NS_STYLE_CURSOR_GRABBING },
     642             :   { eCSSKeyword_zoom_in, NS_STYLE_CURSOR_ZOOM_IN },
     643             :   { eCSSKeyword_zoom_out, NS_STYLE_CURSOR_ZOOM_OUT },
     644             :   // -moz- prefixed vendor specific
     645             :   { eCSSKeyword__moz_grab, NS_STYLE_CURSOR_GRAB },
     646             :   { eCSSKeyword__moz_grabbing, NS_STYLE_CURSOR_GRABBING },
     647             :   { eCSSKeyword__moz_zoom_in, NS_STYLE_CURSOR_ZOOM_IN },
     648             :   { eCSSKeyword__moz_zoom_out, NS_STYLE_CURSOR_ZOOM_OUT },
     649             :   { eCSSKeyword_UNKNOWN, -1 }
     650             : };
     651             : 
     652             : const KTableEntry nsCSSProps::kDirectionKTable[] = {
     653             :   { eCSSKeyword_ltr,      NS_STYLE_DIRECTION_LTR },
     654             :   { eCSSKeyword_rtl,      NS_STYLE_DIRECTION_RTL },
     655             :   { eCSSKeyword_UNKNOWN, -1 }
     656             : };
     657             : 
     658             : KTableEntry nsCSSProps::kDisplayKTable[] = {
     659             :   { eCSSKeyword_none,                StyleDisplay::None },
     660             :   { eCSSKeyword_inline,              StyleDisplay::Inline },
     661             :   { eCSSKeyword_block,               StyleDisplay::Block },
     662             :   { eCSSKeyword_inline_block,        StyleDisplay::InlineBlock },
     663             :   { eCSSKeyword_list_item,           StyleDisplay::ListItem },
     664             :   { eCSSKeyword_table,               StyleDisplay::Table },
     665             :   { eCSSKeyword_inline_table,        StyleDisplay::InlineTable },
     666             :   { eCSSKeyword_table_row_group,     StyleDisplay::TableRowGroup },
     667             :   { eCSSKeyword_table_header_group,  StyleDisplay::TableHeaderGroup },
     668             :   { eCSSKeyword_table_footer_group,  StyleDisplay::TableFooterGroup },
     669             :   { eCSSKeyword_table_row,           StyleDisplay::TableRow },
     670             :   { eCSSKeyword_table_column_group,  StyleDisplay::TableColumnGroup },
     671             :   { eCSSKeyword_table_column,        StyleDisplay::TableColumn },
     672             :   { eCSSKeyword_table_cell,          StyleDisplay::TableCell },
     673             :   { eCSSKeyword_table_caption,       StyleDisplay::TableCaption },
     674             :   // Make sure this is kept in sync with the code in
     675             :   // nsCSSFrameConstructor::ConstructXULFrame
     676             :   { eCSSKeyword__moz_box,            StyleDisplay::MozBox },
     677             :   { eCSSKeyword__moz_inline_box,     StyleDisplay::MozInlineBox },
     678             : #ifdef MOZ_XUL
     679             :   { eCSSKeyword__moz_grid,           StyleDisplay::MozGrid },
     680             :   { eCSSKeyword__moz_inline_grid,    StyleDisplay::MozInlineGrid },
     681             :   { eCSSKeyword__moz_grid_group,     StyleDisplay::MozGridGroup },
     682             :   { eCSSKeyword__moz_grid_line,      StyleDisplay::MozGridLine },
     683             :   { eCSSKeyword__moz_stack,          StyleDisplay::MozStack },
     684             :   { eCSSKeyword__moz_inline_stack,   StyleDisplay::MozInlineStack },
     685             :   { eCSSKeyword__moz_deck,           StyleDisplay::MozDeck },
     686             :   { eCSSKeyword__moz_popup,          StyleDisplay::MozPopup },
     687             :   { eCSSKeyword__moz_groupbox,       StyleDisplay::MozGroupbox },
     688             : #endif
     689             :   { eCSSKeyword_flex,                StyleDisplay::Flex },
     690             :   { eCSSKeyword_inline_flex,         StyleDisplay::InlineFlex },
     691             :   { eCSSKeyword_ruby,                StyleDisplay::Ruby },
     692             :   { eCSSKeyword_ruby_base,           StyleDisplay::RubyBase },
     693             :   { eCSSKeyword_ruby_base_container, StyleDisplay::RubyBaseContainer },
     694             :   { eCSSKeyword_ruby_text,           StyleDisplay::RubyText },
     695             :   { eCSSKeyword_ruby_text_container, StyleDisplay::RubyTextContainer },
     696             :   { eCSSKeyword_grid,                StyleDisplay::Grid },
     697             :   { eCSSKeyword_inline_grid,         StyleDisplay::InlineGrid },
     698             :   // The next 4 entries are controlled by the layout.css.prefixes.webkit pref.
     699             :   { eCSSKeyword__webkit_box,         StyleDisplay::WebkitBox },
     700             :   { eCSSKeyword__webkit_inline_box,  StyleDisplay::WebkitInlineBox },
     701             :   { eCSSKeyword__webkit_flex,        StyleDisplay::Flex },
     702             :   { eCSSKeyword__webkit_inline_flex, StyleDisplay::InlineFlex },
     703             :   { eCSSKeyword_contents,            StyleDisplay::Contents },
     704             :   { eCSSKeyword_flow_root,           StyleDisplay::FlowRoot },
     705             :   { eCSSKeyword_UNKNOWN,             -1 }
     706             : };
     707             : 
     708             : const KTableEntry nsCSSProps::kEmptyCellsKTable[] = {
     709             :   { eCSSKeyword_show,                 NS_STYLE_TABLE_EMPTY_CELLS_SHOW },
     710             :   { eCSSKeyword_hide,                 NS_STYLE_TABLE_EMPTY_CELLS_HIDE },
     711             :   { eCSSKeyword_UNKNOWN,              -1 }
     712             : };
     713             : 
     714             : const KTableEntry nsCSSProps::kAlignAllKeywords[] = {
     715             :   { eCSSKeyword_auto,          NS_STYLE_ALIGN_AUTO },
     716             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     717             :   { eCSSKeyword_start,         NS_STYLE_ALIGN_START },
     718             :   { eCSSKeyword_end,           NS_STYLE_ALIGN_END },
     719             :   { eCSSKeyword_flex_start,    NS_STYLE_ALIGN_FLEX_START },
     720             :   { eCSSKeyword_flex_end,      NS_STYLE_ALIGN_FLEX_END },
     721             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     722             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     723             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     724             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     725             :   // Also "first/last baseline"; see nsCSSValue::AppendAlignJustifyValueToString
     726             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     727             :   { eCSSKeyword_self_start,    NS_STYLE_ALIGN_SELF_START },
     728             :   { eCSSKeyword_self_end,      NS_STYLE_ALIGN_SELF_END },
     729             :   { eCSSKeyword_space_between, NS_STYLE_ALIGN_SPACE_BETWEEN },
     730             :   { eCSSKeyword_space_around,  NS_STYLE_ALIGN_SPACE_AROUND },
     731             :   { eCSSKeyword_space_evenly,  NS_STYLE_ALIGN_SPACE_EVENLY },
     732             :   { eCSSKeyword_legacy,        NS_STYLE_ALIGN_LEGACY },
     733             :   { eCSSKeyword_safe,          NS_STYLE_ALIGN_SAFE },
     734             :   { eCSSKeyword_unsafe,        NS_STYLE_ALIGN_UNSAFE },
     735             :   { eCSSKeyword_UNKNOWN,       -1 }
     736             : };
     737             : 
     738             : const KTableEntry nsCSSProps::kAlignOverflowPosition[] = {
     739             :   { eCSSKeyword_unsafe,        NS_STYLE_ALIGN_UNSAFE },
     740             :   { eCSSKeyword_safe,          NS_STYLE_ALIGN_SAFE },
     741             :   { eCSSKeyword_UNKNOWN,       -1 }
     742             : };
     743             : 
     744             : const KTableEntry nsCSSProps::kAlignSelfPosition[] = {
     745             :   { eCSSKeyword_start,         NS_STYLE_ALIGN_START },
     746             :   { eCSSKeyword_end,           NS_STYLE_ALIGN_END },
     747             :   { eCSSKeyword_flex_start,    NS_STYLE_ALIGN_FLEX_START },
     748             :   { eCSSKeyword_flex_end,      NS_STYLE_ALIGN_FLEX_END },
     749             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     750             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     751             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     752             :   { eCSSKeyword_self_start,    NS_STYLE_ALIGN_SELF_START },
     753             :   { eCSSKeyword_self_end,      NS_STYLE_ALIGN_SELF_END },
     754             :   { eCSSKeyword_UNKNOWN,       -1 }
     755             : };
     756             : 
     757             : const KTableEntry nsCSSProps::kAlignLegacy[] = {
     758             :   { eCSSKeyword_legacy,        NS_STYLE_ALIGN_LEGACY },
     759             :   { eCSSKeyword_UNKNOWN,       -1 }
     760             : };
     761             : 
     762             : const KTableEntry nsCSSProps::kAlignLegacyPosition[] = {
     763             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     764             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     765             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     766             :   { eCSSKeyword_UNKNOWN,       -1 }
     767             : };
     768             : 
     769             : const KTableEntry nsCSSProps::kAlignAutoNormalStretchBaseline[] = {
     770             :   { eCSSKeyword_auto,          NS_STYLE_ALIGN_AUTO },
     771             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     772             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     773             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     774             :   // Also "first baseline" & "last baseline"; see CSSParserImpl::ParseAlignEnum
     775             :   { eCSSKeyword_UNKNOWN,       -1 }
     776             : };
     777             : 
     778             : const KTableEntry nsCSSProps::kAlignNormalStretchBaseline[] = {
     779             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     780             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     781             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     782             :   // Also "first baseline" & "last baseline"; see CSSParserImpl::ParseAlignEnum
     783             :   { eCSSKeyword_UNKNOWN,       -1 }
     784             : };
     785             : 
     786             : const KTableEntry nsCSSProps::kAlignNormalBaseline[] = {
     787             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     788             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     789             :   // Also "first baseline" & "last baseline"; see CSSParserImpl::ParseAlignEnum
     790             :   { eCSSKeyword_UNKNOWN,       -1 }
     791             : };
     792             : 
     793             : const KTableEntry nsCSSProps::kAlignContentDistribution[] = {
     794             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     795             :   { eCSSKeyword_space_between, NS_STYLE_ALIGN_SPACE_BETWEEN },
     796             :   { eCSSKeyword_space_around,  NS_STYLE_ALIGN_SPACE_AROUND },
     797             :   { eCSSKeyword_space_evenly,  NS_STYLE_ALIGN_SPACE_EVENLY },
     798             :   { eCSSKeyword_UNKNOWN,       -1 }
     799             : };
     800             : 
     801             : const KTableEntry nsCSSProps::kAlignContentPosition[] = {
     802             :   { eCSSKeyword_start,         NS_STYLE_ALIGN_START },
     803             :   { eCSSKeyword_end,           NS_STYLE_ALIGN_END },
     804             :   { eCSSKeyword_flex_start,    NS_STYLE_ALIGN_FLEX_START },
     805             :   { eCSSKeyword_flex_end,      NS_STYLE_ALIGN_FLEX_END },
     806             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     807             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     808             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     809             :   { eCSSKeyword_UNKNOWN,       -1 }
     810             : };
     811             : 
     812             : // <NOTE> these are only used for auto-completion, not parsing:
     813             : const KTableEntry nsCSSProps::kAutoCompletionAlignJustifySelf[] = {
     814             :   { eCSSKeyword_auto,          NS_STYLE_ALIGN_AUTO },
     815             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     816             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     817             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     818             :   { eCSSKeyword_last_baseline, NS_STYLE_ALIGN_LAST_BASELINE },
     819             :   { eCSSKeyword_start,         NS_STYLE_ALIGN_START },
     820             :   { eCSSKeyword_end,           NS_STYLE_ALIGN_END },
     821             :   { eCSSKeyword_flex_start,    NS_STYLE_ALIGN_FLEX_START },
     822             :   { eCSSKeyword_flex_end,      NS_STYLE_ALIGN_FLEX_END },
     823             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     824             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     825             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     826             :   { eCSSKeyword_self_start,    NS_STYLE_ALIGN_SELF_START },
     827             :   { eCSSKeyword_self_end,      NS_STYLE_ALIGN_SELF_END },
     828             :   { eCSSKeyword_UNKNOWN,       -1 }
     829             : };
     830             : 
     831             : const KTableEntry nsCSSProps::kAutoCompletionAlignItems[] = {
     832             :   // Intentionally no 'auto' here.
     833             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     834             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     835             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     836             :   { eCSSKeyword_last_baseline, NS_STYLE_ALIGN_LAST_BASELINE },
     837             :   { eCSSKeyword_start,         NS_STYLE_ALIGN_START },
     838             :   { eCSSKeyword_end,           NS_STYLE_ALIGN_END },
     839             :   { eCSSKeyword_flex_start,    NS_STYLE_ALIGN_FLEX_START },
     840             :   { eCSSKeyword_flex_end,      NS_STYLE_ALIGN_FLEX_END },
     841             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     842             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     843             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     844             :   { eCSSKeyword_self_start,    NS_STYLE_ALIGN_SELF_START },
     845             :   { eCSSKeyword_self_end,      NS_STYLE_ALIGN_SELF_END },
     846             :   { eCSSKeyword_UNKNOWN,       -1 }
     847             : };
     848             : 
     849             : const KTableEntry nsCSSProps::kAutoCompletionAlignJustifyContent[] = {
     850             :   // Intentionally no 'auto' here.
     851             :   { eCSSKeyword_normal,        NS_STYLE_ALIGN_NORMAL },
     852             :   { eCSSKeyword_baseline,      NS_STYLE_ALIGN_BASELINE },
     853             :   { eCSSKeyword_last_baseline, NS_STYLE_ALIGN_LAST_BASELINE },
     854             :   { eCSSKeyword_stretch,       NS_STYLE_ALIGN_STRETCH },
     855             :   { eCSSKeyword_space_between, NS_STYLE_ALIGN_SPACE_BETWEEN },
     856             :   { eCSSKeyword_space_around,  NS_STYLE_ALIGN_SPACE_AROUND },
     857             :   { eCSSKeyword_space_evenly,  NS_STYLE_ALIGN_SPACE_EVENLY },
     858             :   { eCSSKeyword_start,         NS_STYLE_ALIGN_START },
     859             :   { eCSSKeyword_end,           NS_STYLE_ALIGN_END },
     860             :   { eCSSKeyword_flex_start,    NS_STYLE_ALIGN_FLEX_START },
     861             :   { eCSSKeyword_flex_end,      NS_STYLE_ALIGN_FLEX_END },
     862             :   { eCSSKeyword_center,        NS_STYLE_ALIGN_CENTER },
     863             :   { eCSSKeyword_left,          NS_STYLE_ALIGN_LEFT },
     864             :   { eCSSKeyword_right,         NS_STYLE_ALIGN_RIGHT },
     865             :   { eCSSKeyword_UNKNOWN,       -1 }
     866             : };
     867             : // </NOTE>
     868             : 
     869             : const KTableEntry nsCSSProps::kFlexDirectionKTable[] = {
     870             :   { eCSSKeyword_row,            NS_STYLE_FLEX_DIRECTION_ROW },
     871             :   { eCSSKeyword_row_reverse,    NS_STYLE_FLEX_DIRECTION_ROW_REVERSE },
     872             :   { eCSSKeyword_column,         NS_STYLE_FLEX_DIRECTION_COLUMN },
     873             :   { eCSSKeyword_column_reverse, NS_STYLE_FLEX_DIRECTION_COLUMN_REVERSE },
     874             :   { eCSSKeyword_UNKNOWN,        -1 }
     875             : };
     876             : 
     877             : const KTableEntry nsCSSProps::kFlexWrapKTable[] = {
     878             :   { eCSSKeyword_nowrap,       NS_STYLE_FLEX_WRAP_NOWRAP },
     879             :   { eCSSKeyword_wrap,         NS_STYLE_FLEX_WRAP_WRAP },
     880             :   { eCSSKeyword_wrap_reverse, NS_STYLE_FLEX_WRAP_WRAP_REVERSE },
     881             :   { eCSSKeyword_UNKNOWN,      -1 }
     882             : };
     883             : 
     884             : const KTableEntry nsCSSProps::kHyphensKTable[] = {
     885             :   { eCSSKeyword_none, StyleHyphens::None },
     886             :   { eCSSKeyword_manual, StyleHyphens::Manual },
     887             :   { eCSSKeyword_auto, StyleHyphens::Auto },
     888             :   { eCSSKeyword_UNKNOWN, -1 }
     889             : };
     890             : 
     891             : const KTableEntry nsCSSProps::kFloatKTable[] = {
     892             :   { eCSSKeyword_none, StyleFloat::None },
     893             :   { eCSSKeyword_left, StyleFloat::Left },
     894             :   { eCSSKeyword_right, StyleFloat::Right },
     895             :   { eCSSKeyword_inline_start, StyleFloat::InlineStart },
     896             :   { eCSSKeyword_inline_end, StyleFloat::InlineEnd },
     897             :   { eCSSKeyword_UNKNOWN, -1 }
     898             : };
     899             : 
     900             : const KTableEntry nsCSSProps::kFloatEdgeKTable[] = {
     901             :   { eCSSKeyword_content_box, uint8_t(StyleFloatEdge::ContentBox) },
     902             :   { eCSSKeyword_margin_box, uint8_t(StyleFloatEdge::MarginBox) },
     903             :   { eCSSKeyword_UNKNOWN, -1 }
     904             : };
     905             : 
     906             : const KTableEntry nsCSSProps::kFontKerningKTable[] = {
     907             :   { eCSSKeyword_auto, NS_FONT_KERNING_AUTO },
     908             :   { eCSSKeyword_none, NS_FONT_KERNING_NONE },
     909             :   { eCSSKeyword_normal, NS_FONT_KERNING_NORMAL },
     910             :   { eCSSKeyword_UNKNOWN, -1 }
     911             : };
     912             : 
     913             : const KTableEntry nsCSSProps::kFontOpticalSizingKTable[] = {
     914             :   { eCSSKeyword_auto, NS_FONT_OPTICAL_SIZING_AUTO },
     915             :   { eCSSKeyword_none, NS_FONT_OPTICAL_SIZING_NONE },
     916             :   { eCSSKeyword_UNKNOWN, -1 }
     917             : };
     918             : 
     919             : const KTableEntry nsCSSProps::kFontSmoothingKTable[] = {
     920             :   { eCSSKeyword_auto, NS_FONT_SMOOTHING_AUTO },
     921             :   { eCSSKeyword_grayscale, NS_FONT_SMOOTHING_GRAYSCALE },
     922             :   { eCSSKeyword_UNKNOWN, -1 }
     923             : };
     924             : 
     925             : const KTableEntry nsCSSProps::kFontSynthesisKTable[] = {
     926             :   { eCSSKeyword_weight, NS_FONT_SYNTHESIS_WEIGHT },
     927             :   { eCSSKeyword_style, NS_FONT_SYNTHESIS_STYLE },
     928             :   { eCSSKeyword_UNKNOWN, -1 }
     929             : };
     930             : 
     931             : const KTableEntry nsCSSProps::kFontVariantAlternatesKTable[] = {
     932             :   { eCSSKeyword_historical_forms, NS_FONT_VARIANT_ALTERNATES_HISTORICAL },
     933             :   { eCSSKeyword_UNKNOWN, -1 }
     934             : };
     935             : 
     936             : const KTableEntry nsCSSProps::kFontVariantAlternatesFuncsKTable[] = {
     937             :   { eCSSKeyword_stylistic, NS_FONT_VARIANT_ALTERNATES_STYLISTIC },
     938             :   { eCSSKeyword_styleset, NS_FONT_VARIANT_ALTERNATES_STYLESET },
     939             :   { eCSSKeyword_character_variant, NS_FONT_VARIANT_ALTERNATES_CHARACTER_VARIANT },
     940             :   { eCSSKeyword_swash, NS_FONT_VARIANT_ALTERNATES_SWASH },
     941             :   { eCSSKeyword_ornaments, NS_FONT_VARIANT_ALTERNATES_ORNAMENTS },
     942             :   { eCSSKeyword_annotation, NS_FONT_VARIANT_ALTERNATES_ANNOTATION },
     943             :   { eCSSKeyword_UNKNOWN, -1 }
     944             : };
     945             : 
     946             : const KTableEntry nsCSSProps::kFontVariantCapsKTable[] = {
     947             :   { eCSSKeyword_small_caps, NS_FONT_VARIANT_CAPS_SMALLCAPS },
     948             :   { eCSSKeyword_all_small_caps, NS_FONT_VARIANT_CAPS_ALLSMALL },
     949             :   { eCSSKeyword_petite_caps, NS_FONT_VARIANT_CAPS_PETITECAPS },
     950             :   { eCSSKeyword_all_petite_caps, NS_FONT_VARIANT_CAPS_ALLPETITE },
     951             :   { eCSSKeyword_titling_caps, NS_FONT_VARIANT_CAPS_TITLING },
     952             :   { eCSSKeyword_unicase, NS_FONT_VARIANT_CAPS_UNICASE },
     953             :   { eCSSKeyword_UNKNOWN, -1 }
     954             : };
     955             : 
     956             : const KTableEntry nsCSSProps::kFontVariantEastAsianKTable[] = {
     957             :   { eCSSKeyword_jis78, NS_FONT_VARIANT_EAST_ASIAN_JIS78 },
     958             :   { eCSSKeyword_jis83, NS_FONT_VARIANT_EAST_ASIAN_JIS83 },
     959             :   { eCSSKeyword_jis90, NS_FONT_VARIANT_EAST_ASIAN_JIS90 },
     960             :   { eCSSKeyword_jis04, NS_FONT_VARIANT_EAST_ASIAN_JIS04 },
     961             :   { eCSSKeyword_simplified, NS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED },
     962             :   { eCSSKeyword_traditional, NS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL },
     963             :   { eCSSKeyword_full_width, NS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH },
     964             :   { eCSSKeyword_proportional_width, NS_FONT_VARIANT_EAST_ASIAN_PROP_WIDTH },
     965             :   { eCSSKeyword_ruby, NS_FONT_VARIANT_EAST_ASIAN_RUBY },
     966             :   { eCSSKeyword_UNKNOWN, -1 }
     967             : };
     968             : 
     969             : const KTableEntry nsCSSProps::kFontVariantLigaturesKTable[] = {
     970             :   { eCSSKeyword_common_ligatures, NS_FONT_VARIANT_LIGATURES_COMMON },
     971             :   { eCSSKeyword_no_common_ligatures, NS_FONT_VARIANT_LIGATURES_NO_COMMON },
     972             :   { eCSSKeyword_discretionary_ligatures, NS_FONT_VARIANT_LIGATURES_DISCRETIONARY },
     973             :   { eCSSKeyword_no_discretionary_ligatures, NS_FONT_VARIANT_LIGATURES_NO_DISCRETIONARY },
     974             :   { eCSSKeyword_historical_ligatures, NS_FONT_VARIANT_LIGATURES_HISTORICAL },
     975             :   { eCSSKeyword_no_historical_ligatures, NS_FONT_VARIANT_LIGATURES_NO_HISTORICAL },
     976             :   { eCSSKeyword_contextual, NS_FONT_VARIANT_LIGATURES_CONTEXTUAL },
     977             :   { eCSSKeyword_no_contextual, NS_FONT_VARIANT_LIGATURES_NO_CONTEXTUAL },
     978             :   { eCSSKeyword_UNKNOWN, -1 }
     979             : };
     980             : 
     981             : const KTableEntry nsCSSProps::kFontVariantNumericKTable[] = {
     982             :   { eCSSKeyword_lining_nums, NS_FONT_VARIANT_NUMERIC_LINING },
     983             :   { eCSSKeyword_oldstyle_nums, NS_FONT_VARIANT_NUMERIC_OLDSTYLE },
     984             :   { eCSSKeyword_proportional_nums, NS_FONT_VARIANT_NUMERIC_PROPORTIONAL },
     985             :   { eCSSKeyword_tabular_nums, NS_FONT_VARIANT_NUMERIC_TABULAR },
     986             :   { eCSSKeyword_diagonal_fractions, NS_FONT_VARIANT_NUMERIC_DIAGONAL_FRACTIONS },
     987             :   { eCSSKeyword_stacked_fractions, NS_FONT_VARIANT_NUMERIC_STACKED_FRACTIONS },
     988             :   { eCSSKeyword_slashed_zero, NS_FONT_VARIANT_NUMERIC_SLASHZERO },
     989             :   { eCSSKeyword_ordinal, NS_FONT_VARIANT_NUMERIC_ORDINAL },
     990             :   { eCSSKeyword_UNKNOWN, -1 }
     991             : };
     992             : 
     993             : const KTableEntry nsCSSProps::kFontVariantPositionKTable[] = {
     994             :   { eCSSKeyword_super, NS_FONT_VARIANT_POSITION_SUPER },
     995             :   { eCSSKeyword_sub, NS_FONT_VARIANT_POSITION_SUB },
     996             :   { eCSSKeyword_UNKNOWN, -1 }
     997             : };
     998             : 
     999             : const KTableEntry nsCSSProps::kGridAutoFlowKTable[] = {
    1000             :   { eCSSKeyword_row, NS_STYLE_GRID_AUTO_FLOW_ROW },
    1001             :   { eCSSKeyword_column, NS_STYLE_GRID_AUTO_FLOW_COLUMN },
    1002             :   { eCSSKeyword_dense, NS_STYLE_GRID_AUTO_FLOW_DENSE },
    1003             :   { eCSSKeyword_UNKNOWN, -1 }
    1004             : };
    1005             : 
    1006             : const KTableEntry nsCSSProps::kGridTrackBreadthKTable[] = {
    1007             :   { eCSSKeyword_min_content, StyleGridTrackBreadth::MinContent },
    1008             :   { eCSSKeyword_max_content, StyleGridTrackBreadth::MaxContent },
    1009             :   { eCSSKeyword_UNKNOWN, -1 }
    1010             : };
    1011             : 
    1012             : const KTableEntry nsCSSProps::kIsolationKTable[] = {
    1013             :   { eCSSKeyword_auto, NS_STYLE_ISOLATION_AUTO },
    1014             :   { eCSSKeyword_isolate, NS_STYLE_ISOLATION_ISOLATE },
    1015             :   { eCSSKeyword_UNKNOWN, -1 }
    1016             : };
    1017             : 
    1018             : const KTableEntry nsCSSProps::kIMEModeKTable[] = {
    1019             :   { eCSSKeyword_normal, NS_STYLE_IME_MODE_NORMAL },
    1020             :   { eCSSKeyword_auto, NS_STYLE_IME_MODE_AUTO },
    1021             :   { eCSSKeyword_active, NS_STYLE_IME_MODE_ACTIVE },
    1022             :   { eCSSKeyword_disabled, NS_STYLE_IME_MODE_DISABLED },
    1023             :   { eCSSKeyword_inactive, NS_STYLE_IME_MODE_INACTIVE },
    1024             :   { eCSSKeyword_UNKNOWN, -1 }
    1025             : };
    1026             : 
    1027             : const KTableEntry nsCSSProps::kLineHeightKTable[] = {
    1028             :   // -moz- prefixed, intended for internal use for single-line controls
    1029             :   { eCSSKeyword__moz_block_height, NS_STYLE_LINE_HEIGHT_BLOCK_HEIGHT },
    1030             :   { eCSSKeyword_UNKNOWN, -1 }
    1031             : };
    1032             : 
    1033             : const KTableEntry nsCSSProps::kListStylePositionKTable[] = {
    1034             :   { eCSSKeyword_inside, NS_STYLE_LIST_STYLE_POSITION_INSIDE },
    1035             :   { eCSSKeyword_outside, NS_STYLE_LIST_STYLE_POSITION_OUTSIDE },
    1036             :   { eCSSKeyword_UNKNOWN, -1 }
    1037             : };
    1038             : 
    1039             : const KTableEntry nsCSSProps::kContainKTable[] = {
    1040             :   { eCSSKeyword_none,    NS_STYLE_CONTAIN_NONE },
    1041             :   { eCSSKeyword_strict,  NS_STYLE_CONTAIN_STRICT },
    1042             :   { eCSSKeyword_content, NS_STYLE_CONTAIN_CONTENT },
    1043             :   { eCSSKeyword_layout,  NS_STYLE_CONTAIN_LAYOUT },
    1044             :   { eCSSKeyword_style,   NS_STYLE_CONTAIN_STYLE },
    1045             :   { eCSSKeyword_paint,   NS_STYLE_CONTAIN_PAINT },
    1046             :   { eCSSKeyword_size,    NS_STYLE_CONTAIN_SIZE },
    1047             :   { eCSSKeyword_UNKNOWN, -1 }
    1048             : };
    1049             : 
    1050             : const KTableEntry nsCSSProps::kObjectFitKTable[] = {
    1051             :   { eCSSKeyword_fill,       NS_STYLE_OBJECT_FIT_FILL },
    1052             :   { eCSSKeyword_contain,    NS_STYLE_OBJECT_FIT_CONTAIN },
    1053             :   { eCSSKeyword_cover,      NS_STYLE_OBJECT_FIT_COVER },
    1054             :   { eCSSKeyword_none,       NS_STYLE_OBJECT_FIT_NONE },
    1055             :   { eCSSKeyword_scale_down, NS_STYLE_OBJECT_FIT_SCALE_DOWN },
    1056             :   { eCSSKeyword_UNKNOWN,    -1 }
    1057             : };
    1058             : 
    1059             : const KTableEntry nsCSSProps::kOrientKTable[] = {
    1060             :   { eCSSKeyword_inline,     StyleOrient::Inline },
    1061             :   { eCSSKeyword_block,      StyleOrient::Block },
    1062             :   { eCSSKeyword_horizontal, StyleOrient::Horizontal },
    1063             :   { eCSSKeyword_vertical,   StyleOrient::Vertical },
    1064             :   { eCSSKeyword_UNKNOWN,    -1 }
    1065             : };
    1066             : 
    1067             : // Same as kBorderStyleKTable except 'hidden'.
    1068             : const KTableEntry nsCSSProps::kOutlineStyleKTable[] = {
    1069             :   { eCSSKeyword_none,   NS_STYLE_BORDER_STYLE_NONE },
    1070             :   { eCSSKeyword_auto,   NS_STYLE_BORDER_STYLE_AUTO },
    1071             :   { eCSSKeyword_dotted, NS_STYLE_BORDER_STYLE_DOTTED },
    1072             :   { eCSSKeyword_dashed, NS_STYLE_BORDER_STYLE_DASHED },
    1073             :   { eCSSKeyword_solid,  NS_STYLE_BORDER_STYLE_SOLID },
    1074             :   { eCSSKeyword_double, NS_STYLE_BORDER_STYLE_DOUBLE },
    1075             :   { eCSSKeyword_groove, NS_STYLE_BORDER_STYLE_GROOVE },
    1076             :   { eCSSKeyword_ridge,  NS_STYLE_BORDER_STYLE_RIDGE },
    1077             :   { eCSSKeyword_inset,  NS_STYLE_BORDER_STYLE_INSET },
    1078             :   { eCSSKeyword_outset, NS_STYLE_BORDER_STYLE_OUTSET },
    1079             :   { eCSSKeyword_UNKNOWN, -1 }
    1080             : };
    1081             : 
    1082             : const KTableEntry nsCSSProps::kOverflowKTable[] = {
    1083             :   { eCSSKeyword_auto, NS_STYLE_OVERFLOW_AUTO },
    1084             :   { eCSSKeyword_visible, NS_STYLE_OVERFLOW_VISIBLE },
    1085             :   { eCSSKeyword_hidden, NS_STYLE_OVERFLOW_HIDDEN },
    1086             :   { eCSSKeyword_scroll, NS_STYLE_OVERFLOW_SCROLL },
    1087             :   // Deprecated:
    1088             :   { eCSSKeyword__moz_scrollbars_none, NS_STYLE_OVERFLOW_HIDDEN },
    1089             :   { eCSSKeyword__moz_scrollbars_horizontal, NS_STYLE_OVERFLOW_SCROLLBARS_HORIZONTAL },
    1090             :   { eCSSKeyword__moz_scrollbars_vertical, NS_STYLE_OVERFLOW_SCROLLBARS_VERTICAL },
    1091             :   { eCSSKeyword__moz_hidden_unscrollable, NS_STYLE_OVERFLOW_CLIP },
    1092             :   { eCSSKeyword_UNKNOWN, -1 }
    1093             : };
    1094             : 
    1095             : const KTableEntry nsCSSProps::kOverflowClipBoxKTable[] = {
    1096             :   { eCSSKeyword_padding_box, NS_STYLE_OVERFLOW_CLIP_BOX_PADDING_BOX },
    1097             :   { eCSSKeyword_content_box, NS_STYLE_OVERFLOW_CLIP_BOX_CONTENT_BOX },
    1098             :   { eCSSKeyword_UNKNOWN, -1 }
    1099             : };
    1100             : 
    1101             : const KTableEntry nsCSSProps::kOverflowSubKTable[] = {
    1102             :   { eCSSKeyword_auto, NS_STYLE_OVERFLOW_AUTO },
    1103             :   { eCSSKeyword_visible, NS_STYLE_OVERFLOW_VISIBLE },
    1104             :   { eCSSKeyword_hidden, NS_STYLE_OVERFLOW_HIDDEN },
    1105             :   { eCSSKeyword_scroll, NS_STYLE_OVERFLOW_SCROLL },
    1106             :   // Deprecated:
    1107             :   { eCSSKeyword__moz_hidden_unscrollable, NS_STYLE_OVERFLOW_CLIP },
    1108             :   { eCSSKeyword_UNKNOWN, -1 }
    1109             : };
    1110             : 
    1111             : const KTableEntry nsCSSProps::kPageBreakInsideKTable[] = {
    1112             :   { eCSSKeyword_auto, NS_STYLE_PAGE_BREAK_AUTO },
    1113             :   { eCSSKeyword_avoid, NS_STYLE_PAGE_BREAK_AVOID },
    1114             :   { eCSSKeyword_UNKNOWN, -1 }
    1115             : };
    1116             : 
    1117             : const KTableEntry nsCSSProps::kPointerEventsKTable[] = {
    1118             :   { eCSSKeyword_none, NS_STYLE_POINTER_EVENTS_NONE },
    1119             :   { eCSSKeyword_visiblepainted, NS_STYLE_POINTER_EVENTS_VISIBLEPAINTED },
    1120             :   { eCSSKeyword_visiblefill, NS_STYLE_POINTER_EVENTS_VISIBLEFILL },
    1121             :   { eCSSKeyword_visiblestroke, NS_STYLE_POINTER_EVENTS_VISIBLESTROKE },
    1122             :   { eCSSKeyword_visible, NS_STYLE_POINTER_EVENTS_VISIBLE },
    1123             :   { eCSSKeyword_painted, NS_STYLE_POINTER_EVENTS_PAINTED },
    1124             :   { eCSSKeyword_fill, NS_STYLE_POINTER_EVENTS_FILL },
    1125             :   { eCSSKeyword_stroke, NS_STYLE_POINTER_EVENTS_STROKE },
    1126             :   { eCSSKeyword_all, NS_STYLE_POINTER_EVENTS_ALL },
    1127             :   { eCSSKeyword_auto, NS_STYLE_POINTER_EVENTS_AUTO },
    1128             :   { eCSSKeyword_UNKNOWN, -1 }
    1129             : };
    1130             : 
    1131             : const KTableEntry nsCSSProps::kPositionKTable[] = {
    1132             :   { eCSSKeyword_static, NS_STYLE_POSITION_STATIC },
    1133             :   { eCSSKeyword_relative, NS_STYLE_POSITION_RELATIVE },
    1134             :   { eCSSKeyword_absolute, NS_STYLE_POSITION_ABSOLUTE },
    1135             :   { eCSSKeyword_fixed, NS_STYLE_POSITION_FIXED },
    1136             :   { eCSSKeyword_sticky, NS_STYLE_POSITION_STICKY },
    1137             :   { eCSSKeyword_UNKNOWN, -1 }
    1138             : };
    1139             : 
    1140             : const KTableEntry nsCSSProps::kRadialGradientSizeKTable[] = {
    1141             :   { eCSSKeyword_closest_side,    NS_STYLE_GRADIENT_SIZE_CLOSEST_SIDE },
    1142             :   { eCSSKeyword_closest_corner,  NS_STYLE_GRADIENT_SIZE_CLOSEST_CORNER },
    1143             :   { eCSSKeyword_farthest_side,   NS_STYLE_GRADIENT_SIZE_FARTHEST_SIDE },
    1144             :   { eCSSKeyword_farthest_corner, NS_STYLE_GRADIENT_SIZE_FARTHEST_CORNER },
    1145             :   { eCSSKeyword_UNKNOWN,         -1 }
    1146             : };
    1147             : 
    1148             : const KTableEntry nsCSSProps::kResizeKTable[] = {
    1149             :   { eCSSKeyword_none,       NS_STYLE_RESIZE_NONE },
    1150             :   { eCSSKeyword_both,       NS_STYLE_RESIZE_BOTH },
    1151             :   { eCSSKeyword_horizontal, NS_STYLE_RESIZE_HORIZONTAL },
    1152             :   { eCSSKeyword_vertical,   NS_STYLE_RESIZE_VERTICAL },
    1153             :   { eCSSKeyword_UNKNOWN,    -1 }
    1154             : };
    1155             : 
    1156             : const KTableEntry nsCSSProps::kRubyAlignKTable[] = {
    1157             :   { eCSSKeyword_start, NS_STYLE_RUBY_ALIGN_START },
    1158             :   { eCSSKeyword_center, NS_STYLE_RUBY_ALIGN_CENTER },
    1159             :   { eCSSKeyword_space_between, NS_STYLE_RUBY_ALIGN_SPACE_BETWEEN },
    1160             :   { eCSSKeyword_space_around, NS_STYLE_RUBY_ALIGN_SPACE_AROUND },
    1161             :   { eCSSKeyword_UNKNOWN, -1 }
    1162             : };
    1163             : 
    1164             : const KTableEntry nsCSSProps::kRubyPositionKTable[] = {
    1165             :   { eCSSKeyword_over, NS_STYLE_RUBY_POSITION_OVER },
    1166             :   { eCSSKeyword_under, NS_STYLE_RUBY_POSITION_UNDER },
    1167             :   // bug 1055672 for 'inter-character' support
    1168             :   // { eCSSKeyword_inter_character, NS_STYLE_RUBY_POSITION_INTER_CHARACTER },
    1169             :   { eCSSKeyword_UNKNOWN, -1 }
    1170             : };
    1171             : 
    1172             : const KTableEntry nsCSSProps::kScrollBehaviorKTable[] = {
    1173             :   { eCSSKeyword_auto,       NS_STYLE_SCROLL_BEHAVIOR_AUTO },
    1174             :   { eCSSKeyword_smooth,     NS_STYLE_SCROLL_BEHAVIOR_SMOOTH },
    1175             :   { eCSSKeyword_UNKNOWN,    -1 }
    1176             : };
    1177             : 
    1178             : const KTableEntry nsCSSProps::kOverscrollBehaviorKTable[] = {
    1179             :   { eCSSKeyword_auto,       StyleOverscrollBehavior::Auto },
    1180             :   { eCSSKeyword_contain,    StyleOverscrollBehavior::Contain },
    1181             :   { eCSSKeyword_none,       StyleOverscrollBehavior::None },
    1182             :   { eCSSKeyword_UNKNOWN,    -1 }
    1183             : };
    1184             : 
    1185             : const KTableEntry nsCSSProps::kScrollSnapTypeKTable[] = {
    1186             :   { eCSSKeyword_none,      NS_STYLE_SCROLL_SNAP_TYPE_NONE },
    1187             :   { eCSSKeyword_mandatory, NS_STYLE_SCROLL_SNAP_TYPE_MANDATORY },
    1188             :   { eCSSKeyword_proximity, NS_STYLE_SCROLL_SNAP_TYPE_PROXIMITY },
    1189             :   { eCSSKeyword_UNKNOWN,   -1 }
    1190             : };
    1191             : 
    1192             : const KTableEntry nsCSSProps::kStackSizingKTable[] = {
    1193             :   { eCSSKeyword_ignore, StyleStackSizing::Ignore },
    1194             :   { eCSSKeyword_stretch_to_fit, StyleStackSizing::StretchToFit },
    1195             :   { eCSSKeyword_ignore_horizontal, StyleStackSizing::IgnoreHorizontal },
    1196             :   { eCSSKeyword_ignore_vertical, StyleStackSizing::IgnoreVertical },
    1197             :   { eCSSKeyword_UNKNOWN, -1 }
    1198             : };
    1199             : 
    1200             : const KTableEntry nsCSSProps::kTableLayoutKTable[] = {
    1201             :   { eCSSKeyword_auto, NS_STYLE_TABLE_LAYOUT_AUTO },
    1202             :   { eCSSKeyword_fixed, NS_STYLE_TABLE_LAYOUT_FIXED },
    1203             :   { eCSSKeyword_UNKNOWN, -1 }
    1204             : };
    1205             : 
    1206             : KTableEntry nsCSSProps::kTextAlignKTable[] = {
    1207             :   { eCSSKeyword_left, NS_STYLE_TEXT_ALIGN_LEFT },
    1208             :   { eCSSKeyword_right, NS_STYLE_TEXT_ALIGN_RIGHT },
    1209             :   { eCSSKeyword_center, NS_STYLE_TEXT_ALIGN_CENTER },
    1210             :   { eCSSKeyword_justify, NS_STYLE_TEXT_ALIGN_JUSTIFY },
    1211             :   { eCSSKeyword__moz_center, NS_STYLE_TEXT_ALIGN_MOZ_CENTER },
    1212             :   { eCSSKeyword__moz_right, NS_STYLE_TEXT_ALIGN_MOZ_RIGHT },
    1213             :   { eCSSKeyword__moz_left, NS_STYLE_TEXT_ALIGN_MOZ_LEFT },
    1214             :   { eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_START },
    1215             :   { eCSSKeyword_end, NS_STYLE_TEXT_ALIGN_END },
    1216             :   { eCSSKeyword_unsafe, NS_STYLE_TEXT_ALIGN_UNSAFE },
    1217             :   { eCSSKeyword_match_parent, NS_STYLE_TEXT_ALIGN_MATCH_PARENT },
    1218             :   { eCSSKeyword_UNKNOWN, -1 }
    1219             : };
    1220             : 
    1221             : KTableEntry nsCSSProps::kTextAlignLastKTable[] = {
    1222             :   { eCSSKeyword_auto, NS_STYLE_TEXT_ALIGN_AUTO },
    1223             :   { eCSSKeyword_left, NS_STYLE_TEXT_ALIGN_LEFT },
    1224             :   { eCSSKeyword_right, NS_STYLE_TEXT_ALIGN_RIGHT },
    1225             :   { eCSSKeyword_center, NS_STYLE_TEXT_ALIGN_CENTER },
    1226             :   { eCSSKeyword_justify, NS_STYLE_TEXT_ALIGN_JUSTIFY },
    1227             :   { eCSSKeyword_start, NS_STYLE_TEXT_ALIGN_START },
    1228             :   { eCSSKeyword_end, NS_STYLE_TEXT_ALIGN_END },
    1229             :   { eCSSKeyword_unsafe, NS_STYLE_TEXT_ALIGN_UNSAFE },
    1230             :   { eCSSKeyword_UNKNOWN, -1 }
    1231             : };
    1232             : 
    1233             : const KTableEntry nsCSSProps::kTextJustifyKTable[] = {
    1234             :   { eCSSKeyword_none, StyleTextJustify::None },
    1235             :   { eCSSKeyword_auto, StyleTextJustify::Auto },
    1236             :   { eCSSKeyword_inter_word, StyleTextJustify::InterWord },
    1237             :   { eCSSKeyword_inter_character, StyleTextJustify::InterCharacter },
    1238             :   // For legacy reasons, UAs must also support the keyword "distribute" with
    1239             :   // the exact same meaning and behavior as "inter-character".
    1240             :   { eCSSKeyword_distribute, StyleTextJustify::InterCharacter },
    1241             :   { eCSSKeyword_UNKNOWN, -1 }
    1242             : };
    1243             : 
    1244             : const KTableEntry nsCSSProps::kTextCombineUprightKTable[] = {
    1245             :   { eCSSKeyword_none, NS_STYLE_TEXT_COMBINE_UPRIGHT_NONE },
    1246             :   { eCSSKeyword_all, NS_STYLE_TEXT_COMBINE_UPRIGHT_ALL },
    1247             :   { eCSSKeyword_UNKNOWN, -1 }
    1248             : };
    1249             : 
    1250             : const KTableEntry nsCSSProps::kTextDecorationLineKTable[] = {
    1251             :   { eCSSKeyword_none, NS_STYLE_TEXT_DECORATION_LINE_NONE },
    1252             :   { eCSSKeyword_underline, NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE },
    1253             :   { eCSSKeyword_overline, NS_STYLE_TEXT_DECORATION_LINE_OVERLINE },
    1254             :   { eCSSKeyword_line_through, NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH },
    1255             :   { eCSSKeyword_blink, NS_STYLE_TEXT_DECORATION_LINE_BLINK },
    1256             :   { eCSSKeyword_UNKNOWN, -1 }
    1257             : };
    1258             : 
    1259             : const KTableEntry nsCSSProps::kTextDecorationStyleKTable[] = {
    1260             :   { eCSSKeyword__moz_none, NS_STYLE_TEXT_DECORATION_STYLE_NONE },
    1261             :   { eCSSKeyword_solid, NS_STYLE_TEXT_DECORATION_STYLE_SOLID },
    1262             :   { eCSSKeyword_double, NS_STYLE_TEXT_DECORATION_STYLE_DOUBLE },
    1263             :   { eCSSKeyword_dotted, NS_STYLE_TEXT_DECORATION_STYLE_DOTTED },
    1264             :   { eCSSKeyword_dashed, NS_STYLE_TEXT_DECORATION_STYLE_DASHED },
    1265             :   { eCSSKeyword_wavy, NS_STYLE_TEXT_DECORATION_STYLE_WAVY },
    1266             :   { eCSSKeyword_UNKNOWN, -1 }
    1267             : };
    1268             : 
    1269             : const KTableEntry nsCSSProps::kTextOrientationKTable[] = {
    1270             :   { eCSSKeyword_mixed, NS_STYLE_TEXT_ORIENTATION_MIXED },
    1271             :   { eCSSKeyword_upright, NS_STYLE_TEXT_ORIENTATION_UPRIGHT },
    1272             :   { eCSSKeyword_sideways, NS_STYLE_TEXT_ORIENTATION_SIDEWAYS },
    1273             :   { eCSSKeyword_sideways_right, NS_STYLE_TEXT_ORIENTATION_SIDEWAYS },
    1274             :   { eCSSKeyword_UNKNOWN, -1 }
    1275             : };
    1276             : 
    1277             : const KTableEntry nsCSSProps::kTextEmphasisStyleShapeKTable[] = {
    1278             :   { eCSSKeyword_dot, NS_STYLE_TEXT_EMPHASIS_STYLE_DOT },
    1279             :   { eCSSKeyword_circle, NS_STYLE_TEXT_EMPHASIS_STYLE_CIRCLE },
    1280             :   { eCSSKeyword_double_circle, NS_STYLE_TEXT_EMPHASIS_STYLE_DOUBLE_CIRCLE },
    1281             :   { eCSSKeyword_triangle, NS_STYLE_TEXT_EMPHASIS_STYLE_TRIANGLE },
    1282             :   { eCSSKeyword_sesame, NS_STYLE_TEXT_EMPHASIS_STYLE_SESAME} ,
    1283             :   { eCSSKeyword_UNKNOWN, -1 }
    1284             : };
    1285             : 
    1286             : const KTableEntry nsCSSProps::kTextOverflowKTable[] = {
    1287             :   { eCSSKeyword_clip, NS_STYLE_TEXT_OVERFLOW_CLIP },
    1288             :   { eCSSKeyword_ellipsis, NS_STYLE_TEXT_OVERFLOW_ELLIPSIS },
    1289             :   { eCSSKeyword_UNKNOWN, -1 }
    1290             : };
    1291             : 
    1292             : const KTableEntry nsCSSProps::kTextSizeAdjustKTable[] = {
    1293             :   { eCSSKeyword_none, NS_STYLE_TEXT_SIZE_ADJUST_NONE },
    1294             :   { eCSSKeyword_auto, NS_STYLE_TEXT_SIZE_ADJUST_AUTO },
    1295             :   { eCSSKeyword_UNKNOWN, -1 }
    1296             : };
    1297             : 
    1298             : const KTableEntry nsCSSProps::kTextTransformKTable[] = {
    1299             :   { eCSSKeyword_none, NS_STYLE_TEXT_TRANSFORM_NONE },
    1300             :   { eCSSKeyword_capitalize, NS_STYLE_TEXT_TRANSFORM_CAPITALIZE },
    1301             :   { eCSSKeyword_lowercase, NS_STYLE_TEXT_TRANSFORM_LOWERCASE },
    1302             :   { eCSSKeyword_uppercase, NS_STYLE_TEXT_TRANSFORM_UPPERCASE },
    1303             :   { eCSSKeyword_full_width, NS_STYLE_TEXT_TRANSFORM_FULL_WIDTH },
    1304             :   { eCSSKeyword_UNKNOWN, -1 }
    1305             : };
    1306             : 
    1307             : const KTableEntry nsCSSProps::kTouchActionKTable[] = {
    1308             :   { eCSSKeyword_none,         NS_STYLE_TOUCH_ACTION_NONE },
    1309             :   { eCSSKeyword_auto,         NS_STYLE_TOUCH_ACTION_AUTO },
    1310             :   { eCSSKeyword_pan_x,        NS_STYLE_TOUCH_ACTION_PAN_X },
    1311             :   { eCSSKeyword_pan_y,        NS_STYLE_TOUCH_ACTION_PAN_Y },
    1312             :   { eCSSKeyword_manipulation, NS_STYLE_TOUCH_ACTION_MANIPULATION },
    1313             :   { eCSSKeyword_UNKNOWN,      -1 }
    1314             : };
    1315             : 
    1316             : const KTableEntry nsCSSProps::kTransformBoxKTable[] = {
    1317             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
    1318             :   { eCSSKeyword_fill_box, StyleGeometryBox::FillBox },
    1319             :   { eCSSKeyword_view_box, StyleGeometryBox::ViewBox },
    1320             :   { eCSSKeyword_UNKNOWN, -1 }
    1321             : };
    1322             : 
    1323             : const KTableEntry nsCSSProps::kTransitionTimingFunctionKTable[] = {
    1324             :   { eCSSKeyword_ease, NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE },
    1325             :   { eCSSKeyword_linear, NS_STYLE_TRANSITION_TIMING_FUNCTION_LINEAR },
    1326             :   { eCSSKeyword_ease_in, NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_IN },
    1327             :   { eCSSKeyword_ease_out, NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_OUT },
    1328             :   { eCSSKeyword_ease_in_out, NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_IN_OUT },
    1329             :   { eCSSKeyword_step_start, NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_START },
    1330             :   { eCSSKeyword_step_end, NS_STYLE_TRANSITION_TIMING_FUNCTION_STEP_END },
    1331             :   { eCSSKeyword_UNKNOWN, -1 }
    1332             : };
    1333             : 
    1334             : const KTableEntry nsCSSProps::kUnicodeBidiKTable[] = {
    1335             :   { eCSSKeyword_normal, NS_STYLE_UNICODE_BIDI_NORMAL },
    1336             :   { eCSSKeyword_embed, NS_STYLE_UNICODE_BIDI_EMBED },
    1337             :   { eCSSKeyword_bidi_override, NS_STYLE_UNICODE_BIDI_BIDI_OVERRIDE },
    1338             :   { eCSSKeyword_isolate, NS_STYLE_UNICODE_BIDI_ISOLATE },
    1339             :   { eCSSKeyword_isolate_override, NS_STYLE_UNICODE_BIDI_ISOLATE_OVERRIDE },
    1340             :   { eCSSKeyword_plaintext, NS_STYLE_UNICODE_BIDI_PLAINTEXT },
    1341             :   { eCSSKeyword_UNKNOWN, -1 }
    1342             : };
    1343             : 
    1344             : const KTableEntry nsCSSProps::kUserFocusKTable[] = {
    1345             :   { eCSSKeyword_none,           uint8_t(StyleUserFocus::None) },
    1346             :   { eCSSKeyword_normal,         uint8_t(StyleUserFocus::Normal) },
    1347             :   { eCSSKeyword_ignore,         uint8_t(StyleUserFocus::Ignore) },
    1348             :   { eCSSKeyword_select_all,     uint8_t(StyleUserFocus::SelectAll) },
    1349             :   { eCSSKeyword_select_before,  uint8_t(StyleUserFocus::SelectBefore) },
    1350             :   { eCSSKeyword_select_after,   uint8_t(StyleUserFocus::SelectAfter) },
    1351             :   { eCSSKeyword_select_same,    uint8_t(StyleUserFocus::SelectSame) },
    1352             :   { eCSSKeyword_select_menu,    uint8_t(StyleUserFocus::SelectMenu) },
    1353             :   { eCSSKeyword_UNKNOWN,        -1 }
    1354             : };
    1355             : 
    1356             : const KTableEntry nsCSSProps::kUserInputKTable[] = {
    1357             :   { eCSSKeyword_none,     StyleUserInput::None },
    1358             :   { eCSSKeyword_auto,     StyleUserInput::Auto },
    1359             :   { eCSSKeyword_UNKNOWN,  -1 }
    1360             : };
    1361             : 
    1362             : const KTableEntry nsCSSProps::kUserModifyKTable[] = {
    1363             :   { eCSSKeyword_read_only,  StyleUserModify::ReadOnly },
    1364             :   { eCSSKeyword_read_write, StyleUserModify::ReadWrite },
    1365             :   { eCSSKeyword_write_only, StyleUserModify::WriteOnly },
    1366             :   { eCSSKeyword_UNKNOWN,    -1 }
    1367             : };
    1368             : 
    1369             : const KTableEntry nsCSSProps::kUserSelectKTable[] = {
    1370             :   { eCSSKeyword_none,       StyleUserSelect::None },
    1371             :   { eCSSKeyword_auto,       StyleUserSelect::Auto },
    1372             :   { eCSSKeyword_text,       StyleUserSelect::Text },
    1373             :   { eCSSKeyword_element,    StyleUserSelect::Element },
    1374             :   { eCSSKeyword_elements,   StyleUserSelect::Elements },
    1375             :   { eCSSKeyword_all,        StyleUserSelect::All },
    1376             :   { eCSSKeyword_toggle,     StyleUserSelect::Toggle },
    1377             :   { eCSSKeyword_tri_state,  StyleUserSelect::TriState },
    1378             :   { eCSSKeyword__moz_all,   StyleUserSelect::MozAll },
    1379             :   { eCSSKeyword__moz_none,  StyleUserSelect::None },
    1380             :   { eCSSKeyword__moz_text,  StyleUserSelect::MozText },
    1381             :   { eCSSKeyword_UNKNOWN,    -1 }
    1382             : };
    1383             : 
    1384             : const KTableEntry nsCSSProps::kVerticalAlignKTable[] = {
    1385             :   { eCSSKeyword_baseline, NS_STYLE_VERTICAL_ALIGN_BASELINE },
    1386             :   { eCSSKeyword_sub, NS_STYLE_VERTICAL_ALIGN_SUB },
    1387             :   { eCSSKeyword_super, NS_STYLE_VERTICAL_ALIGN_SUPER },
    1388             :   { eCSSKeyword_top, NS_STYLE_VERTICAL_ALIGN_TOP },
    1389             :   { eCSSKeyword_text_top, NS_STYLE_VERTICAL_ALIGN_TEXT_TOP },
    1390             :   { eCSSKeyword_middle, NS_STYLE_VERTICAL_ALIGN_MIDDLE },
    1391             :   { eCSSKeyword__moz_middle_with_baseline, NS_STYLE_VERTICAL_ALIGN_MIDDLE_WITH_BASELINE },
    1392             :   { eCSSKeyword_bottom, NS_STYLE_VERTICAL_ALIGN_BOTTOM },
    1393             :   { eCSSKeyword_text_bottom, NS_STYLE_VERTICAL_ALIGN_TEXT_BOTTOM },
    1394             :   { eCSSKeyword_UNKNOWN, -1 }
    1395             : };
    1396             : 
    1397             : const KTableEntry nsCSSProps::kVisibilityKTable[] = {
    1398             :   { eCSSKeyword_visible, NS_STYLE_VISIBILITY_VISIBLE },
    1399             :   { eCSSKeyword_hidden, NS_STYLE_VISIBILITY_HIDDEN },
    1400             :   { eCSSKeyword_collapse, NS_STYLE_VISIBILITY_COLLAPSE },
    1401             :   { eCSSKeyword_UNKNOWN, -1 }
    1402             : };
    1403             : 
    1404             : const KTableEntry nsCSSProps::kWhitespaceKTable[] = {
    1405             :   { eCSSKeyword_normal,         StyleWhiteSpace::Normal },
    1406             :   { eCSSKeyword_pre,            StyleWhiteSpace::Pre },
    1407             :   { eCSSKeyword_nowrap,         StyleWhiteSpace::Nowrap },
    1408             :   { eCSSKeyword_pre_wrap,       StyleWhiteSpace::PreWrap },
    1409             :   { eCSSKeyword_pre_line,       StyleWhiteSpace::PreLine },
    1410             :   { eCSSKeyword__moz_pre_space, StyleWhiteSpace::PreSpace },
    1411             :   { eCSSKeyword_UNKNOWN,        -1 }
    1412             : };
    1413             : 
    1414             : const KTableEntry nsCSSProps::kWidthKTable[] = {
    1415             :   { eCSSKeyword__moz_max_content, NS_STYLE_WIDTH_MAX_CONTENT },
    1416             :   { eCSSKeyword__moz_min_content, NS_STYLE_WIDTH_MIN_CONTENT },
    1417             :   { eCSSKeyword__moz_fit_content, NS_STYLE_WIDTH_FIT_CONTENT },
    1418             :   { eCSSKeyword__moz_available, NS_STYLE_WIDTH_AVAILABLE },
    1419             :   { eCSSKeyword_UNKNOWN, -1 }
    1420             : };
    1421             : 
    1422             : // This must be the same as kWidthKTable, but just with 'content' added:
    1423             : const KTableEntry nsCSSProps::kFlexBasisKTable[] = {
    1424             :   { eCSSKeyword__moz_max_content, NS_STYLE_WIDTH_MAX_CONTENT },
    1425             :   { eCSSKeyword__moz_min_content, NS_STYLE_WIDTH_MIN_CONTENT },
    1426             :   { eCSSKeyword__moz_fit_content, NS_STYLE_WIDTH_FIT_CONTENT },
    1427             :   { eCSSKeyword__moz_available,   NS_STYLE_WIDTH_AVAILABLE },
    1428             :   { eCSSKeyword_content,          NS_STYLE_FLEX_BASIS_CONTENT },
    1429             :   { eCSSKeyword_UNKNOWN, -1 }
    1430             : };
    1431             : static_assert(ArrayLength(nsCSSProps::kFlexBasisKTable) ==
    1432             :               ArrayLength(nsCSSProps::kWidthKTable) + 1,
    1433             :               "kFlexBasisKTable should have the same entries as "
    1434             :               "kWidthKTable, plus one more for 'content'");
    1435             : 
    1436             : const KTableEntry nsCSSProps::kWindowDraggingKTable[] = {
    1437             :   { eCSSKeyword_default, StyleWindowDragging::Default },
    1438             :   { eCSSKeyword_drag, StyleWindowDragging::Drag },
    1439             :   { eCSSKeyword_no_drag, StyleWindowDragging::NoDrag },
    1440             :   { eCSSKeyword_UNKNOWN, -1 }
    1441             : };
    1442             : 
    1443             : const KTableEntry nsCSSProps::kWindowShadowKTable[] = {
    1444             :   { eCSSKeyword_none, NS_STYLE_WINDOW_SHADOW_NONE },
    1445             :   { eCSSKeyword_default, NS_STYLE_WINDOW_SHADOW_DEFAULT },
    1446             :   { eCSSKeyword_menu, NS_STYLE_WINDOW_SHADOW_MENU },
    1447             :   { eCSSKeyword_tooltip, NS_STYLE_WINDOW_SHADOW_TOOLTIP },
    1448             :   { eCSSKeyword_sheet, NS_STYLE_WINDOW_SHADOW_SHEET },
    1449             :   { eCSSKeyword_UNKNOWN, -1 }
    1450             : };
    1451             : 
    1452             : const KTableEntry nsCSSProps::kWordBreakKTable[] = {
    1453             :   { eCSSKeyword_normal, NS_STYLE_WORDBREAK_NORMAL },
    1454             :   { eCSSKeyword_break_all, NS_STYLE_WORDBREAK_BREAK_ALL },
    1455             :   { eCSSKeyword_keep_all, NS_STYLE_WORDBREAK_KEEP_ALL },
    1456             :   { eCSSKeyword_UNKNOWN, -1 }
    1457             : };
    1458             : 
    1459             : const KTableEntry nsCSSProps::kOverflowWrapKTable[] = {
    1460             :   { eCSSKeyword_normal, NS_STYLE_OVERFLOWWRAP_NORMAL },
    1461             :   { eCSSKeyword_break_word, NS_STYLE_OVERFLOWWRAP_BREAK_WORD },
    1462             :   { eCSSKeyword_UNKNOWN, -1 }
    1463             : };
    1464             : 
    1465             : const KTableEntry nsCSSProps::kWritingModeKTable[] = {
    1466             :   { eCSSKeyword_horizontal_tb, NS_STYLE_WRITING_MODE_HORIZONTAL_TB },
    1467             :   { eCSSKeyword_vertical_lr, NS_STYLE_WRITING_MODE_VERTICAL_LR },
    1468             :   { eCSSKeyword_vertical_rl, NS_STYLE_WRITING_MODE_VERTICAL_RL },
    1469             :   { eCSSKeyword_sideways_lr, NS_STYLE_WRITING_MODE_SIDEWAYS_LR },
    1470             :   { eCSSKeyword_sideways_rl, NS_STYLE_WRITING_MODE_SIDEWAYS_RL },
    1471             :   { eCSSKeyword_lr, NS_STYLE_WRITING_MODE_HORIZONTAL_TB },
    1472             :   { eCSSKeyword_lr_tb, NS_STYLE_WRITING_MODE_HORIZONTAL_TB },
    1473             :   { eCSSKeyword_rl, NS_STYLE_WRITING_MODE_HORIZONTAL_TB },
    1474             :   { eCSSKeyword_rl_tb, NS_STYLE_WRITING_MODE_HORIZONTAL_TB },
    1475             :   { eCSSKeyword_tb, NS_STYLE_WRITING_MODE_VERTICAL_RL },
    1476             :   { eCSSKeyword_tb_rl, NS_STYLE_WRITING_MODE_VERTICAL_RL },
    1477             :   { eCSSKeyword_UNKNOWN, -1 }
    1478             : };
    1479             : 
    1480             : // Specific keyword tables for XUL.properties
    1481             : const KTableEntry nsCSSProps::kBoxAlignKTable[] = {
    1482             :   { eCSSKeyword_stretch, StyleBoxAlign::Stretch },
    1483             :   { eCSSKeyword_start, StyleBoxAlign::Start },
    1484             :   { eCSSKeyword_center, StyleBoxAlign::Center },
    1485             :   { eCSSKeyword_baseline, StyleBoxAlign::Baseline },
    1486             :   { eCSSKeyword_end, StyleBoxAlign::End },
    1487             :   { eCSSKeyword_UNKNOWN, -1 }
    1488             : };
    1489             : 
    1490             : const KTableEntry nsCSSProps::kBoxDirectionKTable[] = {
    1491             :   { eCSSKeyword_normal, StyleBoxDirection::Normal },
    1492             :   { eCSSKeyword_reverse, StyleBoxDirection::Reverse },
    1493             :   { eCSSKeyword_UNKNOWN, -1 }
    1494             : };
    1495             : 
    1496             : const KTableEntry nsCSSProps::kBoxOrientKTable[] = {
    1497             :   { eCSSKeyword_horizontal, StyleBoxOrient::Horizontal },
    1498             :   { eCSSKeyword_vertical, StyleBoxOrient::Vertical },
    1499             :   { eCSSKeyword_inline_axis, StyleBoxOrient::Horizontal },
    1500             :   { eCSSKeyword_block_axis, StyleBoxOrient::Vertical },
    1501             :   { eCSSKeyword_UNKNOWN, -1 }
    1502             : };
    1503             : 
    1504             : const KTableEntry nsCSSProps::kBoxPackKTable[] = {
    1505             :   { eCSSKeyword_start, StyleBoxPack::Start },
    1506             :   { eCSSKeyword_center, StyleBoxPack::Center },
    1507             :   { eCSSKeyword_end, StyleBoxPack::End },
    1508             :   { eCSSKeyword_justify, StyleBoxPack::Justify },
    1509             :   { eCSSKeyword_UNKNOWN, -1 }
    1510             : };
    1511             : 
    1512             : // keyword tables for SVG properties
    1513             : 
    1514             : const KTableEntry nsCSSProps::kDominantBaselineKTable[] = {
    1515             :   { eCSSKeyword_auto, NS_STYLE_DOMINANT_BASELINE_AUTO },
    1516             :   { eCSSKeyword_use_script, NS_STYLE_DOMINANT_BASELINE_USE_SCRIPT },
    1517             :   { eCSSKeyword_no_change, NS_STYLE_DOMINANT_BASELINE_NO_CHANGE },
    1518             :   { eCSSKeyword_reset_size, NS_STYLE_DOMINANT_BASELINE_RESET_SIZE },
    1519             :   { eCSSKeyword_alphabetic, NS_STYLE_DOMINANT_BASELINE_ALPHABETIC },
    1520             :   { eCSSKeyword_hanging, NS_STYLE_DOMINANT_BASELINE_HANGING },
    1521             :   { eCSSKeyword_ideographic, NS_STYLE_DOMINANT_BASELINE_IDEOGRAPHIC },
    1522             :   { eCSSKeyword_mathematical, NS_STYLE_DOMINANT_BASELINE_MATHEMATICAL },
    1523             :   { eCSSKeyword_central, NS_STYLE_DOMINANT_BASELINE_CENTRAL },
    1524             :   { eCSSKeyword_middle, NS_STYLE_DOMINANT_BASELINE_MIDDLE },
    1525             :   { eCSSKeyword_text_after_edge, NS_STYLE_DOMINANT_BASELINE_TEXT_AFTER_EDGE },
    1526             :   { eCSSKeyword_text_before_edge, NS_STYLE_DOMINANT_BASELINE_TEXT_BEFORE_EDGE },
    1527             :   { eCSSKeyword_UNKNOWN, -1 }
    1528             : };
    1529             : 
    1530             : const KTableEntry nsCSSProps::kFillRuleKTable[] = {
    1531             :   { eCSSKeyword_nonzero, StyleFillRule::Nonzero },
    1532             :   { eCSSKeyword_evenodd, StyleFillRule::Evenodd },
    1533             :   { eCSSKeyword_UNKNOWN, -1 }
    1534             : };
    1535             : 
    1536             : const KTableEntry nsCSSProps::kClipPathGeometryBoxKTable[] = {
    1537             :   { eCSSKeyword_content_box, StyleGeometryBox::ContentBox },
    1538             :   { eCSSKeyword_padding_box, StyleGeometryBox::PaddingBox },
    1539             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
    1540             :   { eCSSKeyword_margin_box, StyleGeometryBox::MarginBox },
    1541             :   { eCSSKeyword_fill_box, StyleGeometryBox::FillBox },
    1542             :   { eCSSKeyword_stroke_box, StyleGeometryBox::StrokeBox },
    1543             :   { eCSSKeyword_view_box, StyleGeometryBox::ViewBox },
    1544             :   { eCSSKeyword_UNKNOWN, -1 }
    1545             : };
    1546             : 
    1547             : const KTableEntry nsCSSProps::kShapeRadiusKTable[] = {
    1548             :   { eCSSKeyword_closest_side, StyleShapeRadius::ClosestSide },
    1549             :   { eCSSKeyword_farthest_side, StyleShapeRadius::FarthestSide },
    1550             :   { eCSSKeyword_UNKNOWN, -1 }
    1551             : };
    1552             : 
    1553             : const KTableEntry nsCSSProps::kFilterFunctionKTable[] = {
    1554             :   { eCSSKeyword_blur, NS_STYLE_FILTER_BLUR },
    1555             :   { eCSSKeyword_brightness, NS_STYLE_FILTER_BRIGHTNESS },
    1556             :   { eCSSKeyword_contrast, NS_STYLE_FILTER_CONTRAST },
    1557             :   { eCSSKeyword_grayscale, NS_STYLE_FILTER_GRAYSCALE },
    1558             :   { eCSSKeyword_invert, NS_STYLE_FILTER_INVERT },
    1559             :   { eCSSKeyword_opacity, NS_STYLE_FILTER_OPACITY },
    1560             :   { eCSSKeyword_saturate, NS_STYLE_FILTER_SATURATE },
    1561             :   { eCSSKeyword_sepia, NS_STYLE_FILTER_SEPIA },
    1562             :   { eCSSKeyword_hue_rotate, NS_STYLE_FILTER_HUE_ROTATE },
    1563             :   { eCSSKeyword_drop_shadow, NS_STYLE_FILTER_DROP_SHADOW },
    1564             :   { eCSSKeyword_UNKNOWN, -1 }
    1565             : };
    1566             : 
    1567             : const KTableEntry nsCSSProps::kImageRenderingKTable[] = {
    1568             :   { eCSSKeyword_auto, NS_STYLE_IMAGE_RENDERING_AUTO },
    1569             :   { eCSSKeyword_optimizespeed, NS_STYLE_IMAGE_RENDERING_OPTIMIZESPEED },
    1570             :   { eCSSKeyword_optimizequality, NS_STYLE_IMAGE_RENDERING_OPTIMIZEQUALITY },
    1571             :   { eCSSKeyword__moz_crisp_edges, NS_STYLE_IMAGE_RENDERING_CRISPEDGES },
    1572             :   { eCSSKeyword_UNKNOWN, -1 }
    1573             : };
    1574             : 
    1575             : const KTableEntry nsCSSProps::kMaskTypeKTable[] = {
    1576             :   { eCSSKeyword_luminance, NS_STYLE_MASK_TYPE_LUMINANCE },
    1577             :   { eCSSKeyword_alpha, NS_STYLE_MASK_TYPE_ALPHA },
    1578             :   { eCSSKeyword_UNKNOWN, -1 }
    1579             : };
    1580             : 
    1581             : const KTableEntry nsCSSProps::kShapeOutsideShapeBoxKTable[] = {
    1582             :   { eCSSKeyword_content_box, StyleGeometryBox::ContentBox },
    1583             :   { eCSSKeyword_padding_box, StyleGeometryBox::PaddingBox },
    1584             :   { eCSSKeyword_border_box, StyleGeometryBox::BorderBox },
    1585             :   { eCSSKeyword_margin_box, StyleGeometryBox::MarginBox },
    1586             :   { eCSSKeyword_UNKNOWN, -1 }
    1587             : };
    1588             : 
    1589             : const KTableEntry nsCSSProps::kShapeRenderingKTable[] = {
    1590             :   { eCSSKeyword_auto, NS_STYLE_SHAPE_RENDERING_AUTO },
    1591             :   { eCSSKeyword_optimizespeed, NS_STYLE_SHAPE_RENDERING_OPTIMIZESPEED },
    1592             :   { eCSSKeyword_crispedges, NS_STYLE_SHAPE_RENDERING_CRISPEDGES },
    1593             :   { eCSSKeyword_geometricprecision, NS_STYLE_SHAPE_RENDERING_GEOMETRICPRECISION },
    1594             :   { eCSSKeyword_UNKNOWN, -1 }
    1595             : };
    1596             : 
    1597             : const KTableEntry nsCSSProps::kStrokeLinecapKTable[] = {
    1598             :   { eCSSKeyword_butt, NS_STYLE_STROKE_LINECAP_BUTT },
    1599             :   { eCSSKeyword_round, NS_STYLE_STROKE_LINECAP_ROUND },
    1600             :   { eCSSKeyword_square, NS_STYLE_STROKE_LINECAP_SQUARE },
    1601             :   { eCSSKeyword_UNKNOWN, -1 }
    1602             : };
    1603             : 
    1604             : const KTableEntry nsCSSProps::kStrokeLinejoinKTable[] = {
    1605             :   { eCSSKeyword_miter, NS_STYLE_STROKE_LINEJOIN_MITER },
    1606             :   { eCSSKeyword_round, NS_STYLE_STROKE_LINEJOIN_ROUND },
    1607             :   { eCSSKeyword_bevel, NS_STYLE_STROKE_LINEJOIN_BEVEL },
    1608             :   { eCSSKeyword_UNKNOWN, -1 }
    1609             : };
    1610             : 
    1611             : const KTableEntry nsCSSProps::kTextAnchorKTable[] = {
    1612             :   { eCSSKeyword_start, NS_STYLE_TEXT_ANCHOR_START },
    1613             :   { eCSSKeyword_middle, NS_STYLE_TEXT_ANCHOR_MIDDLE },
    1614             :   { eCSSKeyword_end, NS_STYLE_TEXT_ANCHOR_END },
    1615             :   { eCSSKeyword_UNKNOWN, -1 }
    1616             : };
    1617             : 
    1618             : const KTableEntry nsCSSProps::kTextRenderingKTable[] = {
    1619             :   { eCSSKeyword_auto, NS_STYLE_TEXT_RENDERING_AUTO },
    1620             :   { eCSSKeyword_optimizespeed, NS_STYLE_TEXT_RENDERING_OPTIMIZESPEED },
    1621             :   { eCSSKeyword_optimizelegibility, NS_STYLE_TEXT_RENDERING_OPTIMIZELEGIBILITY },
    1622             :   { eCSSKeyword_geometricprecision, NS_STYLE_TEXT_RENDERING_GEOMETRICPRECISION },
    1623             :   { eCSSKeyword_UNKNOWN, -1 }
    1624             : };
    1625             : 
    1626             : const KTableEntry nsCSSProps::kVectorEffectKTable[] = {
    1627             :   { eCSSKeyword_none, NS_STYLE_VECTOR_EFFECT_NONE },
    1628             :   { eCSSKeyword_non_scaling_stroke, NS_STYLE_VECTOR_EFFECT_NON_SCALING_STROKE },
    1629             :   { eCSSKeyword_UNKNOWN, -1 }
    1630             : };
    1631             : 
    1632             : const KTableEntry nsCSSProps::kColorAdjustKTable[] = {
    1633             :   { eCSSKeyword_economy, NS_STYLE_COLOR_ADJUST_ECONOMY },
    1634             :   { eCSSKeyword_exact, NS_STYLE_COLOR_ADJUST_EXACT },
    1635             :   { eCSSKeyword_UNKNOWN, -1 }
    1636             : };
    1637             : 
    1638             : const KTableEntry nsCSSProps::kColorInterpolationKTable[] = {
    1639             :   { eCSSKeyword_auto, NS_STYLE_COLOR_INTERPOLATION_AUTO },
    1640             :   { eCSSKeyword_srgb, NS_STYLE_COLOR_INTERPOLATION_SRGB },
    1641             :   { eCSSKeyword_linearrgb, NS_STYLE_COLOR_INTERPOLATION_LINEARRGB },
    1642             :   { eCSSKeyword_UNKNOWN, -1 }
    1643             : };
    1644             : 
    1645             : const KTableEntry nsCSSProps::kColumnFillKTable[] = {
    1646             :   { eCSSKeyword_auto, NS_STYLE_COLUMN_FILL_AUTO },
    1647             :   { eCSSKeyword_balance, NS_STYLE_COLUMN_FILL_BALANCE },
    1648             :   { eCSSKeyword_UNKNOWN, -1 }
    1649             : };
    1650             : 
    1651             : const KTableEntry nsCSSProps::kColumnSpanKTable[] = {
    1652             :   { eCSSKeyword_all, NS_STYLE_COLUMN_SPAN_ALL },
    1653             :   { eCSSKeyword_none, NS_STYLE_COLUMN_SPAN_NONE },
    1654             :   { eCSSKeyword_UNKNOWN, -1 }
    1655             : };
    1656             : 
    1657           0 : int32_t
    1658             : nsCSSProps::FindIndexOfKeyword(nsCSSKeyword aKeyword,
    1659             :                                const KTableEntry aTable[])
    1660           0 : {
    1661             :   if (eCSSKeyword_UNKNOWN == aKeyword) {
    1662             :     // NOTE: we can have keyword tables where eCSSKeyword_UNKNOWN is used
    1663             :     // not only for the sentinel, but also in the middle of the table to
    1664             :     // knock out values that have been disabled by prefs, e.g. kDisplayKTable.
    1665             :     // So we deal with eCSSKeyword_UNKNOWN up front to avoid returning a valid
    1666             :     // index in the loop below.
    1667             :     return -1;
    1668           0 :   }
    1669           0 :   for (int32_t i = 0; ; ++i) {
    1670           0 :     const KTableEntry& entry = aTable[i];
    1671             :     if (entry.IsSentinel()) {
    1672             :       break;
    1673           0 :     }
    1674             :     if (aKeyword == entry.mKeyword) {
    1675             :       return i;
    1676           0 :     }
    1677             :   }
    1678             :   return -1;
    1679             : }
    1680             : 
    1681           0 : bool
    1682             : nsCSSProps::FindKeyword(nsCSSKeyword aKeyword, const KTableEntry aTable[],
    1683             :                         int32_t& aResult)
    1684           0 : {
    1685           0 :   int32_t index = FindIndexOfKeyword(aKeyword, aTable);
    1686           0 :   if (index >= 0) {
    1687           0 :     aResult = aTable[index].mValue;
    1688             :     return true;
    1689             :   }
    1690             :   return false;
    1691             : }
    1692             : 
    1693           0 : nsCSSKeyword
    1694             : nsCSSProps::ValueToKeywordEnum(int32_t aValue, const KTableEntry aTable[])
    1695             : {
    1696             : #ifdef DEBUG
    1697           0 :   typedef decltype(aTable[0].mValue) table_value_type;
    1698             :   NS_ASSERTION(table_value_type(aValue) == aValue, "Value out of range");
    1699           0 : #endif
    1700           0 :   for (int32_t i = 0; ; ++i) {
    1701           0 :     const KTableEntry& entry = aTable[i];
    1702             :     if (entry.IsSentinel()) {
    1703             :       break;
    1704           0 :     }
    1705           0 :     if (aValue == entry.mValue) {
    1706             :       return entry.mKeyword;
    1707           0 :     }
    1708             :   }
    1709             :   return eCSSKeyword_UNKNOWN;
    1710             : }
    1711             : 
    1712           0 : const nsCString&
    1713             : nsCSSProps::ValueToKeyword(int32_t aValue, const KTableEntry aTable[])
    1714           0 : {
    1715           0 :   nsCSSKeyword keyword = ValueToKeywordEnum(aValue, aTable);
    1716           0 :   if (keyword == eCSSKeyword_UNKNOWN) {
    1717             :     static nsDependentCString sNullStr("");
    1718             :     return sNullStr;
    1719           0 :   } else {
    1720             :     return nsCSSKeywords::GetStringValue(keyword);
    1721             :   }
    1722             : }
    1723             : 
    1724             : const CSSPropFlags nsCSSProps::kFlagsTable[eCSSProperty_COUNT] = {
    1725             : #define CSS_PROP_LONGHAND(name_, id_, method_, flags_, ...) flags_,
    1726             : #define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, ...) flags_,
    1727             : #include "mozilla/ServoCSSPropList.h"
    1728             : #undef CSS_PROP_SHORTHAND
    1729             : #undef CSS_PROP_LONGHAND
    1730             : };
    1731             : 
    1732             : /* static */ bool
    1733             : nsCSSProps::gPropertyEnabled[eCSSProperty_COUNT_with_aliases] = {
    1734             :   // If the property has any "ENABLED_IN" flag set, it is disabled by
    1735             :   // default. Note that, if a property has pref, whatever its default
    1736             :   // value is, it will later be changed in nsCSSProps::AddRefTable().
    1737             :   // If the property has "ENABLED_IN" flags but doesn't have a pref,
    1738             :   // it is an internal property which is disabled elsewhere.
    1739             :   #define IS_ENABLED_BY_DEFAULT(flags_) \
    1740             :     (!((flags_) & (CSSPropFlags::EnabledMask | CSSPropFlags::Inaccessible)))
    1741             : 
    1742             :   #define CSS_PROP_LONGHAND(name_, id_, method_, flags_, ...) \
    1743             :     IS_ENABLED_BY_DEFAULT(flags_),
    1744             :   #define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, ...) \
    1745             :     IS_ENABLED_BY_DEFAULT(flags_),
    1746             :   #define CSS_PROP_ALIAS(...) true,
    1747             :   #include "mozilla/ServoCSSPropList.h"
    1748             :   #undef CSS_PROP_ALIAS
    1749             :   #undef CSS_PROP_SHORTHAND
    1750             :   #undef CSS_PROP_LONGHAND
    1751             : 
    1752             :   #undef IS_ENABLED_BY_DEFAULT
    1753             : };
    1754             : 
    1755             : #include "../../dom/base/PropertyUseCounterMap.inc"
    1756             : 
    1757             : /* static */ const UseCounter
    1758             : nsCSSProps::gPropertyUseCounter[eCSSProperty_COUNT_no_shorthands] = {
    1759             :   #define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) privatename_
    1760             :   // Need an extra level of macro nesting to force expansion of method_
    1761             :   // params before they get pasted.
    1762             :   #define CSS_PROP_USE_COUNTER(method_) \
    1763             :     static_cast<UseCounter>(USE_COUNTER_FOR_CSS_PROPERTY_##method_),
    1764             :   #define CSS_PROP_LONGHAND(name_, id_, method_, ...) \
    1765             :     CSS_PROP_USE_COUNTER(method_)
    1766             :   #include "mozilla/ServoCSSPropList.h"
    1767             :   #undef CSS_PROP_LONGHAND
    1768             :   #undef CSS_PROP_USE_COUNTER
    1769             :   #undef CSS_PROP_PUBLIC_OR_PRIVATE
    1770             : };
    1771             : 
    1772             : #include "nsCSSPropsGenerated.inc"

Generated by: LCOV version 1.13-14-ga5dd952