SelectPopupTest.java revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)package org.chromium.content.browser.input;
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import android.test.suitebuilder.annotation.LargeTest;
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.base.test.util.Feature;
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.base.test.util.UrlUtils;
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.ContentView;
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.ContentViewCore;
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.test.util.Criteria;
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper;
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.test.util.DOMUtils;
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import org.chromium.content_shell_apk.ContentShellTestBase;
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import java.util.concurrent.TimeUnit;
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public class SelectPopupTest extends ContentShellTestBase {
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private static final long WAIT_TIMEOUT_SECONDS = scaleTimeout(2);
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private static final String SELECT_URL = UrlUtils.encodeHtmlDataUri(
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "<html><head><meta name=\"viewport\"" +
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>" +
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "<body>Which animal is the strongest:<br/>" +
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "<select id=\"select\">" +
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "<option>Black bear</option>" +
32d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            "<option>Polar bear</option>" +
33e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            "<option>Grizzly</option>" +
34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            "<option>Tiger</option>" +
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "<option>Lion</option>" +
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            "<option>Gorilla</option>" +
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "<option>Chipmunk</option>" +
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "</select>" +
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "</body></html>");
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    private class PopupShowingCriteria implements Criteria {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @Override
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        public boolean isSatisfied() {
44d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            ContentViewCore contentViewCore
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    = getActivity().getActiveContentView().getContentViewCore();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return contentViewCore.getSelectPopupForTest() != null;
4776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        }
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private class PopupHiddenCriteria implements Criteria {
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        @Override
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        public boolean isSatisfied() {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ContentViewCore contentViewCore
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    = getActivity().getActiveContentView().getContentViewCore();
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return contentViewCore.getSelectPopupForTest() == null;
56d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    @Override
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public void setUp() throws Exception {
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        super.setUp();
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        launchContentShellWithUrl(SELECT_URL);
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading());
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // TODO(aurimas) remove this wait once crbug.com/179511 is fixed.
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        assertWaitForPageScaleFactorMatch(1);
66    }
67
68    /**
69     * Tests that showing a select popup and having the page reload while the popup is showing does
70     * not assert.
71     */
72    @LargeTest
73    @Feature({"Browser"})
74    public void testReloadWhilePopupShowing() throws InterruptedException, Exception, Throwable {
75        // The popup should be hidden before the click.
76        assertTrue("The select popup is shown after load.",
77                CriteriaHelper.pollForCriteria(new PopupHiddenCriteria()));
78
79        final ContentView view = getActivity().getActiveContentView();
80        final TestCallbackHelperContainer viewClient =
81                new TestCallbackHelperContainer(view);
82        final OnPageFinishedHelper onPageFinishedHelper =
83                viewClient.getOnPageFinishedHelper();
84
85        // Once clicked, the popup should show up.
86        DOMUtils.clickNode(this, view, "select");
87        assertTrue("The select popup did not show up on click.",
88                CriteriaHelper.pollForCriteria(new PopupShowingCriteria()));
89
90        // Reload the test page.
91        int currentCallCount = onPageFinishedHelper.getCallCount();
92        getInstrumentation().runOnMainSync(new Runnable() {
93            @Override
94            public void run() {
95                // Now reload the page while the popup is showing, it gets hidden.
96                getActivity().getActiveShell().loadUrl(SELECT_URL);
97            }
98        });
99        onPageFinishedHelper.waitForCallback(currentCallCount, 1,
100                WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
101
102        // The popup should be hidden after the page reload.
103        assertTrue("The select popup did not hide after reload.",
104                CriteriaHelper.pollForCriteria(new PopupHiddenCriteria()));
105
106        // Click the select and wait for the popup to show.
107        DOMUtils.clickNode(this, view, "select");
108        assertTrue("The select popup did not show on click after reload.",
109                CriteriaHelper.pollForCriteria(new PopupShowingCriteria()));
110    }
111}
112