OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.contextualsearch; | 5 package org.chromium.chrome.browser.contextualsearch; |
6 | 6 |
7 import android.net.Uri; | 7 import android.net.Uri; |
| 8 import android.text.TextUtils; |
8 | 9 |
| 10 import org.chromium.base.VisibleForTesting; |
9 import org.chromium.chrome.browser.search_engines.TemplateUrlService; | 11 import org.chromium.chrome.browser.search_engines.TemplateUrlService; |
10 | 12 |
11 import java.net.MalformedURLException; | 13 import java.net.MalformedURLException; |
12 import java.net.URL; | 14 import java.net.URL; |
| 15 import java.util.Locale; |
13 | 16 |
14 import javax.annotation.Nullable; | 17 import javax.annotation.Nullable; |
15 | 18 |
16 | 19 |
17 /** | 20 /** |
18 * Bundles a Search Request URL with a low-priority version of the URL, helps ma
nage the | 21 * Bundles a Search Request URL with a low-priority version of the URL, helps ma
nage the |
19 * fall-back when the low-priority version fails, and tracks which one is in use
. | 22 * fall-back when the low-priority version fails, and tracks which one is in use
. |
20 */ | 23 */ |
21 class ContextualSearchRequest { | 24 class ContextualSearchRequest { |
| 25 private final boolean mWasPrefetch; |
22 | 26 |
23 private final Uri mLowPriorityUri; | 27 private Uri mLowPriorityUri; |
24 private final Uri mNormalPriorityUri; | 28 private Uri mNormalPriorityUri; |
25 private final boolean mWasPrefetch; | |
26 | 29 |
27 private boolean mIsLowPriority; | 30 private boolean mIsLowPriority; |
28 private boolean mHasFailedLowPriorityLoad; | 31 private boolean mHasFailedLowPriorityLoad; |
| 32 private boolean mIsTranslationForced; |
29 | 33 |
| 34 private static final String GWS_LOW_PRIORITY_SEARCH_PATH = "s"; |
| 35 private static final String GWS_SEARCH_NO_SUGGESTIONS_PARAM = "sns"; |
| 36 private static final String GWS_SEARCH_NO_SUGGESTIONS_PARAM_VALUE = "1"; |
| 37 private static final String GWS_QUERY_PARAM = "q"; |
30 private static final String CTXS_PARAM_PATTERN = "(ctxs=[^&]+)"; | 38 private static final String CTXS_PARAM_PATTERN = "(ctxs=[^&]+)"; |
31 private static final String CTXR_PARAM = "ctxr"; | 39 private static final String CTXR_PARAM = "ctxr"; |
| 40 @VisibleForTesting static final String TLITE_SOURCE_LANGUAGE_PARAM = "tlites
l"; |
| 41 private static final String TLITE_TARGET_LANGUAGE_PARAM = "tlitetl"; |
| 42 private static final String TLITE_QUERY_PARAM = "tlitetxt"; |
32 | 43 |
33 /** | 44 /** |
34 * Creates a search request for the given search term without any alternate
term and | 45 * Creates a search request for the given search term without any alternate
term and |
35 * for normal-priority loading capability only. | 46 * for normal-priority loading capability only. |
36 * @param searchTerm The resolved search term. | 47 * @param searchTerm The resolved search term. |
37 */ | 48 */ |
38 ContextualSearchRequest(String searchTerm) { | 49 ContextualSearchRequest(String searchTerm) { |
39 this(searchTerm, null, false); | 50 this(searchTerm, null, false); |
40 } | 51 } |
41 | 52 |
42 /** | 53 /** |
43 * Creates a search request for the given search term with the given alterna
te term and | 54 * Creates a search request for the given search term with the given alterna
te term and |
44 * low-priority loading capability. | 55 * low-priority loading capability. |
45 * @param searchTerm The resolved search term. | 56 * @param searchTerm The resolved search term. |
46 * @param alternateTerm The alternate search term. | 57 * @param alternateTerm The alternate search term. |
47 * @param isLowPriorityEnabled Whether the request can be made at a low prio
rity. | 58 * @param isLowPriorityEnabled Whether the request can be made at a low prio
rity. |
48 */ | 59 */ |
49 ContextualSearchRequest(String searchTerm, @Nullable String alternateTerm, | 60 ContextualSearchRequest(String searchTerm, @Nullable String alternateTerm, |
50 boolean isLowPriorityEnabled) { | 61 boolean isLowPriorityEnabled) { |
51 mWasPrefetch = isLowPriorityEnabled; | 62 mWasPrefetch = isLowPriorityEnabled; |
52 mNormalPriorityUri = getUriTemplate(searchTerm, alternateTerm, false); | 63 mNormalPriorityUri = getUriTemplate(searchTerm, alternateTerm, false); |
53 if (isLowPriorityEnabled) { | 64 if (isLowPriorityEnabled) { |
54 // TODO(donnd): Call TemplateURL once we have an API for 3rd-party p
roviders. | 65 // TODO(donnd): Call TemplateURL once we have an API for 3rd-party p
roviders. |
55 Uri baseLowPriorityUri = getUriTemplate(searchTerm, alternateTerm, t
rue); | 66 Uri baseLowPriorityUri = getUriTemplate(searchTerm, alternateTerm, t
rue); |
56 mLowPriorityUri = baseLowPriorityUri.buildUpon() | 67 mLowPriorityUri = makeLowPriorityUri(baseLowPriorityUri); |
57 .path("s") | |
58 .appendQueryParameter("sns", "1") | |
59 .build(); | |
60 mIsLowPriority = true; | 68 mIsLowPriority = true; |
61 } else { | 69 } else { |
62 mIsLowPriority = false; | 70 mIsLowPriority = false; |
63 mLowPriorityUri = null; | 71 mLowPriorityUri = null; |
64 } | 72 } |
65 } | 73 } |
66 | 74 |
67 /** | 75 /** |
68 * Sets an indicator that the normal-priority URL should be used for this se
arch request. | 76 * Sets an indicator that the normal-priority URL should be used for this se
arch request. |
69 */ | 77 */ |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 try { | 141 try { |
134 url = new URL(searchUrl.replaceAll(CTXS_PARAM_PATTERN, CTXR_PARAM)); | 142 url = new URL(searchUrl.replaceAll(CTXS_PARAM_PATTERN, CTXR_PARAM)); |
135 } catch (MalformedURLException e) { | 143 } catch (MalformedURLException e) { |
136 url = null; | 144 url = null; |
137 } | 145 } |
138 | 146 |
139 return url != null ? url.toString() : null; | 147 return url != null ? url.toString() : null; |
140 } | 148 } |
141 | 149 |
142 /** | 150 /** |
| 151 * Adds translation parameters. |
| 152 * @param sourceLanguage The language of the original search term. |
| 153 * @param targetLanguage The language the that the user prefers. |
| 154 */ |
| 155 void forceTranslation(String sourceLanguage, String targetLanguage) { |
| 156 mIsTranslationForced = true; |
| 157 if (mLowPriorityUri != null) { |
| 158 mLowPriorityUri = makeTranslateUri(mLowPriorityUri, sourceLanguage,
targetLanguage); |
| 159 } |
| 160 mNormalPriorityUri = makeTranslateUri(mNormalPriorityUri, sourceLanguage
, targetLanguage); |
| 161 } |
| 162 |
| 163 /** |
| 164 * @return Whether translation was forced for this request. |
| 165 */ |
| 166 @VisibleForTesting |
| 167 boolean isTranslationForced() { |
| 168 return mIsTranslationForced; |
| 169 } |
| 170 |
| 171 /** |
143 * Uses TemplateUrlService to generate the url for the given query | 172 * Uses TemplateUrlService to generate the url for the given query |
144 * {@link String} for {@code query} with the contextual search version param
set. | 173 * {@link String} for {@code query} with the contextual search version param
set. |
145 * @param query The search term to use as the main query in the returned sea
rch url. | 174 * @param query The search term to use as the main query in the returned sea
rch url. |
146 * @param alternateTerm The alternate search term to use as an alternate sug
gestion. | 175 * @param alternateTerm The alternate search term to use as an alternate sug
gestion. |
147 * @param shouldPrefetch Whether the returned url should include a prefetch
parameter. | 176 * @param shouldPrefetch Whether the returned url should include a prefetch
parameter. |
148 * @return A {@link String} that contains the url of the default search
engine with | 177 * @return A {@link Uri} that contains the url of the default search engine
with |
149 * {@code query} and {@code alternateTerm} inserted as paramete
rs and contextual | 178 * {@code query} and {@code alternateTerm} inserted as parameters an
d contextual |
150 * search and prefetch parameters conditionally set. | 179 * search and prefetch parameters conditionally set. |
151 */ | 180 */ |
152 private Uri getUriTemplate(String query, @Nullable String alternateTerm, | 181 private Uri getUriTemplate(String query, @Nullable String alternateTerm, |
153 boolean shouldPrefetch) { | 182 boolean shouldPrefetch) { |
154 return Uri.parse(TemplateUrlService.getInstance().getUrlForContextualSea
rchQuery( | 183 return Uri.parse(TemplateUrlService.getInstance().getUrlForContextualSea
rchQuery( |
155 query, alternateTerm, shouldPrefetch)); | 184 query, alternateTerm, shouldPrefetch)); |
156 } | 185 } |
| 186 |
| 187 /** |
| 188 * @return a low-priority {@code Uri} from the given base {@code Uri}. |
| 189 */ |
| 190 private Uri makeLowPriorityUri(Uri baseUri) { |
| 191 return baseUri.buildUpon() |
| 192 .path(GWS_LOW_PRIORITY_SEARCH_PATH) |
| 193 .appendQueryParameter( |
| 194 GWS_SEARCH_NO_SUGGESTIONS_PARAM, GWS_SEARCH_NO_SUGGESTIO
NS_PARAM_VALUE) |
| 195 .build(); |
| 196 } |
| 197 |
| 198 /** |
| 199 * Makes the given {@code Uri} into a similar Uri that triggers a Translate
one-box. |
| 200 * @param baseUri The base Uri to build off of. |
| 201 * @param sourceLanguage The language of the original search term. |
| 202 * @param targetLanguage The language the that the user prefers. |
| 203 * @return A {@link Uri} that has additional parameters for Translate approp
riately set. |
| 204 */ |
| 205 private Uri makeTranslateUri(Uri baseUri, String sourceLanguage, String targ
etLanguage) { |
| 206 // TODO(donnd): update to work for non-English. See also getTranslateQu
ery. |
| 207 if (!TextUtils.equals(targetLanguage, Locale.ENGLISH.getLanguage())) ret
urn baseUri; |
| 208 Uri resultUri = baseUri; |
| 209 if (!sourceLanguage.isEmpty() || !targetLanguage.isEmpty()) { |
| 210 // We must replace the q= param, and there seems to be no good way o
ther than clearing |
| 211 // all the query params and adding them all back in, changing q=. |
| 212 Uri.Builder builder = baseUri.buildUpon().clearQuery(); |
| 213 String query = null; |
| 214 for (String param : baseUri.getQueryParameterNames()) { |
| 215 String value = baseUri.getQueryParameter(param); |
| 216 if (TextUtils.equals(param, GWS_QUERY_PARAM)) { |
| 217 query = value; |
| 218 value = getTranslateQuery(); |
| 219 } |
| 220 builder.appendQueryParameter(param, value); |
| 221 } |
| 222 if (!sourceLanguage.isEmpty()) { |
| 223 builder.appendQueryParameter(TLITE_SOURCE_LANGUAGE_PARAM, source
Language); |
| 224 } |
| 225 if (!targetLanguage.isEmpty()) { |
| 226 builder.appendQueryParameter(TLITE_TARGET_LANGUAGE_PARAM, target
Language); |
| 227 } |
| 228 builder.appendQueryParameter(TLITE_QUERY_PARAM, query); |
| 229 resultUri = builder.build(); |
| 230 } |
| 231 return resultUri; |
| 232 } |
| 233 |
| 234 /** |
| 235 * TODO(donnd): This translate API is evolving. Update this code! |
| 236 * TODO(donnd): As of Oct 2015 this will only work on production GWS to tran
slate into English. |
| 237 */ |
| 238 private String getTranslateQuery() { |
| 239 return "Translate"; |
| 240 } |
157 } | 241 } |
OLD | NEW |