Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 package org.mozilla.gecko.tests.components;
7 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertEquals;
8 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertFalse;
9 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertNotNull;
10 import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue;
12 import org.mozilla.gecko.R;
13 import org.mozilla.gecko.tests.UITestContext;
14 import org.mozilla.gecko.tests.helpers.DeviceHelper;
15 import org.mozilla.gecko.tests.helpers.WaitHelper;
17 import android.view.View;
18 import android.widget.EditText;
19 import android.widget.ImageButton;
20 import android.widget.TextView;
22 import com.jayway.android.robotium.solo.Condition;
23 import com.jayway.android.robotium.solo.Solo;
25 /**
26 * A class representing any interactions that take place on the Toolbar.
27 */
28 public class ToolbarComponent extends BaseComponent {
29 public ToolbarComponent(final UITestContext testContext) {
30 super(testContext);
31 }
33 public ToolbarComponent assertIsEditing() {
34 fAssertTrue("The toolbar is in the editing state", isEditing());
35 return this;
36 }
38 public ToolbarComponent assertIsNotEditing() {
39 fAssertFalse("The toolbar is not in the editing state", isEditing());
40 return this;
41 }
43 public ToolbarComponent assertTitle(final String expected) {
44 fAssertEquals("The Toolbar title is " + expected, expected, getTitle());
45 return this;
46 }
48 public ToolbarComponent assertUrl(final String expected) {
49 assertIsEditing();
50 fAssertEquals("The Toolbar url is " + expected, expected, getUrlEditText().getText());
51 return this;
52 }
54 /**
55 * Returns the root View for the browser toolbar.
56 */
57 private View getToolbarView() {
58 return mSolo.getView(R.id.browser_toolbar);
59 }
61 private EditText getUrlEditText() {
62 return (EditText) getToolbarView().findViewById(R.id.url_edit_text);
63 }
65 private View getUrlDisplayLayout() {
66 return getToolbarView().findViewById(R.id.display_layout);
67 }
69 private TextView getUrlTitleText() {
70 return (TextView) getToolbarView().findViewById(R.id.url_bar_title);
71 }
73 private ImageButton getBackButton() {
74 DeviceHelper.assertIsTablet();
75 return (ImageButton) getToolbarView().findViewById(R.id.back);
76 }
78 private ImageButton getForwardButton() {
79 DeviceHelper.assertIsTablet();
80 return (ImageButton) getToolbarView().findViewById(R.id.forward);
81 }
83 /**
84 * Returns the View for the edit cancel button in the browser toolbar.
85 */
86 private ImageButton getEditCancelButton() {
87 return (ImageButton) getToolbarView().findViewById(R.id.edit_cancel);
88 }
90 private CharSequence getTitle() {
91 return getTitleHelper(true);
92 }
94 /**
95 * Returns the title of the page. Note that this makes no assertions to Toolbar state and
96 * may return a value that may never be visible to the user. Callers likely want to use
97 * {@link assertTitle} instead.
98 */
99 public CharSequence getPotentiallyInconsistentTitle() {
100 return getTitleHelper(false);
101 }
103 private CharSequence getTitleHelper(final boolean shouldAssertNotEditing) {
104 if (shouldAssertNotEditing) {
105 assertIsNotEditing();
106 }
108 return getUrlTitleText().getText();
109 }
111 private boolean isEditing() {
112 return getUrlDisplayLayout().getVisibility() != View.VISIBLE &&
113 getUrlEditText().getVisibility() == View.VISIBLE;
114 }
116 public ToolbarComponent enterEditingMode() {
117 assertIsNotEditing();
119 mSolo.clickOnView(getUrlTitleText(), true);
121 waitForEditing();
122 WaitHelper.waitFor("UrlEditText to be input method target", new Condition() {
123 @Override
124 public boolean isSatisfied() {
125 return getUrlEditText().isInputMethodTarget();
126 }
127 });
129 return this;
130 }
132 public ToolbarComponent commitEditingMode() {
133 assertIsEditing();
135 WaitHelper.waitForPageLoad(new Runnable() {
136 @Override
137 public void run() {
138 mSolo.sendKey(Solo.ENTER);
139 }
140 });
141 waitForNotEditing();
143 return this;
144 }
146 public ToolbarComponent dismissEditingMode() {
147 assertIsEditing();
149 // Cancel Button not implemeneted in tablet.
150 if (DeviceHelper.isTablet()) {
151 if (getUrlEditText().isInputMethodTarget()) {
152 // Drop the soft keyboard.
153 // TODO: Solo.hideSoftKeyboard() does not clear focus, causing unexpected
154 // behavior, but we may want to use it over goBack().
155 mSolo.goBack();
156 }
158 mSolo.goBack();
159 } else {
160 mSolo.clickOnView(getEditCancelButton());
161 }
163 waitForNotEditing();
165 return this;
166 }
168 public ToolbarComponent enterUrl(final String url) {
169 fAssertNotNull("url is not null", url);
171 assertIsEditing();
173 final EditText urlEditText = getUrlEditText();
174 fAssertTrue("The UrlEditText is the input method target",
175 urlEditText.isInputMethodTarget());
177 mSolo.clearEditText(urlEditText);
178 mSolo.enterText(urlEditText, url);
180 return this;
181 }
183 public ToolbarComponent pressBackButton() {
184 final ImageButton backButton = getBackButton();
185 return pressButton(backButton, "back");
186 }
188 public ToolbarComponent pressForwardButton() {
189 final ImageButton forwardButton = getForwardButton();
190 return pressButton(forwardButton, "forward");
191 }
193 private ToolbarComponent pressButton(final View view, final String buttonName) {
194 fAssertNotNull("The " + buttonName + " button View is not null", view);
195 fAssertTrue("The " + buttonName + " button is enabled", view.isEnabled());
196 fAssertEquals("The " + buttonName + " button is visible",
197 View.VISIBLE, view.getVisibility());
198 assertIsNotEditing();
200 WaitHelper.waitForPageLoad(new Runnable() {
201 @Override
202 public void run() {
203 mSolo.clickOnView(view);
204 }
205 });
207 return this;
208 }
210 private void waitForEditing() {
211 WaitHelper.waitFor("Toolbar to enter editing mode", new Condition() {
212 @Override
213 public boolean isSatisfied() {
214 return isEditing();
215 }
216 });
217 }
219 private void waitForNotEditing() {
220 WaitHelper.waitFor("Toolbar to exit editing mode", new Condition() {
221 @Override
222 public boolean isSatisfied() {
223 return !isEditing();
224 }
225 });
226 }
227 }