| Index: ios/web/web_state/ui/web_view_js_utils_unittest.mm
|
| diff --git a/ios/web/web_state/ui/web_view_js_utils_unittest.mm b/ios/web/web_state/ui/web_view_js_utils_unittest.mm
|
| index 84a5657d6b37c40cad28d384770fa7fe451d7ed2..17213b8dbba6099b13dff39207afd206e2512aca 100644
|
| --- a/ios/web/web_state/ui/web_view_js_utils_unittest.mm
|
| +++ b/ios/web/web_state/ui/web_view_js_utils_unittest.mm
|
| @@ -93,6 +93,32 @@ TEST(WebViewJsUtilsTest, ValueResultFromDictionaryWKResult) {
|
| EXPECT_EQ(42, value3);
|
| }
|
|
|
| +// Tests that ValueResultFromWKResult converts NSArray to properly
|
| +// initialized base::ListValue.
|
| +TEST(WebViewJsUtilsTest, ValueResultFromArrayWKResult) {
|
| + NSArray* test_array = @[ @"Value1", @[ @YES ], @42 ];
|
| +
|
| + std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(test_array));
|
| + base::ListValue* list = nullptr;
|
| + value->GetAsList(&list);
|
| + EXPECT_NE(nullptr, list);
|
| +
|
| + size_t list_size = 3;
|
| + EXPECT_EQ(list_size, list->GetSize());
|
| +
|
| + std::string value1;
|
| + list->GetString(0, &value1);
|
| + EXPECT_EQ("Value1", value1);
|
| +
|
| + base::ListValue const* inner_list = nullptr;
|
| + list->GetList(1, &inner_list);
|
| + EXPECT_NE(nullptr, inner_list);
|
| +
|
| + double value3;
|
| + list->GetDouble(2, &value3);
|
| + EXPECT_EQ(42, value3);
|
| +}
|
| +
|
| // Tests that an NSDictionary with a cycle does not cause infinite recursion.
|
| TEST(WebViewJsUtilsTest, ValueResultFromDictionaryWithDepthCheckWKResult) {
|
| // Create a dictionary with a cycle.
|
| @@ -131,4 +157,36 @@ TEST(WebViewJsUtilsTest, ValueResultFromDictionaryWithDepthCheckWKResult) {
|
| EXPECT_EQ(nullptr, current_dictionary);
|
| }
|
|
|
| +// Tests that an NSArray with a cycle does not cause infinite recursion.
|
| +TEST(WebViewJsUtilsTest, ValueResultFromArrayWithDepthCheckWKResult) {
|
| + // Create an array with a cycle.
|
| + NSMutableArray* test_array = [NSMutableArray arrayWithCapacity:1];
|
| + NSMutableArray* test_array_2 = [NSMutableArray arrayWithCapacity:1];
|
| + test_array[0] = test_array_2;
|
| + test_array_2[0] = test_array;
|
| +
|
| + // Break the retain cycle so that the arrays are freed.
|
| + base::ScopedClosureRunner runner(base::BindBlock(^{
|
| + [test_array removeAllObjects];
|
| + }));
|
| +
|
| + // Check that parsing the array stopped at a depth of
|
| + // |kMaximumParsingRecursionDepth|.
|
| + std::unique_ptr<base::Value> value = web::ValueResultFromWKResult(test_array);
|
| + base::ListValue* current_list = nullptr;
|
| + base::ListValue* inner_list = nullptr;
|
| +
|
| + value->GetAsList(¤t_list);
|
| + EXPECT_NE(nullptr, current_list);
|
| +
|
| + for (int current_depth = 0; current_depth <= kMaximumParsingRecursionDepth;
|
| + current_depth++) {
|
| + EXPECT_NE(nullptr, current_list);
|
| + inner_list = nullptr;
|
| + current_list->GetList(0, &inner_list);
|
| + current_list = inner_list;
|
| + }
|
| + EXPECT_EQ(nullptr, current_list);
|
| +}
|
| +
|
| } // namespace web
|
|
|