gecko-dev/dom/security/PolicyTokenizer.h

79 lines
2.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef PolicyTokenizer_h___
#define PolicyTokenizer_h___
#include "nsContentUtils.h"
#include "nsString.h"
/**
* How does the parsing work?
*
* We generate tokens by splitting the policy-string by whitespace and
* semicolon. Interally the tokens are represented as an array of string-arrays:
*
* [
* [ name, src, src, src, ... ],
* [ name, src, src, src, ... ],
* [ name, src, src, src, ... ]
* ]
*
* for example:
* [
* [ img-src, http://www.example.com, http:www.test.com ],
* [ default-src, 'self'],
* [ script-src, 'unsafe-eval', 'unsafe-inline' ],
* ]
*/
typedef nsTArray<CopyableTArray<nsString> > policyTokens;
class PolicyTokenizer {
public:
static void tokenizePolicy(const nsAString& aPolicyString,
policyTokens& outTokens);
private:
PolicyTokenizer(const char16_t* aStart, const char16_t* aEnd);
~PolicyTokenizer();
inline bool atEnd() { return mCurChar >= mEndChar; }
inline void skipWhiteSpace() {
while (mCurChar < mEndChar && nsContentUtils::IsHTMLWhitespace(*mCurChar)) {
mCurChar++;
}
mCurToken.Truncate();
}
inline void skipWhiteSpaceAndSemicolon() {
while (mCurChar < mEndChar &&
(*mCurChar == ';' || nsContentUtils::IsHTMLWhitespace(*mCurChar))) {
mCurChar++;
}
mCurToken.Truncate();
}
inline bool accept(char16_t aChar) {
NS_ASSERTION(mCurChar < mEndChar, "Trying to dereference mEndChar");
if (*mCurChar == aChar) {
mCurToken.Append(*mCurChar++);
return true;
}
return false;
}
void generateNextToken();
void generateTokens(policyTokens& outTokens);
const char16_t* mCurChar;
const char16_t* mEndChar;
nsString mCurToken;
};
#endif /* PolicyTokenizer_h___ */