| 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 |