blob: 8e87666dfdf45938fcd611db31e70f4e3d179b90 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string_view>
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/ui_test_utils.h"
#include "chrome/test/fuzzing/in_process_proto_fuzzer.h"
#include "chrome/test/fuzzing/webcodecs_fuzzer_grammar.h"
#include "chrome/test/fuzzing/webcodecs_fuzzer_grammar.pb.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/libfuzzer/proto/lpm_interface.h"
#include "testing/libfuzzer/research/domatolpm/domatolpm.h"
// This fuzzer uses DomatoLPM to generate JS based on an existing Domato
// rule.
class WebcodecsInProcessFuzzer
: public InProcessBinaryProtoFuzzer<
domatolpm::generated::webcodecs_fuzzer_grammar::fuzzcase> {
public:
using FuzzCase = domatolpm::generated::webcodecs_fuzzer_grammar::fuzzcase;
WebcodecsInProcessFuzzer() = default;
void SetUpOnMainThread() override;
int Fuzz(const FuzzCase& fuzz_case) override;
};
REGISTER_BINARY_PROTO_IN_PROCESS_FUZZER(WebcodecsInProcessFuzzer)
void WebcodecsInProcessFuzzer::SetUpOnMainThread() {
InProcessFuzzer::SetUpOnMainThread();
// Some of the functionality tested only runs in a secure context. about:blank
// is not considered a secure context, whereas chrome://chrome-urls/ (for
// example) is. Navigate to this page and execute the JS in this context.
CHECK(ui_test_utils::NavigateToURL(browser(), GURL("chrome://chrome-urls/")));
}
int WebcodecsInProcessFuzzer::Fuzz(const FuzzCase& fuzz_case) {
domatolpm::Context ctx;
CHECK(domatolpm::webcodecs_fuzzer_grammar::handle_fuzzer(&ctx, fuzz_case));
std::string_view js_str(ctx.GetBuilder()->view());
content::WebContents* contents =
browser()->tab_strip_model()->GetActiveWebContents();
content::RenderFrameHost* rfh = contents->GetPrimaryMainFrame();
auto res = content::ExecJs(rfh, js_str);
return 0;
}