Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: ios/chrome/browser/web/progress_indicator_egtest.mm

Issue 2580333003: Upstream Chrome on iOS source code [10/11]. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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
5 #import <EarlGrey/EarlGrey.h>
6
7 #include "base/mac/foundation_util.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/time/time.h"
11 #include "ios/chrome/browser/ui/ui_util.h"
12 #include "ios/chrome/test/app/navigation_test_util.h"
13 #include "ios/chrome/test/app/web_view_interaction_test_util.h"
14 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
15 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
16 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
17 #include "ios/chrome/test/earl_grey/chrome_util.h"
18 #import "ios/testing/earl_grey/disabled_test_macros.h"
19 #import "ios/third_party/material_components_ios/src/components/ProgressView/src /MaterialProgressView.h"
20 #import "ios/web/public/test/http_server.h"
21 #import "ios/web/public/test/http_server_util.h"
22 #include "ios/web/public/test/response_providers/html_response_provider.h"
23 #include "url/gurl.h"
24
25 using chrome_test_util::webViewContainingText;
26
27 namespace {
28
29 // Text to display in form page.
30 const char kFormPageText[] = "Form testing page";
31
32 // Text to display in infinite loading page.
33 const char kPageText[] = "Navigation testing page";
34
35 // Identifier of form to submit on form page.
36 const char kFormID[] = "testform";
37
38 // URL string for a form page.
39 const char kFormURL[] = "http://form";
40
41 // URL string for an infinite pending page.
42 const char kInfinitePendingPageURL[] = "http://infinite";
43
44 // URL string for a simple page containing |kPageText|.
45 const char kSimplePageURL[] = "http://simplepage";
46
47 // Matcher for progress view.
48 id<GREYMatcher> progressView() {
49 return grey_kindOfClass([MDCProgressView class]);
50 }
51
52 // Matcher for the progress view with |progress|.
53 id<GREYMatcher> progressViewWithProgress(CGFloat progress) {
54 MatchesBlock matches = ^BOOL(UIView* view) {
55 MDCProgressView* progressView = base::mac::ObjCCast<MDCProgressView>(view);
56 return progressView && progressView.progress == progress;
57 };
58
59 DescribeToBlock describe = ^(id<GREYDescription> description) {
60 [description
61 appendText:[NSString stringWithFormat:@"progress view with progress:%f",
62 progress]];
63 };
64
65 return [[[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
66 descriptionBlock:describe]
67 autorelease];
68 }
69
70 // Response provider that serves the page which never finishes loading.
71 // TODO(crbug.com/638674): Evaluate if this can move to shared code.
72 class InfinitePendingResponseProvider : public HtmlResponseProvider {
73 public:
74 explicit InfinitePendingResponseProvider(const GURL& url) : url_(url) {}
75 ~InfinitePendingResponseProvider() override {}
76
77 // HtmlResponseProvider overrides:
78 bool CanHandleRequest(const Request& request) override {
79 return request.url == url_ ||
80 request.url == GetInfinitePendingResponseUrl();
81 }
82 void GetResponseHeadersAndBody(
83 const Request& request,
84 scoped_refptr<net::HttpResponseHeaders>* headers,
85 std::string* response_body) override {
86 if (request.url == url_) {
87 *headers = GetDefaultResponseHeaders();
88 *response_body =
89 base::StringPrintf("<p>%s</p><img src='%s'/>", kPageText,
90 GetInfinitePendingResponseUrl().spec().c_str());
91 } else if (request.url == GetInfinitePendingResponseUrl()) {
92 base::PlatformThread::Sleep(base::TimeDelta::FromDays(1));
93 } else {
94 NOTREACHED();
95 }
96 }
97
98 private:
99 // Returns a url for which this responce provider will never reply.
100 GURL GetInfinitePendingResponseUrl() const {
101 GURL::Replacements replacements;
102 replacements.SetPathStr("resource");
103 return url_.GetOrigin().ReplaceComponents(replacements);
104 }
105
106 // Main page URL that never finish loading.
107 GURL url_;
108 };
109
110 } // namespace
111
112 // Tests webpage loading progress indicator.
113 @interface ProgressIndicatorTestCase : ChromeTestCase
114 @end
115
116 @implementation ProgressIndicatorTestCase
117
118 // Returns an HTML string for a form with the submission action set to
119 // |submitURL|.
120 - (std::string)formPageHTMLWithFormSubmitURL:(GURL)submitURL {
121 return base::StringPrintf(
122 "<p>%s</p><form id='%s' method='post' action='%s'>"
123 "<input type='submit'></form>",
124 kFormPageText, kFormID, submitURL.spec().c_str());
125 }
126
127 // Returns an HTML string for a form with a submit event that returns false.
128 - (std::string)formPageHTMLWithSuppressedSubmitEvent {
129 return base::StringPrintf(
130 "<p>%s</p><form id='%s' method='post' onsubmit='return false'>"
131 "<input type='submit'></form>",
132 kFormPageText, kFormID);
133 }
134
135 // Tests that the progress indicator is shown and has expected progress value
136 // for a simple two item page, and the toolbar is visible.
137 - (void)testProgressIndicatorShown {
138 if (IsIPadIdiom()) {
139 EARL_GREY_TEST_SKIPPED(@"Skipped for iPad (no progress view in tablet)");
140 }
141
142 // Load a page which never finishes loading.
143 const GURL infinitePendingURL =
144 web::test::HttpServer::MakeUrl(kInfinitePendingPageURL);
145 web::test::SetUpHttpServer(
146 base::MakeUnique<InfinitePendingResponseProvider>(infinitePendingURL));
147
148 // The page being loaded never completes, so call the LoadUrl helper that
149 // does not wait for the page to complete loading.
150 chrome_test_util::LoadUrl(infinitePendingURL);
151
152 // Wait until the page is half loaded.
153 [[EarlGrey selectElementWithMatcher:webViewContainingText(kPageText)]
154 assertWithMatcher:grey_notNil()];
155
156 // Verify progress view visible and halfway progress.
157 [[EarlGrey selectElementWithMatcher:progressViewWithProgress(0.5)]
158 assertWithMatcher:grey_sufficientlyVisible()];
159
160 // Verify toolbar visible.
161 chrome_test_util::AssertToolbarVisible();
162 }
163
164 // Tests that the progress indicator is shown and has expected progress value
165 // after a form is submitted, and the toolbar is visible.
166 - (void)testProgressIndicatorShownOnFormSubmit {
167 if (IsIPadIdiom()) {
168 EARL_GREY_TEST_SKIPPED(@"Skipped for iPad (no progress view in tablet)");
169 }
170
171 const GURL formURL = web::test::HttpServer::MakeUrl(kFormURL);
172 const GURL infinitePendingURL =
173 web::test::HttpServer::MakeUrl(kInfinitePendingPageURL);
174
175 // Create a page with a form to test.
176 std::map<GURL, std::string> responses;
177 responses[formURL] = [self formPageHTMLWithFormSubmitURL:infinitePendingURL];
178 web::test::SetUpSimpleHttpServer(responses);
179
180 // Add responseProvider for page that never finishes loading.
181 web::test::AddResponseProvider(
182 base::MakeUnique<InfinitePendingResponseProvider>(infinitePendingURL));
183
184 // Load form first.
185 [ChromeEarlGrey loadURL:formURL];
186
187 [[EarlGrey selectElementWithMatcher:webViewContainingText(kFormPageText)]
188 assertWithMatcher:grey_notNil()];
189
190 chrome_test_util::SubmitWebViewFormWithId(kFormID);
191
192 // Wait until the page is half loaded.
193 [[EarlGrey selectElementWithMatcher:webViewContainingText(kPageText)]
194 assertWithMatcher:grey_notNil()];
195
196 // Verify progress view visible and halfway progress.
197 [[EarlGrey selectElementWithMatcher:progressViewWithProgress(0.5)]
198 assertWithMatcher:grey_sufficientlyVisible()];
199
200 // Verify toolbar visible.
201 chrome_test_util::AssertToolbarVisible();
202 }
203
204 // Tests that the progress indicator disappears after form has been submitted.
205 - (void)testProgressIndicatorDisappearsAfterFormSubmit {
206 if (IsIPadIdiom()) {
207 EARL_GREY_TEST_SKIPPED(@"Skipped for iPad (no progress view in tablet)");
208 }
209
210 const GURL formURL = web::test::HttpServer::MakeUrl(kFormURL);
211 const GURL simplePageURL = web::test::HttpServer::MakeUrl(kSimplePageURL);
212
213 // Create a page with a form to test.
214 std::map<GURL, std::string> responses;
215 responses[formURL] = [self formPageHTMLWithFormSubmitURL:simplePageURL];
216 responses[simplePageURL] = kPageText;
217 web::test::SetUpSimpleHttpServer(responses);
218
219 [ChromeEarlGrey loadURL:formURL];
220
221 [[EarlGrey selectElementWithMatcher:webViewContainingText(kFormPageText)]
222 assertWithMatcher:grey_notNil()];
223
224 chrome_test_util::SubmitWebViewFormWithId(kFormID);
225
226 // Verify the new page has been loaded.
227 [[EarlGrey selectElementWithMatcher:webViewContainingText(kPageText)]
228 assertWithMatcher:grey_notNil()];
229
230 // Verify progress view is not visible.
231 [[EarlGrey selectElementWithMatcher:progressView()]
232 assertWithMatcher:grey_notVisible()];
233 }
234
235 // Tests that the progress indicator disappears after form post attempt with a
236 // submit event that returns false.
237 - (void)testProgressIndicatorDisappearsAfterSuppressedFormPost {
238 if (IsIPadIdiom()) {
239 EARL_GREY_TEST_SKIPPED(@"Skipped for iPad (no progress view in tablet)");
240 }
241
242 // Create a page with a form to test.
243 const GURL formURL = web::test::HttpServer::MakeUrl(kFormURL);
244 std::map<GURL, std::string> responses;
245 responses[formURL] = [self formPageHTMLWithSuppressedSubmitEvent];
246 web::test::SetUpSimpleHttpServer(responses);
247
248 [ChromeEarlGrey loadURL:formURL];
249
250 // Verify the form page has been loaded.
251 [[EarlGrey selectElementWithMatcher:webViewContainingText(kFormPageText)]
252 assertWithMatcher:grey_notNil()];
253
254 chrome_test_util::SubmitWebViewFormWithId(kFormID);
255
256 // Verify progress view is not visible.
257 [[EarlGrey selectElementWithMatcher:grey_kindOfClass([MDCProgressView class])]
258 assertWithMatcher:grey_notVisible()];
259 }
260
261 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/web/print_observer.mm ('k') | ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698