SelectPopupTest.java revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser.input;
6
7import android.test.suitebuilder.annotation.LargeTest;
8
9import org.chromium.base.test.util.Feature;
10import org.chromium.base.test.util.UrlUtils;
11import org.chromium.content.browser.ContentView;
12import org.chromium.content.browser.test.util.Criteria;
13import org.chromium.content.browser.test.util.CriteriaHelper;
14import org.chromium.content.browser.test.util.DOMUtils;
15import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
16import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
17import org.chromium.content_shell_apk.ContentShellTestBase;
18
19import java.util.concurrent.TimeUnit;
20
21public class SelectPopupTest extends ContentShellTestBase {
22    private static final int WAIT_TIMEOUT_SECONDS = 2;
23    private static final String SELECT_URL = UrlUtils.encodeHtmlDataUri(
24            "<html><head><meta name=\"viewport\"" +
25            "content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" /></head>" +
26            "<body>Which animal is the strongest:<br/>" +
27            "<select id=\"select\">" +
28            "<option>Black bear</option>" +
29            "<option>Polar bear</option>" +
30            "<option>Grizzly</option>" +
31            "<option>Tiger</option>" +
32            "<option>Lion</option>" +
33            "<option>Gorilla</option>" +
34            "<option>Chipmunk</option>" +
35            "</select>" +
36            "</body></html>");
37
38    private static class PopupShowingCriteria implements Criteria {
39        @Override
40        public boolean isSatisfied() {
41            return SelectPopupDialog.getCurrent() != null;
42        }
43    }
44
45    private static class PopupHiddenCriteria implements Criteria {
46        @Override
47        public boolean isSatisfied() {
48            return SelectPopupDialog.getCurrent() == null;
49        }
50    }
51
52    @Override
53    public void setUp() throws Exception {
54        super.setUp();
55        launchContentShellWithUrl(SELECT_URL);
56        assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading());
57        // TODO(aurimas) remove this wait once crbug.com/179511 is fixed.
58        assertWaitForPageScaleFactorMatch(1);
59    }
60
61    /**
62     * Tests that showing a select popup and having the page reload while the popup is showing does
63     * not assert.
64     */
65    @LargeTest
66    @Feature({"Browser"})
67    public void testReloadWhilePopupShowing() throws InterruptedException, Exception, Throwable {
68        // The popup should be hidden before the click.
69        assertTrue("The select popup is shown after load.",
70                CriteriaHelper.pollForCriteria(new PopupHiddenCriteria()));
71
72        final ContentView view = getActivity().getActiveContentView();
73        final TestCallbackHelperContainer viewClient =
74                new TestCallbackHelperContainer(view);
75        final OnPageFinishedHelper onPageFinishedHelper =
76                viewClient.getOnPageFinishedHelper();
77
78        // Once clicked, the popup should show up.
79        DOMUtils.clickNode(this, view, viewClient, "select");
80        assertTrue("The select popup did not show up on click.",
81                CriteriaHelper.pollForCriteria(new PopupShowingCriteria()));
82
83        // Reload the test page.
84        int currentCallCount = onPageFinishedHelper.getCallCount();
85        getInstrumentation().runOnMainSync(new Runnable() {
86            @Override
87            public void run() {
88                // Now reload the page while the popup is showing, it gets hidden.
89                getActivity().getActiveShell().loadUrl(SELECT_URL);
90            }
91        });
92        onPageFinishedHelper.waitForCallback(currentCallCount, 1,
93                WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
94
95        // The popup should be hidden after the page reload.
96        assertTrue("The select popup did not hide after reload.",
97                CriteriaHelper.pollForCriteria(new PopupHiddenCriteria()));
98
99        // Click the select and wait for the popup to show.
100        DOMUtils.clickNode(this, view, viewClient, "select");
101        assertTrue("The select popup did not show on click after reload.",
102                CriteriaHelper.pollForCriteria(new PopupShowingCriteria()));
103    }
104}
105