Index: extensions/renderer/api_request_handler_unittest.cc |
diff --git a/extensions/renderer/api_request_handler_unittest.cc b/extensions/renderer/api_request_handler_unittest.cc |
index 915c19718a03d58fdb74d3bf27db7794029e45ab..a54445301c0a6759474b35d19ce9a9a7e8cee754 100644 |
--- a/extensions/renderer/api_request_handler_unittest.cc |
+++ b/extensions/renderer/api_request_handler_unittest.cc |
@@ -2,12 +2,13 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "extensions/renderer/api_request_handler.h" |
#include "base/bind.h" |
+#include "base/memory/ptr_util.h" |
#include "base/optional.h" |
#include "base/values.h" |
#include "extensions/renderer/api_binding_test.h" |
#include "extensions/renderer/api_binding_test_util.h" |
-#include "extensions/renderer/api_request_handler.h" |
#include "gin/converter.h" |
#include "gin/function_template.h" |
#include "gin/public/context_holder.h" |
@@ -23,9 +24,15 @@ namespace { |
const char kEchoArgs[] = |
"(function() { this.result = Array.from(arguments); })"; |
+const char kMethod[] = "method"; |
+ |
// TODO(devlin): We should probably hoist this up to e.g. api_binding_types.h. |
using ArgumentList = std::vector<v8::Local<v8::Value>>; |
+// TODO(devlin): Should we move some parts of api_binding_unittest.cc to here? |
+void DoNothingWithRequest(std::unique_ptr<APIRequestHandler::Request> request, |
+ v8::Local<v8::Context> context) {} |
+ |
} // namespace |
class APIRequestHandlerTest : public APIBindingTest { |
@@ -58,6 +65,7 @@ TEST_F(APIRequestHandlerTest, AddRequestAndCompleteRequestTest) { |
v8::Local<v8::Context> context = ContextLocal(); |
APIRequestHandler request_handler( |
+ base::Bind(&DoNothingWithRequest), |
base::Bind(&APIRequestHandlerTest::RunJS, base::Unretained(this)), |
APILastError(APILastError::GetParent())); |
@@ -66,8 +74,9 @@ TEST_F(APIRequestHandlerTest, AddRequestAndCompleteRequestTest) { |
v8::Local<v8::Function> function = FunctionFromString(context, kEchoArgs); |
ASSERT_FALSE(function.IsEmpty()); |
- int request_id = request_handler.AddPendingRequest(isolate(), function, |
- context, ArgumentList()); |
+ int request_id = request_handler.StartRequest( |
+ context, kMethod, base::MakeUnique<base::ListValue>(), function, |
+ v8::Local<v8::Function>()); |
EXPECT_THAT(request_handler.GetPendingRequestIdsForTesting(), |
testing::UnorderedElementsAre(request_id)); |
@@ -91,14 +100,16 @@ TEST_F(APIRequestHandlerTest, InvalidRequestsTest) { |
v8::Local<v8::Context> context = ContextLocal(); |
APIRequestHandler request_handler( |
+ base::Bind(&DoNothingWithRequest), |
base::Bind(&APIRequestHandlerTest::RunJS, base::Unretained(this)), |
APILastError(APILastError::GetParent())); |
v8::Local<v8::Function> function = FunctionFromString(context, kEchoArgs); |
ASSERT_FALSE(function.IsEmpty()); |
- int request_id = request_handler.AddPendingRequest(isolate(), function, |
- context, ArgumentList()); |
+ int request_id = request_handler.StartRequest( |
+ context, kMethod, base::MakeUnique<base::ListValue>(), function, |
+ v8::Local<v8::Function>()); |
EXPECT_THAT(request_handler.GetPendingRequestIdsForTesting(), |
testing::UnorderedElementsAre(request_id)); |
@@ -127,6 +138,7 @@ TEST_F(APIRequestHandlerTest, MultipleRequestsAndContexts) { |
holder_b.SetContext(context_b); |
APIRequestHandler request_handler( |
+ base::Bind(&DoNothingWithRequest), |
base::Bind(&APIRequestHandlerTest::RunJS, base::Unretained(this)), |
APILastError(APILastError::GetParent())); |
@@ -138,10 +150,12 @@ TEST_F(APIRequestHandlerTest, MultipleRequestsAndContexts) { |
v8::Local<v8::Function> function_b = FunctionFromString( |
context_b, "(function(res) { this.result = res + 'beta'; })"); |
- int request_a = request_handler.AddPendingRequest(isolate(), function_a, |
- context_a, ArgumentList()); |
- int request_b = request_handler.AddPendingRequest(isolate(), function_b, |
- context_b, ArgumentList()); |
+ int request_a = request_handler.StartRequest( |
+ context_a, kMethod, base::MakeUnique<base::ListValue>(), function_a, |
+ v8::Local<v8::Function>()); |
+ int request_b = request_handler.StartRequest( |
+ context_b, kMethod, base::MakeUnique<base::ListValue>(), function_b, |
+ v8::Local<v8::Function>()); |
EXPECT_THAT(request_handler.GetPendingRequestIdsForTesting(), |
testing::UnorderedElementsAre(request_a, request_b)); |
@@ -176,30 +190,42 @@ TEST_F(APIRequestHandlerTest, CustomCallbackArguments) { |
v8::Local<v8::Context> context = ContextLocal(); |
APIRequestHandler request_handler( |
+ base::Bind(&DoNothingWithRequest), |
base::Bind(&APIRequestHandlerTest::RunJS, base::Unretained(this)), |
APILastError(APILastError::GetParent())); |
- ArgumentList custom_callback_args = { |
- gin::StringToV8(isolate(), "to"), gin::StringToV8(isolate(), "be"), |
- }; |
+ v8::Local<v8::Function> custom_callback = |
+ FunctionFromString(context, kEchoArgs); |
+ v8::Local<v8::Function> callback = |
+ FunctionFromString(context, "(function() {})"); |
+ ASSERT_FALSE(callback.IsEmpty()); |
+ ASSERT_FALSE(custom_callback.IsEmpty()); |
- v8::Local<v8::Function> function = FunctionFromString(context, kEchoArgs); |
- ASSERT_FALSE(function.IsEmpty()); |
- |
- int request_id = request_handler.AddPendingRequest( |
- isolate(), function, context, custom_callback_args); |
+ int request_id = request_handler.StartRequest( |
+ context, "method", base::MakeUnique<base::ListValue>(), callback, |
+ custom_callback); |
EXPECT_THAT(request_handler.GetPendingRequestIdsForTesting(), |
testing::UnorderedElementsAre(request_id)); |
std::unique_ptr<base::ListValue> response_arguments = |
- ListValueFromString("['or','not','to','be']"); |
+ ListValueFromString("['response', 'arguments']"); |
ASSERT_TRUE(response_arguments); |
request_handler.CompleteRequest(request_id, *response_arguments, |
std::string()); |
EXPECT_TRUE(did_run_js()); |
- EXPECT_EQ(ReplaceSingleQuotes("['to','be','or','not','to','be']"), |
- GetStringPropertyFromObject(context->Global(), context, "result")); |
+ v8::Local<v8::Value> result = |
+ GetPropertyFromObject(context->Global(), context, "result"); |
+ ASSERT_FALSE(result.IsEmpty()); |
+ ASSERT_TRUE(result->IsArray()); |
+ ArgumentList args; |
+ ASSERT_TRUE(gin::Converter<ArgumentList>::FromV8(isolate(), result, &args)); |
+ ASSERT_EQ(5u, args.size()); |
+ EXPECT_EQ("\"method\"", V8ToString(args[0], context)); |
+ EXPECT_EQ("{}", V8ToString(args[1], context)); |
+ EXPECT_EQ(callback, args[2]); |
+ EXPECT_EQ("\"response\"", V8ToString(args[3], context)); |
+ EXPECT_EQ("\"arguments\"", V8ToString(args[4], context)); |
EXPECT_TRUE(request_handler.GetPendingRequestIdsForTesting().empty()); |
} |
@@ -210,6 +236,7 @@ TEST_F(APIRequestHandlerTest, UserGestureTest) { |
v8::Local<v8::Context> context = ContextLocal(); |
APIRequestHandler request_handler( |
+ base::Bind(&DoNothingWithRequest), |
base::Bind(&APIRequestHandlerTest::RunJS, base::Unretained(this)), |
APILastError(APILastError::GetParent())); |
@@ -228,8 +255,9 @@ TEST_F(APIRequestHandlerTest, UserGestureTest) { |
function_template->GetFunction(context).ToLocalChecked(); |
// Try first without a user gesture. |
- int request_id = request_handler.AddPendingRequest(isolate(), v8_callback, |
- context, ArgumentList()); |
+ int request_id = request_handler.StartRequest( |
+ context, kMethod, base::MakeUnique<base::ListValue>(), v8_callback, |
+ v8::Local<v8::Function>()); |
request_handler.CompleteRequest(request_id, *ListValueFromString("[]"), |
std::string()); |
@@ -243,8 +271,9 @@ TEST_F(APIRequestHandlerTest, UserGestureTest) { |
blink::WebScopedUserGesture user_gesture(nullptr); |
EXPECT_TRUE( |
blink::WebUserGestureIndicator::isProcessingUserGestureThreadSafe()); |
- request_id = request_handler.AddPendingRequest(isolate(), v8_callback, |
- context, ArgumentList()); |
+ request_id = request_handler.StartRequest( |
+ context, kMethod, base::MakeUnique<base::ListValue>(), v8_callback, |
+ v8::Local<v8::Function>()); |
} |
EXPECT_FALSE( |
blink::WebUserGestureIndicator::isProcessingUserGestureThreadSafe()); |