java_script_feature_manager_unittest.mm 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Copyright 2021 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/java_script_feature_manager.h"
  5. #import <WebKit/WebKit.h>
  6. #include "base/ios/ios_util.h"
  7. #import "ios/web/public/js_messaging/java_script_feature.h"
  8. #import "ios/web/public/test/fakes/fake_web_client.h"
  9. #include "ios/web/public/test/web_test.h"
  10. #import "ios/web/web_state/ui/wk_web_view_configuration_provider.h"
  11. #import "testing/gtest_mac.h"
  12. #if !defined(__has_feature) || !__has_feature(objc_arc)
  13. #error "This file requires ARC support."
  14. #endif
  15. // A test fixture for testing JavaScriptFeatureManager.
  16. class JavaScriptFeatureManagerTest : public web::WebTest {
  17. protected:
  18. JavaScriptFeatureManagerTest()
  19. : web::WebTest(std::make_unique<web::FakeWebClient>()) {}
  20. web::JavaScriptFeatureManager* GetJavaScriptFeatureManager() {
  21. web::JavaScriptFeatureManager* java_script_feature_manager =
  22. web::JavaScriptFeatureManager::FromBrowserState(GetBrowserState());
  23. return java_script_feature_manager;
  24. }
  25. WKUserContentController* GetUserContentController() {
  26. return web::WKWebViewConfigurationProvider::FromBrowserState(
  27. GetBrowserState())
  28. .GetWebViewConfiguration()
  29. .userContentController;
  30. }
  31. void SetUp() override {
  32. web::WebTest::SetUp();
  33. [GetUserContentController() removeAllUserScripts];
  34. }
  35. };
  36. // Tests that JavaScriptFeatureManager adds base shared user scripts.
  37. TEST_F(JavaScriptFeatureManagerTest, Configure) {
  38. ASSERT_TRUE(GetJavaScriptFeatureManager());
  39. ASSERT_EQ(0ul, [GetUserContentController().userScripts count]);
  40. GetJavaScriptFeatureManager()->ConfigureFeatures({});
  41. EXPECT_EQ(6ul, [GetUserContentController().userScripts count]);
  42. }
  43. // Tests that JavaScriptFeatureManager adds a JavaScriptFeature for all frames
  44. // at document start time for the page content world.
  45. TEST_F(JavaScriptFeatureManagerTest, AllFramesStartFeature) {
  46. ASSERT_TRUE(GetJavaScriptFeatureManager());
  47. std::vector<const web::JavaScriptFeature::FeatureScript> feature_scripts = {
  48. web::JavaScriptFeature::FeatureScript::CreateWithFilename(
  49. "java_script_feature_test_inject_once",
  50. web::JavaScriptFeature::FeatureScript::InjectionTime::kDocumentStart,
  51. web::JavaScriptFeature::FeatureScript::TargetFrames::kAllFrames)};
  52. std::unique_ptr<web::JavaScriptFeature> feature =
  53. std::make_unique<web::JavaScriptFeature>(
  54. web::JavaScriptFeature::ContentWorld::kPageContentWorld,
  55. feature_scripts);
  56. GetJavaScriptFeatureManager()->ConfigureFeatures({feature.get()});
  57. EXPECT_EQ(7ul, [GetUserContentController().userScripts count]);
  58. WKUserScript* user_script =
  59. [GetUserContentController().userScripts lastObject];
  60. EXPECT_TRUE(
  61. [user_script.source containsString:@"__gCrWeb.javaScriptFeatureTest"]);
  62. EXPECT_EQ(WKUserScriptInjectionTimeAtDocumentStart,
  63. user_script.injectionTime);
  64. EXPECT_EQ(NO, user_script.forMainFrameOnly);
  65. }
  66. // Tests that JavaScriptFeatureManager adds a JavaScriptFeature for all frames
  67. // at document end time for any content world.
  68. TEST_F(JavaScriptFeatureManagerTest, MainFrameEndFeature) {
  69. ASSERT_TRUE(GetJavaScriptFeatureManager());
  70. std::vector<const web::JavaScriptFeature::FeatureScript> feature_scripts = {
  71. web::JavaScriptFeature::FeatureScript::CreateWithFilename(
  72. "java_script_feature_test_inject_once",
  73. web::JavaScriptFeature::FeatureScript::InjectionTime::kDocumentEnd,
  74. web::JavaScriptFeature::FeatureScript::TargetFrames::kMainFrame)};
  75. std::unique_ptr<web::JavaScriptFeature> feature =
  76. std::make_unique<web::JavaScriptFeature>(
  77. web::JavaScriptFeature::ContentWorld::kAnyContentWorld,
  78. feature_scripts);
  79. GetJavaScriptFeatureManager()->ConfigureFeatures({feature.get()});
  80. EXPECT_EQ(7ul, [GetUserContentController().userScripts count]);
  81. WKUserScript* user_script =
  82. [GetUserContentController().userScripts lastObject];
  83. EXPECT_TRUE(
  84. [user_script.source containsString:@"__gCrWeb.javaScriptFeatureTest"]);
  85. EXPECT_EQ(WKUserScriptInjectionTimeAtDocumentEnd, user_script.injectionTime);
  86. EXPECT_EQ(YES, user_script.forMainFrameOnly);
  87. }
  88. // Tests that JavaScriptFeatureManager adds a JavaScriptFeature for all frames
  89. // at document end time for an isolated world.
  90. TEST_F(JavaScriptFeatureManagerTest, MainFrameEndFeatureIsolatedWorld) {
  91. ASSERT_TRUE(GetJavaScriptFeatureManager());
  92. std::vector<const web::JavaScriptFeature::FeatureScript> feature_scripts = {
  93. web::JavaScriptFeature::FeatureScript::CreateWithFilename(
  94. "java_script_feature_test_inject_once",
  95. web::JavaScriptFeature::FeatureScript::InjectionTime::kDocumentEnd,
  96. web::JavaScriptFeature::FeatureScript::TargetFrames::kMainFrame)};
  97. std::unique_ptr<web::JavaScriptFeature> feature =
  98. std::make_unique<web::JavaScriptFeature>(
  99. web::JavaScriptFeature::ContentWorld::kIsolatedWorldOnly,
  100. feature_scripts);
  101. GetJavaScriptFeatureManager()->ConfigureFeatures({feature.get()});
  102. EXPECT_EQ(7ul, [GetUserContentController().userScripts count]);
  103. WKUserScript* user_script =
  104. [GetUserContentController().userScripts lastObject];
  105. EXPECT_TRUE(
  106. [user_script.source containsString:@"__gCrWeb.javaScriptFeatureTest"]);
  107. EXPECT_EQ(WKUserScriptInjectionTimeAtDocumentEnd, user_script.injectionTime);
  108. EXPECT_EQ(YES, user_script.forMainFrameOnly);
  109. }