OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/web/web_state/ui/web_view_js_utils.h" | 5 #import "ios/web/web_state/ui/web_view_js_utils.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #import "base/mac/scoped_nsobject.h" | |
9 #include "base/test/ios/wait_util.h" | |
10 #include "base/values.h" | 8 #include "base/values.h" |
11 #include "ios/web/public/test/test_browser_state.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
12 #import "ios/web/public/test/test_web_client.h" | |
13 #import "ios/web/public/web_view_creation_util.h" | |
14 #import "ios/web/web_state/web_view_internal_creation_util.h" | |
15 #include "ios/web/public/test/web_test.h" | |
16 #include "testing/gtest_mac.h" | |
17 #include "testing/platform_test.h" | |
18 | 10 |
19 namespace web { | 11 namespace web { |
20 | 12 |
21 // Test fixture for web::EvaluateJavaScript testing. | |
22 class WebViewJsUtilsTest : public web::WebTest { | |
23 protected: | |
24 void SetUp() override { | |
25 web::WebTest::SetUp(); | |
26 web_view_.reset(web::CreateWKWebView(CGRectZero, GetBrowserState())); | |
27 } | |
28 // Synchronously returns result of web::EvaluateJavaScript call. | |
29 NSString* EvaluateJavaScript(NSString* js) { | |
30 __block bool evaluation_completed = false; | |
31 __block base::scoped_nsobject<NSString> evaluation_result; | |
32 web::EvaluateJavaScript(web_view_, js, ^(NSString* result, NSError* error) { | |
33 DCHECK(!error); | |
34 evaluation_result.reset([result copy]); | |
35 evaluation_completed = true; | |
36 }); | |
37 base::test::ios::WaitUntilCondition(^{ | |
38 return evaluation_completed; | |
39 }); | |
40 return [[evaluation_result copy] autorelease]; | |
41 } | |
42 | |
43 private: | |
44 // WKWebView created for testing. | |
45 base::scoped_nsobject<WKWebView> web_view_; | |
46 }; | |
47 | |
48 // Tests that ValueResultFromWKResult converts nil value to nullptr. | 13 // Tests that ValueResultFromWKResult converts nil value to nullptr. |
49 TEST_F(WebViewJsUtilsTest, ValueResultFromUndefinedWKResult) { | 14 TEST(WebViewJsUtilsTest, ValueResultFromUndefinedWKResult) { |
50 EXPECT_FALSE(ValueResultFromWKResult(nil)); | 15 EXPECT_FALSE(ValueResultFromWKResult(nil)); |
51 } | 16 } |
52 | 17 |
53 // Tests that ValueResultFromWKResult converts string to Value::TYPE_STRING. | 18 // Tests that ValueResultFromWKResult converts string to Value::TYPE_STRING. |
54 TEST_F(WebViewJsUtilsTest, ValueResultFromStringWKResult) { | 19 TEST(WebViewJsUtilsTest, ValueResultFromStringWKResult) { |
55 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@"test")); | 20 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@"test")); |
56 EXPECT_TRUE(value); | 21 EXPECT_TRUE(value); |
57 EXPECT_EQ(base::Value::TYPE_STRING, value->GetType()); | 22 EXPECT_EQ(base::Value::TYPE_STRING, value->GetType()); |
58 std::string converted_result; | 23 std::string converted_result; |
59 value->GetAsString(&converted_result); | 24 value->GetAsString(&converted_result); |
60 EXPECT_EQ("test", converted_result); | 25 EXPECT_EQ("test", converted_result); |
61 } | 26 } |
62 | 27 |
63 // Tests that ValueResultFromWKResult converts inetger to Value::TYPE_DOUBLE. | 28 // Tests that ValueResultFromWKResult converts inetger to Value::TYPE_DOUBLE. |
64 // NOTE: WKWebView API returns all numbers as kCFNumberFloat64Type, so there is | 29 // NOTE: WKWebView API returns all numbers as kCFNumberFloat64Type, so there is |
65 // no way to tell if the result is integer or double. | 30 // no way to tell if the result is integer or double. |
66 TEST_F(WebViewJsUtilsTest, ValueResultFromIntegerWKResult) { | 31 TEST(WebViewJsUtilsTest, ValueResultFromIntegerWKResult) { |
67 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@1)); | 32 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@1)); |
68 EXPECT_TRUE(value); | 33 EXPECT_TRUE(value); |
69 EXPECT_EQ(base::Value::TYPE_DOUBLE, value->GetType()); | 34 EXPECT_EQ(base::Value::TYPE_DOUBLE, value->GetType()); |
70 double converted_result = 0; | 35 double converted_result = 0; |
71 value->GetAsDouble(&converted_result); | 36 value->GetAsDouble(&converted_result); |
72 EXPECT_EQ(1, converted_result); | 37 EXPECT_EQ(1, converted_result); |
73 } | 38 } |
74 | 39 |
75 // Tests that ValueResultFromWKResult converts double to Value::TYPE_DOUBLE. | 40 // Tests that ValueResultFromWKResult converts double to Value::TYPE_DOUBLE. |
76 TEST_F(WebViewJsUtilsTest, ValueResultFromDoubleWKResult) { | 41 TEST(WebViewJsUtilsTest, ValueResultFromDoubleWKResult) { |
77 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@3.14)); | 42 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@3.14)); |
78 EXPECT_TRUE(value); | 43 EXPECT_TRUE(value); |
79 EXPECT_EQ(base::Value::TYPE_DOUBLE, value->GetType()); | 44 EXPECT_EQ(base::Value::TYPE_DOUBLE, value->GetType()); |
80 double converted_result = 0; | 45 double converted_result = 0; |
81 value->GetAsDouble(&converted_result); | 46 value->GetAsDouble(&converted_result); |
82 EXPECT_EQ(3.14, converted_result); | 47 EXPECT_EQ(3.14, converted_result); |
83 } | 48 } |
84 | 49 |
85 // Tests that ValueResultFromWKResult converts bool to Value::TYPE_BOOLEAN. | 50 // Tests that ValueResultFromWKResult converts bool to Value::TYPE_BOOLEAN. |
86 TEST_F(WebViewJsUtilsTest, ValueResultFromBoolWKResult) { | 51 TEST(WebViewJsUtilsTest, ValueResultFromBoolWKResult) { |
87 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@YES)); | 52 std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(@YES)); |
88 EXPECT_TRUE(value); | 53 EXPECT_TRUE(value); |
89 EXPECT_EQ(base::Value::TYPE_BOOLEAN, value->GetType()); | 54 EXPECT_EQ(base::Value::TYPE_BOOLEAN, value->GetType()); |
90 bool converted_result = false; | 55 bool converted_result = false; |
91 value->GetAsBoolean(&converted_result); | 56 value->GetAsBoolean(&converted_result); |
92 EXPECT_TRUE(converted_result); | 57 EXPECT_TRUE(converted_result); |
93 } | 58 } |
94 | 59 |
95 // Tests that ValueResultFromWKResult converts null to Value::TYPE_NULL. | 60 // Tests that ValueResultFromWKResult converts null to Value::TYPE_NULL. |
96 TEST_F(WebViewJsUtilsTest, ValueResultFromNullWKResult) { | 61 TEST(WebViewJsUtilsTest, ValueResultFromNullWKResult) { |
97 std::unique_ptr<base::Value> value( | 62 std::unique_ptr<base::Value> value( |
98 web::ValueResultFromWKResult([NSNull null])); | 63 web::ValueResultFromWKResult([NSNull null])); |
99 EXPECT_TRUE(value); | 64 EXPECT_TRUE(value); |
100 EXPECT_EQ(base::Value::TYPE_NULL, value->GetType()); | 65 EXPECT_EQ(base::Value::TYPE_NULL, value->GetType()); |
101 } | 66 } |
102 | 67 |
103 // Tests that ValueResultFromWKResult converts NSDictionaries to properly | 68 // Tests that ValueResultFromWKResult converts NSDictionaries to properly |
104 // initialized base::DictionaryValue. | 69 // initialized base::DictionaryValue. |
105 TEST_F(WebViewJsUtilsTest, ValueResultFromDictionaryWKResult) { | 70 TEST(WebViewJsUtilsTest, ValueResultFromDictionaryWKResult) { |
106 NSDictionary* testDictionary = | 71 NSDictionary* testDictionary = |
107 @{ @"Key1" : @"Value1", | 72 @{ @"Key1" : @"Value1", |
108 @"Key2" : @{@"Key3" : @42} }; | 73 @"Key2" : @{@"Key3" : @42} }; |
109 | 74 |
110 std::unique_ptr<base::Value> value( | 75 std::unique_ptr<base::Value> value( |
111 web::ValueResultFromWKResult(testDictionary)); | 76 web::ValueResultFromWKResult(testDictionary)); |
112 base::DictionaryValue* dictionary = nullptr; | 77 base::DictionaryValue* dictionary = nullptr; |
113 value->GetAsDictionary(&dictionary); | 78 value->GetAsDictionary(&dictionary); |
114 EXPECT_NE(nullptr, dictionary); | 79 EXPECT_NE(nullptr, dictionary); |
115 | 80 |
116 std::string value1; | 81 std::string value1; |
117 dictionary->GetString("Key1", &value1); | 82 dictionary->GetString("Key1", &value1); |
118 EXPECT_EQ("Value1", value1); | 83 EXPECT_EQ("Value1", value1); |
119 | 84 |
120 base::DictionaryValue const* innerDictionary = nullptr; | 85 base::DictionaryValue const* innerDictionary = nullptr; |
121 dictionary->GetDictionary("Key2", &innerDictionary); | 86 dictionary->GetDictionary("Key2", &innerDictionary); |
122 EXPECT_NE(nullptr, innerDictionary); | 87 EXPECT_NE(nullptr, innerDictionary); |
123 | 88 |
124 double value3; | 89 double value3; |
125 innerDictionary->GetDouble("Key3", &value3); | 90 innerDictionary->GetDouble("Key3", &value3); |
126 EXPECT_EQ(42, value3); | 91 EXPECT_EQ(42, value3); |
127 } | 92 } |
128 | 93 |
129 // Tests that a script with undefined result correctly evaluates to string. | |
130 TEST_F(WebViewJsUtilsTest, UndefinedEvaluation) { | |
131 EXPECT_NSEQ(@"", EvaluateJavaScript(@"{}")); | |
132 } | |
133 | |
134 // Tests that a script with string result correctly evaluates to string. | |
135 TEST_F(WebViewJsUtilsTest, StringEvaluation) { | |
136 EXPECT_NSEQ(@"test", EvaluateJavaScript(@"'test'")); | |
137 } | |
138 | |
139 // Tests that a script with number result correctly evaluates to string. | |
140 TEST_F(WebViewJsUtilsTest, NumberEvaluation) { | |
141 EXPECT_NSEQ(@"-1", EvaluateJavaScript(@"-1")); | |
142 EXPECT_NSEQ(@"0", EvaluateJavaScript(@"0")); | |
143 EXPECT_NSEQ(@"1", EvaluateJavaScript(@"1")); | |
144 EXPECT_NSEQ(@"3.14", EvaluateJavaScript(@"3.14")); | |
145 } | |
146 | |
147 // Tests that a script with bool result correctly evaluates to string. | |
148 TEST_F(WebViewJsUtilsTest, BoolEvaluation) { | |
149 EXPECT_NSEQ(@"true", EvaluateJavaScript(@"true")); | |
150 EXPECT_NSEQ(@"false", EvaluateJavaScript(@"false")); | |
151 } | |
152 | |
153 // Tests that a script with null result correctly evaluates to empty string. | |
154 TEST_F(WebViewJsUtilsTest, NullEvaluation) { | |
155 EXPECT_NSEQ(@"", EvaluateJavaScript(@"null")); | |
156 } | |
157 | |
158 } // namespace web | 94 } // namespace web |
OLD | NEW |