blob: edc375b207c0dcc92aaf8086aaba26656282aef7 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/search_engines/search_terms_data.h"
#include <memory>
#include "base/check.h"
#include "base/trace_event/memory_usage_estimator.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "components/google/core/common/google_util.h"
#include "components/lens/lens_features.h"
#include "url/gurl.h"
namespace {
// -----------------------------------------------------------------
// SearchTermsDataSnapshot
// Implementation of SearchTermsData that takes a snapshot of another
// SearchTermsData by copying all the responses to the different getters into
// member strings, then returning those strings when its own getters are called.
// This will typically be constructed on the UI thread from
// UIThreadSearchTermsData but is subsequently safe to use on any thread.
class SearchTermsDataSnapshot : public SearchTermsData {
public:
explicit SearchTermsDataSnapshot(const SearchTermsData* search_terms_data);
~SearchTermsDataSnapshot() override;
SearchTermsDataSnapshot(const SearchTermsDataSnapshot&) = delete;
SearchTermsDataSnapshot& operator=(const SearchTermsDataSnapshot&) = delete;
std::string GoogleBaseURLValue() const override;
std::string GetApplicationLocale() const override;
std::u16string GetRlzParameterValue(bool from_app_list) const override;
std::string GetSearchClient() const override;
std::string GoogleImageSearchSource() const override;
// Estimates dynamic memory usage.
// See base/trace_event/memory_usage_estimator.h for more info.
size_t EstimateMemoryUsage() const override;
private:
std::string google_base_url_value_;
std::string application_locale_;
std::u16string rlz_parameter_value_;
std::string search_client_;
std::string google_image_search_source_;
};
SearchTermsDataSnapshot::SearchTermsDataSnapshot(
const SearchTermsData* search_terms_data) {
if (search_terms_data) {
google_base_url_value_ = search_terms_data->GoogleBaseURLValue();
application_locale_ = search_terms_data->GetApplicationLocale();
rlz_parameter_value_ = search_terms_data->GetRlzParameterValue(false);
search_client_ = search_terms_data->GetSearchClient();
google_image_search_source_ = search_terms_data->GoogleImageSearchSource();
}
}
SearchTermsDataSnapshot::~SearchTermsDataSnapshot() = default;
std::string SearchTermsDataSnapshot::GoogleBaseURLValue() const {
return google_base_url_value_;
}
std::string SearchTermsDataSnapshot::GetApplicationLocale() const {
return application_locale_;
}
std::u16string SearchTermsDataSnapshot::GetRlzParameterValue(
bool from_app_list) const {
return rlz_parameter_value_;
}
std::string SearchTermsDataSnapshot::GetSearchClient() const {
return search_client_;
}
std::string SearchTermsDataSnapshot::GoogleImageSearchSource() const {
return google_image_search_source_;
}
size_t SearchTermsDataSnapshot::EstimateMemoryUsage() const {
size_t res = 0;
res += base::trace_event::EstimateMemoryUsage(google_base_url_value_);
res += base::trace_event::EstimateMemoryUsage(application_locale_);
res += base::trace_event::EstimateMemoryUsage(rlz_parameter_value_);
res += base::trace_event::EstimateMemoryUsage(search_client_);
res += base::trace_event::EstimateMemoryUsage(google_image_search_source_);
return res;
}
} // namespace
// static
std::unique_ptr<SearchTermsData> SearchTermsData::MakeSnapshot(
const SearchTermsData* original_data) {
return std::make_unique<SearchTermsDataSnapshot>(original_data);
}
SearchTermsData::SearchTermsData() = default;
SearchTermsData::~SearchTermsData() = default;
std::string SearchTermsData::GoogleBaseURLValue() const {
return google_util::kGoogleHomepageURL;
}
std::string SearchTermsData::GoogleBaseSearchByImageURLValue() const {
const std::string kGoogleHomepageURLPath = std::string("searchbyimage/");
#if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
if (base::FeatureList::IsEnabled(lens::features::kLensStandalone)) {
return lens::features::GetHomepageURLForLens();
}
#endif // !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
return google_util::kGoogleHomepageURL + kGoogleHomepageURLPath;
}
std::string SearchTermsData::GoogleBaseSuggestURLValue() const {
// Start with the Google base URL.
const GURL base_url(GoogleBaseURLValue());
DCHECK(base_url.is_valid());
GURL::Replacements repl;
// Replace any existing path with "/complete/".
repl.SetPathStr("/complete/");
// Clear the query and ref.
repl.ClearQuery();
repl.ClearRef();
return base_url.ReplaceComponents(repl).spec();
}
std::string SearchTermsData::GetApplicationLocale() const {
return "en";
}
std::u16string SearchTermsData::GetRlzParameterValue(bool from_app_list) const {
return std::u16string();
}
std::string SearchTermsData::GetSearchClient() const {
return std::string();
}
std::string SearchTermsData::GoogleImageSearchSource() const {
return std::string();
}
std::string SearchTermsData::GetYandexReferralID() const {
return std::string();
}
std::string SearchTermsData::GetMailRUReferralID() const {
return std::string();
}
size_t SearchTermsData::EstimateMemoryUsage() const {
return 0;
}