web_view_kvo_inttest.mm 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. // Copyright 2017 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. #import <ChromeWebView/ChromeWebView.h>
  5. #import <Foundation/Foundation.h>
  6. #include "base/strings/stringprintf.h"
  7. #import "base/strings/sys_string_conversions.h"
  8. #import "base/test/ios/wait_util.h"
  9. #include "components/url_formatter/elide_url.h"
  10. #import "ios/web_view/test/observer.h"
  11. #import "ios/web_view/test/web_view_inttest_base.h"
  12. #import "ios/web_view/test/web_view_test_util.h"
  13. #import "net/base/mac/url_conversions.h"
  14. #include "net/test/embedded_test_server/embedded_test_server.h"
  15. #include "testing/gtest_mac.h"
  16. #include "url/gurl.h"
  17. #if !defined(__has_feature) || !__has_feature(objc_arc)
  18. #error "This file requires ARC support."
  19. #endif
  20. namespace ios_web_view {
  21. // Tests that the KVO compliant properties of CWVWebView correctly report
  22. // changes.
  23. typedef ios_web_view::WebViewInttestBase WebViewKvoTest;
  24. // Tests that CWVWebView correctly reports |canGoBack| and |canGoForward| state.
  25. TEST_F(WebViewKvoTest, CanGoBackForward) {
  26. ASSERT_TRUE(test_server_->Start());
  27. Observer* back_observer = [[Observer alloc] init];
  28. [back_observer setObservedObject:web_view_ keyPath:@"canGoBack"];
  29. Observer* forward_observer = [[Observer alloc] init];
  30. [forward_observer setObservedObject:web_view_ keyPath:@"canGoForward"];
  31. ASSERT_FALSE(back_observer.lastValue);
  32. ASSERT_FALSE(forward_observer.lastValue);
  33. // Define pages in reverse order so the links can reference the "next" page.
  34. GURL page_3_url = GetUrlForPageWithTitleAndBody("Page 3", "Body 3");
  35. std::string page_2_html =
  36. "<a id='link_2' href='" + page_3_url.spec() + "'>Link 2</a>";
  37. GURL page_2_url = GetUrlForPageWithHtmlBody(page_2_html);
  38. std::string page_1_html =
  39. "<a id='link_1' href='" + page_2_url.spec() + "'>Link 1</a>";
  40. GURL page_1_url = GetUrlForPageWithHtmlBody(page_1_html);
  41. ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url)));
  42. // Loading initial URL should not affect back/forward navigation state.
  43. EXPECT_FALSE([back_observer.lastValue boolValue]);
  44. EXPECT_FALSE([forward_observer.lastValue boolValue]);
  45. // Navigate to page 2.
  46. EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  47. ASSERT_TRUE(
  48. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 2"));
  49. EXPECT_TRUE([back_observer.lastValue boolValue]);
  50. EXPECT_FALSE([forward_observer.lastValue boolValue]);
  51. // Navigate back to page 1.
  52. [web_view_ goBack];
  53. ASSERT_TRUE(
  54. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  55. EXPECT_FALSE([back_observer.lastValue boolValue]);
  56. EXPECT_TRUE([forward_observer.lastValue boolValue]);
  57. // Navigate forward to page 2.
  58. [web_view_ goForward];
  59. ASSERT_TRUE(
  60. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 2"));
  61. EXPECT_TRUE([back_observer.lastValue boolValue]);
  62. EXPECT_FALSE([forward_observer.lastValue boolValue]);
  63. // Navigate to page 3.
  64. EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_2"));
  65. ASSERT_TRUE(
  66. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 3"));
  67. EXPECT_TRUE([back_observer.lastValue boolValue]);
  68. EXPECT_FALSE([forward_observer.lastValue boolValue]);
  69. // Navigate back to page 2.
  70. [web_view_ goBack];
  71. ASSERT_TRUE(
  72. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 2"));
  73. EXPECT_TRUE([back_observer.lastValue boolValue]);
  74. EXPECT_TRUE([forward_observer.lastValue boolValue]);
  75. }
  76. // Tests that CWVWebView correctly reports current |title|.
  77. TEST_F(WebViewKvoTest, Title) {
  78. ASSERT_TRUE(test_server_->Start());
  79. Observer* observer = [[Observer alloc] init];
  80. [observer setObservedObject:web_view_ keyPath:@"title"];
  81. NSString* page_2_title = @"Page 2";
  82. GURL page_2_url = GetUrlForPageWithTitleAndBody(
  83. base::SysNSStringToUTF8(page_2_title), "Body 2");
  84. NSString* page_1_title = @"Page 1";
  85. std::string page_1_html = base::StringPrintf(
  86. "<a id='link_1' href='%s'>Link 1</a>", page_2_url.spec().c_str());
  87. GURL page_1_url = GetUrlForPageWithTitleAndBody(
  88. base::SysNSStringToUTF8(page_1_title), page_1_html);
  89. ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url)));
  90. EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
  91. base::test::ios::kWaitForJSCompletionTimeout, ^{
  92. return [page_1_title isEqualToString:web_view_.title];
  93. }));
  94. EXPECT_NSEQ(page_1_title, observer.lastValue);
  95. // Navigate to page 2.
  96. EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  97. ASSERT_TRUE(
  98. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2"));
  99. EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
  100. base::test::ios::kWaitForJSCompletionTimeout, ^{
  101. return [page_2_title isEqualToString:web_view_.title];
  102. }));
  103. EXPECT_NSEQ(page_2_title, observer.lastValue);
  104. // Navigate back to page 1.
  105. [web_view_ goBack];
  106. ASSERT_TRUE(
  107. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  108. EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
  109. base::test::ios::kWaitForJSCompletionTimeout, ^{
  110. return [page_1_title isEqualToString:web_view_.title];
  111. }));
  112. EXPECT_NSEQ(page_1_title, observer.lastValue);
  113. }
  114. // Tests that CWVWebView correctly reports |isLoading| value.
  115. TEST_F(WebViewKvoTest, Loading) {
  116. ASSERT_TRUE(test_server_->Start());
  117. Observer* observer = [[Observer alloc] init];
  118. [observer setObservedObject:web_view_ keyPath:@"loading"];
  119. GURL page_2_url = GetUrlForPageWithTitleAndBody("Page 2", "Body 2");
  120. std::string page_1_html = base::StringPrintf(
  121. "<a id='link_1' href='%s'>Link 1</a>", page_2_url.spec().c_str());
  122. GURL page_1_url = GetUrlForPageWithTitleAndBody("Page 1", page_1_html);
  123. ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url)));
  124. EXPECT_TRUE([observer.previousValue boolValue]);
  125. EXPECT_FALSE([observer.lastValue boolValue]);
  126. // Navigate to page 2.
  127. EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  128. ASSERT_TRUE(
  129. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2"));
  130. EXPECT_TRUE([observer.previousValue boolValue]);
  131. EXPECT_FALSE([observer.lastValue boolValue]);
  132. // Navigate back to page 1.
  133. [web_view_ goBack];
  134. ASSERT_TRUE(
  135. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  136. EXPECT_TRUE([observer.previousValue boolValue]);
  137. EXPECT_FALSE([observer.lastValue boolValue]);
  138. }
  139. // Tests that CWVWebView correctly reports |visibleURL| and |lastCommittedURL|.
  140. TEST_F(WebViewKvoTest, URLs) {
  141. ASSERT_TRUE(test_server_->Start());
  142. Observer* last_committed_url_observer = [[Observer alloc] init];
  143. [last_committed_url_observer setObservedObject:web_view_
  144. keyPath:@"lastCommittedURL"];
  145. Observer* visible_url_observer = [[Observer alloc] init];
  146. [visible_url_observer setObservedObject:web_view_ keyPath:@"visibleURL"];
  147. Observer* visible_location_string_observer = [[Observer alloc] init];
  148. [visible_location_string_observer setObservedObject:web_view_
  149. keyPath:@"visibleLocationString"];
  150. GURL page_2 = GetUrlForPageWithTitleAndBody("Page 2", "Body 2");
  151. NSURL* page_2_url = net::NSURLWithGURL(page_2);
  152. NSString* page_2_location_string = base::SysUTF16ToNSString(
  153. url_formatter::FormatUrlForSecurityDisplay(page_2));
  154. std::string page_1_html = base::StringPrintf(
  155. "<a id='link_1' href='%s'>Link 1</a>", page_2.spec().c_str());
  156. GURL page_1 = GetUrlForPageWithTitleAndBody("Page 1", page_1_html);
  157. NSURL* page_1_url = net::NSURLWithGURL(page_1);
  158. NSString* page_1_location_string = base::SysUTF16ToNSString(
  159. url_formatter::FormatUrlForSecurityDisplay(page_1));
  160. [web_view_ loadRequest:[NSURLRequest requestWithURL:page_1_url]];
  161. // |visibleURL| will update immediately
  162. EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
  163. EXPECT_NSEQ(page_1_location_string,
  164. visible_location_string_observer.lastValue);
  165. ASSERT_TRUE(
  166. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  167. EXPECT_NSEQ(page_1_url, last_committed_url_observer.lastValue);
  168. EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
  169. EXPECT_NSEQ(page_1_location_string,
  170. visible_location_string_observer.lastValue);
  171. // Navigate to page 2.
  172. EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1"));
  173. ASSERT_TRUE(
  174. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2"));
  175. EXPECT_NSEQ(page_2_url, last_committed_url_observer.lastValue);
  176. EXPECT_NSEQ(page_2_url, visible_url_observer.lastValue);
  177. EXPECT_NSEQ(page_2_location_string,
  178. visible_location_string_observer.lastValue);
  179. // Navigate back to page 1.
  180. [web_view_ goBack];
  181. ASSERT_TRUE(
  182. test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1"));
  183. EXPECT_NSEQ(page_1_url, last_committed_url_observer.lastValue);
  184. EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
  185. EXPECT_NSEQ(page_1_location_string,
  186. visible_location_string_observer.lastValue);
  187. }
  188. } // namespace ios_web_view