crw_js_window_id_manager_unittest.mm 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright 2014 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 "ios/web/js_messaging/crw_js_window_id_manager.h"
  5. #import <WebKit/WebKit.h>
  6. #import "ios/web/js_messaging/page_script_util.h"
  7. #include "ios/web/public/test/fakes/fake_browser_state.h"
  8. #import "ios/web/public/test/js_test_util.h"
  9. #import "testing/gtest_mac.h"
  10. #import "testing/platform_test.h"
  11. #if !defined(__has_feature) || !__has_feature(objc_arc)
  12. #error "This file requires ARC support."
  13. #endif
  14. namespace web {
  15. // Test fixture for testing CRWJSWindowIDManager class.
  16. class JSWindowIDManagerTest : public PlatformTest {
  17. protected:
  18. // Creates and returns a WKWebView instance configured with the necessary
  19. // shared scripts.
  20. WKWebView* CreateWebView() {
  21. WKWebView* web_view = [[WKWebView alloc] init];
  22. web::test::ExecuteJavaScript(web_view, web::test::GetSharedScripts());
  23. return web_view;
  24. }
  25. FakeBrowserState browser_state_;
  26. };
  27. // Tests that window ID injection by a second manager results in a different
  28. // window ID.
  29. TEST_F(JSWindowIDManagerTest, WindowIDDifferentManager) {
  30. // Inject the first manager.
  31. WKWebView* web_view = CreateWebView();
  32. CRWJSWindowIDManager* manager =
  33. [[CRWJSWindowIDManager alloc] initWithWebView:web_view];
  34. [manager inject];
  35. EXPECT_NSEQ([manager windowID],
  36. test::ExecuteJavaScript(web_view, @"window.__gCrWeb.windowId"));
  37. // Inject the second manager.
  38. WKWebView* web_view2 = CreateWebView();
  39. CRWJSWindowIDManager* manager2 =
  40. [[CRWJSWindowIDManager alloc] initWithWebView:web_view2];
  41. [manager2 inject];
  42. EXPECT_NSEQ([manager2 windowID],
  43. test::ExecuteJavaScript(web_view2, @"window.__gCrWeb.windowId"));
  44. // Window IDs must be different.
  45. EXPECT_NSNE([manager windowID], [manager2 windowID]);
  46. }
  47. // Tests that injecting multiple times creates a new window ID.
  48. TEST_F(JSWindowIDManagerTest, MultipleInjections) {
  49. WKWebView* web_view = CreateWebView();
  50. // First injection.
  51. CRWJSWindowIDManager* manager =
  52. [[CRWJSWindowIDManager alloc] initWithWebView:web_view];
  53. [manager inject];
  54. NSString* windowID = [manager windowID];
  55. EXPECT_NSEQ(windowID,
  56. test::ExecuteJavaScript(web_view, @"window.__gCrWeb.windowId"));
  57. // Second injection.
  58. [manager inject];
  59. EXPECT_NSEQ([manager windowID],
  60. test::ExecuteJavaScript(web_view, @"window.__gCrWeb.windowId"));
  61. EXPECT_NSNE(windowID, [manager windowID]);
  62. }
  63. // Tests that injection will retry if |window.__gCrWeb| is not present.
  64. TEST_F(JSWindowIDManagerTest, InjectionRetry) {
  65. WKWebView* web_view = [[WKWebView alloc] init];
  66. CRWJSWindowIDManager* manager =
  67. [[CRWJSWindowIDManager alloc] initWithWebView:web_view];
  68. [manager inject];
  69. EXPECT_TRUE([manager windowID]);
  70. EXPECT_FALSE(test::ExecuteJavaScript(web_view, @"window.__gCrWeb"));
  71. // Now inject window.__gCrWeb and check if window ID injection retried.
  72. web::test::ExecuteJavaScript(web_view, web::test::GetSharedScripts());
  73. EXPECT_NSEQ([manager windowID],
  74. test::ExecuteJavaScript(web_view, @"window.__gCrWeb.windowId"));
  75. }
  76. } // namespace web