summaryrefslogtreecommitdiffstats
path: root/layout/style/nsCSSKeywords.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layout/style/nsCSSKeywords.cpp')
-rw-r--r--layout/style/nsCSSKeywords.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/layout/style/nsCSSKeywords.cpp b/layout/style/nsCSSKeywords.cpp
new file mode 100644
index 000000000..8dd362e7c
--- /dev/null
+++ b/layout/style/nsCSSKeywords.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* keywords used within CSS property values */
+
+#include "nsCSSKeywords.h"
+#include "nsString.h"
+#include "nsStaticNameTable.h"
+
+// required to make the symbol external, so that TestCSSPropertyLookup.cpp can link with it
+extern const char* const kCSSRawKeywords[];
+
+// define an array of all CSS keywords
+#define CSS_KEY(_name,_id) #_name,
+const char* const kCSSRawKeywords[] = {
+#include "nsCSSKeywordList.h"
+};
+#undef CSS_KEY
+
+static int32_t gKeywordTableRefCount;
+static nsStaticCaseInsensitiveNameTable* gKeywordTable;
+
+void
+nsCSSKeywords::AddRefTable(void)
+{
+ if (0 == gKeywordTableRefCount++) {
+ NS_ASSERTION(!gKeywordTable, "pre existing array!");
+ gKeywordTable =
+ new nsStaticCaseInsensitiveNameTable(kCSSRawKeywords, eCSSKeyword_COUNT);
+#ifdef DEBUG
+ // Partially verify the entries.
+ int32_t index = 0;
+ for (; index < eCSSKeyword_COUNT && kCSSRawKeywords[index]; ++index) {
+ nsAutoCString temp(kCSSRawKeywords[index]);
+ NS_ASSERTION(-1 == temp.FindChar('_'), "underscore char in table");
+ }
+ NS_ASSERTION(index == eCSSKeyword_COUNT, "kCSSRawKeywords and eCSSKeyword_COUNT are out of sync");
+#endif
+ }
+}
+
+void
+nsCSSKeywords::ReleaseTable(void)
+{
+ if (0 == --gKeywordTableRefCount) {
+ if (gKeywordTable) {
+ delete gKeywordTable;
+ gKeywordTable = nullptr;
+ }
+ }
+}
+
+nsCSSKeyword
+nsCSSKeywords::LookupKeyword(const nsACString& aKeyword)
+{
+ NS_ASSERTION(gKeywordTable, "no lookup table, needs addref");
+ if (gKeywordTable) {
+ return nsCSSKeyword(gKeywordTable->Lookup(aKeyword));
+ }
+ return eCSSKeyword_UNKNOWN;
+}
+
+nsCSSKeyword
+nsCSSKeywords::LookupKeyword(const nsAString& aKeyword)
+{
+ NS_ASSERTION(gKeywordTable, "no lookup table, needs addref");
+ if (gKeywordTable) {
+ return nsCSSKeyword(gKeywordTable->Lookup(aKeyword));
+ }
+ return eCSSKeyword_UNKNOWN;
+}
+
+const nsAFlatCString&
+nsCSSKeywords::GetStringValue(nsCSSKeyword aKeyword)
+{
+ NS_ASSERTION(gKeywordTable, "no lookup table, needs addref");
+ NS_ASSERTION(0 <= aKeyword && aKeyword < eCSSKeyword_COUNT, "out of range");
+ if (gKeywordTable) {
+ return gKeywordTable->GetStringValue(int32_t(aKeyword));
+ } else {
+ static nsDependentCString kNullStr("");
+ return kNullStr;
+ }
+}
+