diff options
author | rouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-09 23:14:42 +0000 |
---|---|---|
committer | rouslan@chromium.org <rouslan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-09 23:14:42 +0000 |
commit | 97efb659d66738fa9b461ecd33f75a78f99278fe (patch) | |
tree | 575cc018d81f711492587a359d2a321829fb1033 /chrome/browser/extensions | |
parent | 629b0d75da698bed10ad473c14e33ae24e59d2ff (diff) | |
download | chromium_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')
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; }; |