| Index: chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
|
| index 26dcfc45efb8d8bf3f1bf522d27d383d40fe527c..0ff7e039b7793b56660e25b9fb9099fb95747932 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
|
| @@ -226,6 +226,36 @@ public class LocationBarLayout extends FrameLayout
|
|
|
| private Runnable mShowSuggestions;
|
|
|
| + private boolean mShowCachedZeroSuggestResults;
|
| +
|
| + private DeferredOnSelectionRunnable mDeferredOnSelection;
|
| +
|
| + private abstract class DeferredOnSelectionRunnable implements Runnable {
|
| + protected final OmniboxSuggestion mSuggestion;
|
| + protected final int mPosition;
|
| + protected boolean mShouldLog;
|
| +
|
| + public DeferredOnSelectionRunnable(OmniboxSuggestion suggestion, int position) {
|
| + this.mSuggestion = suggestion;
|
| + this.mPosition = position;
|
| + }
|
| +
|
| + /**
|
| + * Set whether the selection matches with native results for logging to make sense.
|
| + * @param log Whether the selection should be logged in native code.
|
| + */
|
| + public void setShouldLog(boolean log) {
|
| + mShouldLog = log;
|
| + }
|
| +
|
| + /**
|
| + * @return Whether the selection should be logged in native code.
|
| + */
|
| + public boolean shouldLog() {
|
| + return mShouldLog;
|
| + }
|
| + }
|
| +
|
| /**
|
| * Listener for receiving the messages related with interacting with the omnibox during startup.
|
| */
|
| @@ -761,6 +791,29 @@ public class LocationBarLayout extends FrameLayout
|
| // If the user focused the omnibox prior to the native libraries being initialized,
|
| // autocomplete will not always be enabled, so we force it enabled in that case.
|
| mUrlBar.setIgnoreTextChangesForAutocomplete(false);
|
| + mAutocomplete = new AutocompleteController(this);
|
| + }
|
| +
|
| + /**
|
| + * Sets to show cached zero suggest results. This will start both caching zero suggest results
|
| + * in shared preferences and also attempt to show them when appropriate without needing native
|
| + * initialization. See {@link LocationBarLayout#showCachedZeroSuggestResultsIfAvailable()} for
|
| + * showing the loaded results before native initialization.
|
| + * @param showCachedZeroSuggestResults Whether cached zero suggest should be shown.
|
| + */
|
| + public void setShowCachedZeroSuggestResults(boolean showCachedZeroSuggestResults) {
|
| + mShowCachedZeroSuggestResults = showCachedZeroSuggestResults;
|
| + if (mShowCachedZeroSuggestResults) mAutocomplete.startCachedZeroSuggest();
|
| + }
|
| +
|
| + /**
|
| + * Signals the omnibox to shows the cached zero suggest results if they have been loaded from
|
| + * cache successfully.
|
| + */
|
| + public void showCachedZeroSuggestResultsIfAvailable() {
|
| + if (!mShowCachedZeroSuggestResults || mSuggestionList == null) return;
|
| + setSuggestionsListVisibility(true);
|
| + mSuggestionList.updateLayoutParams();
|
| }
|
|
|
| /**
|
| @@ -794,8 +847,6 @@ public class LocationBarLayout extends FrameLayout
|
| mDeleteButton.setOnClickListener(this);
|
| mMicButton.setOnClickListener(this);
|
|
|
| - mAutocomplete = new AutocompleteController(this);
|
| -
|
| mOmniboxPrerender = new OmniboxPrerender();
|
|
|
| for (Runnable deferredRunnable : mDeferredNativeRunnables) {
|
| @@ -1548,6 +1599,15 @@ public class LocationBarLayout extends FrameLayout
|
| @Override
|
| public void onSelection(OmniboxSuggestion suggestion, int position) {
|
| mSuggestionSelectionInProgress = true;
|
| + if (mShowCachedZeroSuggestResults && !mNativeInitialized) {
|
| + mDeferredOnSelection = new DeferredOnSelectionRunnable(suggestion, position) {
|
| + @Override
|
| + public void run() {
|
| + onSelection(this.mSuggestion, this.mPosition);
|
| + }
|
| + };
|
| + return;
|
| + }
|
| String suggestionMatchUrl = updateSuggestionUrlIfNeeded(
|
| suggestion, position, false);
|
| loadUrlFromOmniboxMatch(suggestionMatchUrl, suggestion.getTransition(), position,
|
| @@ -1720,7 +1780,7 @@ public class LocationBarLayout extends FrameLayout
|
| */
|
| @Override
|
| public void hideSuggestions() {
|
| - if (mAutocomplete == null) return;
|
| + if (mAutocomplete == null || !mNativeInitialized) return;
|
|
|
| if (mShowSuggestions != null) removeCallbacks(mShowSuggestions);
|
|
|
| @@ -1861,12 +1921,13 @@ public class LocationBarLayout extends FrameLayout
|
| // so can only be called once the native side is set up.
|
| assert mNativeInitialized : "Suggestions received before native side intialialized";
|
|
|
| - if (getCurrentTab() == null) {
|
| - // If the current tab is not available, drop the suggestions and hide the autocomplete.
|
| - hideSuggestions();
|
| - return;
|
| + if (mDeferredOnSelection != null) {
|
| + mDeferredOnSelection.setShouldLog(newSuggestions.size() > mDeferredOnSelection.mPosition
|
| + && mDeferredOnSelection.mSuggestion.equals(
|
| + newSuggestions.get(mDeferredOnSelection.mPosition)));
|
| + mDeferredOnSelection.run();
|
| + mDeferredOnSelection = null;
|
| }
|
| -
|
| String userText = mUrlBar.getTextWithoutAutocomplete();
|
| mUrlTextAfterSuggestionsReceived = userText + inlineAutocompleteText;
|
|
|
| @@ -1945,7 +2006,8 @@ public class LocationBarLayout extends FrameLayout
|
| // Update the navigation button to show the default suggestion's icon.
|
| updateNavigationButton();
|
|
|
| - if (!CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_INSTANT)
|
| + if (mNativeInitialized
|
| + && !CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_INSTANT)
|
| && PrivacyPreferencesManager.getInstance().shouldPrerender()) {
|
| mOmniboxPrerender.prerenderMaybe(
|
| userText,
|
| @@ -2092,9 +2154,15 @@ public class LocationBarLayout extends FrameLayout
|
| WebContents webContents = currentTab != null ? currentTab.getWebContents() : null;
|
| long elapsedTimeSinceModified = mNewOmniboxEditSessionTimestamp > 0
|
| ? (SystemClock.elapsedRealtime() - mNewOmniboxEditSessionTimestamp) : -1;
|
| - mAutocomplete.onSuggestionSelected(matchPosition, type, currentPageUrl,
|
| - mUrlFocusedFromFakebox, elapsedTimeSinceModified, mUrlBar.getAutocompleteLength(),
|
| - webContents);
|
| + boolean shouldSkipNativeLog = mShowCachedZeroSuggestResults
|
| + && (mDeferredOnSelection != null)
|
| + && !mDeferredOnSelection.shouldLog();
|
| + if (!shouldSkipNativeLog) {
|
| + mAutocomplete.onSuggestionSelected(matchPosition, type, currentPageUrl,
|
| + mUrlFocusedFromFakebox, elapsedTimeSinceModified,
|
| + mUrlBar.getAutocompleteLength(),
|
| + webContents);
|
| + }
|
| loadUrl(url, transition);
|
| }
|
|
|
|
|