// 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);
}
