summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authorrouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-09 23:14:42 +0000
committerrouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-09 23:14:42 +0000
commit97efb659d66738fa9b461ecd33f75a78f99278fe (patch)
tree575cc018d81f711492587a359d2a321829fb1033 /chrome/browser/extensions
parent629b0d75da698bed10ad473c14e33ae24e59d2ff (diff)
downloadchromium_src-97efb659d66738fa9b461ecd33f75a78f99278fe.zip
chromium_src-97efb659d66738fa9b461ecd33f75a78f99278fe.tar.gz
chromium_src-97efb659d66738fa9b461ecd33f75a78f99278fe.tar.bz2
Revert 222090 "<webview>: Cleanup WebRequest event listeners whe..."
Browser test WebViewTest.Shim_TestWebRequestListenerSurvivesReparenting failed on win xp: http://build.chromium.org/p/chromium.win/builders/XP%20Tests%20%283%29/builds/24239 > <webview>: Cleanup WebRequest event listeners when embedder destroyed > > <webivew> WebRequest event listeners should survive reparenting of the <webview> within the same embedder WebContents. Currently, event listeners are lost when the <webview> is removed from the DOM. This CL solves this problem. > > Note that there is still a problem where custom elements break if the original page that created the element is closed. I have written a test that exercises this problem and I've left the test disabled until we fix the problem. > > BUG=281551 > Test=WebViewTest.Shim_TestWebRequestListenerSurvivesReparenting > > Review URL: https://chromiumcodereview.appspot.com/23514016 TBR=fsamuel@chromium.org Review URL: https://codereview.chromium.org/23965004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222123 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r--chrome/browser/extensions/api/web_request/web_request_api.cc12
-rw-r--r--chrome/browser/extensions/api/web_request/web_request_api.h2
-rw-r--r--chrome/browser/extensions/api/web_request/web_request_api_unittest.cc46
-rw-r--r--chrome/browser/extensions/extension_renderer_state.h1
4 files changed, 39 insertions, 22 deletions
diff --git a/chrome/browser/extensions/api/web_request/web_request_api.cc b/chrome/browser/extensions/api/web_request/web_request_api.cc
index fce2f1f..23c2a59 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_api.cc
@@ -397,6 +397,7 @@ struct ExtensionWebRequestEventRouter::EventListener {
RequestFilter filter;
int extra_info_spec;
int embedder_process_id;
+ int embedder_routing_id;
int webview_instance_id;
base::WeakPtr<IPC::Sender> ipc_sender;
mutable std::set<uint64> blocked_requests;
@@ -1172,6 +1173,7 @@ bool ExtensionWebRequestEventRouter::AddEventListener(
const RequestFilter& filter,
int extra_info_spec,
int embedder_process_id,
+ int embedder_routing_id,
int webview_instance_id,
base::WeakPtr<IPC::Sender> ipc_sender) {
@@ -1186,6 +1188,7 @@ bool ExtensionWebRequestEventRouter::AddEventListener(
listener.extra_info_spec = extra_info_spec;
listener.ipc_sender = ipc_sender;
listener.embedder_process_id = embedder_process_id;
+ listener.embedder_routing_id = embedder_routing_id;
listener.webview_instance_id = webview_instance_id;
if (listener.webview_instance_id)
RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener"));
@@ -1238,6 +1241,7 @@ void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners(
void* profile,
const std::string& extension_id,
int embedder_process_id,
+ int embedder_routing_id,
int webview_instance_id) {
// Iterate over all listeners of all WebRequest events to delete
// any listeners that belong to the provided <webview>.
@@ -1249,7 +1253,10 @@ void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners(
for (std::set<EventListener>::iterator listener_iter = listeners.begin();
listener_iter != listeners.end(); ++listener_iter) {
const EventListener& listener = *listener_iter;
+ // TODO(fsamuel): Investigate making <webview> instance IDs unique within
+ // a process.
if (listener.embedder_process_id == embedder_process_id &&
+ listener.embedder_routing_id == embedder_routing_id &&
listener.webview_instance_id == webview_instance_id)
listeners_to_delete.push_back(listener);
}
@@ -1371,6 +1378,7 @@ void ExtensionWebRequestEventRouter::GetMatchingListenersImpl(
if (is_guest &&
(it->embedder_process_id != webview_info.embedder_process_id ||
+ it->embedder_routing_id != webview_info.embedder_routing_id ||
it->webview_instance_id != webview_info.instance_id))
continue;
@@ -2079,6 +2087,7 @@ bool WebRequestAddEventListener::RunImpl() {
int embedder_process_id =
ipc_sender.get() ? ipc_sender->render_process_id() : -1;
+ int embedder_routing_id = routing_id();
const Extension* extension =
extension_info_map()->extensions().GetByID(extension_id());
@@ -2113,7 +2122,8 @@ bool WebRequestAddEventListener::RunImpl() {
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
profile_id(), extension_id(), extension_name,
event_name, sub_event_name, filter, extra_info_spec,
- embedder_process_id, webview_instance_id, ipc_sender_weak());
+ embedder_process_id, embedder_routing_id, webview_instance_id,
+ ipc_sender_weak());
EXTENSION_FUNCTION_VALIDATE(success);
helpers::ClearCacheOnNavigation();
diff --git a/chrome/browser/extensions/api/web_request/web_request_api.h b/chrome/browser/extensions/api/web_request/web_request_api.h
index 15c985b..fba59b0 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api.h
+++ b/chrome/browser/extensions/api/web_request/web_request_api.h
@@ -246,6 +246,7 @@ class ExtensionWebRequestEventRouter
const RequestFilter& filter,
int extra_info_spec,
int embedder_process_id,
+ int embedder_routing_id,
int web_view_instance_id,
base::WeakPtr<IPC::Sender> ipc_sender);
@@ -260,6 +261,7 @@ class ExtensionWebRequestEventRouter
void* profile,
const std::string& extension_id,
int embedder_process_id,
+ int embedder_routing_id,
int web_view_instance_id);
// Called when an incognito profile is created or destroyed.
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 ccf2655..2c8774f 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
@@ -224,12 +224,12 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceRedirect) {
base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension1_id, extension1_id, kEventName, kEventName + "/1",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension2_id, extension2_id, kEventName, kEventName + "/2",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
net::URLRequestJobFactoryImpl job_factory;
job_factory.SetProtocolHandler(
@@ -359,12 +359,12 @@ TEST_F(ExtensionWebRequestTest, BlockingEventPrecedenceCancel) {
base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension1_id, extension1_id, kEventName, kEventName + "/1",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension2_id, extension2_id, kEventName, kEventName + "/2",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
GURL request_url("about:blank");
net::URLRequest request(request_url, &delegate_, context_.get());
@@ -427,11 +427,11 @@ TEST_F(ExtensionWebRequestTest, SimulateChancelWhileBlocked) {
base::WeakPtrFactory<TestIPCSender> ipc_sender_factory(&ipc_sender_);
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension_id, extension_id, kEventName, kEventName + "/1",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension_id, extension_id, kEventName2, kEventName2 + "/1",
- filter, 0, -1, -1, ipc_sender_factory.GetWeakPtr());
+ filter, 0, -1, MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
GURL request_url("about:blank");
net::URLRequest request(request_url, &delegate_, context_.get());
@@ -620,7 +620,8 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
ASSERT_TRUE(GenerateInfoSpec(string_spec_post, &extra_info_spec_body));
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension_id, extension_id, kEventName, kEventName + "/1",
- filter, extra_info_spec_body, -1, -1, ipc_sender_factory.GetWeakPtr());
+ filter, extra_info_spec_body, -1, MSG_ROUTING_NONE, -1,
+ ipc_sender_factory.GetWeakPtr());
FireURLRequestWithData(kMethodPost, kMultipart, form_1, form_2);
@@ -636,7 +637,8 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
GenerateInfoSpec(string_spec_no_post, &extra_info_spec_empty));
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension_id, extension_id, kEventName, kEventName + "/1",
- filter, extra_info_spec_empty, -1, -1, ipc_sender_factory.GetWeakPtr());
+ filter, extra_info_spec_empty, -1, MSG_ROUTING_NONE, -1,
+ ipc_sender_factory.GetWeakPtr());
FireURLRequestWithData(kMethodPost, kMultipart, form_1, form_2);
@@ -646,7 +648,8 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) {
// Subscribe to OnBeforeRequest with requestBody requirement.
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension_id, extension_id, kEventName, kEventName + "/1",
- filter, extra_info_spec_body, -1, -1, ipc_sender_factory.GetWeakPtr());
+ filter, extra_info_spec_body, -1, MSG_ROUTING_NONE, -1,
+ ipc_sender_factory.GetWeakPtr());
// Part 3.
// Now send a POST request with body which is not parseable as a form.
@@ -704,7 +707,8 @@ TEST_F(ExtensionWebRequestTest, NoAccessRequestBodyData) {
// Subscribe to OnBeforeRequest with requestBody requirement.
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension_id, extension_id, kEventName, kEventName + "/1",
- filter, extra_info_spec, -1, -1, ipc_sender_factory.GetWeakPtr());
+ filter, extra_info_spec, -1, MSG_ROUTING_NONE, -1,
+ ipc_sender_factory.GetWeakPtr());
// The request URL can be arbitrary but must have an HTTP or HTTPS scheme.
const GURL request_url("http://www.example.com");
@@ -814,19 +818,19 @@ TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) {
// higher precedence than extension 1.
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension1_id, extension1_id, kEventName, kEventName + "/1",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension2_id, extension2_id, kEventName, kEventName + "/2",
- filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ filter, ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
// Install one extension that observes the final headers.
ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
&profile_, extension3_id, extension3_id, keys::kOnSendHeadersEvent,
std::string(keys::kOnSendHeadersEvent) + "/3", filter,
- ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, -1, -1,
- ipc_sender_factory.GetWeakPtr());
+ ExtensionWebRequestEventRouter::ExtraInfoSpec::REQUEST_HEADERS, -1,
+ MSG_ROUTING_NONE, -1, ipc_sender_factory.GetWeakPtr());
GURL request_url("http://doesnotexist/does_not_exist.html");
net::URLRequest request(request_url, &delegate_, context_.get());
diff --git a/chrome/browser/extensions/extension_renderer_state.h b/chrome/browser/extensions/extension_renderer_state.h
index bf1740a..297f26e 100644
--- a/chrome/browser/extensions/extension_renderer_state.h
+++ b/chrome/browser/extensions/extension_renderer_state.h
@@ -20,6 +20,7 @@ class ExtensionRendererState {
public:
struct WebViewInfo {
int embedder_process_id;
+ int embedder_routing_id;
int instance_id;
};