blob: 82c51b5c43005d708ee7814691f648e06d5b8da2 [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.
#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
#include "third_party/blink/renderer/core/css/media_values_cached.h"
#include "third_party/blink/renderer/core/html/html_document.h"
#include "third_party/blink/renderer/core/html/parser/html_document_parser.h"
#include "third_party/blink/renderer/core/html/parser/resource_preloader.h"
#include "third_party/blink/renderer/core/html/parser/text_resource_decoder_for_fuzzing.h"
#include "third_party/blink/renderer/core/media_type_names.h"
#include "third_party/blink/renderer/platform/loader/subresource_integrity.h"
#include "third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h"
#include "third_party/blink/renderer/platform/testing/fuzzed_data_provider.h"
namespace blink {
std::unique_ptr<CachedDocumentParameters> CachedDocumentParametersForFuzzing(
FuzzedDataProvider& fuzzed_data) {
std::unique_ptr<CachedDocumentParameters> document_parameters =
std::make_unique<CachedDocumentParameters>();
document_parameters->do_html_preload_scanning = fuzzed_data.ConsumeBool();
// TODO(csharrison): How should this be fuzzed?
document_parameters->default_viewport_min_width = Length();
document_parameters->viewport_meta_zero_values_quirk =
fuzzed_data.ConsumeBool();
document_parameters->viewport_meta_enabled = fuzzed_data.ConsumeBool();
document_parameters->integrity_features =
fuzzed_data.ConsumeBool()
? SubresourceIntegrity::IntegrityFeatures::kDefault
: SubresourceIntegrity::IntegrityFeatures::kSignatures;
return document_parameters;
}
class MockResourcePreloader : public ResourcePreloader {
void Preload(std::unique_ptr<PreloadRequest>) override {}
};
int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
static BlinkFuzzerTestSupport test_support = BlinkFuzzerTestSupport();
FuzzedDataProvider fuzzed_data(data, size);
HTMLParserOptions options;
options.scripting_flag = fuzzed_data.ConsumeBool();
std::unique_ptr<CachedDocumentParameters> document_parameters =
CachedDocumentParametersForFuzzing(fuzzed_data);
KURL document_url("http://whatever.test/");
// Copied from HTMLPreloadScannerTest. May be worthwhile to fuzz.
MediaValuesCached::MediaValuesCachedData media_data;
media_data.viewport_width = 500;
media_data.viewport_height = 600;
media_data.device_width = 700;
media_data.device_height = 800;
media_data.device_pixel_ratio = 2.0;
media_data.color_bits_per_component = 24;
media_data.monochrome_bits_per_component = 0;
media_data.primary_pointer_type = mojom::blink::PointerType::kPointerFineType;
media_data.default_font_size = 16;
media_data.three_d_enabled = true;
media_data.media_type = media_type_names::kScreen;
media_data.strict_mode = true;
media_data.display_mode = blink::mojom::DisplayMode::kBrowser;
MockResourcePreloader preloader;
std::unique_ptr<HTMLPreloadScanner> scanner =
std::make_unique<HTMLPreloadScanner>(
options, document_url, std::move(document_parameters), media_data,
TokenPreloadScanner::ScannerType::kMainDocument);
TextResourceDecoderForFuzzing decoder(fuzzed_data);
std::string bytes = fuzzed_data.ConsumeRemainingBytes();
String decoded_bytes = decoder.Decode(bytes.data(), bytes.length());
scanner->AppendToEnd(decoded_bytes);
bool has_csp_meta_tag_unused = false;
PreloadRequestStream requests =
scanner->Scan(document_url, nullptr, has_csp_meta_tag_unused);
preloader.TakeAndPreload(requests);
return 0;
}
} // namespace blink
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
return blink::LLVMFuzzerTestOneInput(data, size);
}