Commit daf6c775 authored by Pavel Yatsuk's avatar Pavel Yatsuk Committed by Commit Bot

[SEC] Implementation for adding Play search engine in TemplateUrlServiceAndroid

This CL adds implementation for
TemplateUrlServiceAndroid::SetPlayAPISearchEngine. The function:
- Checks if Play API search engine already exists.
- Adds new search engine marking it with created_from_play_api flag.
- Sets the search engine as DSE if enterprise policy allows.

The logic for merging new search engine with existing prepopulated or
autogenerated is still not implemented.

BUG=1002271
R=pkasting@chromium.org,wylieb@chromium.org

Change-Id: I3065df7218f90fb74cabbd338b37b8286d2450ef
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1826001Reviewed-by: default avatarKevin Bailey <krb@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Commit-Queue: Pavel Yatsuk <pavely@chromium.org>
Cr-Commit-Position: refs/heads/master@{#700478}
parent 31034cc8
......@@ -267,6 +267,65 @@ public class TemplateUrlServiceTest {
Assert.assertEquals("keyword2", customSearchEngines.get(3).getKeyword());
}
@Test
@SmallTest
@Feature({"SearchEngines"})
public void testSetPlayAPISearchEngine() {
final TemplateUrlService templateUrlService = waitForTemplateUrlServiceToLoad();
// Add regular search engine. It will be used to test conflict with Play API search engine.
TestThreadUtils.runOnUiThreadBlocking(
() -> { templateUrlService.addSearchEngineForTesting("keyword1", 0); });
// Adding Play API search engine with the same keyword should fail.
Assert.assertFalse(
TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
@Override
public Boolean call() {
return templateUrlService.setPlayAPISearchEngine("SearchEngine1",
"keyword1", "https://search.engine?q={searchTerms}",
"https://fav.icon");
}
}));
// Adding Play API search engine with unique keyword should succeed.
Assert.assertTrue(TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
@Override
public Boolean call() {
return templateUrlService.setPlayAPISearchEngine("SearchEngine2", "keyword2",
"https://search.engine?q={searchTerms}", "https://fav.icon");
}
}));
TemplateUrl defaultSearchEngine =
TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<TemplateUrl>() {
@Override
public TemplateUrl call() throws Exception {
return templateUrlService.getDefaultSearchEngineTemplateUrl();
}
});
Assert.assertEquals("keyword2", defaultSearchEngine.getKeyword());
Assert.assertTrue(defaultSearchEngine.getIsPrepopulated());
// Adding Play API search engine again should fail.
Assert.assertFalse(
TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
@Override
public Boolean call() {
return templateUrlService.setPlayAPISearchEngine("SearchEngine3",
"keyword3", "https://search.engine?q={searchTerms}",
"https://fav.icon");
}
}));
defaultSearchEngine =
TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<TemplateUrl>() {
@Override
public TemplateUrl call() throws Exception {
return templateUrlService.getDefaultSearchEngineTemplateUrl();
}
});
Assert.assertEquals("keyword2", defaultSearchEngine.getKeyword());
}
private int getSearchEngineCount(final TemplateUrlService templateUrlService) {
return TestThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() {
@Override
......
......@@ -245,7 +245,42 @@ jboolean TemplateUrlServiceAndroid::SetPlayAPISearchEngine(
const base::android::JavaParamRef<jstring>& jkeyword,
const base::android::JavaParamRef<jstring>& jsearch_url,
const base::android::JavaParamRef<jstring>& jfavicon_url) {
// TODO(crbug/1002271): Implement adding search engine to TemplateURLService.
// Check if there is already a search engine created from Play API.
TemplateURLService::TemplateURLVector template_urls =
template_url_service_->GetTemplateURLs();
auto existing_play_api_turl = std::find_if(
template_urls.cbegin(), template_urls.cend(),
[](const TemplateURL* turl) { return turl->created_from_play_api(); });
if (existing_play_api_turl != template_urls.cend())
return false;
base::string16 keyword =
base::android::ConvertJavaStringToUTF16(env, jkeyword);
const TemplateURL* existing_turl =
template_url_service_->GetTemplateURLForKeyword(keyword);
if (existing_turl) {
// TODO(crbug/1002271): Implement merging Play API search engine with
// existing prepopulated or autogenerated search engine.
return false;
}
TemplateURLData data;
data.SetShortName(base::android::ConvertJavaStringToUTF16(env, jname));
data.SetKeyword(keyword);
data.SetURL(base::android::ConvertJavaStringToUTF8(jsearch_url));
data.favicon_url = GURL(base::android::ConvertJavaStringToUTF8(jfavicon_url));
data.safe_for_autoreplace = true;
data.created_from_play_api = true;
TemplateURL* t_url =
template_url_service_->Add(std::make_unique<TemplateURL>(data));
if (!t_url) {
// TODO(crbug/1002271): Investigate and handle cases when
// TemplateURLService::Add() might return false.
return false;
}
if (template_url_service_->CanMakeDefault(t_url))
template_url_service_->SetUserSelectedDefaultSearchProvider(t_url);
return true;
}
......
......@@ -65,7 +65,7 @@ class TemplateUrlServiceAndroid : public TemplateURLServiceObserver {
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jkeyword);
// Adds a search engine, set by Play API.
// Adds a search engine, set by Play API. Sets it as DSE if possible.
// Returns true if search engine was successfully added, false if search
// engine from Play API with such keyword already existed (e.g. from previous
// attempt to set search engine).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment