2018-05-02 17:36:51 +03:00
|
|
|
/* -*- 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' ],
|
|
|
|
* ]
|
|
|
|
*/
|
|
|
|
|
2020-05-06 14:16:49 +03:00
|
|
|
typedef nsTArray<CopyableTArray<nsString> > policyTokens;
|
2018-05-02 17:36:51 +03:00
|
|
|
|
|
|
|
class PolicyTokenizer {
|
2018-11-30 13:46:48 +03:00
|
|
|
public:
|
2018-05-02 17:36:51 +03:00
|
|
|
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)) {
|
2019-02-25 21:58:54 +03:00
|
|
|
mCurChar++;
|
2018-05-02 17:36:51 +03:00
|
|
|
}
|
|
|
|
mCurToken.Truncate();
|
2018-11-30 13:46:48 +03:00
|
|
|
}
|
2018-05-02 17:36:51 +03:00
|
|
|
|
|
|
|
inline void skipWhiteSpaceAndSemicolon() {
|
|
|
|
while (mCurChar < mEndChar &&
|
|
|
|
(*mCurChar == ';' || nsContentUtils::IsHTMLWhitespace(*mCurChar))) {
|
2019-02-25 21:58:54 +03:00
|
|
|
mCurChar++;
|
2018-05-02 17:36:51 +03:00
|
|
|
}
|
|
|
|
mCurToken.Truncate();
|
2018-11-30 13:46:48 +03:00
|
|
|
}
|
2018-05-02 17:36:51 +03:00
|
|
|
|
|
|
|
inline bool accept(char16_t aChar) {
|
|
|
|
NS_ASSERTION(mCurChar < mEndChar, "Trying to dereference mEndChar");
|
|
|
|
if (*mCurChar == aChar) {
|
|
|
|
mCurToken.Append(*mCurChar++);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2018-11-30 13:46:48 +03:00
|
|
|
}
|
2018-05-02 17:36:51 +03:00
|
|
|
|
|
|
|
void generateNextToken();
|
|
|
|
void generateTokens(policyTokens& outTokens);
|
|
|
|
|
|
|
|
const char16_t* mCurChar;
|
|
|
|
const char16_t* mEndChar;
|
|
|
|
nsString mCurToken;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* PolicyTokenizer_h___ */
|