1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_OMNIBOX_BROWSER_CONTEXTUAL_SEARCH_PROVIDER_H_
#define COMPONENTS_OMNIBOX_BROWSER_CONTEXTUAL_SEARCH_PROVIDER_H_
#include <memory>
#include <string>
#include "base/callback_list.h"
#include "components/omnibox/browser/autocomplete_enums.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "components/omnibox/browser/base_search_provider.h"
class AutocompleteProviderClient;
class AutocompleteProviderListener;
namespace network {
class SimpleURLLoader;
}
// Autocomplete provider for searches based on page context, which includes
// page content, URL, possibly a screenshot, etc. Although some contextual
// suggestions may be shown without additional query input, this is functionally
// distinct from the ZeroSuggestProvider. It does its main work when explicitly
// invoked via the '@page' keyword mode, and also surfaces action matches for
// empty/zero inputs to help the user find their way into the '@page' scope.
// It also produces the omnibox toolbelt which can be used to enter various
// forms of scoped search (Lens or some starter pack keywords, for example).
class ContextualSearchProvider : public BaseSearchProvider {
public:
ContextualSearchProvider(AutocompleteProviderClient* client,
AutocompleteProviderListener* listener);
ContextualSearchProvider(const ContextualSearchProvider&) = delete;
ContextualSearchProvider& operator=(const ContextualSearchProvider&) = delete;
// AutocompleteProvider:
void Start(const AutocompleteInput& input, bool minimal_changes) override;
void Stop(AutocompleteStopReason stop_reason) override;
void AddProviderInfo(ProvidersInfo* provider_info) const override;
// Whether or not the Lens action (i.e. "Ask Google about this page") is
// present in the Omnibox toolbelt.
bool HasToolbeltLensAction() const;
protected:
~ContextualSearchProvider() override;
// BaseSearchProvider:
bool ShouldAppendExtraParams(
const SearchSuggestionParser::SuggestResult& result) const override;
void RecordDeletionResult(bool success) override {}
// Waits for the Lens suggest inputs to be ready and then sends the request to
// the remote suggest server. If the inputs are already ready, the request is
// sent immediately.
void StartSuggestRequest(AutocompleteInput input);
// Attaches the lens suggest inputs to `input` and makes the suggest request.
void OnLensSuggestInputsReady(
AutocompleteInput input,
std::optional<lens::proto::LensOverlaySuggestInputs> lens_suggest_inputs);
// Makes the suggest request with the given input.
void MakeSuggestRequest(AutocompleteInput input);
// Called when the suggest network request has completed.
void SuggestRequestCompleted(AutocompleteInput input,
const network::SimpleURLLoader* source,
const int response_code,
std::unique_ptr<std::string> response_body);
// Uses |results| and |input| to populate |matches_| and its associated
// metadata.
void ConvertSuggestResultsToAutocompleteMatches(
const SearchSuggestionParser::Results& results,
const AutocompleteInput& input);
// Adds the Lens entrypoint takeover action match.
void AddLensEntrypointMatch(const AutocompleteInput& input);
// Adds a default match for verbatim input, or keyword instructions if there
// is no input yet. This is the match that holds the omnibox in keyword mode
// when no other matches are available yet.
void AddDefaultVerbatimMatch(const AutocompleteInput& input);
// Conditionally appends a special toolbelt match with various actions.
// The `input_starter_pack_engine` may be nullptr and its value can affect the
// actions included on the toolbelt. Returns true if toolbelt is added; false
// otherwise.
bool MaybeAddToolbeltMatch(const AutocompleteInput& input,
const TemplateURL* input_starter_pack_engine);
// Gets the '@page' starter pack engine using `input_keyword_`.
const TemplateURL* GetKeywordTemplateURL() const;
// Keyword taken from most recently started autocomplete input.
std::u16string input_keyword_;
// Loader used to retrieve suggest results.
std::unique_ptr<network::SimpleURLLoader> loader_;
// Holds the subscription to get the Lens suggest inputs. If the subscription
// is freed, the callback will not be run.
base::CallbackListSubscription lens_suggest_inputs_subscription_;
};
#endif // COMPONENTS_OMNIBOX_BROWSER_CONTEXTUAL_SEARCH_PROVIDER_H_
|