Skip to content

Commit

Permalink
[waffle]Record when the user clicks on the learn more link
Browse files Browse the repository at this point in the history
Record a histogram when the user clicks on the "learn more" link. We
record different instances for when the click happens in the
Profile Picker or in the Search Engine Choice dialog.

Bug: b:307714156
Change-Id: I3ea89290e757e9ca92534b9b01334ae1da51849c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4988248
Commit-Queue: Matthew Denton <mpdenton@chromium.org>
Auto-Submit: Jack Yammine <jyammine@google.com>
Reviewed-by: Nicolas Dossou-Gbété <dgn@chromium.org>
Reviewed-by: Matthew Denton <mpdenton@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1217126}
  • Loading branch information
Jack Yammine authored and Chromium LUCI CQ committed Oct 30, 2023
1 parent 1d5d20c commit e9e4e31
Show file tree
Hide file tree
Showing 13 changed files with 156 additions and 13 deletions.
6 changes: 3 additions & 3 deletions chrome/browser/resources/search_engine_choice/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@
width: 100px;
}

.info-link {
#infoLink {
color: var(--google-blue-600);
}

Expand Down Expand Up @@ -283,7 +283,7 @@
content: url(images/right_illustration_dark.svg);
}

.info-link {
#infoLink {
color: var(--google-blue-300);
}

Expand Down Expand Up @@ -397,7 +397,7 @@ <h1 class="title">$i18n{title}</h1>
</div>
<p class="subtitle">
$i18n{subtitle}
<a class="info-link" href="" on-click="onLinkClicked_"
<a id="infoLink" href="" on-click="onLinkClicked_"
aria-label="$i18n{subtitleInfoLinkA11yLabel}">
$i18n{subtitleInfoLink}
</a>
Expand Down
16 changes: 12 additions & 4 deletions chrome/browser/resources/search_engine_choice/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/p

import {getTemplate} from './app.html.js';
import {SearchEngineChoice, SearchEngineChoiceBrowserProxy} from './browser_proxy.js';
import {PageHandlerRemote} from './search_engine_choice.mojom-webui.js';

export interface SearchEngineChoiceAppElement {
$: {
dummyOmnibox: HTMLElement,
infoDialog: CrDialogElement,
searchEngineOmnibox: HTMLElement,
submitButton: CrButtonElement,
infoLink: HTMLElement,
};
}

Expand Down Expand Up @@ -88,6 +90,12 @@ export class SearchEngineChoiceAppElement extends
private selectedChoice_: string;
private fakeOmniboxText_: string;
private fakeOmniboxIconPath_: string;
private pageHandler_: PageHandlerRemote;

constructor() {
super();
this.pageHandler_ = SearchEngineChoiceBrowserProxy.getInstance().handler;
}

override connectedCallback() {
super.connectedCallback();
Expand All @@ -108,22 +116,22 @@ export class SearchEngineChoiceAppElement extends
});

afterNextRender(this, () => {
SearchEngineChoiceBrowserProxy.getInstance().handler.displayDialog();
this.pageHandler_.displayDialog();
});
}

private onLinkClicked_() {
this.$.infoDialog.showModal();
this.pageHandler_.handleLearnMoreLinkClicked();
}

private isSubmitButtonDisabled_() {
return parseInt(this.selectedChoice_) === -1;
}

private onSubmitClicked_() {
SearchEngineChoiceBrowserProxy.getInstance()
.handler.handleSearchEngineChoiceSelected(
parseInt(this.selectedChoice_));
this.pageHandler_.handleSearchEngineChoiceSelected(
parseInt(this.selectedChoice_));
}

private onInfoDialogButtonClicked_() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* to interact with the browser.
*/

import {PageHandlerFactory, PageHandlerInterface, PageHandlerRemote} from './search_engine_choice.mojom-webui.js';
import {PageHandlerFactory, PageHandlerRemote} from './search_engine_choice.mojom-webui.js';

