Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2095)

Unified Diff: chrome/browser/extensions/api/web_request/web_request_api_unittest.cc

Issue 2303113002: Fix semantics of ExtensionWebRequestEventRouter::EventListeners. (Closed)
Patch Set: Comments from rdevlin. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e1f88e190c9d712b647bcf0e5a0bef62ac7035a8..9bf4c38a7c456589701729bdb2ab6da263b65495 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
@@ -91,6 +91,7 @@ using helpers::StringToCharList;
namespace extensions {
namespace {
+
static void EventHandledOnIOThread(
void* profile,
const std::string& extension_id,
@@ -355,10 +356,12 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) {
EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
}
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&profile_, extension1_id, kEventName + "/1", 0, 0);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id2(
&profile_, extension2_id, kEventName + "/2", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id2);
}
// Test that a request is canceled if this is requested by any extension
@@ -419,10 +422,12 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceCancel) {
EXPECT_EQ(1U, request->url_chain().size());
EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&profile_, extension1_id, kEventName + "/1", 0, 0);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id2(
&profile_, extension2_id, kEventName + "/2", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id2);
}
TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) {
@@ -483,10 +488,12 @@ TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) {
EXPECT_EQ(1U, request->url_chain().size());
EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&profile_, extension_id, kEventName + "/1", 0, 0);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id2(
&profile_, extension_id, kEventName2 + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id2);
}
namespace {
@@ -643,8 +650,9 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
// We inspect the result in the message list of |ipc_sender_| later.
base::RunLoop().RunUntilIdle();
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&profile_, extension_id, kEventName + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
// Part 2.
// Now subscribe to OnBeforeRequest *without* the requestBody requirement.
@@ -657,8 +665,7 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
FireURLRequestWithData(kMethodPost, kMultipart, form_1, form_2);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
- &profile_, extension_id, kEventName + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
// Subscribe to OnBeforeRequest with requestBody requirement.
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
@@ -677,8 +684,7 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
base::RunLoop().RunUntilIdle();
// Clean-up.
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
- &profile_, extension_id, kEventName + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
IPC::Message* message = NULL;
TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin();
@@ -754,14 +760,18 @@ TEST_F(ExtensionWebRequestTest, MinimalAccessRequestBodyData) {
base::RunLoop().RunUntilIdle();
// Clean-up
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&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(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id2(
+ &profile_, extension_id1, kEventName + "/2", 0, 0);
+ ExtensionWebRequestEventRouter::EventListener::Identifier id3(
+ &profile_, extension_id2, kEventName + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::EventListener::Identifier id4(
&profile_, extension_id2, kEventName + "/2", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id2);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id3);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id4);
TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin();
@@ -816,8 +826,9 @@ TEST_F(ExtensionWebRequestTest, NoAccessRequestBodyData) {
// We inspect the result in the message list of |ipc_sender_| later.
base::RunLoop().RunUntilIdle();
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&profile_, extension_id, kEventName + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
TestIPCSender::SentMessages::const_iterator i = ipc_sender_.sent_begin();
for (size_t test = 0; test < arraysize(kMethods); ++test, ++i) {
@@ -834,6 +845,110 @@ TEST_F(ExtensionWebRequestTest, NoAccessRequestBodyData) {
EXPECT_EQ(i, ipc_sender_.sent_end());
}
+// Tests that |embedder_process_id| is not relevant for adding and removing
+// listeners with |web_view_instance_id| = 0.
+TEST_F(ExtensionWebRequestTest, AddAndRemoveListeners) {
+ std::string ext_id("abcdefghijklmnopabcdefghijklmnop");
+ ExtensionWebRequestEventRouter::RequestFilter filter;
+ const std::string kEventName(web_request::OnBeforeRequest::kEventName);
+ const std::string kSubEventName = kEventName + "/1";
+ base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
+ EXPECT_EQ(
+ 0u,
+ ExtensionWebRequestEventRouter::GetInstance()->GetListenerCountForTesting(
+ &profile_, kEventName));
+
+ // Add two non-webview listeners.
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
+ &profile_, ext_id, ext_id, events::FOR_TEST, kEventName, kSubEventName,
+ filter, 0, 1 /* embedder_process_id */, 0,
+ ipc_sender_factory.GetWeakPtr());
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
+ &profile_, ext_id, ext_id, events::FOR_TEST, kEventName, kSubEventName,
+ filter, 0, 2 /* embedder_process_id */, 0,
+ ipc_sender_factory.GetWeakPtr());
+ EXPECT_EQ(
+ 2u,
+ ExtensionWebRequestEventRouter::GetInstance()->GetListenerCountForTesting(
+ &profile_, kEventName));
+
+ // Now remove the events without passing an explicit process ID.
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
+ &profile_, ext_id, kSubEventName, 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ EXPECT_EQ(
+ 1u,
+ ExtensionWebRequestEventRouter::GetInstance()->GetListenerCountForTesting(
+ &profile_, kEventName));
+
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ EXPECT_EQ(
+ 0u,
+ ExtensionWebRequestEventRouter::GetInstance()->GetListenerCountForTesting(
+ &profile_, kEventName));
+}
+
+// The set of blocked requests should not grow unbounded.
+TEST_F(ExtensionWebRequestTest, BlockedRequestsAreRemoved) {
+ std::string extension_id("1");
+ ExtensionWebRequestEventRouter::RequestFilter filter;
+
+ // Subscribe to OnBeforeRequest.
+ const std::string kEventName(web_request::OnBeforeRequest::kEventName);
+ base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
+ ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
+ &profile_, extension_id, extension_id, events::FOR_TEST, kEventName,
+ kEventName + "/1", filter, ExtraInfoSpec::BLOCKING, 0, 0,
+ ipc_sender_factory.GetWeakPtr());
+ ExtensionWebRequestEventRouter::EventListener::Identifier id(
+ &profile_, extension_id, kEventName + "/1", 0, 0);
+ ExtensionWebRequestEventRouter::EventListener* listener =
+ ExtensionWebRequestEventRouter::GetInstance()->FindEventListener(id);
+ ASSERT_NE(nullptr, listener);
+ EXPECT_EQ(0u, listener->blocked_requests.size());
+
+ // Send a request. It should block. Wait for the run loop to become idle.
+ GURL request_url("about:blank");
+ std::unique_ptr<net::URLRequest> request(
+ context_->CreateRequest(request_url, net::DEFAULT_PRIORITY, &delegate_));
+ // Extension response for OnErrorOccurred: Terminate the message loop.
+ {
+ base::RunLoop run_loop;
+ ipc_sender_.PushTask(
+ base::Bind(base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
+ base::ThreadTaskRunnerHandle::Get(), FROM_HERE,
+ run_loop.QuitWhenIdleClosure()));
+ request->Start();
+ run_loop.Run();
+ }
+
+ // Confirm that there is a blocked request.
+ EXPECT_EQ(1u, listener->blocked_requests.size());
+
+ // Send a response through.
+ ExtensionWebRequestEventRouter::EventResponse* response =
+ new ExtensionWebRequestEventRouter::EventResponse(
+ extension_id, base::Time::FromDoubleT(1));
+ response->cancel = true;
+ ExtensionWebRequestEventRouter::GetInstance()->OnEventHandled(
+ &profile_, extension_id, kEventName, kEventName + "/1",
+ request->identifier(), response);
+ {
+ base::RunLoop run_loop;
+ run_loop.RunUntilIdle();
+ }
+
+ // Now there should be no blocked requests.
+ EXPECT_EQ(0u, listener->blocked_requests.size());
+
+ EXPECT_TRUE(!request->is_pending());
+ EXPECT_EQ(net::URLRequestStatus::FAILED, request->status().status());
+ EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, request->status().error());
+ EXPECT_EQ(0U, ipc_sender_.GetNumTasks());
+
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id);
+}
+
struct HeaderModificationTest_Header {
const char* name;
const char* value;
@@ -1046,13 +1161,16 @@ TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) {
++num_headers_observed;
}
EXPECT_EQ(1, num_headers_observed);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id1(
&profile_, extension1_id, kEventName + "/1", 0, 0);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
+ ExtensionWebRequestEventRouter::EventListener::Identifier id2(
&profile_, extension2_id, kEventName + "/2", 0, 0);
- ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(
- &profile_, extension3_id,
- std::string(keys::kOnSendHeadersEvent) + "/3", 0, 0);
+ ExtensionWebRequestEventRouter::EventListener::Identifier id3(
+ &profile_, extension3_id, std::string(keys::kOnSendHeadersEvent) + "/3",
+ 0, 0);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id1);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id2);
+ ExtensionWebRequestEventRouter::GetInstance()->RemoveEventListener(id3);
};
namespace {

Powered by Google App Engine
This is Rietveld 408576698