meta_tag_inttest.mm 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2019 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. #include "base/bind.h"
  5. #include "base/strings/stringprintf.h"
  6. #import "ios/testing/embedded_test_server_handlers.h"
  7. #import "ios/web/public/test/navigation_test_util.h"
  8. #import "ios/web/public/test/web_test_with_web_state.h"
  9. #import "ios/web/public/test/web_view_content_test_util.h"
  10. #include "net/test/embedded_test_server/embedded_test_server.h"
  11. #include "net/test/embedded_test_server/http_request.h"
  12. #include "net/test/embedded_test_server/http_response.h"
  13. #include "net/test/embedded_test_server/request_handler_util.h"
  14. #include "testing/gtest/include/gtest/gtest.h"
  15. #include "url/gurl.h"
  16. #if !defined(__has_feature) || !__has_feature(objc_arc)
  17. #error "This file requires ARC support."
  18. #endif
  19. namespace {
  20. // A simple test page with generic content.
  21. const char kDestinationPage[] = "You've arrived!";
  22. // Template for a test page with META refresh tag. Required template arguments
  23. // are: refresh time in seconds (integer) and destination URL for redirect
  24. // (string).
  25. const char kRefreshMetaPageTemplate[] =
  26. "<!DOCTYPE html>"
  27. "<html>"
  28. " <head><meta HTTP-EQUIV='REFRESH' content='%d;url=%s'></head>"
  29. " <body></body>"
  30. "</html>";
  31. const char kOriginRelativeUrl[] = "/origin";
  32. const char kDestinationRelativeUrl[] = "/destination";
  33. } // namespace
  34. using base::test::ios::kWaitForUIElementTimeout;
  35. namespace web {
  36. // Test fixture for integration tests involving page navigation triggered by
  37. // meta-tag.
  38. class MetaTagTest : public WebTestWithWebState,
  39. public ::testing::WithParamInterface<int> {
  40. protected:
  41. void SetUp() override {
  42. WebTestWithWebState::SetUp();
  43. std::string refresh_meta_page = base::StringPrintf(
  44. kRefreshMetaPageTemplate, GetParam(), kDestinationRelativeUrl);
  45. server_.RegisterRequestHandler(base::BindRepeating(
  46. net::test_server::HandlePrefixedRequest, kOriginRelativeUrl,
  47. base::BindRepeating(::testing::HandlePageWithHtml, refresh_meta_page)));
  48. server_.RegisterDefaultHandler(
  49. base::BindRepeating(::testing::HandlePageWithHtml, kDestinationPage));
  50. ASSERT_TRUE(server_.Start());
  51. }
  52. net::test_server::EmbeddedTestServer server_;
  53. };
  54. // Tests that if a page contains <meta HTTP-EQUIV='REFRESH' content='time;url'>,
  55. // the page will redirect to |url| after |time| seconds.
  56. TEST_P(MetaTagTest, HttpEquivRefresh) {
  57. const GURL origin_url = server_.GetURL(kOriginRelativeUrl);
  58. const GURL destination_url = server_.GetURL(kDestinationRelativeUrl);
  59. test::LoadUrl(web_state(), origin_url);
  60. ASSERT_TRUE(test::WaitForPageToFinishLoading(web_state()));
  61. EXPECT_TRUE(test::WaitForWebViewContainingText(
  62. web_state(), kDestinationPage, GetParam() + kWaitForUIElementTimeout));
  63. }
  64. INSTANTIATE_TEST_SUITE_P(/* No InstantiationName */,
  65. MetaTagTest,
  66. ::testing::Values(1, 3));
  67. } // namespace web