File: contextual_search_provider.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (109 lines) | stat: -rw-r--r-- 4,721 bytes parent folder | download | duplicates (3)
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_