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

[ToolbarMVC] Move searchQuery logic to LocationBarMediator

Bug: 1147581

Change-Id: Iaa39fc9bb763955476cfade0cf54bcf069147aee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2533332
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarBrandon Wylie <wylieb@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835759}
parent fbd229b1
...@@ -323,6 +323,7 @@ chrome_test_java_sources = [ ...@@ -323,6 +323,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/omaha/StringSanitizerTest.java", "javatests/src/org/chromium/chrome/browser/omaha/StringSanitizerTest.java",
"javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java", "javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java",
"javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/LocationBarLayoutTest.java",
"javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java",
"javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java",
"javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java",
"javatests/src/org/chromium/chrome/browser/omnibox/UrlBarIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/UrlBarIntegrationTest.java",
......
...@@ -33,8 +33,10 @@ import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; ...@@ -33,8 +33,10 @@ 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.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
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;
import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
...@@ -68,6 +70,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -68,6 +70,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
private View mAutocompleteAnchorView; private View mAutocompleteAnchorView;
private LocationBarMediator mLocationBarMediator; private LocationBarMediator mLocationBarMediator;
private View mUrlBar; private View mUrlBar;
private final OneshotSupplierImpl<TemplateUrlService> mTemplateUrlServiceSupplier =
new OneshotSupplierImpl<>();
private CallbackController mCallbackController = new CallbackController(); private CallbackController mCallbackController = new CallbackController();
private boolean mNativeInitialized; private boolean mNativeInitialized;
...@@ -128,7 +132,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -128,7 +132,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
mLocationBarMediator = new LocationBarMediator(mLocationBarLayout, locationBarDataProvider, mLocationBarMediator = new LocationBarMediator(mLocationBarLayout, locationBarDataProvider,
assistantVoiceSearchSupplier, profileObservableSupplier, assistantVoiceSearchSupplier, profileObservableSupplier,
PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate, PrivacyPreferencesManagerImpl.getInstance(), overrideUrlLoadingDelegate,
LocaleManager.getInstance()); LocaleManager.getInstance(), mTemplateUrlServiceSupplier);
mUrlCoordinator = mUrlCoordinator =
new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback, new UrlBarCoordinator((UrlBar) mUrlBar, windowDelegate, actionModeCallback,
mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange), mCallbackController.makeCancelable(mLocationBarMediator::onUrlFocusChange),
...@@ -186,6 +190,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -186,6 +190,7 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
@Override @Override
public void onFinishNativeInitialization() { public void onFinishNativeInitialization() {
mTemplateUrlServiceSupplier.set(TemplateUrlServiceFactory.get());
mLocationBarMediator.onFinishNativeInitialization(); mLocationBarMediator.onFinishNativeInitialization();
mAutocompleteCoordinator.onNativeInitialized(); mAutocompleteCoordinator.onNativeInitialized();
mStatusCoordinator.onNativeInitialized(); mStatusCoordinator.onNativeInitialized();
...@@ -411,4 +416,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse ...@@ -411,4 +416,8 @@ public final class LocationBarCoordinator implements LocationBar, NativeInitObse
VoiceRecognitionHandler voiceRecognitionHandler) { VoiceRecognitionHandler voiceRecognitionHandler) {
mLocationBarMediator.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler); mLocationBarMediator.setVoiceRecognitionHandlerForTesting(voiceRecognitionHandler);
} }
/* package */ LocationBarMediator getMediatorForTesting() {
return mLocationBarMediator;
}
} }
...@@ -308,39 +308,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener { ...@@ -308,39 +308,6 @@ public class LocationBarLayout extends FrameLayout implements OnClickListener {
// When we restore tabs, we focus the selected tab so the URL of the page shows. // When we restore tabs, we focus the selected tab so the URL of the page shows.
} }
/**
* Sets the query string in the omnibox (ensuring the URL bar has focus and triggering
* autocomplete for the specified query) as if the user typed it.
*
* @param query The query to be set in the omnibox.
*/
/* package */ void setSearchQuery(final String query) {
if (TextUtils.isEmpty(query)) return;
if (!mNativeInitialized) {
mDeferredNativeRunnables.add(new Runnable() {
@Override
public void run() {
setSearchQuery(query);
}
});
return;
}
// Ensure the UrlBar has focus before entering text. If the UrlBar is not focused,
// autocomplete text will be updated but the visible text will not.
setUrlBarFocus(true, null, OmniboxFocusReason.SEARCH_QUERY);
setUrlBarText(UrlBarData.forNonUrlText(query), UrlBar.ScrollType.NO_SCROLL,
SelectionState.SELECT_ALL);
mAutocompleteCoordinator.startAutocompleteForQuery(query);
post(new Runnable() {
@Override
public void run() {
getWindowAndroid().getKeyboardDelegate().showKeyboard(mUrlBar);
}
});
}
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (v == mDeleteButton) { if (v == mDeleteButton) {
......
...@@ -18,6 +18,7 @@ import org.chromium.base.CallbackController; ...@@ -18,6 +18,7 @@ import org.chromium.base.CallbackController;
import org.chromium.base.CommandLine; import org.chromium.base.CommandLine;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier;
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.flags.ChromeSwitches;
...@@ -36,15 +37,16 @@ import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; ...@@ -36,15 +37,16 @@ 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.privacy.settings.PrivacyPreferencesManagerImpl;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
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.KeyNavigationUtil; import org.chromium.chrome.browser.util.KeyNavigationUtil;
import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.common.ResourceRequestBody; import org.chromium.content_public.common.ResourceRequestBody;
import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -70,6 +72,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -70,6 +72,8 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
private CallbackController mCallbackController = new CallbackController(); private CallbackController mCallbackController = new CallbackController();
private final OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate; private final OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate;
private final LocaleManager mLocaleManager; private final LocaleManager mLocaleManager;
private final List<Runnable> mDeferredNativeRunnables = new ArrayList<>();
private final OneshotSupplier<TemplateUrlService> mTemplateUrlServiceSupplier;
private boolean mNativeInitialized; private boolean mNativeInitialized;
...@@ -79,17 +83,19 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -79,17 +83,19 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@NonNull ObservableSupplier<Profile> profileSupplier, @NonNull ObservableSupplier<Profile> profileSupplier,
@NonNull PrivacyPreferencesManagerImpl privacyPreferencesManager, @NonNull PrivacyPreferencesManagerImpl privacyPreferencesManager,
@NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate, @NonNull OverrideUrlLoadingDelegate overrideUrlLoadingDelegate,
@NonNull LocaleManager localeManager) { @NonNull LocaleManager localeManager,
@NonNull OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier) {
mLocationBarLayout = locationBarLayout; mLocationBarLayout = locationBarLayout;
mLocationBarDataProvider = locationBarDataProvider; mLocationBarDataProvider = locationBarDataProvider;
mLocationBarDataProvider.addObserver(this); mLocationBarDataProvider.addObserver(this);
mAssistantVoiceSearchSupplier = assistantVoiceSearchSupplier; mAssistantVoiceSearchSupplier = assistantVoiceSearchSupplier;
mOverrideUrlLoadingDelegate = overrideUrlLoadingDelegate;
mLocaleManager = localeManager;
mVoiceRecognitionHandler = new VoiceRecognitionHandler(this, mAssistantVoiceSearchSupplier); mVoiceRecognitionHandler = new VoiceRecognitionHandler(this, mAssistantVoiceSearchSupplier);
mProfileSupplier = profileSupplier; mProfileSupplier = profileSupplier;
mProfileSupplier.addObserver(mCallbackController.makeCancelable(this::setProfile)); mProfileSupplier.addObserver(mCallbackController.makeCancelable(this::setProfile));
mPrivacyPreferencesManager = privacyPreferencesManager; mPrivacyPreferencesManager = privacyPreferencesManager;
mOverrideUrlLoadingDelegate = overrideUrlLoadingDelegate; mTemplateUrlServiceSupplier = templateUrlServiceSupplier;
mLocaleManager = localeManager;
} }
/** /**
...@@ -116,6 +122,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -116,6 +122,9 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mAutocompleteCoordinator = null; mAutocompleteCoordinator = null;
mUrlCoordinator = null; mUrlCoordinator = null;
mPrivacyPreferencesManager = null; mPrivacyPreferencesManager = null;
mVoiceRecognitionHandler = null;
mLocationBarDataProvider.removeObserver(this);
mDeferredNativeRunnables.clear();
} }
/*package */ void onUrlFocusChange(boolean hasFocus) { /*package */ void onUrlFocusChange(boolean hasFocus) {
...@@ -127,11 +136,16 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -127,11 +136,16 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
mOmniboxPrerender = new OmniboxPrerender(); 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(), mTemplateUrlServiceSupplier.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()); setProfile(mProfileSupplier.get());
for (Runnable deferredRunnable : mDeferredNativeRunnables) {
mLocationBarLayout.post(deferredRunnable);
}
mDeferredNativeRunnables.clear();
} }
/*package */ void setUrlFocusChangeFraction(float fraction) { /*package */ void setUrlFocusChangeFraction(float fraction) {
...@@ -348,12 +362,13 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -348,12 +362,13 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
public void performSearchQuery(String query, List<String> searchParams) { public void performSearchQuery(String query, List<String> searchParams) {
if (TextUtils.isEmpty(query)) return; if (TextUtils.isEmpty(query)) return;
String queryUrl = TemplateUrlServiceFactory.get().getUrlForSearchQuery(query, searchParams); String queryUrl =
mTemplateUrlServiceSupplier.get().getUrlForSearchQuery(query, searchParams);
if (!TextUtils.isEmpty(queryUrl)) { if (!TextUtils.isEmpty(queryUrl)) {
loadUrl(queryUrl, PageTransition.GENERATED, 0); loadUrl(queryUrl, PageTransition.GENERATED, 0);
} else { } else {
mLocationBarLayout.setSearchQuery(query); setSearchQuery(query);
} }
} }
...@@ -408,7 +423,20 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -408,7 +423,20 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public void setSearchQuery(String query) { public void setSearchQuery(String query) {
mLocationBarLayout.setSearchQuery(query); if (TextUtils.isEmpty(query)) return;
if (!mNativeInitialized) {
mDeferredNativeRunnables.add(() -> setSearchQuery(query));
return;
}
// Ensure the UrlBar has focus before entering text. If the UrlBar is not focused,
// autocomplete text will be updated but the visible text will not.
mLocationBarLayout.setUrlBarFocus(true, null, OmniboxFocusReason.SEARCH_QUERY);
mLocationBarLayout.setUrlBarText(UrlBarData.forNonUrlText(query),
UrlBar.ScrollType.NO_SCROLL, SelectionState.SELECT_ALL);
mAutocompleteCoordinator.startAutocompleteForQuery(query);
mUrlCoordinator.setKeyboardVisibility(true, false);
} }
@Override @Override
...@@ -438,7 +466,6 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe ...@@ -438,7 +466,6 @@ class LocationBarMediator implements LocationBarDataProvider.Observer, FakeboxDe
@Override @Override
public boolean allowKeyboardLearning() { public boolean allowKeyboardLearning() {
assert mLocationBarDataProvider != null;
return !mLocationBarDataProvider.isIncognito(); return !mLocationBarDataProvider.isIncognito();
} }
......
...@@ -263,18 +263,6 @@ public class LocationBarLayoutTest { ...@@ -263,18 +263,6 @@ public class LocationBarLayoutTest {
}); });
} }
@Test
@SmallTest
public void testSetSearchQueryFocuses() {
final LocationBarLayout locationBar = getLocationBar();
final String query = "testing query";
TestThreadUtils.runOnUiThreadBlocking(() -> {
locationBar.setSearchQuery(query);
Assert.assertEquals(query, locationBar.mUrlCoordinator.getTextWithoutAutocomplete());
});
}
/* /*
* Search engine logo tests. * Search engine logo tests.
*/ */
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.omnibox;
import static org.mockito.Mockito.doReturn;
import android.content.Intent;
import androidx.test.filters.MediumTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.chromium.base.CommandLine;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Criteria;
import org.chromium.base.test.util.CriteriaHelper;
import org.chromium.base.test.util.Matchers;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.lifecycle.InflationObserver;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Instrumentation tests for the LocationBar component.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class LocationBarTest {
private static final String TEST_QUERY = "testing query";
private static final List<String> TEST_PARAMS = Arrays.asList("foo=bar");
@Rule
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Mock
TemplateUrlService mTemplateUrlService;
ChromeTabbedActivity mActivity;
UrlBar mUrlBar;
LocationBarMediator mLocationBarMediator;
String mSearchUrl;
@Before
public void setUp() throws InterruptedException {
TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
}
private void startActivityNormally() {
mActivityTestRule.startMainActivityOnBlankPage();
mActivity = mActivityTestRule.getActivity();
doPostActivitySetup(mActivity);
}
private void startActivityWithDeferredNativeInitialization() {
CommandLine.getInstance().appendSwitch(ChromeSwitches.DISABLE_NATIVE_INITIALIZATION);
Intent intent = new Intent("about:blank");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
mActivityTestRule.prepareUrlIntent(intent, "about:blank");
mActivityTestRule.launchActivity(intent);
ChromeActivity chromeActivity = mActivityTestRule.getActivity();
if (!chromeActivity.isInitialLayoutInflationComplete()) {
AtomicBoolean isInflated = new AtomicBoolean();
chromeActivity.getLifecycleDispatcher().register(new InflationObserver() {
@Override
public void onPreInflationStartup() {}
@Override
public void onPostInflationStartup() {
isInflated.set(true);
}
});
CriteriaHelper.pollUiThread(isInflated::get);
}
doPostActivitySetup(chromeActivity);
}
private void triggerAndWaitForDeferredNativeInitialization() {
CommandLine.getInstance().removeSwitch(ChromeSwitches.DISABLE_NATIVE_INITIALIZATION);
TestThreadUtils.runOnUiThreadBlocking(() -> {
mActivityTestRule.getActivity().startDelayedNativeInitializationForTests();
});
mActivityTestRule.waitForActivityNativeInitializationComplete();
}
private void doPostActivitySetup(ChromeActivity activity) {
mUrlBar = activity.findViewById(org.chromium.chrome.R.id.url_bar);
// clang-format off
mLocationBarMediator = ((LocationBarCoordinator) activity.getToolbarManager()
.getToolbarLayoutForTesting()
.getLocationBar())
.getMediatorForTesting();
// clang-format on
mSearchUrl = mActivityTestRule.getEmbeddedTestServerRule().getServer().getURL("/search");
}
@Test
@MediumTest
public void testSetSearchQueryFocusesUrlBar() {
startActivityNormally();
final String query = "testing query";
TestThreadUtils.runOnUiThreadBlocking(() -> {
mLocationBarMediator.setSearchQuery(query);
Assert.assertEquals(query, mUrlBar.getTextWithoutAutocomplete());
Assert.assertTrue(mLocationBarMediator.isUrlBarFocused());
});
CriteriaHelper.pollUiThread(() -> {
Criteria.checkThat(
mActivityTestRule.getKeyboardDelegate().isKeyboardShowing(mActivity, mUrlBar),
Matchers.is(true));
});
}
@Test
@MediumTest
public void testSetSearchQueryFocusesUrlBar_preNative() {
startActivityWithDeferredNativeInitialization();
final String query = "testing query";
TestThreadUtils.runOnUiThreadBlocking(() -> mLocationBarMediator.setSearchQuery(query));
triggerAndWaitForDeferredNativeInitialization();
TestThreadUtils.runOnUiThreadBlocking(() -> {
Assert.assertEquals(query, mUrlBar.getTextWithoutAutocomplete());
Assert.assertTrue(mLocationBarMediator.isUrlBarFocused());
});
CriteriaHelper.pollUiThread(() -> {
Criteria.checkThat(
mActivityTestRule.getKeyboardDelegate().isKeyboardShowing(mActivity, mUrlBar),
Matchers.is(true));
});
}
@Test
@MediumTest
public void testPerformSearchQuery() {
startActivityNormally();
final List<String> params = Arrays.asList("foo=bar");
doReturn(mSearchUrl)
.when(mTemplateUrlService)
.getUrlForSearchQuery(TEST_QUERY, TEST_PARAMS);
TestThreadUtils.runOnUiThreadBlocking(
() -> mLocationBarMediator.performSearchQuery(TEST_QUERY, TEST_PARAMS));
ChromeTabUtils.waitForTabPageLoaded(
mActivityTestRule.getActivity().getActivityTab(), mSearchUrl);
}
@Test
@MediumTest
public void testPerformSearchQuery_emptyUrl() {
startActivityNormally();
doReturn("").when(mTemplateUrlService).getUrlForSearchQuery(TEST_QUERY, TEST_PARAMS);
TestThreadUtils.runOnUiThreadBlocking(() -> {
mLocationBarMediator.performSearchQuery(TEST_QUERY, TEST_PARAMS);
Assert.assertEquals(TEST_QUERY, mUrlBar.getTextWithoutAutocomplete());
});
}
}
...@@ -10,8 +10,12 @@ import static junit.framework.Assert.assertNull; ...@@ -10,8 +10,12 @@ import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
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;
...@@ -20,15 +24,16 @@ import static org.mockito.Mockito.times; ...@@ -20,15 +24,16 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.content.Context; import android.content.Context;
import android.text.TextUtils;
import android.view.View; import android.view.View;
import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; 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.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
...@@ -37,6 +42,7 @@ import org.robolectric.annotation.Config; ...@@ -37,6 +42,7 @@ import org.robolectric.annotation.Config;
import org.chromium.base.BuildConfig; import org.chromium.base.BuildConfig;
import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.supplier.OneshotSupplier;
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.base.test.util.JniMocker;
...@@ -49,7 +55,6 @@ import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; ...@@ -49,7 +55,6 @@ import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService;
import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; 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.profiles.ProfileJni; import org.chromium.chrome.browser.profiles.ProfileJni;
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.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;
...@@ -57,12 +62,16 @@ import org.chromium.components.search_engines.TemplateUrlService; ...@@ -57,12 +62,16 @@ import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.PageTransition;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/** Unit tests for LocationBarMediator. */ /** Unit tests for LocationBarMediator. */
@RunWith(BaseRobolectricTestRunner.class) @RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE) @Config(manifest = Config.NONE)
@Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH) @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH)
public class LocationBarMediatorTest { public class LocationBarMediatorTest {
private static final String TEST_URL = "http://testurl.com"; private static final String TEST_URL = "http://www.example.org";
@Rule @Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule(); public MockitoRule mMockitoRule = MockitoJUnit.rule();
...@@ -82,6 +91,10 @@ public class LocationBarMediatorTest { ...@@ -82,6 +91,10 @@ public class LocationBarMediatorTest {
@Mock @Mock
private OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier; private OneshotSupplierImpl<AssistantVoiceSearchService> mAssistantVoiceSearchSupplier;
@Mock @Mock
private OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate;
@Mock
private LocaleManager mLocaleManager;
@Mock
private Profile.Natives mProfileNativesJniMock; private Profile.Natives mProfileNativesJniMock;
@Mock @Mock
private Tab mTab; private Tab mTab;
...@@ -98,12 +111,12 @@ public class LocationBarMediatorTest { ...@@ -98,12 +111,12 @@ public class LocationBarMediatorTest {
@Mock @Mock
private SearchEngineLogoUtils.Delegate mSearchEngineDelegate; private SearchEngineLogoUtils.Delegate mSearchEngineDelegate;
@Mock @Mock
private OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate;
@Mock
private LocaleManager mLocaleManager;
@Mock
private View mView; private View mView;
@Mock
private OneshotSupplier<TemplateUrlService> mTemplateUrlServiceSupplier;
@Captor
private ArgumentCaptor<Runnable> mRunnableCaptor;
@Captor @Captor
private ArgumentCaptor<LoadUrlParams> mLoadUrlParamsCaptor; private ArgumentCaptor<LoadUrlParams> mLoadUrlParamsCaptor;
...@@ -113,12 +126,13 @@ public class LocationBarMediatorTest { ...@@ -113,12 +126,13 @@ public class LocationBarMediatorTest {
@Before @Before
public void setUp() { public void setUp() {
doReturn(mContext).when(mLocationBarLayout).getContext(); doReturn(mContext).when(mLocationBarLayout).getContext();
TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); doReturn(mTemplateUrlService).when(mTemplateUrlServiceSupplier).get();
mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock); mJniMocker.mock(ProfileJni.TEST_HOOKS, mProfileNativesJniMock);
mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni); mJniMocker.mock(OmniboxPrerenderJni.TEST_HOOKS, mPrerenderJni);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
mMediator = new LocationBarMediator(mLocationBarLayout, mLocationBarDataProvider, mMediator = new LocationBarMediator(mLocationBarLayout, mLocationBarDataProvider,
mAssistantVoiceSearchSupplier, mProfileSupplier, mPrivacyPreferencesManager, mAssistantVoiceSearchSupplier, mProfileSupplier, mPrivacyPreferencesManager,
mOverrideUrlLoadingDelegate, mLocaleManager); mOverrideUrlLoadingDelegate, mLocaleManager, mTemplateUrlServiceSupplier);
mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator); mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate); SearchEngineLogoUtils.setDelegateForTesting(mSearchEngineDelegate);
} }
...@@ -214,8 +228,8 @@ public class LocationBarMediatorTest { ...@@ -214,8 +228,8 @@ public class LocationBarMediatorTest {
mMediator.loadUrl(TEST_URL, PageTransition.TYPED, 0); mMediator.loadUrl(TEST_URL, PageTransition.TYPED, 0);
verify(mTab).loadUrl(mLoadUrlParamsCaptor.capture()); verify(mTab).loadUrl(mLoadUrlParamsCaptor.capture());
Assert.assertEquals(TEST_URL, mLoadUrlParamsCaptor.getValue().getUrl()); assertEquals(TEST_URL, mLoadUrlParamsCaptor.getValue().getUrl());
Assert.assertEquals(PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, assertEquals(PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR,
mLoadUrlParamsCaptor.getValue().getTransitionType()); mLoadUrlParamsCaptor.getValue().getTransitionType());
} }
...@@ -267,4 +281,103 @@ public class LocationBarMediatorTest { ...@@ -267,4 +281,103 @@ public class LocationBarMediatorTest {
verify(mLocationBarDataProvider, times(2)).getTab(); verify(mLocationBarDataProvider, times(2)).getTab();
verify(mTab, times(1)).getView(); verify(mTab, times(1)).getView();
} }
@Test
public void testSetSearchQuery() {
String query = "example search";
mMediator.onFinishNativeInitialization();
mMediator.setSearchQuery(query);
verify(mLocationBarLayout).setUrlBarFocus(true, null, OmniboxFocusReason.SEARCH_QUERY);
verify(mLocationBarLayout)
.setUrlBarText(argThat(matchesUrlBarDataForQuery(query)),
eq(UrlBar.ScrollType.NO_SCROLL), eq(SelectionState.SELECT_ALL));
verify(mAutocompleteCoordinator).startAutocompleteForQuery(query);
verify(mUrlCoordinator).setKeyboardVisibility(true, false);
}
@Test
public void testSetSearchQuery_empty() {
mMediator.setSearchQuery("");
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
verify(mLocationBarLayout, never()).post(any());
mMediator.onFinishNativeInitialization();
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
mMediator.setSearchQuery("");
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
verify(mLocationBarLayout, never()).post(any());
}
@Test
public void testSetSearchQuery_preNative() {
String query = "example search";
mMediator.setSearchQuery(query);
mMediator.onFinishNativeInitialization();
verify(mLocationBarLayout).post(mRunnableCaptor.capture());
mRunnableCaptor.getValue().run();
verify(mLocationBarLayout).setUrlBarFocus(true, null, OmniboxFocusReason.SEARCH_QUERY);
verify(mLocationBarLayout)
.setUrlBarText(argThat(matchesUrlBarDataForQuery(query)),
eq(UrlBar.ScrollType.NO_SCROLL), eq(SelectionState.SELECT_ALL));
verify(mAutocompleteCoordinator).startAutocompleteForQuery(query);
verify(mUrlCoordinator).setKeyboardVisibility(true, false);
}
@Test
public void testPerformSearchQuery() {
mMediator.onFinishNativeInitialization();
String query = "example search";
List<String> params = Arrays.asList("param 1", "param 2");
doReturn("http://www.search.com")
.when(mTemplateUrlService)
.getUrlForSearchQuery("example search", params);
doReturn(mTab).when(mLocationBarDataProvider).getTab();
mMediator.performSearchQuery(query, params);
verify(mTab).loadUrl(mLoadUrlParamsCaptor.capture());
assertEquals("http://www.search.com", mLoadUrlParamsCaptor.getValue().getUrl());
assertEquals(PageTransition.GENERATED | PageTransition.FROM_ADDRESS_BAR,
mLoadUrlParamsCaptor.getValue().getTransitionType());
}
@Test
public void testPerformSearchQuery_empty() {
mMediator.performSearchQuery("", Collections.emptyList());
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
verify(mLocationBarLayout, never()).post(any());
mMediator.onFinishNativeInitialization();
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
mMediator.setSearchQuery("");
verify(mLocationBarLayout, never()).setUrlBarFocus(anyBoolean(), anyString(), anyInt());
verify(mLocationBarLayout, never()).post(any());
}
@Test
public void testPerformSearchQuery_emptyUrl() {
String query = "example search";
List<String> params = Arrays.asList("param 1", "param 2");
mMediator.onFinishNativeInitialization();
doReturn("").when(mTemplateUrlService).getUrlForSearchQuery("example search", params);
mMediator.performSearchQuery(query, params);
verify(mLocationBarLayout).setUrlBarFocus(true, null, OmniboxFocusReason.SEARCH_QUERY);
verify(mLocationBarLayout)
.setUrlBarText(argThat(matchesUrlBarDataForQuery(query)),
eq(UrlBar.ScrollType.NO_SCROLL), eq(SelectionState.SELECT_ALL));
verify(mAutocompleteCoordinator).startAutocompleteForQuery(query);
verify(mUrlCoordinator).setKeyboardVisibility(true, false);
}
private ArgumentMatcher<UrlBarData> matchesUrlBarDataForQuery(String query) {
return actual -> {
UrlBarData expected = UrlBarData.forNonUrlText(query);
return TextUtils.equals(actual.displayText, expected.displayText);
};
}
} }
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