Commit fb8df66c authored by Patrick Noland's avatar Patrick Noland Committed by Chromium LUCI CQ

[ToolbarMVC] Manage profile and OmniboxPrerender in LBMediator

As of this change, LocationBarLayout does not track the active
profile or manage an OmniboxPrerender instance. This logic is
moved to LocationBarMediator, with an associated unit test.
This entails moving most of the implementation of
onSuggestionsChanged() to LocationBarMediator as well.

Bug: 1147581
Change-Id: I3cbb921074c7db893658388405ef8bdb514fd83a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2553040
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833900}
parent 5604a532
...@@ -6,9 +6,11 @@ package org.chromium.chrome.browser.omnibox; ...@@ -6,9 +6,11 @@ package org.chromium.chrome.browser.omnibox;
import android.view.ActionMode; import android.view.ActionMode;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import org.chromium.base.CallbackController; import org.chromium.base.CallbackController;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.OneshotSupplierImpl;
...@@ -26,6 +28,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; ...@@ -26,6 +28,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider;
...@@ -115,8 +118,10 @@ public final class LocationBarCoordinator ...@@ -115,8 +118,10 @@ public final class LocationBarCoordinator
mUrlBar = mLocationBarLayout.findViewById(R.id.url_bar); mUrlBar = mLocationBarLayout.findViewById(R.id.url_bar);
OneshotSupplierImpl<AssistantVoiceSearchService> assistantVoiceSearchSupplier = OneshotSupplierImpl<AssistantVoiceSearchService> assistantVoiceSearchSupplier =
new OneshotSupplierImpl(); new OneshotSupplierImpl();
mLocationBarMediator = new LocationBarMediator(
mLocationBarLayout, locationBarDataProvider, assistantVoiceSearchSupplier); mLocationBarMediator = new LocationBarMediator(mLocationBarLayout, locationBarDataProvider,
assistantVoiceSearchSupplier, profileObservableSupplier,
PrivacyPreferencesManagerImpl.getInstance());
mUrlCoordinator = mUrlCoordinator =
new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback, new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback,
mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange), mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange),
...@@ -128,8 +133,10 @@ public final class LocationBarCoordinator ...@@ -128,8 +133,10 @@ public final class LocationBarCoordinator
StatusView statusView = mLocationBarLayout.findViewById(R.id.location_bar_status); StatusView statusView = mLocationBarLayout.findViewById(R.id.location_bar_status);
mStatusCoordinator = new StatusCoordinator(isTablet(), statusView, mUrlCoordinator, mStatusCoordinator = new StatusCoordinator(isTablet(), statusView, mUrlCoordinator,
incognitoStateProvider, modalDialogManagerSupplier, locationBarDataProvider); incognitoStateProvider, modalDialogManagerSupplier, locationBarDataProvider);
mLocationBarMediator.setCoordinators(mStatusCoordinator, mAutocompleteCoordinator); mLocationBarMediator.setCoordinators(
mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
mUrlBar.setOnKeyListener(mLocationBarMediator); mUrlBar.setOnKeyListener(mLocationBarMediator);
mUrlCoordinator.addUrlTextChangeListener(mAutocompleteCoordinator); mUrlCoordinator.addUrlTextChangeListener(mAutocompleteCoordinator);
// The LocationBar's direction is tied to the UrlBar's text direction. Icons inside the // The LocationBar's direction is tied to the UrlBar's text direction. Icons inside the
...@@ -142,9 +149,8 @@ public final class LocationBarCoordinator ...@@ -142,9 +149,8 @@ public final class LocationBarCoordinator
mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator); mLocationBarLayout.addUrlFocusChangeListener(mAutocompleteCoordinator);
mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator, mLocationBarLayout.initialize(mAutocompleteCoordinator, mUrlCoordinator, mStatusCoordinator,
locationBarDataProvider, profileObservableSupplier, windowDelegate, windowAndroid, locationBarDataProvider, windowDelegate, windowAndroid, overrideUrlLoadingDelegate,
overrideUrlLoadingDelegate, mLocationBarMediator.getVoiceRecognitionHandler(), mLocationBarMediator.getVoiceRecognitionHandler(), assistantVoiceSearchSupplier);
assistantVoiceSearchSupplier);
} }
@Override @Override
......
...@@ -30,17 +30,12 @@ import androidx.annotation.VisibleForTesting; ...@@ -30,17 +30,12 @@ import androidx.annotation.VisibleForTesting;
import androidx.core.view.MarginLayoutParamsCompat; import androidx.core.view.MarginLayoutParamsCompat;
import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.Callback;
import org.chromium.base.CallbackController;
import org.chromium.base.CommandLine;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.WindowDelegate;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.ntp.NewTabPageUma;
import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType; import org.chromium.chrome.browser.omnibox.UrlBar.ScrollType;
...@@ -51,8 +46,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusView; ...@@ -51,8 +46,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusView;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
...@@ -110,8 +103,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -110,8 +103,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
private boolean mUrlFocusedWithoutAnimations; private boolean mUrlFocusedWithoutAnimations;
protected boolean mVoiceSearchEnabled; protected boolean mVoiceSearchEnabled;
private OmniboxPrerender mOmniboxPrerender;
protected float mUrlFocusChangeFraction; protected float mUrlFocusChangeFraction;
protected LinearLayout mUrlActionContainer; protected LinearLayout mUrlActionContainer;
...@@ -122,9 +113,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -122,9 +113,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
private OneshotSupplier<AssistantVoiceSearchService> mAssistantVoiceSearchServiceSupplier; private OneshotSupplier<AssistantVoiceSearchService> mAssistantVoiceSearchServiceSupplier;
private Runnable mKeyboardResizeModeTask; private Runnable mKeyboardResizeModeTask;
private Runnable mKeyboardHideTask; private Runnable mKeyboardHideTask;
private ObservableSupplier<Profile> mProfileSupplier;
private Callback<Profile> mProfileSupplierObserver;
private CallbackController mCallbackController = new CallbackController();
private TemplateUrlServiceObserver mTemplateUrlObserver; private TemplateUrlServiceObserver mTemplateUrlObserver;
private OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate; private OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate;
...@@ -157,17 +145,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -157,17 +145,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mAutocompleteCoordinator = null; mAutocompleteCoordinator = null;
} }
if (mCallbackController != null) {
mCallbackController.destroy();
mCallbackController = null;
}
if (mProfileSupplier != null) {
mProfileSupplier.removeObserver(mProfileSupplierObserver);
mProfileSupplier = null;
mProfileSupplierObserver = null;
}
if (mTemplateUrlObserver != null) { if (mTemplateUrlObserver != null) {
TemplateUrlServiceFactory.get().removeObserver(mTemplateUrlObserver); TemplateUrlServiceFactory.get().removeObserver(mTemplateUrlObserver);
mTemplateUrlObserver = null; mTemplateUrlObserver = null;
...@@ -224,7 +201,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -224,7 +201,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
* @param urlCoordinator The coordinator for interacting with the url bar. * @param urlCoordinator The coordinator for interacting with the url bar.
* @param statusCoordinator The coordinator for interacting with the status icon. * @param statusCoordinator The coordinator for interacting with the status icon.
* @param locationBarDataProvider Provider of LocationBar data, e.g. url and title. * @param locationBarDataProvider Provider of LocationBar data, e.g. url and title.
* @param profileSupplier Supplier of the profile for the currently active TabModel.
* @param windowDelegate {@link WindowDelegate} that will provide {@link Window} related info. * @param windowDelegate {@link WindowDelegate} that will provide {@link Window} related info.
* @param windowAndroid {@link WindowAndroid} that is used by the owning {@link Activity}. * @param windowAndroid {@link WindowAndroid} that is used by the owning {@link Activity}.
*/ */
...@@ -232,7 +208,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -232,7 +208,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator, public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator, @NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid, @NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate, @NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler, @NonNull VoiceRecognitionHandler voiceRecognitionHandler,
...@@ -247,12 +222,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -247,12 +222,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mVoiceRecognitionHandler = voiceRecognitionHandler; mVoiceRecognitionHandler = voiceRecognitionHandler;
mAssistantVoiceSearchServiceSupplier = assistantVoiceSearchSupplier; mAssistantVoiceSearchServiceSupplier = assistantVoiceSearchSupplier;
assert profileSupplier != null;
assert mProfileSupplier == null;
mProfileSupplier = profileSupplier;
mProfileSupplierObserver = mCallbackController.makeCancelable(this::setProfile);
mProfileSupplier.addObserver(mProfileSupplierObserver);
updateButtonVisibility(); updateButtonVisibility();
updateShouldAnimateIconChanges(); updateShouldAnimateIconChanges();
} }
...@@ -263,8 +232,7 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -263,8 +232,7 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
} }
/** /**
* Signals to LocationBarLayout that's it safe to call code that requires native to be loaded, * Signals to LocationBarLayout that's it safe to call code that requires native to be loaded.
* e.g. OmniboxPrerender.
*/ */
public void onFinishNativeInitialization() { public void onFinishNativeInitialization() {
TemplateUrlServiceFactory.get().runWhenLoaded(this::registerTemplateUrlObserver); TemplateUrlServiceFactory.get().runWhenLoaded(this::registerTemplateUrlObserver);
...@@ -274,8 +242,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -274,8 +242,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mDeleteButton.setOnClickListener(this); mDeleteButton.setOnClickListener(this);
mMicButton.setOnClickListener(this); mMicButton.setOnClickListener(this);
mOmniboxPrerender = new OmniboxPrerender();
for (Runnable deferredRunnable : mDeferredNativeRunnables) { for (Runnable deferredRunnable : mDeferredNativeRunnables) {
post(deferredRunnable); post(deferredRunnable);
} }
...@@ -284,8 +250,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -284,8 +250,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
onPrimaryColorChanged(); onPrimaryColorChanged();
updateMicButtonVisibility(); updateMicButtonVisibility();
setProfile(mProfileSupplier.get());
} }
/** Initiates a prefetch of autocomplete suggestions. */ /** Initiates a prefetch of autocomplete suggestions. */
...@@ -351,26 +315,12 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -351,26 +315,12 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
/* package */ void onSuggestionsHidden() {} /* package */ void onSuggestionsHidden() {}
/* package */ void onSuggestionsChanged(String autocompleteText) { /* package */ void onSuggestionsChanged() {
String userText = mUrlCoordinator.getTextWithoutAutocomplete();
if (mUrlCoordinator.shouldAutocomplete()) {
mUrlCoordinator.setAutocompleteText(userText, autocompleteText);
}
// Handle the case where suggestions (in particular zero suggest) are received without the // Handle the case where suggestions (in particular zero suggest) are received without the
// URL focusing happening. // URL focusing happening.
if (mUrlFocusedWithoutAnimations && mUrlHasFocus) { if (mUrlFocusedWithoutAnimations && mUrlHasFocus) {
handleUrlFocusAnimation(mUrlHasFocus); handleUrlFocusAnimation(mUrlHasFocus);
} }
if (mNativeInitialized
&& !CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_INSTANT)
&& PrivacyPreferencesManagerImpl.getInstance().shouldPrerender()
&& mLocationBarDataProvider.hasTab()) {
mOmniboxPrerender.prerenderMaybe(userText, getOriginalUrl(),
mAutocompleteCoordinator.getCurrentNativeAutocompleteResult(),
mLocationBarDataProvider.getProfile(), mLocationBarDataProvider.getTab());
}
} }
@Override @Override
...@@ -643,10 +593,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -643,10 +593,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
setUrlBarText(mLocationBarDataProvider.getUrlBarData(), UrlBar.ScrollType.SCROLL_TO_TLD, setUrlBarText(mLocationBarDataProvider.getUrlBarData(), UrlBar.ScrollType.SCROLL_TO_TLD,
SelectionState.SELECT_ALL); SelectionState.SELECT_ALL);
if (!mLocationBarDataProvider.hasTab()) return; if (!mLocationBarDataProvider.hasTab()) return;
// Profile may be null if switching to a tab that has not yet been initialized.
Profile profile = mLocationBarDataProvider.getProfile();
if (profile != null && mOmniboxPrerender != null) mOmniboxPrerender.clear(profile);
} }
/* package */ void setOmniboxEditingText(String text) { /* package */ void setOmniboxEditingText(String text) {
...@@ -789,20 +735,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -789,20 +735,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
mStatusCoordinator.setShouldAnimateIconChanges(shouldAnimate); mStatusCoordinator.setShouldAnimateIconChanges(shouldAnimate);
} }
/**
* Updates the profile used by this LocationBar, for, e.g. determining incognito status or
* generating autocomplete suggestions..
* @param profile The profile to be used.
*/
private void setProfile(Profile profile) {
if (profile == null || !mNativeInitialized) return;
mAutocompleteCoordinator.setAutocompleteProfile(profile);
mOmniboxPrerender.initializeForProfile(profile);
setShowIconsWhenUrlFocused(
SearchEngineLogoUtils.shouldShowSearchEngineLogo(profile.isOffTheRecord()));
}
/** Focuses the current page. */ /** Focuses the current page. */
private void focusCurrentTab() { private void focusCurrentTab() {
if (mLocationBarDataProvider.hasTab()) { if (mLocationBarDataProvider.hasTab()) {
......
...@@ -13,8 +13,12 @@ import android.widget.TextView; ...@@ -13,8 +13,12 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.chromium.base.CallbackController;
import org.chromium.base.CommandLine;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.OneshotSupplierImpl;
import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.gsa.GSAState; import org.chromium.chrome.browser.gsa.GSAState;
import org.chromium.chrome.browser.native_page.NativePageFactory; import org.chromium.chrome.browser.native_page.NativePageFactory;
import org.chromium.chrome.browser.ntp.FakeboxDelegate; import org.chromium.chrome.browser.ntp.FakeboxDelegate;
...@@ -26,6 +30,8 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteDelegate; ...@@ -26,6 +30,8 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteDelegate;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.util.KeyNavigationUtil; import org.chromium.chrome.browser.util.KeyNavigationUtil;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
...@@ -47,16 +53,42 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl ...@@ -47,16 +53,42 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl
private final OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier; private final OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier;
private StatusCoordinator mStatusCoordinator; private StatusCoordinator mStatusCoordinator;
private AutocompleteCoordinator mAutocompleteCoordinator; private AutocompleteCoordinator mAutocompleteCoordinator;
private OmniboxPrerender mOmniboxPrerender;
private UrlBarCoordinator mUrlCoordinator;
private ObservableSupplier<Profile> mProfileSupplier;
private PrivacyPreferencesManagerImpl mPrivacyPreferencesManager;
private CallbackController mCallbackController = new CallbackController();
private boolean mNativeInitialized;
/*package */ LocationBarMediator(@NonNull LocationBarLayout locationBarLayout, /*package */ LocationBarMediator(@NonNull LocationBarLayout locationBarLayout,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull OneshotSupplierImpl<AssistantVoiceSearchService> @NonNull OneshotSupplierImpl<AssistantVoiceSearchService> assistantVoiceSearchSupplier,
assistantVoiceSearchSupplier) { @NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull PrivacyPreferencesManagerImpl privacyPreferencesManager) {
mLocationBarLayout = locationBarLayout; mLocationBarLayout = locationBarLayout;
mLocationBarDataProvider = locationBarDataProvider; mLocationBarDataProvider = locationBarDataProvider;
mLocationBarDataProvider.addObserver(this); mLocationBarDataProvider.addObserver(this);
mAssistantVoiceSearchSupplier = assistantVoiceSearchSupplier; mAssistantVoiceSearchSupplier = assistantVoiceSearchSupplier;
mVoiceRecognitionHandler = new VoiceRecognitionHandler(this, mAssistantVoiceSearchSupplier); mVoiceRecognitionHandler = new VoiceRecognitionHandler(this, mAssistantVoiceSearchSupplier);
mProfileSupplier = profileSupplier;
mProfileSupplier.addObserver(mCallbackController.makeCancelable(this::setProfile));
mPrivacyPreferencesManager = privacyPreferencesManager;
}
/**
* Sets coordinators post-construction; they can't be set at construction time since
* LocationBarMediator is a delegate for them, so is constructed beforehand.
*
* @param urlCoordinator Coordinator for the url bar.
* @param autocompleteCoordinator Coordinator for the autocomplete component.
* @param statusCoordinator Coordinator for the status icon.
*/
/*package */ void setCoordinators(UrlBarCoordinator urlCoordinator,
AutocompleteCoordinator autocompleteCoordinator, StatusCoordinator statusCoordinator) {
mUrlCoordinator = urlCoordinator;
mAutocompleteCoordinator = autocompleteCoordinator;
mStatusCoordinator = statusCoordinator;
} }
/*package */ void destroy() { /*package */ void destroy() {
...@@ -66,6 +98,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl ...@@ -66,6 +98,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl
} }
mStatusCoordinator = null; mStatusCoordinator = null;
mAutocompleteCoordinator = null; mAutocompleteCoordinator = null;
mUrlCoordinator = null;
mPrivacyPreferencesManager = null;
} }
/*package */ void onUrlFocusChange(boolean hasFocus) { /*package */ void onUrlFocusChange(boolean hasFocus) {
...@@ -73,12 +107,15 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl ...@@ -73,12 +107,15 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl
} }
/*package */ void onFinishNativeInitialization() { /*package */ void onFinishNativeInitialization() {
mNativeInitialized = true;
mOmniboxPrerender = new OmniboxPrerender();
Context context = mLocationBarLayout.getContext(); Context context = mLocationBarLayout.getContext();
mAssistantVoiceSearchService = new AssistantVoiceSearchService(context, mAssistantVoiceSearchService = new AssistantVoiceSearchService(context,
AppHooks.get().getExternalAuthUtils(), TemplateUrlServiceFactory.get(), AppHooks.get().getExternalAuthUtils(), TemplateUrlServiceFactory.get(),
GSAState.getInstance(context), this, SharedPreferencesManager.getInstance()); GSAState.getInstance(context), this, SharedPreferencesManager.getInstance());
mAssistantVoiceSearchSupplier.set(mAssistantVoiceSearchService); mAssistantVoiceSearchSupplier.set(mAssistantVoiceSearchService);
mLocationBarLayout.onFinishNativeInitialization(); mLocationBarLayout.onFinishNativeInitialization();
setProfile(mProfileSupplier.get());
} }
/*package */ void setUrlFocusChangeFraction(float fraction) { /*package */ void setUrlFocusChangeFraction(float fraction) {
...@@ -95,17 +132,15 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl ...@@ -95,17 +132,15 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl
mLocationBarLayout.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler); mLocationBarLayout.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler);
} }
/** // Private methods
* Sets coordinators post-construction; they can't be set at construction time since
* LocationBarMediator is a delegate for them, so is constructed beforehand. private void setProfile(Profile profile) {
* if (profile == null || !mNativeInitialized) return;
* @param statusCoordinator mAutocompleteCoordinator.setAutocompleteProfile(profile);
* @param autocompleteCoordinator mOmniboxPrerender.initializeForProfile(profile);
*/
/* package */ void setCoordinators(@NonNull StatusCoordinator statusCoordinator, mLocationBarLayout.setShowIconsWhenUrlFocused(
@NonNull AutocompleteCoordinator autocompleteCoordinator) { SearchEngineLogoUtils.shouldShowSearchEngineLogo(profile.isOffTheRecord()));
mStatusCoordinator = statusCoordinator;
mAutocompleteCoordinator = autocompleteCoordinator;
} }
/*package */ void updateVisualsForState() { /*package */ void updateVisualsForState() {
...@@ -152,6 +187,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl ...@@ -152,6 +187,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl
@Override @Override
public void onUrlChanged() { public void onUrlChanged() {
mLocationBarLayout.setUrl(mLocationBarDataProvider.getCurrentUrl()); mLocationBarLayout.setUrl(mLocationBarDataProvider.getCurrentUrl());
// Profile may be null if switching to a tab that has not yet been initialized.
Profile profile = mProfileSupplier.get();
if (profile != null && mOmniboxPrerender != null) mOmniboxPrerender.clear(profile);
} }
@Override @Override
...@@ -210,10 +248,21 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl ...@@ -210,10 +248,21 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, Autocompl
@Override @Override
public void onSuggestionsChanged(String autocompleteText, boolean defaultMatchIsSearch) { public void onSuggestionsChanged(String autocompleteText, boolean defaultMatchIsSearch) {
mLocationBarLayout.onSuggestionsChanged(autocompleteText);
// TODO (https://crbug.com/1152501): Refactor the LBM/LBC relationship such that LBM doesn't
// need to communicate with other coordinators like this.
mStatusCoordinator.onDefaultMatchClassified(defaultMatchIsSearch); mStatusCoordinator.onDefaultMatchClassified(defaultMatchIsSearch);
String userText = mUrlCoordinator.getTextWithoutAutocomplete();
if (mUrlCoordinator.shouldAutocomplete()) {
mUrlCoordinator.setAutocompleteText(userText, autocompleteText);
}
mLocationBarLayout.onSuggestionsChanged();
if (mNativeInitialized
&& !CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_INSTANT)
&& mPrivacyPreferencesManager.shouldPrerender()
&& mLocationBarDataProvider.hasTab()) {
mOmniboxPrerender.prerenderMaybe(userText, mLocationBarLayout.getOriginalUrl(),
mAutocompleteCoordinator.getCurrentNativeAutocompleteResult(),
mProfileSupplier.get(), mLocationBarDataProvider.getTab());
}
} }
@Override @Override
......
...@@ -16,7 +16,6 @@ import android.view.View; ...@@ -16,7 +16,6 @@ import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.WindowDelegate;
...@@ -25,7 +24,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; ...@@ -25,7 +24,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.toolbar.top.ToolbarTablet; import org.chromium.chrome.browser.toolbar.top.ToolbarTablet;
import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener; import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener;
...@@ -120,14 +118,13 @@ class LocationBarTablet extends LocationBarLayout { ...@@ -120,14 +118,13 @@ class LocationBarTablet extends LocationBarLayout {
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator, public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator, @NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid, @NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate, @NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler, @NonNull VoiceRecognitionHandler voiceRecognitionHandler,
@NonNull OneshotSupplier<AssistantVoiceSearchService> assistantVoiceSearchSupplier) { @NonNull OneshotSupplier<AssistantVoiceSearchService> assistantVoiceSearchSupplier) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator, super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, profileSupplier, windowDelegate, windowAndroid, locationBarDataProvider, windowDelegate, windowAndroid, overrideUrlLoadingDelegate,
overrideUrlLoadingDelegate, voiceRecognitionHandler, assistantVoiceSearchSupplier); voiceRecognitionHandler, assistantVoiceSearchSupplier);
mStatusCoordinator.setShowIconsWhenUrlFocused(true); mStatusCoordinator.setShowIconsWhenUrlFocused(true);
if (SearchEngineLogoUtils.shouldShowSearchEngineLogo( if (SearchEngineLogoUtils.shouldShowSearchEngineLogo(
mLocationBarDataProvider.isIncognito())) { mLocationBarDataProvider.isIncognito())) {
...@@ -244,8 +241,8 @@ class LocationBarTablet extends LocationBarLayout { ...@@ -244,8 +241,8 @@ class LocationBarTablet extends LocationBarLayout {
} }
@Override @Override
void onSuggestionsChanged(String autocompleteText) { void onSuggestionsChanged() {
super.onSuggestionsChanged(autocompleteText); super.onSuggestionsChanged();
mStatusCoordinator.setFirstSuggestionIsSearchType( mStatusCoordinator.setFirstSuggestionIsSearchType(
mAutocompleteCoordinator.getSuggestionCount() > 0 mAutocompleteCoordinator.getSuggestionCount() > 0
&& mAutocompleteCoordinator.getSuggestionAt(0).isSearchSuggestion()); && mAutocompleteCoordinator.getSuggestionAt(0).isSearchSuggestion());
......
...@@ -50,8 +50,8 @@ public class OmniboxPrerender { ...@@ -50,8 +50,8 @@ public class OmniboxPrerender {
} }
/** /**
* Potentailly invokes a pre-render or pre-connect given the url typed into the omnibox and * Potentially invokes a pre-render or pre-connect given the url typed into the omnibox and
* a corresponding autocomplete result. This should be invoked everytime the omnibox changes * a corresponding autocomplete result. This should be invoked every time the omnibox changes
* (e.g. As the user types characters this method should be invoked at least once per character) * (e.g. As the user types characters this method should be invoked at least once per character)
* *
* @param url url in the omnibox. * @param url url in the omnibox.
......
...@@ -9,12 +9,9 @@ import android.os.Handler; ...@@ -9,12 +9,9 @@ import android.os.Handler;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.WindowDelegate; import org.chromium.chrome.browser.WindowDelegate;
...@@ -30,7 +27,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusCoordinator; ...@@ -30,7 +27,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.toolbar.top.ToolbarPhone; import org.chromium.chrome.browser.toolbar.top.ToolbarPhone;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
...@@ -67,16 +63,14 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout { ...@@ -67,16 +63,14 @@ public class SearchActivityLocationBarLayout extends LocationBarLayout {
public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator, public void initialize(@NonNull AutocompleteCoordinator autocompleteCoordinator,
@NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator, @NonNull UrlBarCoordinator urlCoordinator, @NonNull StatusCoordinator statusCoordinator,
@NonNull LocationBarDataProvider locationBarDataProvider, @NonNull LocationBarDataProvider locationBarDataProvider,
@NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid, @NonNull WindowDelegate windowDelegate, @NonNull WindowAndroid windowAndroid,
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate, @NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull VoiceRecognitionHandler voiceRecognitionHandler, @NonNull VoiceRecognitionHandler voiceRecognitionHandler,
@NonNull OneshotSupplier<AssistantVoiceSearchService> @NonNull OneshotSupplier<AssistantVoiceSearchService>
assistantVoiceSearchServiceSupplier) { assistantVoiceSearchServiceSupplier) {
super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator, super.initialize(autocompleteCoordinator, urlCoordinator, statusCoordinator,
locationBarDataProvider, profileSupplier, windowDelegate, windowAndroid, locationBarDataProvider, windowDelegate, windowAndroid, overrideUrlLoadingDelegate,
overrideUrlLoadingDelegate, voiceRecognitionHandler, voiceRecognitionHandler, assistantVoiceSearchServiceSupplier);
assistantVoiceSearchServiceSupplier);
setUrlBarFocusable(true); setUrlBarFocusable(true);
mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo(); mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete( getAutocompleteCoordinator().setShouldPreventOmniboxAutocomplete(
......
...@@ -4,9 +4,13 @@ ...@@ -4,9 +4,13 @@
package org.chromium.chrome.browser.omnibox; package org.chromium.chrome.browser.omnibox;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.notNull; import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.Context;
...@@ -16,17 +20,26 @@ import org.junit.Rule; ...@@ -16,17 +20,26 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.TestRule; import org.junit.rules.TestRule;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.OneshotSupplierImpl;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState;
import org.chromium.chrome.browser.omnibox.status.StatusCoordinator;
import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator;
import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileJni;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.components.search_engines.TemplateUrlService;
...@@ -40,6 +53,8 @@ public class LocationBarMediatorTest { ...@@ -40,6 +53,8 @@ public class LocationBarMediatorTest {
public MockitoRule mMockitoRule = MockitoJUnit.rule(); public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule @Rule
public TestRule mProcessor = new Features.JUnitProcessor(); public TestRule mProcessor = new Features.JUnitProcessor();
@Rule
public JniMocker mJniMocker = new JniMocker();
@Mock @Mock
LocationBarLayout mLocationBarLayout; LocationBarLayout mLocationBarLayout;
...@@ -51,15 +66,36 @@ public class LocationBarMediatorTest { ...@@ -51,15 +66,36 @@ public class LocationBarMediatorTest {
private LocationBarDataProvider mLocationBarDataProvider; private LocationBarDataProvider mLocationBarDataProvider;
@Mock @Mock
private OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier; private OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier;
@Mock
private Profile.Natives mProfileNativesJniMock;
@Mock
private Tab mTab;
@Mock
private AutocompleteCoordinator mAutocompleteCoordinator;
@Mock
private UrlBarCoordinator mUrlCoordinator;
@Mock
private StatusCoordinator mStatusCoordintor;
@Mock
private PrivacyPreferencesManagerImpl mPrivacyPreferencesManager;
@Mock
private OmniboxPrerender.Natives mPrerenderJni;
@Mock
private SearchEngineLogoUtils.Delegate mSearchEngineDelegate;
private ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>();
private LocationBarMediator mMediator; private LocationBarMediator mMediator;
@Before @Before
public void setUp() { public void setUp() {
doReturn(mContext).when(mLocationBarLayout).getContext(); doReturn(mContext).when(mLocationBarLayout).getContext();
TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
mMediator = new LocationBarMediator( mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock);
mLocationBarLayout, mLocationBarDataProvider, mAssistantVoiceSearchSupplier); mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni);
mMediator = new LocationBarMediator(mLocationBarLayout, mLocationBarDataProvider,
mAssistantVoiceSearchSupplier, mProfileSupplier, mPrivacyPreferencesManager);
mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordintor);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
} }
@Test @Test
...@@ -112,4 +148,36 @@ public class LocationBarMediatorTest { ...@@ -112,4 +148,36 @@ public class LocationBarMediatorTest {
mMediator.revertChanges(); mMediator.revertChanges();
verify(mLocationBarLayout).setUrl("http://url.com"); verify(mLocationBarLayout).setUrl("http://url.com");
} }
@Test
public void testOnSuggestionsChanged() {
ArgumentCaptor<OmniboxPrerender> omniboxPrerenderCaptor =
ArgumentCaptor.forClass(OmniboxPrerender.class);
doReturn(123L).when(mPrerenderJni).init(omniboxPrerenderCaptor.capture());
mMediator.onFinishNativeInitialization();
Profile profile = mock(Profile.class);
mProfileSupplier.set(profile);
verify(mPrerenderJni)
.initializeForProfile(123L, omniboxPrerenderCaptor.getValue(), profile);
doReturn(false).when(mPrivacyPreferencesManager).shouldPrerender();
mMediator.onSuggestionsChanged("text", true);
verify(mPrerenderJni, never())
.prerenderMaybe(
anyLong(), any(), anyString(), anyString(), anyLong(), any(), any());
doReturn(true).when(mPrivacyPreferencesManager).shouldPrerender();
doReturn(true).when(mLocationBarDataProvider).hasTab();
doReturn(mTab).when(mLocationBarDataProvider).getTab();
doReturn("originalUrl").when(mLocationBarLayout).getOriginalUrl();
doReturn(456L).when(mAutocompleteCoordinator).getCurrentNativeAutocompleteResult();
doReturn("text").when(mUrlCoordinator).getTextWithoutAutocomplete();
doReturn(true).when(mUrlCoordinator).shouldAutocomplete();
mMediator.onSuggestionsChanged("textWithAutocomplete", true);
verify(mPrerenderJni)
.prerenderMaybe(123L, omniboxPrerenderCaptor.getValue(), "text", "originalUrl",
456L, profile, mTab);
verify(mUrlCoordinator).setAutocompleteText("text", "textWithAutocomplete");
}
} }
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