summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-17 18:42:03 +0000
committerkmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-17 18:42:03 +0000
commit8ca7e09cc5179af7ce94221e9538e0b100202628 (patch)
treea7389af5637ec3993813efc398477ccd9c3c1ec7
parentfd569cdd997e550483e1fb421e3646aaba57d7ba (diff)
downloadchromium_src-8ca7e09cc5179af7ce94221e9538e0b100202628.zip
chromium_src-8ca7e09cc5179af7ce94221e9538e0b100202628.tar.gz
chromium_src-8ca7e09cc5179af7ce94221e9538e0b100202628.tar.bz2
To support Instant search in Android Chrome, this CL
(1) Prerenders an Instant search base page on the receipt of a high-confidence search suggestion. (2) Prefetches the search results for the high-confidence suggestion using the prerendered page. (3) When the user commits the search query, Android Chrome submits the query to the prerendered page and swaps the active tab contents with the prerendered contents. BUG=382694 TEST= Apply this patch, build Android Chrome and run it against the server url specified in go/yzcku. Type a search query in the LocationBar. Android Chrome should identify the high-confidence suggestion for the typed query and prefetch the results for that suggestion. Commit the typed query. Android Chrome should swap the active tab contents with the prerendered page contents. You should see the search results instantaneously. Review URL: https://codereview.chromium.org/321943002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277818 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/about_flags.cc4
-rw-r--r--chrome/browser/android/omnibox/autocomplete_controller_android.cc30
-rw-r--r--chrome/browser/android/omnibox/omnibox_prerender.cc36
-rw-r--r--chrome/browser/android/tab_android.cc15
4 files changed, 72 insertions, 13 deletions
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 77af30b..b38fa9b 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1742,14 +1742,14 @@ const Experiment kExperiments[] = {
kOsAndroid,
SINGLE_VALUE_TYPE(switches::kDisableCast)
},
-#endif
{
"prefetch-search-results",
IDS_FLAGS_PREFETCH_SEARCH_RESULTS_NAME,
IDS_FLAGS_PREFETCH_SEARCH_RESULTS_DESCRIPTION,
- kOsDesktop,
+ kOsAndroid,
SINGLE_VALUE_TYPE(switches::kPrefetchSearchResults)
},
+#endif
#if defined(ENABLE_APP_LIST)
{
"enable-experimental-app-list",
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
index 1bd65ad..ffbb3eb 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/autocomplete/autocomplete_controller.h"
#include "chrome/browser/autocomplete/autocomplete_input.h"
#include "chrome/browser/autocomplete/autocomplete_match.h"
+#include "chrome/browser/autocomplete/search_provider.h"
#include "chrome/browser/autocomplete/shortcuts_backend_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
@@ -24,11 +25,14 @@
#include "chrome/browser/profiles/incognito_helpers.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/search/search.h"
#include "chrome/browser/search_engines/template_url_service.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/sessions/session_id.h"
+#include "chrome/browser/ui/search/instant_search_prerenderer.h"
#include "chrome/browser/ui/toolbar/toolbar_model.h"
#include "chrome/common/autocomplete_match_type.h"
+#include "chrome/common/instant_types.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
@@ -329,7 +333,31 @@ void AutocompleteControllerAndroid::InitJNI(JNIEnv* env, jobject obj) {
void AutocompleteControllerAndroid::OnResultChanged(
bool default_match_changed) {
- if (autocomplete_controller_.get() != NULL && !inside_synchronous_start_)
+ if (!autocomplete_controller_)
+ return;
+
+ const AutocompleteResult& result = autocomplete_controller_->result();
+ const AutocompleteResult::const_iterator default_match(
+ result.default_match());
+ if ((default_match != result.end()) && default_match_changed &&
+ chrome::IsInstantExtendedAPIEnabled() &&
+ chrome::ShouldPrefetchSearchResults()) {
+ InstantSuggestion prefetch_suggestion;
+ // If the default match should be prefetched, do that.
+ if (SearchProvider::ShouldPrefetch(*default_match)) {
+ prefetch_suggestion.text = default_match->contents;
+ prefetch_suggestion.metadata =
+ SearchProvider::GetSuggestMetadata(*default_match);
+ }
+ // Send the prefetch suggestion unconditionally to the Instant search base
+ // page. If there is no suggestion to prefetch, we need to send a blank
+ // query to clear the prefetched results.
+ InstantSearchPrerenderer* prerenderer =
+ InstantSearchPrerenderer::GetForProfile(profile_);
+ if (prerenderer)
+ prerenderer->Prerender(prefetch_suggestion);
+ }
+ if (!inside_synchronous_start_)
NotifySuggestionsReceived(autocomplete_controller_->result());
}
diff --git a/chrome/browser/android/omnibox/omnibox_prerender.cc b/chrome/browser/android/omnibox/omnibox_prerender.cc
index 67bb950..c3916c5 100644
--- a/chrome/browser/android/omnibox/omnibox_prerender.cc
+++ b/chrome/browser/android/omnibox/omnibox_prerender.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
+#include "chrome/browser/ui/search/instant_search_prerenderer.h"
#include "content/public/browser/web_contents.h"
#include "jni/OmniboxPrerender_jni.h"
#include "url/gurl.h"
@@ -88,18 +89,25 @@ void OmniboxPrerender::PrerenderMaybe(JNIEnv* env,
if (default_match == autocomplete_result->end())
return;
- AutocompleteActionPredictor* action_predictor =
- AutocompleteActionPredictorFactory::GetForProfile(profile);
- if (!action_predictor)
- return;
-
AutocompleteActionPredictor::Action recommended_action =
AutocompleteActionPredictor::ACTION_NONE;
- if (action_predictor) {
- action_predictor->
- RegisterTransitionalMatches(url_string, *autocomplete_result);
- recommended_action =
- action_predictor->RecommendAction(url_string, *default_match);
+ InstantSearchPrerenderer* prerenderer =
+ InstantSearchPrerenderer::GetForProfile(profile);
+ if (prerenderer &&
+ prerenderer->IsAllowed(*default_match, web_contents)) {
+ recommended_action = AutocompleteActionPredictor::ACTION_PRERENDER;
+ } else {
+ AutocompleteActionPredictor* action_predictor =
+ AutocompleteActionPredictorFactory::GetForProfile(profile);
+ if (!action_predictor)
+ return;
+
+ if (action_predictor) {
+ action_predictor->
+ RegisterTransitionalMatches(url_string, *autocomplete_result);
+ recommended_action =
+ action_predictor->RecommendAction(url_string, *default_match);
+ }
}
GURL current_url = GURL(current_url_string);
@@ -135,6 +143,14 @@ void OmniboxPrerender::DoPrerender(const AutocompleteMatch& match,
if (!web_contents)
return;
gfx::Rect container_bounds = web_contents->GetContainerBounds();
+ InstantSearchPrerenderer* prerenderer =
+ InstantSearchPrerenderer::GetForProfile(profile);
+ if (prerenderer && prerenderer->IsAllowed(match, web_contents)) {
+ prerenderer->Init(
+ web_contents->GetController().GetSessionStorageNamespaceMap(),
+ container_bounds.size());
+ return;
+ }
predictors::AutocompleteActionPredictorFactory::GetForProfile(profile)->
StartPrerendering(
match.destination_url,
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index b74feb4..dcf45ca 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -31,6 +31,7 @@
#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
#include "chrome/browser/ui/android/window_android_helper.h"
#include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h"
+#include "chrome/browser/ui/search/instant_search_prerenderer.h"
#include "chrome/browser/ui/search/search_tab_helper.h"
#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
#include "chrome/browser/ui/tab_helpers.h"
@@ -395,6 +396,20 @@ TabAndroid::TabLoadStatus TabAndroid::LoadUrl(JNIEnv* env,
bool prefetched_page_loaded = HasPrerenderedUrl(gurl);
// Getting the load status before MaybeUsePrerenderedPage() b/c it resets.
chrome::NavigateParams params(NULL, web_contents());
+ InstantSearchPrerenderer* prerenderer =
+ InstantSearchPrerenderer::GetForProfile(GetProfile());
+ if (prerenderer) {
+ const base::string16& search_terms =
+ chrome::ExtractSearchTermsFromURL(GetProfile(), gurl);
+ if (!search_terms.empty() &&
+ prerenderer->CanCommitQuery(web_contents_.get(), search_terms)) {
+ prerenderer->Commit(search_terms);
+
+ if (prerenderer->UsePrerenderedPage(gurl, &params))
+ return FULL_PRERENDERED_PAGE_LOAD;
+ }
+ prerenderer->Cancel();
+ }
if (prerender_manager->MaybeUsePrerenderedPage(gurl, &params)) {
return prefetched_page_loaded ?
FULL_PRERENDERED_PAGE_LOAD : PARTIAL_PRERENDERED_PAGE_LOAD;