[lensoverlay] Send correct source param from contextual searchbox

Bug: 366215851

Change-Id: I5328d5c8c14e392d59c99283bffa435d75b017c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5871127
Reviewed-by: Moe Ahmadi <mahmadi@chromium.org>
Commit-Queue: Duncan Mercer <mercerd@google.com>
Cr-Commit-Position: refs/heads/main@{#1357398}
diff --git a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
index 0e86d3c..254ec587 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
@@ -4417,6 +4417,14 @@
                               lens::features::kLensOverlayContextualSearchbox},
         /*disabled_features=*/{});
   }
+
+  void VerifyContextualSearchQueryParameters(const GURL& url_to_process) {
+    EXPECT_THAT(
+        url_to_process.spec(),
+        testing::MatchesRegex(
+            std::string(kResultsSearchBaseUrl) +
+            ".*source=chrome.cr.menu.*&q=.*&gsc=2&hl=.*&biw=\\d+&bih=\\d+"));
+  }
 };
 
 IN_PROC_BROWSER_TEST_F(LensOverlayControllerOverlaySearchbox,
@@ -4452,4 +4460,42 @@
   EXPECT_EQ(controller->GetPageClassificationForTesting(),
             metrics::OmniboxEventProto::CONTEXTUAL_SEARCHBOX);
 }
+
+IN_PROC_BROWSER_TEST_F(LensOverlayControllerOverlaySearchbox,
+                       OverlaySearchboxCorrectResultsUrl) {
+  WaitForPaint();
+
+  // State should start in off.
+  auto* controller = browser()
+                         ->tab_strip_model()
+                         ->GetActiveTab()
+                         ->tab_features()
+                         ->lens_overlay_controller();
+  ASSERT_EQ(controller->state(), State::kOff);
+
+  // Showing UI should change the state to screenshot and eventually to overlay.
+  controller->ShowUI(LensOverlayInvocationSource::kAppMenu);
+  ASSERT_EQ(controller->state(), State::kScreenshot);
+  ASSERT_TRUE(base::test::RunUntil(
+      [&]() { return controller->state() == State::kOverlay; }));
+
+  // Verify searchbox is in contextual mode.
+  EXPECT_EQ(controller->GetPageClassificationForTesting(),
+            metrics::OmniboxEventProto::CONTEXTUAL_SEARCHBOX);
+
+  controller->IssueSearchBoxRequestForTesting(
+      "hello", AutocompleteMatchType::Type::SEARCH_WHAT_YOU_TYPED,
+      /*is_zero_prefix_suggestion=*/false,
+      std::map<std::string, std::string>());
+
+  // Wait for URL to load in side panel.
+  EXPECT_TRUE(content::WaitForLoadStop(
+      controller->GetSidePanelWebContentsForTesting()));
+
+  // Verify the query and params are set.
+  auto loaded_search_query = controller->get_loaded_search_query_for_testing();
+  EXPECT_TRUE(loaded_search_query);
+  EXPECT_EQ(loaded_search_query->search_query_text_, "hello");
+  VerifyContextualSearchQueryParameters(loaded_search_query->search_query_url_);
+}
 }  // namespace
diff --git a/chrome/browser/ui/lens/lens_overlay_query_controller_unittest.cc b/chrome/browser/ui/lens/lens_overlay_query_controller_unittest.cc
index dd7db21..612f1d36 100644
--- a/chrome/browser/ui/lens/lens_overlay_query_controller_unittest.cc
+++ b/chrome/browser/ui/lens/lens_overlay_query_controller_unittest.cc
@@ -66,6 +66,9 @@
 // Query parameter for the visual input type.
 inline constexpr char kVisualInputTypeParameterKey[] = "vit";
 
+// Query parameter for the invocation source.
+inline constexpr char kInvocationSourceParameterKey[] = "source";
+
 // The encoded video context for the test page.
 constexpr char kTestEncodedVideoContext[] =
     "ChkKF2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20v";
@@ -723,11 +726,17 @@
   bool has_visual_input_type = net::GetValueForKeyInQuery(
       GURL(url_response_future.Get().url()), kVisualInputTypeParameterKey,
       &visual_input_type);
+  std::string invocation_source;
+  bool has_invocation_source = net::GetValueForKeyInQuery(
+      GURL(url_response_future.Get().url()), kInvocationSourceParameterKey,
+      &invocation_source);
   ASSERT_EQ(GetSelectionTypeFromUrl(url_response_future.Get().url()),
             lens::UNKNOWN_SELECTION_TYPE);
   ASSERT_TRUE(has_start_time);
   ASSERT_TRUE(has_visual_input_type);
   ASSERT_EQ(visual_input_type, "video");
+  ASSERT_TRUE(has_invocation_source);
+  ASSERT_EQ(invocation_source, "chrome.cr.menu");
   ASSERT_EQ(query_controller.num_gen204_pings_sent_, 1);
   ASSERT_TRUE(url_response_future.Get().has_url());
 }
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc
index f6e54d0..e2b9dd0 100644
--- a/components/search_engines/template_url.cc
+++ b/components/search_engines/template_url.cc
@@ -1362,15 +1362,16 @@
       case GOOGLE_SEARCH_SOURCE_ID: {
         DCHECK(!replacement.is_post_param);
         switch (search_terms_args.request_source) {
-          case RequestSource::CONTEXTUAL_SEARCHBOX:
           case RequestSource::SEARCH_SIDE_PANEL_SEARCHBOX:
-            HandleReplacement("source", "chrome.gsc", replacement, &url);
-            break;
+          case RequestSource::CONTEXTUAL_SEARCHBOX:
           case RequestSource::LENS_SIDE_PANEL_SEARCHBOX:
-            // Lens side panel searchbox source is set via the Lens Overlay
-            // url builder as it contains entry point information.
-            // Therefore we shouldn't replace anything here.
+            // Searchboxes used by the Lens Overlay have their source set via
+            // the Lens Overlay url builder as it contains entry point
+            // information. Therefore we shouldn't replace anything here.
             break;
+          case RequestSource::NTP_MODULE:
+          case RequestSource::SEARCHBOX:
+          case RequestSource::CROS_APP_LIST:
           default:
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
             HandleReplacement("sourceid", "chrome-mobile", replacement, &url);
diff --git a/components/search_engines/template_url_unittest.cc b/components/search_engines/template_url_unittest.cc
index 0d947d2..b29d973 100644
--- a/components/search_engines/template_url_unittest.cc
+++ b/components/search_engines/template_url_unittest.cc
@@ -1504,13 +1504,14 @@
   result = GURL(
       url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_));
   ASSERT_TRUE(result.is_valid());
-  EXPECT_EQ("http://google.com/?source=chrome.gsc&", result.spec());
+  // The Lens Overlay url builder will handle setting the correct source.
+  EXPECT_EQ("http://google.com/?", result.spec());
 
   search_terms_args.request_source = RequestSource::SEARCH_SIDE_PANEL_SEARCHBOX;
   result = GURL(
       url.url_ref().ReplaceSearchTerms(search_terms_args, search_terms_data_));
   ASSERT_TRUE(result.is_valid());
-  EXPECT_EQ("http://google.com/?source=chrome.gsc&", result.spec());
+  EXPECT_EQ("http://google.com/?", result.spec());
 
   search_terms_args.request_source = RequestSource::LENS_SIDE_PANEL_SEARCHBOX;
   result = GURL(