export interface SearchEngineChoice {
prepopulate_id: number;
Expand All @@ -17,7 +17,7 @@ export interface SearchEngineChoice {
}

export class SearchEngineChoiceBrowserProxy {
handler: PageHandlerInterface;
handler: PageHandlerRemote;

constructor(handler: PageHandlerRemote) {
this.handler = handler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,3 +267,12 @@ bool SearchEngineChoiceService::IsUrlSuitableForDialog(GURL url) {
// Don't show the dialog over remaining urls that start with 'chrome://'.
return !url.SchemeIs(content::kChromeUIScheme);
}

void SearchEngineChoiceService::NotifyLearnMoreLinkClicked(
EntryPoint entry_point) {
RecordChoiceScreenEvent(entry_point == EntryPoint::kDialog
? search_engines::SearchEngineChoiceScreenEvents::
kLearnMoreWasDisplayed
: search_engines::SearchEngineChoiceScreenEvents::
kFreLearnMoreWasDisplayed);
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ class SearchEngineChoiceService : public KeyedService {
// `browser`.
void NotifyDialogClosed(Browser* browser);

// Informs the service that the learn more link was clicked. This is used to
// record histograms. `entry_point` is the view in which the UI is rendered.
void NotifyLearnMoreLinkClicked(EntryPoint entry_point);

// Returns whether a Search Engine Choice dialog is currently open or not for
// `browser`.
bool IsShowingDialog(Browser* browser);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/search_engine_choice/search_engine_choice_service.h"
#include "base/functional/bind.h"
#include "base/memory/raw_ptr.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/ui/webui/settings/search_engines_handler.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/country_codes/country_codes.h"
#include "components/search_engines/search_engine_choice_utils.h"
#include "components/search_engines/template_url_service.h"
#include "components/signin/public/base/signin_switches.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"

class SearchEngineChoiceServiceTest : public testing::Test {
public:
SearchEngineChoiceServiceTest()
: profile_manager_(TestingBrowserProcess::GetGlobal()) {}

void SetUp() override {
testing::Test::SetUp();
ASSERT_TRUE(profile_manager_.SetUp());
profile_ = profile_manager_.CreateTestingProfile("Profile 1");

TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
profile(),
base::BindRepeating(&TemplateURLServiceFactory::BuildInstanceFor));

PrefService* pref_service = profile()->GetPrefs();
// The search engine choice feature is only enabled for countries in the EEA
// region.
const int kBelgiumCountryId =
country_codes::CountryCharsToCountryID('B', 'E');
pref_service->SetInteger(country_codes::kCountryIDAtInstall,
kBelgiumCountryId);

TemplateURLService* template_url_service =
TemplateURLServiceFactory::GetForProfile(profile());
search_engine_choice_service_ = std::make_unique<SearchEngineChoiceService>(
*profile_, *template_url_service);
}

Profile* profile() const { return profile_; }

SearchEngineChoiceService* search_engine_choice_service() {
return search_engine_choice_service_.get();
}

const base::HistogramTester& histogram_tester() const {
return histogram_tester_;
}

private:
base::test::ScopedFeatureList feature_list_{switches::kSearchEngineChoice};
content::BrowserTaskEnvironment task_environment_;
TestingProfileManager profile_manager_;
raw_ptr<Profile> profile_ = nullptr;
std::unique_ptr<SearchEngineChoiceService> search_engine_choice_service_;
base::HistogramTester histogram_tester_;
};

TEST_F(SearchEngineChoiceServiceTest, HandleLearnMoreLinkClicked) {
search_engine_choice_service()->NotifyLearnMoreLinkClicked(
SearchEngineChoiceService::EntryPoint::kDialog);
histogram_tester().ExpectBucketCount(
search_engines::kSearchEngineChoiceScreenEventsHistogram,
search_engines::SearchEngineChoiceScreenEvents::kLearnMoreWasDisplayed,
1);

search_engine_choice_service()->NotifyLearnMoreLinkClicked(
SearchEngineChoiceService::EntryPoint::kProfilePicker);
histogram_tester().ExpectBucketCount(
search_engines::kSearchEngineChoiceScreenEventsHistogram,
search_engines::SearchEngineChoiceScreenEvents::kFreLearnMoreWasDisplayed,
1);
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@ interface PageHandler {
// Triggered by the `handleSearchEngineChoiceSelected()` call in
// `chrome/browser/resources/search_engine_choice/app.ts`
HandleSearchEngineChoiceSelected(int32 prepopulate_id);

// Notifies the `SearchEngineChoiceService` that the learn more link was
// clicked.
HandleLearnMoreLinkClicked();
};
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,23 @@

#include "chrome/browser/ui/webui/search_engine_choice/search_engine_choice_handler.h"

#include "base/functional/callback_forward.h"
#include "components/search_engines/search_engine_choice_utils.h"

SearchEngineChoiceHandler::SearchEngineChoiceHandler(
mojo::PendingReceiver<search_engine_choice::mojom::PageHandler> receiver,
base::OnceCallback<void()> display_dialog_callback,
base::OnceCallback<void(int)> handle_choice_selected_callback)
base::OnceCallback<void(int)> handle_choice_selected_callback,
base::RepeatingCallback<void()> handle_learn_more_clicked_callback)
: receiver_(this, std::move(receiver)),
display_dialog_callback_(std::move(display_dialog_callback)),
handle_choice_selected_callback_(
std::move(handle_choice_selected_callback)) {
std::move(handle_choice_selected_callback)),
handle_learn_more_clicked_callback_(handle_learn_more_clicked_callback) {
CHECK(search_engines::IsChoiceScreenFlagEnabled(
search_engines::ChoicePromo::kAny));
CHECK(handle_choice_selected_callback_);
CHECK(handle_learn_more_clicked_callback_);
}

SearchEngineChoiceHandler::~SearchEngineChoiceHandler() = default;
Expand All @@ -33,3 +37,7 @@ void SearchEngineChoiceHandler::HandleSearchEngineChoiceSelected(
std::move(handle_choice_selected_callback_).Run(prepopulate_id);
}
}

void SearchEngineChoiceHandler::HandleLearnMoreLinkClicked() {
handle_learn_more_clicked_callback_.Run();
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ class SearchEngineChoiceHandler
explicit SearchEngineChoiceHandler(
mojo::PendingReceiver<search_engine_choice::mojom::PageHandler> receiver,
base::OnceCallback<void()> display_dialog_callback,
base::OnceCallback<void(int)> handle_choice_selected_callback);
base::OnceCallback<void(int)> handle_choice_selected_callback,
base::RepeatingCallback<void()> handle_learn_more_clicked_callback);

SearchEngineChoiceHandler(const SearchEngineChoiceHandler&) = delete;
SearchEngineChoiceHandler& operator=(const SearchEngineChoiceHandler&) =
Expand All @@ -26,11 +27,13 @@ class SearchEngineChoiceHandler
// search_engine_choice::mojom::PageHandler:
void DisplayDialog() override;
void HandleSearchEngineChoiceSelected(int32_t prepopulate_id) override;
void HandleLearnMoreLinkClicked() override;

private:
mojo::Receiver<search_engine_choice::mojom::PageHandler> receiver_;
base::OnceCallback<void()> display_dialog_callback_;
base::OnceCallback<void(int)> handle_choice_selected_callback_;
base::RepeatingCallback<void()> handle_learn_more_clicked_callback_;
};

#endif // CHROME_BROWSER_UI_WEBUI_SEARCH_ENGINE_CHOICE_SEARCH_ENGINE_CHOICE_HANDLER_H_
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,19 @@ void SearchEngineChoiceUI::HandleSearchEngineChoiceMade(int prepopulate_id) {
}
}

void SearchEngineChoiceUI::HandleLearnMoreLinkClicked() {
SearchEngineChoiceService* search_engine_choice_service =
SearchEngineChoiceServiceFactory::GetForProfile(&profile_.get());

search_engine_choice_service->NotifyLearnMoreLinkClicked(entry_point_);
}

void SearchEngineChoiceUI::CreatePageHandler(
mojo::PendingReceiver<search_engine_choice::mojom::PageHandler> receiver) {
page_handler_ = std::make_unique<SearchEngineChoiceHandler>(
std::move(receiver), std::move(display_dialog_callback_),
base::BindOnce(&SearchEngineChoiceUI::HandleSearchEngineChoiceMade,
weak_ptr_factory_.GetWeakPtr()));
weak_ptr_factory_.GetWeakPtr()),
base::BindRepeating(&SearchEngineChoiceUI::HandleLearnMoreLinkClicked,
weak_ptr_factory_.GetWeakPtr()));
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ class SearchEngineChoiceUI
// Notifies the search engine choice service that a choice has been made.
void HandleSearchEngineChoiceMade(int prepopulate_id);

// Notifies the search engine choice service that the learn more link was
// clicked.
void HandleLearnMoreLinkClicked();

std::unique_ptr<SearchEngineChoiceHandler> page_handler_;

mojo::Receiver<search_engine_choice::mojom::PageHandlerFactory>
Expand Down
4 changes: 4 additions & 0 deletions chrome/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -6383,6 +6383,10 @@ test("unit_tests") {
]
}

if (enable_search_engine_choice) {
sources += [ "../browser/search_engine_choice/search_engine_choice_service_unittest.cc" ]
}

if (is_linux) {
sources += [ "../browser/metrics/pressure/pressure_metrics_unittest.cc" ]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,11 @@ suite('SearchEngineChoiceTest', function() {
testElement.$.submitButton.click();
assertEquals(handler.getCallCount('handleSearchEngineChoiceSelected'), 1);
});

test('Click learn more link', function() {
testElement.$.infoLink.click();

assertTrue(testElement.$.infoDialog.open);
assertEquals(handler.getCallCount('handleLearnMoreLinkClicked'), 1);
});
});

0 comments on commit e9e4e31

Please sign in to comment.