| Index: chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java | 
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..1f94c7e262d5ba65e7c93159e84b930ef416d7c0 | 
| --- /dev/null | 
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxTest.java | 
| @@ -0,0 +1,648 @@ | 
| +// Copyright 2015 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.chromium.chrome.test.util.OmniboxTestUtils.buildSuggestionMap; | 
| + | 
| +import android.os.SystemClock; | 
| +import android.test.FlakyTest; | 
| +import android.test.suitebuilder.annotation.MediumTest; | 
| +import android.test.suitebuilder.annotation.SmallTest; | 
| +import android.text.Selection; | 
| +import android.util.Pair; | 
| +import android.view.KeyEvent; | 
| +import android.view.WindowManager; | 
| +import android.widget.ImageButton; | 
| +import android.widget.ImageView; | 
| +import android.widget.TextView; | 
| + | 
| +import com.google.android.apps.chrome.R; | 
| + | 
| +import org.chromium.base.ThreadUtils; | 
| +import org.chromium.base.test.util.EnormousTest; | 
| +import org.chromium.base.test.util.Feature; | 
| +import org.chromium.base.test.util.ScalableTimeout; | 
| +import org.chromium.chrome.browser.ChromeActivity; | 
| +import org.chromium.chrome.browser.omnibox.AutocompleteController.OnSuggestionsReceivedListener; | 
| +import org.chromium.chrome.browser.omnibox.OmniboxSuggestion.Type; | 
| +import org.chromium.chrome.test.ChromeActivityTestCaseBase; | 
| +import org.chromium.chrome.test.util.ChromeTabUtils; | 
| +import org.chromium.chrome.test.util.OmniboxTestUtils; | 
| +import org.chromium.chrome.test.util.OmniboxTestUtils.SuggestionsResult; | 
| +import org.chromium.chrome.test.util.OmniboxTestUtils.SuggestionsResultBuilder; | 
| +import org.chromium.chrome.test.util.OmniboxTestUtils.TestAutocompleteController; | 
| +import org.chromium.chrome.test.util.OmniboxTestUtils.TestSuggestionResultsBuilder; | 
| +import org.chromium.chrome.test.util.TestHttpServerClient; | 
| +import org.chromium.content.browser.test.util.Criteria; | 
| +import org.chromium.content.browser.test.util.CriteriaHelper; | 
| +import org.chromium.content.browser.test.util.KeyUtils; | 
| +import org.chromium.content.browser.test.util.UiUtils; | 
| +import org.chromium.ui.base.DeviceFormFactor; | 
| + | 
| +import java.util.HashMap; | 
| +import java.util.List; | 
| +import java.util.Map; | 
| +import java.util.concurrent.Callable; | 
| +import java.util.concurrent.ExecutionException; | 
| +import java.util.concurrent.atomic.AtomicInteger; | 
| + | 
| +/** | 
| + * Tests of the Omnibox. | 
| + */ | 
| +public class OmniboxTest extends ChromeActivityTestCaseBase<ChromeActivity> { | 
| + | 
| +    public OmniboxTest() { | 
| +        super(ChromeActivity.class); | 
| +    } | 
| + | 
| +    private void clearUrlBar() { | 
| +        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| +        assertNotNull(urlBar); | 
| + | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                urlBar.setText(""); | 
| +            } | 
| +        }); | 
| +    } | 
| + | 
| +    /** | 
| +     * Sanity check of Omnibox.  The problem in http://b/5021723 would | 
| +     * cause this to fail (hang or crash). | 
| +     */ | 
| +    @EnormousTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testSimpleUse() throws InterruptedException { | 
| +        typeInOmnibox("aaaaaaa", false); | 
| + | 
| +        final LocationBarLayout locationBar = | 
| +                (LocationBarLayout) getActivity().findViewById(R.id.location_bar); | 
| +        OmniboxTestUtils.waitForOmniboxSuggestions(locationBar); | 
| + | 
| +        ChromeTabUtils.waitForTabPageLoadStart(getActivity().getActivityTab(), new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| +                KeyUtils.singleKeyEventView(getInstrumentation(), urlBar, KeyEvent.KEYCODE_ENTER); | 
| +            } | 
| +        }, ScalableTimeout.scaleTimeout(20)); | 
| +    } | 
| + | 
| +    /** | 
| +     * Test for checking whether soft input model switches with focus. | 
| +     */ | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testFocusChangingSoftInputMode() throws InterruptedException { | 
| +        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| + | 
| +        OmniboxTestUtils.toggleUrlBarFocus(urlBar, true); | 
| +        assertTrue("Soft input mode failed to switch on focus", | 
| +                CriteriaHelper.pollForCriteria(new Criteria() { | 
| +                    @Override | 
| +                    public boolean isSatisfied() { | 
| +                        return getActivity().getWindow().getAttributes().softInputMode | 
| +                                == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN; | 
| +                    } | 
| +                })); | 
| + | 
| +        OmniboxTestUtils.toggleUrlBarFocus(urlBar, false); | 
| +        assertTrue("Soft input mode failed to switch on unfocus", | 
| +                CriteriaHelper.pollForCriteria(new Criteria() { | 
| +                    @Override | 
| +                    public boolean isSatisfied() { | 
| +                        return getActivity().getWindow().getAttributes().softInputMode | 
| +                                == WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; | 
| +                    } | 
| +                })); | 
| +    } | 
| + | 
| +    /** | 
| +     * Tests that focusing a url bar starts a zero suggest request. | 
| +     */ | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testRequestZeroSuggestOnFocus() throws Exception { | 
| +        final LocationBarLayout locationBar = | 
| +                (LocationBarLayout) getActivity().findViewById(R.id.location_bar); | 
| +        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| + | 
| +        final TestAutocompleteController controller = new TestAutocompleteController( | 
| +                locationBar, null, null); | 
| + | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                locationBar.setAutocompleteController(controller); | 
| +            } | 
| +        }); | 
| +        assertEquals("Should not have any zero suggest requests yet", 0, | 
| +                controller.numZeroSuggestRequests()); | 
| + | 
| +        OmniboxTestUtils.toggleUrlBarFocus(urlBar, true); | 
| + | 
| +        assertTrue("Should have requested zero suggest on focusing", | 
| +                CriteriaHelper.pollForCriteria(new Criteria() { | 
| +                    @Override | 
| +                    public boolean isSatisfied() { | 
| +                        return controller.numZeroSuggestRequests() == 1; | 
| +                    } | 
| +                })); | 
| +    } | 
| + | 
| +    /** | 
| +     * Tests that focusing a url bar starts a zero suggest request. | 
| +     */ | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testRequestZeroSuggestAfterDelete() throws InterruptedException { | 
| +        final LocationBarLayout locationBar = | 
| +                (LocationBarLayout) getActivity().findViewById(R.id.location_bar); | 
| +        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| +        final ImageButton deleteButton = (ImageButton) getActivity().findViewById( | 
| +                R.id.delete_button); | 
| + | 
| +        final OnSuggestionsReceivedListener emptySuggestionListener = | 
| +                new OnSuggestionsReceivedListener() { | 
| +                    @Override | 
| +                    public void onSuggestionsReceived( | 
| +                            List<OmniboxSuggestion> suggestions, String inlineAutocompleteText) { | 
| +                    } | 
| +                }; | 
| + | 
| +        final TestAutocompleteController controller = new TestAutocompleteController( | 
| +                locationBar, emptySuggestionListener, | 
| +                new HashMap<String, List<SuggestionsResult>>()); | 
| + | 
| +        OmniboxTestUtils.toggleUrlBarFocus(urlBar, true); | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                locationBar.setAutocompleteController(controller); | 
| +                urlBar.setText("g"); | 
| +            } | 
| +        }); | 
| + | 
| +        assertTrue("Should have drawn the delete button", | 
| +                CriteriaHelper.pollForCriteria(new Criteria() { | 
| +                    @Override | 
| +                    public boolean isSatisfied() { | 
| +                        return deleteButton.getWidth() > 0; | 
| +                    } | 
| +                })); | 
| + | 
| +        // The click view below ends up clicking on the menu button underneath the delete button | 
| +        // for some time after the delete button appears. Wait for UI to settle down before | 
| +        // clicking. | 
| +        UiUtils.settleDownUI(getInstrumentation()); | 
| + | 
| +        singleClickView(deleteButton, deleteButton.getWidth() / 2, deleteButton.getHeight() / 2); | 
| + | 
| +        assertTrue("Should have requested zero suggest results on url bar empty", | 
| +                CriteriaHelper.pollForCriteria(new Criteria() { | 
| +                    @Override | 
| +                    public boolean isSatisfied() { | 
| +                        return controller.numZeroSuggestRequests() == 1; | 
| +                    } | 
| +                })); | 
| +    } | 
| + | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testRequestZeroSuggestTypeAndBackspace() throws InterruptedException { | 
| +        final LocationBarLayout locationBar = | 
| +                (LocationBarLayout) getActivity().findViewById(R.id.location_bar); | 
| +        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| + | 
| +        final OnSuggestionsReceivedListener emptySuggestionListener = | 
| +                new OnSuggestionsReceivedListener() { | 
| +                    @Override | 
| +                    public void onSuggestionsReceived(List<OmniboxSuggestion> suggestions, | 
| +                            String inlineAutocompleteText) { | 
| +                    } | 
| +                }; | 
| + | 
| +        final TestAutocompleteController controller = new TestAutocompleteController( | 
| +                locationBar, emptySuggestionListener, | 
| +                new HashMap<String, List<SuggestionsResult>>()); | 
| + | 
| +        OmniboxTestUtils.toggleUrlBarFocus(urlBar, true); | 
| + | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                locationBar.setAutocompleteController(controller); | 
| +                urlBar.setText("g"); | 
| +                urlBar.setSelection(1); | 
| +            } | 
| +        }); | 
| + | 
| +        assertEquals("No calls to zero suggest yet", 0, controller.numZeroSuggestRequests()); | 
| +        KeyUtils.singleKeyEventView(getInstrumentation(), urlBar, KeyEvent.KEYCODE_DEL); | 
| +        assertTrue("Should have requested zero suggest results on url bar empty", | 
| +                CriteriaHelper.pollForCriteria(new Criteria() { | 
| +                    @Override | 
| +                    public boolean isSatisfied() { | 
| +                        return controller.numZeroSuggestRequests() == 1; | 
| +                    } | 
| +                })); | 
| +    } | 
| + | 
| +    // Sanity check that no text is displayed in the omnibox when on the NTP page and that the hint | 
| +    // text is correct. | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testDefaultText() throws InterruptedException { | 
| +        startMainActivityFromLauncher(); | 
| + | 
| +        final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| + | 
| +        // Omnibox on NTP shows the hint text. | 
| +        assertNotNull(urlBar); | 
| +        assertEquals("Location bar has text.", "", urlBar.getText().toString()); | 
| +        assertEquals("Location bar has incorrect hint.", | 
| +                getActivity().getResources().getString(R.string.search_or_type_url), | 
| +                urlBar.getHint().toString()); | 
| + | 
| +        // Type something in the omnibox. | 
| +        // Note that the TextView does not provide a way to test if the hint is showing, the API | 
| +        // documentation simply says it shows when the text is empty. | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                urlBar.requestFocus(); | 
| +                urlBar.setText("G"); | 
| +            } | 
| +        }); | 
| +        assertEquals("Location bar should have text.", "G", urlBar.getText().toString()); | 
| +    } | 
| + | 
| +    @MediumTest | 
| +    @Feature({"Omnibox", "Main"}) | 
| +    public void testAutoCompleteAndCorrectionLandscape() throws ExecutionException, | 
| +            InterruptedException { | 
| +        // Default orientation for tablets is landscape. Default for phones is portrait. | 
| +        int requestedOrientation = 1; | 
| +        if (DeviceFormFactor.isTablet(getActivity())) { | 
| +            requestedOrientation = 0; | 
| +        } | 
| +        doTestAutoCompleteAndCorrectionForOrientation(requestedOrientation); | 
| +    } | 
| + | 
| +    @MediumTest | 
| +    @Feature({"Omnibox", "Main"}) | 
| +    public void testAutoCompleteAndCorrectionPortrait() throws ExecutionException, | 
| +            InterruptedException { | 
| +        // Default orientation for tablets is landscape. Default for phones is portrait. | 
| +        int requestedOrientation = 0; | 
| +        if (DeviceFormFactor.isTablet(getActivity())) { | 
| +            requestedOrientation = 1; | 
| +        } | 
| +        doTestAutoCompleteAndCorrectionForOrientation(requestedOrientation); | 
| +    } | 
| + | 
| +    private void doTestAutoCompleteAndCorrectionForOrientation( | 
| +            int orientation) throws ExecutionException, InterruptedException { | 
| +        getActivity().setRequestedOrientation(orientation); | 
| +        UiUtils.settleDownUI(getInstrumentation()); | 
| + | 
| +        Map<String, List<SuggestionsResult>> suggestionsMap = buildSuggestionMap( | 
| +                new TestSuggestionResultsBuilder() | 
| +                        .setTextShownFor("wiki") | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_SUGGEST, "wikipedia", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_SUGGEST, "wiki", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_SUGGEST, "wikileaks", null) | 
| +                                .setAutocompleteText("pedia")), | 
| +                new TestSuggestionResultsBuilder() | 
| +                        .setTextShownFor("onomatop") | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_SUGGEST, "onomatopoeia", null) | 
| +                                .addGeneratedSuggestion( | 
| +                                        Type.SEARCH_SUGGEST, "onomatopoeia foo", null) | 
| +                                .setAutocompleteText("oeia")), | 
| +                new TestSuggestionResultsBuilder() | 
| +                        .setTextShownFor("mispellled") | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_SUGGEST, "misspelled", null) | 
| +                                .addGeneratedSuggestion( | 
| +                                        Type.SEARCH_SUGGEST, "misspelled words", null) | 
| +                                .setAutocompleteText("")) | 
| +        ); | 
| +        checkAutocompleteText(suggestionsMap, "wiki", "wikipedia", 4, 9); | 
| +        checkAutocompleteText(suggestionsMap, "onomatop", "onomatopoeia", 8, 12); | 
| +        checkAutocompleteText(suggestionsMap, "mispellled", "mispellled", 10, 10); | 
| +    } | 
| + | 
| +    /** | 
| +     * crbug.com/267901 | 
| +     * @MediumTest | 
| +     * @Feature({"Omnibox"}) | 
| +     */ | 
| +    @FlakyTest | 
| +    public void testPerformSearchQuery() throws InterruptedException { | 
| +        UiUtils.settleDownUI(getInstrumentation()); | 
| +        final String testQuery = "Test Query"; | 
| + | 
| +        ChromeTabUtils.waitForTabPageLoaded(getActivity().getActivityTab(), new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +                    @Override | 
| +                    public void run() { | 
| +                        final LocationBarLayout locationBar = | 
| +                                (LocationBarLayout) getActivity().findViewById(R.id.location_bar); | 
| +                        locationBar.performSearchQueryForTest(testQuery); | 
| +                    } | 
| +                }); | 
| +            } | 
| +        }); | 
| + | 
| +        getInstrumentation().runOnMainSync(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar); | 
| +                String currentUrl = urlBar.getText().toString(); | 
| +                assertEquals(testQuery, currentUrl); | 
| +            } | 
| +        }); | 
| +    } | 
| + | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testDuplicateAutocompleteTextResults() | 
| +            throws InterruptedException, ExecutionException { | 
| +        Map<String, List<SuggestionsResult>> suggestionsMap = buildSuggestionMap( | 
| +                new TestSuggestionResultsBuilder() | 
| +                        .setTextShownFor("test") | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testing", null) | 
| +                                .setAutocompleteText("ing")) | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testz", null) | 
| +                                .setAutocompleteText("ing")) | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testblarg", null) | 
| +                                .setAutocompleteText("ing"))); | 
| +        checkAutocompleteText(suggestionsMap, "test", "testing", 4, 7); | 
| +    } | 
| + | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testGrowingAutocompleteTextResults() | 
| +            throws InterruptedException, ExecutionException { | 
| +        Map<String, List<SuggestionsResult>> suggestionsMap = buildSuggestionMap( | 
| +                new TestSuggestionResultsBuilder() | 
| +                        .setTextShownFor("test") | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testing", null) | 
| +                                .setAutocompleteText("i")) | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testz", null) | 
| +                                .setAutocompleteText("in")) | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testblarg", null) | 
| +                                .setAutocompleteText("ing for the win"))); | 
| +        checkAutocompleteText(suggestionsMap, "test", "testing for the win", 4, 19); | 
| +    } | 
| + | 
| +    @MediumTest | 
| +    @Feature({"Omnibox"}) | 
| +    public void testShrinkingAutocompleteTextResults() | 
| +            throws InterruptedException, ExecutionException { | 
| +        Map<String, List<SuggestionsResult>> suggestionsMap = buildSuggestionMap( | 
| +                new TestSuggestionResultsBuilder() | 
| +                        .setTextShownFor("test") | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testing", null) | 
| +                                .setAutocompleteText("ing is awesome")) | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testz", null) | 
| +                                .setAutocompleteText("ing is hard")) | 
| +                        .addSuggestions(new SuggestionsResultBuilder() | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "test", null) | 
| +                                .addGeneratedSuggestion(Type.SEARCH_HISTORY, "testblarg", null) | 
| +                                .setAutocompleteText("ingz"))); | 
| +        checkAutocompleteText(suggestionsMap, "test", "testingz", 4, 8); | 
| +    } | 
| + | 
| +    private void checkAutocompleteText( | 
| +            Map<String, List<SuggestionsResult>> suggestionsMap, | 
| +            final String textToType, final String expectedAutocompleteText, | 
| +            final int expectedAutocompleteStart, final int expectedAutocompleteEnd) | 
| +            throws InterruptedException, ExecutionException { | 
| + | 
| +        final TextView urlBarView = (TextView) getActivity().findViewById(R.id.url_bar); | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                urlBarView.requestFocus(); | 
| +                urlBarView.setText(""); | 
| +            } | 
| +        }); | 
| + | 
| +        final LocationBarLayout locationBar = | 
| +                ((LocationBarLayout) getActivity().findViewById(R.id.location_bar)); | 
| + | 
| +        final Object suggestionsProcessedSignal = new Object(); | 
| +        final AtomicInteger suggestionsLeft = new AtomicInteger( | 
| +                suggestionsMap.get(textToType).size()); | 
| +        OnSuggestionsReceivedListener suggestionsListener = new OnSuggestionsReceivedListener() { | 
| +            @Override | 
| +            public void onSuggestionsReceived( | 
| +                    List<OmniboxSuggestion> suggestions, | 
| +                    String inlineAutocompleteText) { | 
| +                locationBar.onSuggestionsReceived(suggestions, inlineAutocompleteText); | 
| +                synchronized (suggestionsProcessedSignal) { | 
| +                    int remaining = suggestionsLeft.decrementAndGet(); | 
| +                    if (remaining == 0) { | 
| +                        suggestionsProcessedSignal.notifyAll(); | 
| +                    } else if (remaining < 0) { | 
| +                        fail("Unexpected suggestions received"); | 
| +                    } | 
| +                } | 
| +            } | 
| +        }; | 
| +        final TestAutocompleteController controller = new TestAutocompleteController( | 
| +                locationBar, suggestionsListener, suggestionsMap); | 
| + | 
| +        ThreadUtils.runOnUiThreadBlocking(new Runnable() { | 
| +            @Override | 
| +            public void run() { | 
| +                locationBar.setAutocompleteController(controller); | 
| +            } | 
| +        }); | 
| + | 
| +        KeyUtils.typeTextIntoView(getInstrumentation(), urlBarView, textToType); | 
| + | 
| +        synchronized (suggestionsProcessedSignal) { | 
| +            long endTime = SystemClock.uptimeMillis() + 3000; | 
| +            while (suggestionsLeft.get() != 0) { | 
| +                long waitTime = endTime - SystemClock.uptimeMillis(); | 
| +                if (waitTime <= 0) break; | 
| +                suggestionsProcessedSignal.wait(waitTime); | 
| +            } | 
| +        } | 
| + | 
| +        CharSequence urlText = ThreadUtils.runOnUiThreadBlocking(new Callable<CharSequence>() { | 
| +            @Override | 
| +            public CharSequence call() throws Exception { | 
| +                return urlBarView.getText(); | 
| +            } | 
| +        }); | 
| +        assertEquals("URL Bar text not autocompleted as expected.", | 
| +                expectedAutocompleteText, urlText.toString()); | 
| +        assertEquals(expectedAutocompleteStart, Selection.getSelectionStart(urlText)); | 
| +        assertEquals(expectedAutocompleteEnd, Selection.getSelectionEnd(urlText)); | 
| +    } | 
| + | 
| +    /** | 
| +     * The following test is a basic way to assess how much instant slows down typing in the | 
| +     * omnibox. It is meant to be run manually for investigation purposes. | 
| +     * When instant was enabled for all suggestions (including searched), I would get a 40% increase | 
| +     * in the average time on this test. With instant off, it was almost identical. | 
| +     * Marking the test disabled so it is not picked up by our test runner, as it is supposed to be | 
| +     * run manually. | 
| +     */ | 
| +    public void manualTestTypingPerformance() throws InterruptedException { | 
| +        final String text = "searching for pizza"; | 
| +        // Type 10 times something on the omnibox and get the average time with and without instant. | 
| +        long instantAverage = 0; | 
| +        long noInstantAverage = 0; | 
| + | 
| +        for (int i = 0; i < 2; ++i) { | 
| +            boolean instantOn = (i == 1); | 
| +            setAllowPrerender(instantOn); | 
| + | 
| +            for (int j = 0; j < 10; ++j) { | 
| +                long before = System.currentTimeMillis(); | 
| +                typeInOmnibox(text, true); | 
| +                if (instantOn) { | 
| +                    instantAverage += System.currentTimeMillis() - before; | 
| +                } else { | 
| +                    noInstantAverage += System.currentTimeMillis() - before; | 
| +                } | 
| +                clearUrlBar(); | 
| +                getInstrumentation().waitForIdleSync(); | 
| +            } | 
| +        } | 
| +        instantAverage /= 10; | 
| +        noInstantAverage /= 10; | 
| +        System.err.println("******************************************************************"); | 
| +        System.err.println("**** Instant average=" + instantAverage); | 
| +        System.err.println("**** No instant average=" + noInstantAverage); | 
| +        System.err.println("******************************************************************"); | 
| +    } | 
| + | 
| +    /** | 
| +     * crbug.com/414353 | 
| +     * Test to verify security-icon "lock or globe" on visiting http and secured Urls. | 
| +     * @EnormousTest | 
| +     */ | 
| +    @FlakyTest | 
| +    public void testSecurityIcon() throws InterruptedException { | 
| +        final String testUrl = TestHttpServerClient.getUrl( | 
| +                "chrome/test/data/android/omnibox/one.html"); | 
| +        final String securedExternalUrl = "https://www.google.com"; | 
| + | 
| +        ImageView navigationButton = (ImageView) | 
| +                getActivity().findViewById(R.id.navigation_button); | 
| +        ImageButton securityButton = (ImageButton) | 
| +                getActivity().findViewById(R.id.security_button); | 
| + | 
| +        loadUrl(testUrl); | 
| +        final LocationBarLayout locationBar = | 
| +                (LocationBarLayout) getActivity().findViewById(R.id.location_bar); | 
| +        boolean securityIcon = locationBar.isSecurityButtonShown(); | 
| +        assertFalse("Omnibox should not have a Security icon", securityIcon); | 
| +        assertEquals("navigation_button with wrong resource-id", | 
| +                R.id.navigation_button, navigationButton.getId()); | 
| +        assertTrue(navigationButton.isShown()); | 
| +        assertFalse(securityButton.isShown()); | 
| + | 
| +        loadUrl(securedExternalUrl); | 
| +        securityIcon = locationBar.isSecurityButtonShown(); | 
| +        assertTrue("Omnibox should have a Security icon", securityIcon); | 
| +        assertEquals("security_button with wrong resource-id", | 
| +                R.id.security_button, securityButton.getId()); | 
| +        assertTrue(securityButton.isShown()); | 
| +        assertFalse(navigationButton.isShown()); | 
| +    } | 
| + | 
| +    @SmallTest | 
| +    public void testSplitPathFromUrlDisplayText() { | 
| +        verifySplitUrlAndPath("", null, LocationBarLayout.splitPathFromUrlDisplayText("")); | 
| +        verifySplitUrlAndPath( | 
| +                "https:", null, LocationBarLayout.splitPathFromUrlDisplayText("https:")); | 
| +        verifySplitUrlAndPath("about:blank", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("about:blank")); | 
| + | 
| +        verifySplitUrlAndPath("chrome://flags", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("chrome://flags")); | 
| +        verifySplitUrlAndPath("chrome://flags", "/?egads", | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("chrome://flags/?egads")); | 
| + | 
| +        verifySplitUrlAndPath("www.google.com", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("www.google.com")); | 
| +        verifySplitUrlAndPath("www.google.com", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("www.google.com/")); | 
| +        verifySplitUrlAndPath("www.google.com", "/?q=blah", | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("www.google.com/?q=blah")); | 
| + | 
| +        verifySplitUrlAndPath("https://www.google.com", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("https://www.google.com")); | 
| +        verifySplitUrlAndPath("https://www.google.com", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("https://www.google.com/")); | 
| +        verifySplitUrlAndPath("https://www.google.com", "/?q=blah", | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("https://www.google.com/?q=blah")); | 
| + | 
| +        // crbug.com/414990 | 
| +        String testUrl = "https://disneyworld.disney.go.com/special-offers/" | 
| +                + "?CMP=KNC-WDW_FY15_DOM_Q1RO_BR_Gold_SpOffer|G|4141300.RR.AM.01.47" | 
| +                + "&keyword_id=s6JyxRifG_dm|walt%20disney%20world|37174067873|e|1540wwa14043"; | 
| +        verifySplitUrlAndPath("https://disneyworld.disney.go.com", | 
| +                "/special-offers/?CMP=KNC-WDW_FY15_DOM_Q1RO_BR_Gold_SpOffer|G|4141300.RR.AM.01.47" | 
| +                        + "&keyword_id=s6JyxRifG_dm|walt%20disney%20world|37174067873|e|" | 
| +                        + "1540wwa14043", | 
| +                LocationBarLayout.splitPathFromUrlDisplayText(testUrl)); | 
| + | 
| +        // crbug.com/415387 | 
| +        verifySplitUrlAndPath("ftp://example.com", "/ftp.html", | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("ftp://example.com/ftp.html")); | 
| + | 
| +        // crbug.com/447416 | 
| +        verifySplitUrlAndPath("file:///dev/blah", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("file:///dev/blah")); | 
| +        verifySplitUrlAndPath("javascript:window.alert('hello');", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText("javascript:window.alert('hello');")); | 
| +        verifySplitUrlAndPath("data:text/html;charset=utf-8,Page%201", null, | 
| +                LocationBarLayout.splitPathFromUrlDisplayText( | 
| +                        "data:text/html;charset=utf-8,Page%201")); | 
| +    } | 
| + | 
| +    private void verifySplitUrlAndPath( | 
| +            String expectedPrePath, String expectedPostPath, Pair<String, String> actualValues) { | 
| +        assertEquals(expectedPrePath, actualValues.first); | 
| +        assertEquals(expectedPostPath, actualValues.second); | 
| +    } | 
| + | 
| +    @Override | 
| +    public void startMainActivity() throws InterruptedException { | 
| +        if (getName().equals("testsplitPathFromUrlDisplayText") | 
| +                || getName().equals("testDefaultText")) { | 
| +            return; | 
| +        } | 
| +        startMainActivityOnBlankPage(); | 
| +    } | 
| +} | 
|  |