Index: chrome/browser/extensions/api/web_request/web_request_api_unittest.cc |
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc |
index 8414d1f10694420f325eaa650c0cd475b84a65f7..3b672fe27e44a271e43eba1e0be2519b95d61505 100644 |
--- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc |
+++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc |
@@ -77,6 +77,7 @@ using helpers::CharListToString; |
using helpers::EventResponseDelta; |
using helpers::EventResponseDeltas; |
using helpers::EventResponseDeltas; |
+using helpers::ExtraInfoSpec; |
using helpers::InDecreasingExtensionInstallationTimeOrder; |
using helpers::MergeCancelOfResponses; |
using helpers::MergeOnBeforeRequestResponses; |
@@ -231,13 +232,11 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) { |
base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension1_id, extension1_id, events::FOR_TEST, kEventName, |
- kEventName + "/1", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/1", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension2_id, extension2_id, events::FOR_TEST, kEventName, |
- kEventName + "/2", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/2", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
net::URLRequestJobFactoryImpl job_factory; |
@@ -370,13 +369,11 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceCancel) { |
base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension1_id, extension1_id, events::FOR_TEST, kEventName, |
- kEventName + "/1", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/1", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension2_id, extension2_id, events::FOR_TEST, kEventName, |
- kEventName + "/2", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/2", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
GURL request_url("about:blank"); |
@@ -441,8 +438,7 @@ TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) { |
base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension_id, extension_id, events::FOR_TEST, kEventName, |
- kEventName + "/1", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/1", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension_id, extension_id, events::FOR_TEST, kEventName2, |
@@ -500,8 +496,7 @@ bool GenerateInfoSpec(const std::string& values, int* result) { |
base::SplitString(values, ",", base::KEEP_WHITESPACE, |
base::SPLIT_WANT_NONEMPTY)) |
list_value.Append(new base::StringValue(cur)); |
- return ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( |
- list_value, result); |
+ return ExtraInfoSpec::InitFromValue(list_value, result); |
} |
} // namespace |
@@ -703,6 +698,83 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) { |
EXPECT_EQ(i, ipc_sender_.sent_end()); |
} |
+// Tests whether requestBody is only present on the events that requested it. |
+TEST_F(ExtensionWebRequestTest, MinimalAccessRequestBodyData) { |
+ const std::string kEventName(web_request::OnBeforeRequest::kEventName); |
+ ExtensionWebRequestEventRouter::RequestFilter filter; |
+ const std::string extension_id1("1"); |
+ const std::string extension_id2("2"); |
+ int extra_info_spec_body = 0; |
+ int extra_info_spec_empty = 0; |
+ ASSERT_TRUE(GenerateInfoSpec("requestBody", &extra_info_spec_body)); |
+ base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_); |
+ |
+ bool kExpected[] = { |
+ true, |
+ false, |
+ false, |
+ true, |
+ }; |
+ |
+ // Extension 1 with requestBody spec. |
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
+ &profile_, extension_id1, extension_id1, events::FOR_TEST, kEventName, |
+ kEventName + "/1", filter, extra_info_spec_body, 0, 0, |
+ ipc_sender_factory.GetWeakPtr()); |
+ |
+ // Extension 1 without requestBody spec. |
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
+ &profile_, extension_id1, extension_id1, events::FOR_TEST, kEventName, |
+ kEventName + "/2", filter, extra_info_spec_empty, 0, 0, |
+ ipc_sender_factory.GetWeakPtr()); |
+ |
+ // Extension 2, without requestBody spec. |
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
+ &profile_, extension_id2, extension_id2, events::FOR_TEST, kEventName, |
+ kEventName + "/1", filter, extra_info_spec_empty, 0, 0, |
+ ipc_sender_factory.GetWeakPtr()); |
+ |
+ // Extension 2, with requestBody spec. |
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
+ &profile_, extension_id2, extension_id2, events::FOR_TEST, kEventName, |
+ kEventName + "/2", filter, extra_info_spec_body, 0, 0, |
+ ipc_sender_factory.GetWeakPtr()); |
+ |
+ // Only one request is sent, but more than one event will be triggered. |
+ for (size_t i = 1; i < arraysize(kExpected); ++i) |
+ ipc_sender_.PushTask(base::Bind(&base::DoNothing)); |
+ |
+ const std::vector<char> part_of_body(1); |
+ FireURLRequestWithData("POST", nullptr, part_of_body, part_of_body); |
+ |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ |
+ // Clean-up |
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( |
+ &profile_, extension_id1, kEventName + "/1", 0, 0); |
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( |
+ &profile_, extension_id2, kEventName + "/2", 0, 0); |
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( |
+ &profile_, extension_id1, kEventName + "/1", 0, 0); |
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener( |
+ &profile_, extension_id2, kEventName + "/2", 0, 0); |
+ |
+ TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin(); |
+ |
+ for (size_t test = 0; test < arraysize(kExpected); ++test, ++i) { |
+ SCOPED_TRACE(testing::Message("iteration number ") << test); |
+ EXPECT_NE(i, ipc_sender_.sent_end()); |
+ IPC::Message* message = i->get(); |
+ const base::DictionaryValue* details = nullptr; |
+ ExtensionMsg_MessageInvoke::Param param; |
+ GetPartOfMessageArguments(message, &details, ¶m); |
+ ASSERT_TRUE(details != nullptr); |
+ EXPECT_EQ(kExpected[test], details->HasKey(keys::kRequestBodyKey)); |
+ } |
+ |
+ EXPECT_EQ(i, ipc_sender_.sent_end()); |
+} |
+ |
TEST_F(ExtensionWebRequestTest, NoAccessRequestBodyData) { |
// We verify that URLRequest body is NOT accessible to OnBeforeRequest |
// listeners when the type of the request is different from POST or PUT, or |
@@ -836,21 +908,19 @@ TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { |
// higher precedence than extension 1. |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension1_id, extension1_id, events::FOR_TEST, kEventName, |
- kEventName + "/1", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/1", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension2_id, extension2_id, events::FOR_TEST, kEventName, |
- kEventName + "/2", filter, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, 0, 0, |
+ kEventName + "/2", filter, ExtraInfoSpec::BLOCKING, 0, 0, |
ipc_sender_factory.GetWeakPtr()); |
// Install one extension that observes the final headers. |
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
&profile_, extension3_id, extension3_id, events::FOR_TEST, |
keys::kOnSendHeadersEvent, std::string(keys::kOnSendHeadersEvent) + "/3", |
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, 0, |
- 0, ipc_sender_factory.GetWeakPtr()); |
+ filter, ExtraInfoSpec::REQUEST_HEADERS, 0, 0, |
+ ipc_sender_factory.GetWeakPtr()); |
GURL request_url("http://doesnotexist/does_not_exist.html"); |
scoped_ptr<net::URLRequest> request(context_->CreateRequest( |
@@ -1000,30 +1070,29 @@ TEST_F(ExtensionWebRequestTest, InitFromValue) { |
TestInitFromValue( |
"requestHeaders", |
true, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS); |
+ ExtraInfoSpec::REQUEST_HEADERS); |
TestInitFromValue( |
"responseHeaders", |
true, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::RESPONSE_HEADERS); |
+ ExtraInfoSpec::RESPONSE_HEADERS); |
TestInitFromValue( |
"blocking", |
true, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING); |
+ ExtraInfoSpec::BLOCKING); |
TestInitFromValue( |
"asyncBlocking", |
true, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING); |
+ ExtraInfoSpec::ASYNC_BLOCKING); |
TestInitFromValue( |
"requestBody", |
true, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_BODY); |
+ ExtraInfoSpec::REQUEST_BODY); |
// Multiple valid values are bitwise-or'ed. |
TestInitFromValue( |
"requestHeaders,blocking", |
true, |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS | |
- ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING); |
+ ExtraInfoSpec::REQUEST_HEADERS | ExtraInfoSpec::BLOCKING); |
// Any invalid values lead to a bad parse. |
TestInitFromValue("invalidValue", false, 0); |