blob: 36f9b74d91b4b7915ff055cb95bfd3a7f156b5fd [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_TEXT_RESOURCE_DECODER_FOR_FUZZING_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_TEXT_RESOURCE_DECODER_FOR_FUZZING_H_
#include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h"
#include "third_party/blink/renderer/platform/testing/fuzzed_data_provider.h"
#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class TextResourceDecoderForFuzzing : public TextResourceDecoder {
public:
TextResourceDecoderForFuzzing(FuzzedDataProvider& fuzzed_data)
: TextResourceDecoder(FuzzedOption(fuzzed_data)) {}
private:
static TextResourceDecoderOptions FuzzedOption(
FuzzedDataProvider& fuzzed_data) {
switch (static_cast<TextResourceDecoderOptions::EncodingDetectionOption>(
fuzzed_data.ConsumeIntegralInRange<int32_t>(
TextResourceDecoderOptions::kUseAllAutoDetection,
TextResourceDecoderOptions::kAlwaysUseUTF8ForText))) {
case TextResourceDecoderOptions::kUseAllAutoDetection:
return TextResourceDecoderOptions::CreateWithAutoDetection(
FuzzedContentType(fuzzed_data), FuzzedEncoding(fuzzed_data),
WTF::TextEncoding(), NullURL());
case TextResourceDecoderOptions::kUseContentAndBOMBasedDetection:
return TextResourceDecoderOptions(FuzzedContentType(fuzzed_data),
FuzzedEncoding(fuzzed_data));
case TextResourceDecoderOptions::kAlwaysUseUTF8ForText:
return TextResourceDecoderOptions::CreateUTF8Decode();
}
}
static TextResourceDecoderOptions::ContentType FuzzedContentType(
FuzzedDataProvider& fuzzed_data) {
return static_cast<TextResourceDecoderOptions::ContentType>(
fuzzed_data.ConsumeIntegralInRange<int32_t>(
TextResourceDecoderOptions::kPlainTextContent,
TextResourceDecoderOptions::kMaxContentType));
}
static WTF::TextEncoding FuzzedEncoding(FuzzedDataProvider& fuzzed_data) {
// Note: Charsets can be long (see the various encodings in
// wtf/text). For instance: "unicode-1-1-utf-8". To ensure good coverage,
// set a generous max limit for these sizes (32 bytes should be good).
return WTF::TextEncoding(fuzzed_data.ConsumeRandomLengthString(32));
}
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_TEXT_RESOURCE_DECODER_FOR_FUZZING_H_