Files
cromite/build/patches/Add-search-engine.patch

423 lines
19 KiB
Diff

From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Mon, 11 Dec 2017 22:42:11 +0100
Subject: Add search engine
Add a Google search engine that forces languages to English,
disable from all its searches RLZ and field experiments querystring parameters.
Add DuckDuckGo Lite
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
.../search_engine_choice/default_favicon.png | Bin 0 -> 903 bytes
components/search_engines/BUILD.gn | 3 ++
components/search_engines/cromite/BUILD.gn | 12 ++++++
.../cromite/cromite_prepopulated_engines.json | 37 ++++++++++++++++++
.../search_engine_choice_utils.cc | 9 +----
.../search_engines/search_engine_type.h | 5 +++
.../template_url_prepopulate_data.cc | 21 +++++++++-
.../template_url_prepopulate_data.h | 9 -----
tools/json_to_struct/json_to_struct.gni | 9 +++++
tools/json_to_struct/json_to_struct.py | 26 ++++++++----
tools/json_to_struct/struct_generator.py | 10 +++--
tools/variations/fieldtrial_to_struct.py | 4 +-
12 files changed, 113 insertions(+), 32 deletions(-)
create mode 100644 components/resources/default_100_percent/search_engine_choice/default_favicon.png
create mode 100644 components/search_engines/cromite/BUILD.gn
create mode 100644 components/search_engines/cromite/cromite_prepopulated_engines.json
diff --git a/components/resources/default_100_percent/search_engine_choice/default_favicon.png b/components/resources/default_100_percent/search_engine_choice/default_favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6533419f2d6b40f7735054dec62c51ddf1ee1201
GIT binary patch
literal 903
zcmV;219<$2P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm0009{Nkl<Zc-rk*
zHI&>u5dJaD%uTpU6K1Ny)MmAo?2~ki?Li;rI(@haGcz+YGo$8ZtH|rstmUBf-W*z<
z`LqMyjQ;vbR=naxn4FxTa$SOo%Y^Yq3CiCp`IM5k@HhA$JOj`EJVrBqK*>90<Y$Z!
zD&E1~9|C4N=Y0}PoKKzZ=aBLV-UaWB-0*4BX4X}1up41G3JAO#bVTDWd3iku6Hh={
zlma?HmsR5(hfh(b^FD*}4@!0sS4zV2hPiHTHz{QUr=p@EW3ne<xuXf?=gfeJ_n_0B
z@lJY|QARx>G)Ly==Qj#^Pm*zg`6NIm=nm~RX-}Ss_k_usva+)JncnmH^XI=4jNih$
zlz0y|WF4^Se4bG8m@v`L_#mWg6DB6I3T(&-X<X(aWBDC2?f1MT|2uB(BxS%X1$a%k
z;1;{ldEPHo!pWN$|21g&X`3k)RVSdZ`1-to+dxbxpx11tSFj1eY4p>FfHecpOCzcg
zpNwb+@DsmO2`6iI0DN;)MGkB;0q{--kR#0r9={VIfOiJ&qgPlcQV0O=qNN%EZUkK2
zXVWfZ`h5{40I)Gg`DG2UD<uwqtRPHQ`3e=w!vhePgFgO88URJiY>`5mlRG3V0I)IO
z^!VFvHvp@&1;F!4TUc<Tw?P23{124aYG2{<#pZ1%U*J~{i~%4NJtI_HQU19p>56LN
z%3gt$n(-Z(idK@zIi#qli66~IxloAGzuNPP+NSLfTs{_pT7f^J06kI9KUZ>A$&#d(
z+ZUd3gy@cNAuWhQ3vePzWtVK-4H5_<h_y6oOLkRNRsEA)yhw>iqgo-eCg3jF08o2(
zV+xr@B`n6nQmpYnUx3CSsDwu5Yyvoe1poxnZ<>do)Aj_?EW-9wQ^cQO=(N_*SpEcF
zA!n{N_=ZMrDQ)uj`{u@re$c++TFQW?-c&%T<H_NEl62(&6TL7nfTD(I>Jej=5G2dk
zc*-y0$13Q-mVE%=HZZcm54P~5#qa<$Vkc|B{qUnj<Z#y}04P$B=OI-_I^4yL*CEaE
zjS0pJfK7T{VJFY4st5f9G(|wnQru>jUSTzPpE5qa;Lv>bM_w_-mwYy_S=Aoxnl--Y
d#;<tA>kFnu^?NN9uE_uZ002ovPDHLkV1m60sc!%P
literal 0
HcmV?d00001
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn
--- a/components/search_engines/BUILD.gn
+++ b/components/search_engines/BUILD.gn
@@ -74,6 +74,7 @@ static_library("search_engines") {
"//third_party/metrics_proto",
"//third_party/omnibox_proto",
"//third_party/search_engines_data:prepopulated_engines",
+ "cromite:cromite_prepopulated_engines",
]
deps = [
@@ -165,6 +166,7 @@ source_set("search_engine_utils") {
"//components/regional_capabilities",
"//components/regional_capabilities:switches",
"//third_party/search_engines_data:prepopulated_engines",
+ "cromite:cromite_prepopulated_engines",
]
deps = [ "//url" ]
@@ -264,6 +266,7 @@ source_set("unit_tests") {
"//testing/gtest",
"//third_party/search_engines_data:prepopulated_engines",
"//third_party/search_engines_data:regional_settings",
+ "cromite:cromite_prepopulated_engines",
"//ui/base",
"//url",
]
diff --git a/components/search_engines/cromite/BUILD.gn b/components/search_engines/cromite/BUILD.gn
new file mode 100644
--- /dev/null
+++ b/components/search_engines/cromite/BUILD.gn
@@ -0,0 +1,12 @@
+import("//tools/json_to_struct/json_to_struct.gni")
+
+json_to_struct("cromite_prepopulated_engines") {
+ visibility = [ "//components/search_engines:*" ]
+
+ source = "cromite_prepopulated_engines.json"
+ schema_file = "//third_party/search_engines_data/prepopulated_engines_schema.json"
+ namespace = "TemplateURLPrepopulateData"
+ excludetype = true
+
+ deps = [ "//base" ]
+}
diff --git a/components/search_engines/cromite/cromite_prepopulated_engines.json b/components/search_engines/cromite/cromite_prepopulated_engines.json
new file mode 100644
--- /dev/null
+++ b/components/search_engines/cromite/cromite_prepopulated_engines.json
@@ -0,0 +1,37 @@
+{
+ "additionals_includes": {
+ "third_party/search_engines_data/resources/definitions/prepopulated_engines.h": ""
+ },
+ "elements": {
+ "duckduckgo_light": {
+ "name": "DuckDuckGo Light",
+ "keyword": "duckduckgo.com/lite",
+ "favicon_url": "https://duckduckgo.com/favicon.ico",
+ "search_url": "https://duckduckgo.com/lite/?q={searchTerms}",
+ "suggest_url": "https://duckduckgo.com/ac/?q={searchTerms}&type=list",
+ "type": "SEARCH_ENGINE_DUCKDUCKGOLIGHT",
+ "id": 12
+ },
+
+ "googleen": {
+ "name": "Google in English",
+ "keyword": "googleen",
+ "favicon_url": "https://www.google.com/favicon.ico",
+ "search_url": "{google:baseURL}search?q={searchTerms}&ie={inputEncoding}&hl=en",
+ "suggest_url": "{google:baseSuggestURL}search?client={google:suggestClient}&q={searchTerms}&hl=en",
+ "image_url": "{google:baseURL}searchbyimage/upload?hl=en",
+ "new_tab_url": "{google:baseURL}_/chrome/newtab?hl=en&ie={inputEncoding}",
+ "contextual_search_url": "{google:baseURL}_/contextualsearch?{google:contextualSearchVersion}{google:contextualSearchContextData}&hl=en",
+ "image_url_post_params": "encoded_image={google:imageThumbnail},image_url={google:imageURL},sbisrc={google:imageSearchSource},original_width={google:imageOriginalWidth},original_height={google:imageOriginalHeight}",
+ "alternate_urls": [
+ "{google:baseURL}?hl=en#q={searchTerms}",
+ "{google:baseURL}search?hl=en#q={searchTerms}",
+ "{google:baseURL}webhp?hl=en#q={searchTerms}",
+ "{google:baseURL}s?hl=en#q={searchTerms}",
+ "{google:baseURL}s?hl=en&q={searchTerms}"
+ ],
+ "type": "SEARCH_ENGINE_GOOGLE_EN",
+ "id": 13
+ }
+ }
+}
diff --git a/components/search_engines/search_engine_choice/search_engine_choice_utils.cc b/components/search_engines/search_engine_choice/search_engine_choice_utils.cc
--- a/components/search_engines/search_engine_choice/search_engine_choice_utils.cc
+++ b/components/search_engines/search_engine_choice/search_engine_choice_utils.cc
@@ -211,14 +211,7 @@ void RecordChoiceScreenDefaultSearchProviderType(
}
void RecordChoiceScreenSelectedIndex(int selected_engine_index) {
- base::UmaHistogramExactLinear(
- kSearchEngineChoiceScreenSelectedEngineIndexHistogram,
- selected_engine_index,
- TemplateURLPrepopulateData::kMaxEeaPrepopulatedEngines);
- base::PumaHistogramExactLinear(
- base::PumaType::kRc, kPumaSearchChoiceScreenSelectedEngineIndexHistogram,
- selected_engine_index,
- TemplateURLPrepopulateData::kMaxEeaPrepopulatedEngines);
+ // do nothing in Cromite
}
void RecordChoiceScreenPositionsCountryMismatch(bool has_mismatch) {
diff --git a/components/search_engines/search_engine_type.h b/components/search_engines/search_engine_type.h
--- a/components/search_engines/search_engine_type.h
+++ b/components/search_engines/search_engine_type.h
@@ -99,11 +99,16 @@ enum SearchEngineType {
SEARCH_ENGINE_KAGI = 79,
SEARCH_ENGINE_STARTER_PACK_AI_MODE = 80,
SEARCH_ENGINE_YAHOO_JP = 81,
+ SEARCH_ENGINE_GOOGLE_EN = 82,
+ SEARCH_ENGINE_DUCKDUCKGOLIGHT = 83,
SEARCH_ENGINE_MAX // Bounding value needed for UMA histogram macro.
};
// LINT.ThenChange(//tools/metrics/histograms/enums.xml:OmniboxSearchEngineType)
+static_assert(SEARCH_ENGINE_DUCKDUCKGOLIGHT == (SEARCH_ENGINE_MAX - 1),
+ "Please check this patch");
+
// Enum to record the type of search engine a user used in keyword mode. This
// should be kept aligned with the `OmniboxBuiltinEngineType` enum in enums.xml.
// Entries should not be renumbered and numeric values should never be reused.
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -29,6 +29,8 @@
#include "components/search_engines/template_url_data_util.h"
#include "third_party/search_engines_data/resources/definitions/prepopulated_engines.h"
+#include "components/search_engines/cromite/cromite_prepopulated_engines.h"
+
namespace TemplateURLPrepopulateData {
// Helpers --------------------------------------------------------------------
@@ -172,7 +174,7 @@ int GetDataVersion(PrefService* prefs) {
return kCurrentDataVersion;
}
-std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
+std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEnginesChromium(
PrefService& prefs,
const std::vector<const PrepopulatedEngine*>&
regional_prepopulated_engines) {
@@ -188,6 +190,17 @@ std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
&PrepopulatedEngineToTemplateURLData);
}
+std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
+ PrefService& prefs,
+ const std::vector<const PrepopulatedEngine*>&
+ regional_prepopulated_engines) {
+ std::vector<std::unique_ptr<TemplateURLData>> t_urls =
+ GetPrepopulatedEnginesChromium(prefs, regional_prepopulated_engines);
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(googleen));
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(duckduckgo_light));
+ return t_urls;
+}
+
std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(
PrefService& prefs,
const std::vector<const PrepopulatedEngine*>& regional_prepopulated_engines,
@@ -208,10 +221,14 @@ std::vector<std::unique_ptr<TemplateURLData>> GetLocalPrepopulatedEngines(
return std::vector<std::unique_ptr<TemplateURLData>>();
}
- return base::ToVector(regional_capabilities::GetPrepopulatedEngines(
+ std::vector<std::unique_ptr<TemplateURLData>> t_urls =
+ base::ToVector(regional_capabilities::GetPrepopulatedEngines(
country_id, prefs,
regional_capabilities::SearchEngineListType::kTopN),
&PrepopulatedEngineToTemplateURLData);
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(googleen));
+ t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(duckduckgo_light));
+ return t_urls;
}
#endif
diff --git a/components/search_engines/template_url_prepopulate_data.h b/components/search_engines/template_url_prepopulate_data.h
--- a/components/search_engines/template_url_prepopulate_data.h
+++ b/components/search_engines/template_url_prepopulate_data.h
@@ -27,15 +27,6 @@ struct PrepopulatedEngine;
extern const int kMaxPrepopulatedEngineID;
-// The maximum number of prepopulated search engines that can be returned in
-// any of the EEA countries by `GetPrepopulatedEngines()`.
-//
-// Note: If this is increased, please also increase the declared variant count
-// for the `Search.ChoiceScreenShowedEngineAt.Index{Index}` histogram.
-// TODO(crbug.com/408932087): Investigate moving it to the file that actually
-// populates these, `//c/regional_capabilities/r*c*_util.cc`.
-inline constexpr size_t kMaxEeaPrepopulatedEngines = 8;
-
// The maximum number of prepopulated search engines that can be returned in
// in the rest of the world by `GetPrepopulatedEngines()`.
// TODO(crbug.com/408932087): Investigate deduping it with the constant
diff --git a/tools/json_to_struct/json_to_struct.gni b/tools/json_to_struct/json_to_struct.gni
--- a/tools/json_to_struct/json_to_struct.gni
+++ b/tools/json_to_struct/json_to_struct.gni
@@ -39,6 +39,11 @@ template("json_to_struct") {
action_name = target_name + "_action"
source_set_name = target_name
+ excludetype = false
+ if (defined(invoker.excludetype)) {
+ excludetype = invoker.excludetype
+ }
+
action(action_name) {
visibility = [ ":$source_set_name" ]
script = "//tools/json_to_struct/json_to_struct.py"
@@ -61,6 +66,10 @@ template("json_to_struct") {
"--namespace=" + invoker.namespace,
"--schema=" + rebase_path(invoker.schema_file, root_build_dir),
]
+
+ if (excludetype) {
+ args += [ "--excludetype=yes" ]
+ }
}
source_set(source_set_name) {
diff --git a/tools/json_to_struct/json_to_struct.py b/tools/json_to_struct/json_to_struct.py
--- a/tools/json_to_struct/json_to_struct.py
+++ b/tools/json_to_struct/json_to_struct.py
@@ -104,7 +104,7 @@ def _GenerateHeaderGuard(h_filename):
return re.sub(u'^_*', '', result) + u'_' # Remove leading underscores.
-def _GenerateH(basepath, fileroot, head, namespace, schema, description):
+def _GenerateH(basepath, fileroot, head, namespace, schema, description, excludetype):
"""Generates the .h file containing the definition of the structure specified
by the schema.
@@ -148,11 +148,15 @@ def _GenerateH(basepath, fileroot, head, namespace, schema, description):
f.write(u'#include "%s"\n' % header)
f.write(u'\n')
+ for header in description.get(u'additionals_includes', []):
+ f.write(u'#include "%s"\n' % header)
+ f.write(u'\n')
+
if namespace:
f.write(u'namespace %s {\n' % namespace)
f.write(u'\n')
- f.write(struct_generator.GenerateStruct(
+ f.write(struct_generator.GenerateStruct(excludetype,
schema['type_name'], schema['schema']))
f.write(u'\n')
@@ -177,7 +181,7 @@ def _GenerateH(basepath, fileroot, head, namespace, schema, description):
f.write(u'#endif // %s\n' % header_guard)
-def _GenerateCC(basepath, fileroot, head, namespace, schema, description):
+def _GenerateCC(basepath, fileroot, head, namespace, schema, description, excludetype):
"""Generates the .cc file containing the static initializers for the
of the elements specified in the description.
@@ -212,7 +216,7 @@ def _GenerateCC(basepath, fileroot, head, namespace, schema, description):
f.write(element_generator.GenerateElements(schema['type_name'],
schema['schema'], description))
- if not aggregation.export_items:
+ if excludetype == False and not aggregation.export_items:
f.write('\n} // anonymous namespace \n\n')
aggregated = GenerateCCAggregation(schema['type_name'], aggregation)
@@ -299,7 +303,7 @@ def GenerateClass(basepath,
def GenerateStruct(basepath, output_root, namespace, schema, description,
- description_filename, schema_filename, year=None):
+ description_filename, schema_filename, excludetype, year):
"""Generates a C++ struct from a JSON description.
Args:
@@ -318,8 +322,8 @@ def GenerateStruct(basepath, output_root, namespace, schema, description,
"""
year = int(year) if year else datetime.now().year
head = HEAD % (year, schema_filename, description_filename)
- _GenerateH(basepath, output_root, head, namespace, schema, description)
- _GenerateCC(basepath, output_root, head, namespace, schema, description)
+ _GenerateH(basepath, output_root, head, namespace, schema, description, excludetype)
+ _GenerateCC(basepath, output_root, head, namespace, schema, description, excludetype)
if __name__ == '__main__':
parser = optparse.OptionParser(
@@ -334,11 +338,17 @@ if __name__ == '__main__':
parser.add_option('-s', '--schema', help='path to the schema file, '
'mandatory.')
parser.add_option('-o', '--output', help='output filename, ')
+ parser.add_option('-x', '--excludetype', help='exclude type generator, ')
(opts, args) = parser.parse_args()
if not opts.schema:
parser.error('You must specify a --schema.')
+ if not opts.excludetype:
+ opts.excludetype = False
+ else:
+ opts.excludetype = True
+
description_filename = os.path.normpath(args[0])
root, ext = os.path.splitext(description_filename)
shortroot = opts.output if opts.output else os.path.split(root)[1]
@@ -355,4 +365,4 @@ if __name__ == '__main__':
schema = _Load(opts.schema)
description = _Load(description_filename)
GenerateStruct(basepath, output_root, opts.namespace, schema, description,
- description_filename, opts.schema)
+ description_filename, opts.schema, opts.excludetype, datetime.now().year)
diff --git a/tools/json_to_struct/struct_generator.py b/tools/json_to_struct/struct_generator.py
--- a/tools/json_to_struct/struct_generator.py
+++ b/tools/json_to_struct/struct_generator.py
@@ -30,20 +30,24 @@ def GenerateField(field_info):
else:
raise RuntimeError('Unknown field type "%s"' % type)
-def GenerateStruct(type_name, schema):
+def GenerateStruct(excludetype, type_name, schema):
"""Generate a string defining a structure containing the fields specified in
the schema list.
"""
lines = []
+ if excludetype:
+ lines.append('struct %s;' % type_name)
+ return '\n'.join(lines) + '\n'
+
lines.append('struct %s {' % type_name)
for field_info in schema:
if field_info['type'] == 'struct':
- lines.insert(0, GenerateStruct(field_info['type_name'],
+ lines.insert(0, GenerateStruct(excludetype, field_info['type_name'],
field_info['fields']))
elif (field_info['type'] == 'array'
and field_info['contents']['type'] == 'struct'):
contents = field_info['contents']
- lines.insert(0, GenerateStruct(contents['type_name'],
+ lines.insert(0, GenerateStruct(excludetype, contents['type_name'],
contents['fields']))
lines.append(' ' + GenerateField(field_info) + ';')
lines.append('};')
diff --git a/tools/variations/fieldtrial_to_struct.py b/tools/variations/fieldtrial_to_struct.py
--- a/tools/variations/fieldtrial_to_struct.py
+++ b/tools/variations/fieldtrial_to_struct.py
@@ -210,14 +210,14 @@ def main(arguments):
json_to_struct.GenerateStruct(
basepath, output_root, opts.namespace, schema, description,
os.path.split(description_filename)[1], os.path.split(opts.schema)[1],
- opts.year)
+ False, opts.year)
# TODO(peilinwang) filter the schema by platform, form_factor, etc.
if opts.java:
json_to_struct.GenerateClass(basepath, output_root, opts.namespace, schema,
description,
os.path.split(description_filename)[1],
- os.path.split(opts.schema)[1], opts.year)
+ os.path.split(opts.schema)[1], False, opts.year)
if __name__ == '__main__':
--