// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/omnibox/browser/search_suggestion_parser.h"
#include <stddef.h>
#include <stdint.h>
#include <optional>
#include "base/at_exit.h"
#include "base/i18n/icu_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "components/omnibox/browser/test_scheme_classifier.h"
#include "third_party/metrics_proto/omnibox_event.pb.h"
// From crbug.com/774858
struct IcuEnvironment {
IcuEnvironment() { CHECK(base::i18n::InitializeICU()); }
// Used by ICU integration.
base::AtExitManager at_exit_manager;
};
IcuEnvironment icu_env;
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
// This is an arbitrary size, and arguably even small for a JSON input,
// but we have to cut it off somewhere.
if (size > 4096)
return 0;
std::unique_ptr<std::string> response_body =
std::make_unique<std::string>(reinterpret_cast<const char*>(data), size);
std::optional<base::Value::List> root_list =
SearchSuggestionParser::DeserializeJsonData(
SearchSuggestionParser::ExtractJsonData(nullptr,
std::move(response_body)));
if (root_list) {
AutocompleteInput input;
{
// Set-up the input so downstream won't reject it.
if (!root_list->empty() && (*root_list)[0].is_string()) {
std::string query = (*root_list)[0].GetString();
input = AutocompleteInput(base::UTF8ToUTF16(query),
metrics::OmniboxEventProto::OTHER,
TestSchemeClassifier());
}
}
// This is primarily only used to decide where to store the results,
// and to record in the SuggestResult.
const bool is_keyword = false;
SearchSuggestionParser::Results results;
// Copied from BaseSearchProvider::ParseSuggestResults()
SearchSuggestionParser::ParseSuggestResults(
*root_list, input, TestSchemeClassifier(),
/*default_result_relevance=*/-1,
/*is_keyword_result=*/is_keyword, &results);
}
return 0;
}