diff options
author | jdduke@chromium.org <jdduke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-16 22:11:26 +0000 |
---|---|---|
committer | jdduke@chromium.org <jdduke@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-16 22:11:26 +0000 |
commit | 2955e4e3c747fd4aa3c227d6c4e4c698cf31b3c4 (patch) | |
tree | 4653406477771c82a78bb65092cbc252a789b2f6 | |
parent | baf64d069a6bbc6e87f3ce9eaf7ed5bb775f0965 (diff) | |
download | chromium_src-2955e4e3c747fd4aa3c227d6c4e4c698cf31b3c4.zip chromium_src-2955e4e3c747fd4aa3c227d6c4e4c698cf31b3c4.tar.gz chromium_src-2955e4e3c747fd4aa3c227d6c4e4c698cf31b3c4.tar.bz2 |
Allow MessageFilters to restrict listening to specific message classes
ChannelProxy currently offers messages to all member MessageFilters. It turns
out that a good portion of the most common message types will never be filtered,
making the O(N) filter walk an unnecessary affair. To prevent this, allow
MessageFilters to indicate which (if any) subset of message classes they may
filter, allowing the ChannelProxy to refine the list of filters that are offered
a particular message. This saves ~35us per message received on the browser IO
thread for a typical Android device.
BUG=340881
TBR=asargent@chromium.org
Review URL: https://codereview.chromium.org/142923005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@251622 0039d316-1c4b-4281-b951-d872f2087c98
75 files changed, 618 insertions, 85 deletions
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index 0a5ed1e..dcca91d 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc @@ -68,7 +68,8 @@ private: }; AwContentsMessageFilter::AwContentsMessageFilter(int process_id) - : process_id_(process_id) { + : BrowserMessageFilter(AndroidWebViewMsgStart), + process_id_(process_id) { } AwContentsMessageFilter::~AwContentsMessageFilter() { diff --git a/build/android/pylib/gtest/filter/ipc_tests_disabled b/build/android/pylib/gtest/filter/ipc_tests_disabled index fcd5e73..e8d0691 100644 --- a/build/android/pylib/gtest/filter/ipc_tests_disabled +++ b/build/android/pylib/gtest/filter/ipc_tests_disabled @@ -9,6 +9,9 @@ IPCFuzzingTest.SanityTest IPCFuzzingTest.MsgBadPayloadArgs IPCFuzzingTest.MsgBadPayloadShort IPCSendFdsTest.DescriptorTest +IPCChannelProxyTest.MessageClassFilters +IPCChannelProxyTest.GlobalAndMessageClassFilters +IPCChannelProxyTest.FilterRemoval IPCChannelTest.ChannelTest IPCChannelTest.ChannelProxyTest IPCChannelTest.SendMessageInChannelConnected diff --git a/chrome/browser/chrome_net_benchmarking_message_filter.cc b/chrome/browser/chrome_net_benchmarking_message_filter.cc index a287a04..5e18e5b 100644 --- a/chrome/browser/chrome_net_benchmarking_message_filter.cc +++ b/chrome/browser/chrome_net_benchmarking_message_filter.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/command_line.h" +#include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/net/chrome_url_request_context.h" #include "chrome/browser/net/predictor.h" @@ -35,7 +36,8 @@ void ClearCacheCallback(ChromeNetBenchmarkingMessageFilter* filter, ChromeNetBenchmarkingMessageFilter::ChromeNetBenchmarkingMessageFilter( Profile* profile, net::URLRequestContextGetter* request_context) - : profile_(profile), + : BrowserMessageFilter(ChromeBenchmarkingMsgStart), + profile_(profile), request_context_(request_context) { } diff --git a/chrome/browser/media/cast_transport_host_filter.cc b/chrome/browser/media/cast_transport_host_filter.cc index fe5ccac..dda0c50 100644 --- a/chrome/browser/media/cast_transport_host_filter.cc +++ b/chrome/browser/media/cast_transport_host_filter.cc @@ -7,7 +7,8 @@ namespace cast { -CastTransportHostFilter::CastTransportHostFilter() { +CastTransportHostFilter::CastTransportHostFilter() + : BrowserMessageFilter(CastMsgStart) { } CastTransportHostFilter::~CastTransportHostFilter() { diff --git a/chrome/browser/media/encrypted_media_message_filter_android.cc b/chrome/browser/media/encrypted_media_message_filter_android.cc index 968f9b9..73d147a 100644 --- a/chrome/browser/media/encrypted_media_message_filter_android.cc +++ b/chrome/browser/media/encrypted_media_message_filter_android.cc @@ -45,7 +45,8 @@ static android::SupportedCodecs GetSupportedCodecs( return supported_codecs; } -EncryptedMediaMessageFilterAndroid::EncryptedMediaMessageFilterAndroid() {} +EncryptedMediaMessageFilterAndroid::EncryptedMediaMessageFilterAndroid() + : BrowserMessageFilter(EncryptedMediaMsgStart) {} EncryptedMediaMessageFilterAndroid::~EncryptedMediaMessageFilterAndroid() {} diff --git a/chrome/browser/media/webrtc_logging_handler_host.cc b/chrome/browser/media/webrtc_logging_handler_host.cc index d015224..5edc9a6 100644 --- a/chrome/browser/media/webrtc_logging_handler_host.cc +++ b/chrome/browser/media/webrtc_logging_handler_host.cc @@ -109,7 +109,8 @@ void FormatMetaDataAsLogMessage( } // namespace WebRtcLoggingHandlerHost::WebRtcLoggingHandlerHost(Profile* profile) - : profile_(profile), + : BrowserMessageFilter(WebRtcLoggingMsgStart), + profile_(profile), logging_state_(CLOSED), upload_log_on_render_close_(false) { DCHECK(profile_); diff --git a/chrome/browser/plugins/plugin_info_message_filter.cc b/chrome/browser/plugins/plugin_info_message_filter.cc index 2995751..85b0995 100644 --- a/chrome/browser/plugins/plugin_info_message_filter.cc +++ b/chrome/browser/plugins/plugin_info_message_filter.cc @@ -91,7 +91,8 @@ PluginInfoMessageFilter::Context::~Context() { PluginInfoMessageFilter::PluginInfoMessageFilter( int render_process_id, Profile* profile) - : context_(render_process_id, profile), + : BrowserMessageFilter(ChromeMsgStart), + context_(render_process_id, profile), weak_ptr_factory_(this) { } diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index d57defc..d0418e9 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -195,7 +195,8 @@ class ChannelDestructionWatcher { class DestructionMessageFilter : public content::BrowserMessageFilter { public: explicit DestructionMessageFilter(ChannelDestructionWatcher* watcher) - : watcher_(watcher) { + : BrowserMessageFilter(0), + watcher_(watcher) { } private: diff --git a/chrome/browser/prerender/prerender_message_filter.cc b/chrome/browser/prerender/prerender_message_filter.cc index 4f203bd..808c23e 100644 --- a/chrome/browser/prerender/prerender_message_filter.cc +++ b/chrome/browser/prerender/prerender_message_filter.cc @@ -33,7 +33,8 @@ namespace prerender { PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id, Profile* profile) - : render_process_id_(render_process_id), + : BrowserMessageFilter(PrerenderMsgStart), + render_process_id_(render_process_id), profile_(profile) { } diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc index 0ddeb48..6911cd3 100644 --- a/chrome/browser/printing/printing_message_filter.cc +++ b/chrome/browser/printing/printing_message_filter.cc @@ -90,7 +90,8 @@ void RenderParamsFromPrintSettings(const printing::PrintSettings& settings, PrintingMessageFilter::PrintingMessageFilter(int render_process_id, Profile* profile) - : profile_io_data_(ProfileIOData::FromResourceContext( + : BrowserMessageFilter(PrintMsgStart), + profile_io_data_(ProfileIOData::FromResourceContext( profile->GetResourceContext())), render_process_id_(render_process_id), queue_(g_browser_process->print_job_manager()->queue()) { diff --git a/chrome/browser/renderer_host/chrome_render_message_filter.cc b/chrome/browser/renderer_host/chrome_render_message_filter.cc index e29587d..b6a8cb0 100644 --- a/chrome/browser/renderer_host/chrome_render_message_filter.cc +++ b/chrome/browser/renderer_host/chrome_render_message_filter.cc @@ -43,6 +43,11 @@ using blink::WebCache; namespace { +const uint32 kFilteredMessageClasses[] = { + ChromeMsgStart, + ExtensionMsgStart, +}; + // Logs an action to the extension activity log for the specified profile. Can // be called from any thread. void AddActionToExtensionActivityLog( @@ -76,7 +81,9 @@ ChromeRenderMessageFilter::ChromeRenderMessageFilter( int render_process_id, Profile* profile, net::URLRequestContextGetter* request_context) - : render_process_id_(render_process_id), + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + render_process_id_(render_process_id), profile_(profile), off_the_record_(profile_->IsOffTheRecord()), predictor_(profile_->GetNetworkPredictor()), diff --git a/chrome/browser/search_engines/search_provider_install_state_message_filter.cc b/chrome/browser/search_engines/search_provider_install_state_message_filter.cc index 71c152b..c4ca4a0 100644 --- a/chrome/browser/search_engines/search_provider_install_state_message_filter.cc +++ b/chrome/browser/search_engines/search_provider_install_state_message_filter.cc @@ -20,7 +20,8 @@ SearchProviderInstallStateMessageFilter:: SearchProviderInstallStateMessageFilter( int render_process_id, Profile* profile) - : provider_data_(profile, + : BrowserMessageFilter(ChromeMsgStart), + provider_data_(profile, content::RenderProcessHost::FromID(render_process_id)), is_off_the_record_(profile->IsOffTheRecord()), weak_factory_(this) { diff --git a/chrome/browser/signin/principals_message_filter.cc b/chrome/browser/signin/principals_message_filter.cc index a2f76f2..d047d80 100644 --- a/chrome/browser/signin/principals_message_filter.cc +++ b/chrome/browser/signin/principals_message_filter.cc @@ -8,7 +8,8 @@ #include "content/public/browser/browser_thread.h" PrincipalsMessageFilter::PrincipalsMessageFilter(int render_process_id) - : render_process_id_(render_process_id) {} + : BrowserMessageFilter(ChromeMsgStart), + render_process_id_(render_process_id) {} PrincipalsMessageFilter::~PrincipalsMessageFilter(){} diff --git a/chrome/browser/speech/tts_message_filter.cc b/chrome/browser/speech/tts_message_filter.cc index 9ef511f..6488b36 100644 --- a/chrome/browser/speech/tts_message_filter.cc +++ b/chrome/browser/speech/tts_message_filter.cc @@ -15,7 +15,8 @@ using content::BrowserThread; TtsMessageFilter::TtsMessageFilter(int render_process_id, Profile* profile) - : render_process_id_(render_process_id), + : BrowserMessageFilter(TtsMsgStart), + render_process_id_(render_process_id), profile_(profile) { CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); TtsController::GetInstance()->AddVoicesChangedDelegate(this); diff --git a/chrome/browser/spellchecker/spellcheck_message_filter.cc b/chrome/browser/spellchecker/spellcheck_message_filter.cc index 091c342..e9265dd 100644 --- a/chrome/browser/spellchecker/spellcheck_message_filter.cc +++ b/chrome/browser/spellchecker/spellcheck_message_filter.cc @@ -23,7 +23,8 @@ using content::BrowserThread; SpellCheckMessageFilter::SpellCheckMessageFilter(int render_process_id) - : render_process_id_(render_process_id), + : BrowserMessageFilter(SpellCheckMsgStart), + render_process_id_(render_process_id), client_(new SpellingServiceClient) { } diff --git a/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc b/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc index be319c7..4766ac7 100644 --- a/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc +++ b/chrome/browser/spellchecker/spellcheck_message_filter_mac.cc @@ -187,7 +187,8 @@ void SpellingRequest::OnLocalCheckCompleted( SpellCheckMessageFilterMac::SpellCheckMessageFilterMac(int render_process_id) - : render_process_id_(render_process_id), + : BrowserMessageFilter(SpellCheckMsgStart), + render_process_id_(render_process_id), client_(new SpellingServiceClient) { } diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc index 6e29f51..c26db55 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc @@ -82,7 +82,8 @@ class MockScorer : public Scorer { class InterceptingMessageFilter : public content::BrowserMessageFilter { public: InterceptingMessageFilter() - : waiting_message_loop_(NULL) { + : BrowserMessageFilter(SafeBrowsingMsgStart), + waiting_message_loop_(NULL) { } const ClientPhishingRequest* verdict() const { return verdict_.get(); } diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_message_filter.cc index cef4fdc..e73e954 100644 --- a/components/nacl/browser/nacl_host_message_filter.cc +++ b/components/nacl/browser/nacl_host_message_filter.cc @@ -22,7 +22,8 @@ NaClHostMessageFilter::NaClHostMessageFilter( bool is_off_the_record, const base::FilePath& profile_directory, net::URLRequestContextGetter* request_context) - : render_process_id_(render_process_id), + : BrowserMessageFilter(NaClHostMsgStart), + render_process_id_(render_process_id), off_the_record_(is_off_the_record), profile_directory_(profile_directory), request_context_(request_context), diff --git a/content/browser/appcache/appcache_dispatcher_host.cc b/content/browser/appcache/appcache_dispatcher_host.cc index 2ce0d83..827a1ee 100644 --- a/content/browser/appcache/appcache_dispatcher_host.cc +++ b/content/browser/appcache/appcache_dispatcher_host.cc @@ -15,7 +15,8 @@ namespace content { AppCacheDispatcherHost::AppCacheDispatcherHost( ChromeAppCacheService* appcache_service, int process_id) - : appcache_service_(appcache_service), + : BrowserMessageFilter(AppCacheMsgStart), + appcache_service_(appcache_service), frontend_proxy_(this), process_id_(process_id) { } diff --git a/content/browser/browser_plugin/browser_plugin_message_filter.cc b/content/browser/browser_plugin/browser_plugin_message_filter.cc index 031797a..b5ada72 100644 --- a/content/browser/browser_plugin/browser_plugin_message_filter.cc +++ b/content/browser/browser_plugin/browser_plugin_message_filter.cc @@ -19,7 +19,8 @@ namespace content { BrowserPluginMessageFilter::BrowserPluginMessageFilter(int render_process_id, bool is_guest) - : render_process_id_(render_process_id), + : BrowserMessageFilter(BrowserPluginMsgStart), + render_process_id_(render_process_id), is_guest_(is_guest) { } diff --git a/content/browser/device_orientation/device_motion_message_filter.cc b/content/browser/device_orientation/device_motion_message_filter.cc index bc33cac..99b0bdb 100644 --- a/content/browser/device_orientation/device_motion_message_filter.cc +++ b/content/browser/device_orientation/device_motion_message_filter.cc @@ -10,7 +10,8 @@ namespace content { DeviceMotionMessageFilter::DeviceMotionMessageFilter() - : is_started_(false) { + : BrowserMessageFilter(DeviceMotionMsgStart), + is_started_(false) { } DeviceMotionMessageFilter::~DeviceMotionMessageFilter() { diff --git a/content/browser/device_orientation/device_orientation_message_filter.cc b/content/browser/device_orientation/device_orientation_message_filter.cc index d00f2b8..dbbb0ce 100644 --- a/content/browser/device_orientation/device_orientation_message_filter.cc +++ b/content/browser/device_orientation/device_orientation_message_filter.cc @@ -10,7 +10,8 @@ namespace content { DeviceOrientationMessageFilter::DeviceOrientationMessageFilter() - : is_started_(false) { + : BrowserMessageFilter(DeviceOrientationMsgStart), + is_started_(false) { } DeviceOrientationMessageFilter::~DeviceOrientationMessageFilter() { diff --git a/content/browser/devtools/worker_devtools_message_filter.cc b/content/browser/devtools/worker_devtools_message_filter.cc index 3f5553f1..2c72dfd 100644 --- a/content/browser/devtools/worker_devtools_message_filter.cc +++ b/content/browser/devtools/worker_devtools_message_filter.cc @@ -12,7 +12,8 @@ namespace content { WorkerDevToolsMessageFilter::WorkerDevToolsMessageFilter( int worker_process_host_id) - : worker_process_host_id_(worker_process_host_id), + : BrowserMessageFilter(DevToolsMsgStart), + worker_process_host_id_(worker_process_host_id), current_routing_id_(0) { } diff --git a/content/browser/dom_storage/dom_storage_message_filter.cc b/content/browser/dom_storage/dom_storage_message_filter.cc index 204aa8c..282b71d 100644 --- a/content/browser/dom_storage/dom_storage_message_filter.cc +++ b/content/browser/dom_storage/dom_storage_message_filter.cc @@ -23,7 +23,8 @@ namespace content { DOMStorageMessageFilter::DOMStorageMessageFilter( int render_process_id, DOMStorageContextWrapper* context) - : render_process_id_(render_process_id), + : BrowserMessageFilter(DOMStorageMsgStart), + render_process_id_(render_process_id), context_(context->context()), connection_dispatching_message_for_(0) { } diff --git a/content/browser/fileapi/fileapi_message_filter.cc b/content/browser/fileapi/fileapi_message_filter.cc index 5d0c27f..3956fe7 100644 --- a/content/browser/fileapi/fileapi_message_filter.cc +++ b/content/browser/fileapi/fileapi_message_filter.cc @@ -53,6 +53,11 @@ namespace content { namespace { +const uint32 kFilteredMessageClasses[] = { + BlobMsgStart, + FileSystemMsgStart, +}; + void RevokeFilePermission(int child_id, const base::FilePath& path) { ChildProcessSecurityPolicyImpl::GetInstance()->RevokeAllPermissionsForFile( child_id, path); @@ -66,7 +71,9 @@ FileAPIMessageFilter::FileAPIMessageFilter( fileapi::FileSystemContext* file_system_context, ChromeBlobStorageContext* blob_storage_context, StreamContext* stream_context) - : process_id_(process_id), + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + process_id_(process_id), context_(file_system_context), security_policy_(ChildProcessSecurityPolicyImpl::GetInstance()), request_context_getter_(request_context_getter), @@ -85,7 +92,9 @@ FileAPIMessageFilter::FileAPIMessageFilter( fileapi::FileSystemContext* file_system_context, ChromeBlobStorageContext* blob_storage_context, StreamContext* stream_context) - : process_id_(process_id), + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + process_id_(process_id), context_(file_system_context), security_policy_(ChildProcessSecurityPolicyImpl::GetInstance()), request_context_(request_context), diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc index c187680..bda5817 100644 --- a/content/browser/frame_host/render_frame_message_filter.cc +++ b/content/browser/frame_host/render_frame_message_filter.cc @@ -36,7 +36,8 @@ void CreateChildFrameOnUI(int process_id, RenderFrameMessageFilter::RenderFrameMessageFilter( int render_process_id, RenderWidgetHelper* render_widget_helper) - : render_process_id_(render_process_id), + : BrowserMessageFilter(FrameMsgStart), + render_process_id_(render_process_id), render_widget_helper_(render_widget_helper) { } diff --git a/content/browser/geolocation/geolocation_dispatcher_host.cc b/content/browser/geolocation/geolocation_dispatcher_host.cc index e461e63..edb2692 100644 --- a/content/browser/geolocation/geolocation_dispatcher_host.cc +++ b/content/browser/geolocation/geolocation_dispatcher_host.cc @@ -295,7 +295,8 @@ GeolocationDispatcherHost* GeolocationDispatcherHost::New( geolocation_permission_context); } -GeolocationDispatcherHost::GeolocationDispatcherHost() { +GeolocationDispatcherHost::GeolocationDispatcherHost() + : BrowserMessageFilter(GeolocationMsgStart) { } GeolocationDispatcherHost::~GeolocationDispatcherHost() { diff --git a/content/browser/histogram_message_filter.cc b/content/browser/histogram_message_filter.cc index f44accdc..eae1100 100644 --- a/content/browser/histogram_message_filter.cc +++ b/content/browser/histogram_message_filter.cc @@ -14,7 +14,8 @@ namespace content { -HistogramMessageFilter::HistogramMessageFilter() {} +HistogramMessageFilter::HistogramMessageFilter() + : BrowserMessageFilter(ChildProcessMsgStart) {} bool HistogramMessageFilter::OnMessageReceived(const IPC::Message& message, bool* message_was_ok) { diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc index ffa628c..9531196 100644 --- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc +++ b/content/browser/indexed_db/indexed_db_dispatcher_host.cc @@ -33,7 +33,8 @@ namespace content { IndexedDBDispatcherHost::IndexedDBDispatcherHost( IndexedDBContextImpl* indexed_db_context) - : indexed_db_context_(indexed_db_context), + : BrowserMessageFilter(IndexedDBMsgStart), + indexed_db_context_(indexed_db_context), database_dispatcher_host_(new DatabaseDispatcherHost(this)), cursor_dispatcher_host_(new CursorDispatcherHost(this)) { DCHECK(indexed_db_context_); diff --git a/content/browser/loader/resource_message_filter.cc b/content/browser/loader/resource_message_filter.cc index c3f30ff..bd7e078 100644 --- a/content/browser/loader/resource_message_filter.cc +++ b/content/browser/loader/resource_message_filter.cc @@ -7,6 +7,7 @@ #include "content/browser/appcache/chrome_appcache_service.h" #include "content/browser/fileapi/chrome_blob_storage_context.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" +#include "content/common/resource_messages.h" #include "content/public/browser/resource_context.h" #include "webkit/browser/fileapi/file_system_context.h" @@ -19,7 +20,8 @@ ResourceMessageFilter::ResourceMessageFilter( ChromeBlobStorageContext* blob_storage_context, fileapi::FileSystemContext* file_system_context, const GetContextsCallback& get_contexts_callback) - : child_id_(child_id), + : BrowserMessageFilter(ResourceMsgStart), + child_id_(child_id), process_type_(process_type), appcache_service_(appcache_service), blob_storage_context_(blob_storage_context), diff --git a/content/browser/loader/resource_scheduler_filter.cc b/content/browser/loader/resource_scheduler_filter.cc index 2cf32e6..97e219e 100644 --- a/content/browser/loader/resource_scheduler_filter.cc +++ b/content/browser/loader/resource_scheduler_filter.cc @@ -11,9 +11,17 @@ #include "content/public/common/page_transition_types.h" namespace content { +namespace { +const uint32 kFilteredMessageClasses[] = { + FrameMsgStart, + ViewMsgStart, +}; +} // namespace ResourceSchedulerFilter::ResourceSchedulerFilter(int child_id) - : child_id_(child_id) { + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + child_id_(child_id) { } ResourceSchedulerFilter::~ResourceSchedulerFilter() { diff --git a/content/browser/media/android/browser_demuxer_android.cc b/content/browser/media/android/browser_demuxer_android.cc index 8480b14..79f9fbf 100644 --- a/content/browser/media/android/browser_demuxer_android.cc +++ b/content/browser/media/android/browser_demuxer_android.cc @@ -57,7 +57,8 @@ class BrowserDemuxerAndroid::Internal : public media::DemuxerAndroid { DISALLOW_COPY_AND_ASSIGN(Internal); }; -BrowserDemuxerAndroid::BrowserDemuxerAndroid() {} +BrowserDemuxerAndroid::BrowserDemuxerAndroid() + : BrowserMessageFilter(MediaPlayerMsgStart) {} BrowserDemuxerAndroid::~BrowserDemuxerAndroid() {} diff --git a/content/browser/message_port_message_filter.cc b/content/browser/message_port_message_filter.cc index 70d8175..4fd8045 100644 --- a/content/browser/message_port_message_filter.cc +++ b/content/browser/message_port_message_filter.cc @@ -11,7 +11,8 @@ namespace content { MessagePortMessageFilter::MessagePortMessageFilter( const NextRoutingIDCallback& callback) - : next_routing_id_(callback) { + : BrowserMessageFilter(MessagePortMsgStart), + next_routing_id_(callback) { } MessagePortMessageFilter::~MessagePortMessageFilter() { diff --git a/content/browser/mime_registry_message_filter.cc b/content/browser/mime_registry_message_filter.cc index f23cc00..d6e4505 100644 --- a/content/browser/mime_registry_message_filter.cc +++ b/content/browser/mime_registry_message_filter.cc @@ -9,7 +9,8 @@ namespace content { -MimeRegistryMessageFilter::MimeRegistryMessageFilter() { +MimeRegistryMessageFilter::MimeRegistryMessageFilter() + : BrowserMessageFilter(MimeRegistryMsgStart) { } MimeRegistryMessageFilter::~MimeRegistryMessageFilter() { diff --git a/content/browser/profiler_message_filter.cc b/content/browser/profiler_message_filter.cc index adea8e7..825e9dc 100644 --- a/content/browser/profiler_message_filter.cc +++ b/content/browser/profiler_message_filter.cc @@ -12,7 +12,8 @@ namespace content { ProfilerMessageFilter::ProfilerMessageFilter(int process_type) - : process_type_(process_type) { + : BrowserMessageFilter(ChildProcessMsgStart), + process_type_(process_type) { } void ProfilerMessageFilter::OnChannelConnected(int32 peer_pid) { diff --git a/content/browser/quota_dispatcher_host.cc b/content/browser/quota_dispatcher_host.cc index 2351269..237c8d7 100644 --- a/content/browser/quota_dispatcher_host.cc +++ b/content/browser/quota_dispatcher_host.cc @@ -221,7 +221,8 @@ QuotaDispatcherHost::QuotaDispatcherHost( int process_id, QuotaManager* quota_manager, QuotaPermissionContext* permission_context) - : process_id_(process_id), + : BrowserMessageFilter(QuotaMsgStart), + process_id_(process_id), quota_manager_(quota_manager), permission_context_(permission_context), weak_factory_(this) { diff --git a/content/browser/renderer_host/clipboard_message_filter.cc b/content/browser/renderer_host/clipboard_message_filter.cc index 6ba95f8..df6d5c3 100644 --- a/content/browser/renderer_host/clipboard_message_filter.cc +++ b/content/browser/renderer_host/clipboard_message_filter.cc @@ -34,7 +34,8 @@ void WriteObjectsOnUIThread(ui::Clipboard::ObjectMap* objects) { } // namespace -ClipboardMessageFilter::ClipboardMessageFilter() {} +ClipboardMessageFilter::ClipboardMessageFilter() + : BrowserMessageFilter(ClipboardMsgStart) {} void ClipboardMessageFilter::OverrideThreadForMessage( const IPC::Message& message, BrowserThread::ID* thread) { diff --git a/content/browser/renderer_host/database_message_filter.cc b/content/browser/renderer_host/database_message_filter.cc index 261019d..e266059 100644 --- a/content/browser/renderer_host/database_message_filter.cc +++ b/content/browser/renderer_host/database_message_filter.cc @@ -41,7 +41,8 @@ const int kDelayDeleteRetryMs = 100; DatabaseMessageFilter::DatabaseMessageFilter( webkit_database::DatabaseTracker* db_tracker) - : db_tracker_(db_tracker), + : BrowserMessageFilter(DatabaseMsgStart), + db_tracker_(db_tracker), observer_added_(false) { DCHECK(db_tracker_.get()); } diff --git a/content/browser/renderer_host/file_utilities_message_filter.cc b/content/browser/renderer_host/file_utilities_message_filter.cc index 577653e..e784ee3 100644 --- a/content/browser/renderer_host/file_utilities_message_filter.cc +++ b/content/browser/renderer_host/file_utilities_message_filter.cc @@ -11,7 +11,8 @@ namespace content { FileUtilitiesMessageFilter::FileUtilitiesMessageFilter(int process_id) - : process_id_(process_id) { + : BrowserMessageFilter(FileUtilitiesMsgStart), + process_id_(process_id) { } FileUtilitiesMessageFilter::~FileUtilitiesMessageFilter() { diff --git a/content/browser/renderer_host/gamepad_browser_message_filter.cc b/content/browser/renderer_host/gamepad_browser_message_filter.cc index 6b5972e..cd36e6a 100644 --- a/content/browser/renderer_host/gamepad_browser_message_filter.cc +++ b/content/browser/renderer_host/gamepad_browser_message_filter.cc @@ -10,7 +10,8 @@ namespace content { GamepadBrowserMessageFilter::GamepadBrowserMessageFilter() - : is_started_(false) { + : BrowserMessageFilter(GamepadMsgStart), + is_started_(false) { } GamepadBrowserMessageFilter::~GamepadBrowserMessageFilter() { diff --git a/content/browser/renderer_host/gpu_message_filter.cc b/content/browser/renderer_host/gpu_message_filter.cc index 4dc49bb..8a14cf6 100644 --- a/content/browser/renderer_host/gpu_message_filter.cc +++ b/content/browser/renderer_host/gpu_message_filter.cc @@ -54,7 +54,8 @@ struct GpuMessageFilter::FrameSubscription { GpuMessageFilter::GpuMessageFilter(int render_process_id, RenderWidgetHelper* render_widget_helper) - : gpu_process_id_(0), + : BrowserMessageFilter(GpuMsgStart), + gpu_process_id_(0), render_process_id_(render_process_id), share_contexts_(false), render_widget_helper_(render_widget_helper), diff --git a/content/browser/renderer_host/input/touch_input_browsertest.cc b/content/browser/renderer_host/input/touch_input_browsertest.cc index 4889b49..b450c02 100644 --- a/content/browser/renderer_host/input/touch_input_browsertest.cc +++ b/content/browser/renderer_host/input/touch_input_browsertest.cc @@ -82,7 +82,8 @@ namespace content { class InputEventMessageFilter : public BrowserMessageFilter { public: InputEventMessageFilter() - : type_(WebInputEvent::Undefined), + : BrowserMessageFilter(InputMsgStart), + type_(WebInputEvent::Undefined), state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} void WaitForAck(WebInputEvent::Type type) { diff --git a/content/browser/renderer_host/media/audio_input_renderer_host.cc b/content/browser/renderer_host/media/audio_input_renderer_host.cc index 6a75f54..9bd39c8 100644 --- a/content/browser/renderer_host/media/audio_input_renderer_host.cc +++ b/content/browser/renderer_host/media/audio_input_renderer_host.cc @@ -54,7 +54,8 @@ AudioInputRendererHost::AudioInputRendererHost( MediaStreamManager* media_stream_manager, AudioMirroringManager* audio_mirroring_manager, media::UserInputMonitor* user_input_monitor) - : audio_manager_(audio_manager), + : BrowserMessageFilter(AudioMsgStart), + audio_manager_(audio_manager), media_stream_manager_(media_stream_manager), audio_mirroring_manager_(audio_mirroring_manager), user_input_monitor_(user_input_monitor), diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc index a1f3710..bea8bcf 100644 --- a/content/browser/renderer_host/media/audio_renderer_host.cc +++ b/content/browser/renderer_host/media/audio_renderer_host.cc @@ -111,7 +111,8 @@ AudioRendererHost::AudioRendererHost( AudioMirroringManager* mirroring_manager, MediaInternals* media_internals, MediaStreamManager* media_stream_manager) - : render_process_id_(render_process_id), + : BrowserMessageFilter(AudioMsgStart), + render_process_id_(render_process_id), audio_manager_(audio_manager), mirroring_manager_(mirroring_manager), audio_log_(media_internals->CreateAudioLog( diff --git a/content/browser/renderer_host/media/device_request_message_filter.cc b/content/browser/renderer_host/media/device_request_message_filter.cc index 89e632f..0c34b53 100644 --- a/content/browser/renderer_host/media/device_request_message_filter.cc +++ b/content/browser/renderer_host/media/device_request_message_filter.cc @@ -23,7 +23,8 @@ namespace content { DeviceRequestMessageFilter::DeviceRequestMessageFilter( ResourceContext* resource_context, MediaStreamManager* media_stream_manager) - : resource_context_(resource_context), + : BrowserMessageFilter(MediaStreamMsgStart), + resource_context_(resource_context), media_stream_manager_(media_stream_manager) { DCHECK(resource_context); DCHECK(media_stream_manager); diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc index 2385f3b..d8c7608 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc @@ -16,7 +16,8 @@ MediaStreamDispatcherHost::MediaStreamDispatcherHost( int render_process_id, ResourceContext* resource_context, MediaStreamManager* media_stream_manager) - : render_process_id_(render_process_id), + : BrowserMessageFilter(MediaStreamMsgStart), + render_process_id_(render_process_id), resource_context_(resource_context), media_stream_manager_(media_stream_manager) { } diff --git a/content/browser/renderer_host/media/midi_dispatcher_host.cc b/content/browser/renderer_host/media/midi_dispatcher_host.cc index 73b69ac..e42fe11 100644 --- a/content/browser/renderer_host/media/midi_dispatcher_host.cc +++ b/content/browser/renderer_host/media/midi_dispatcher_host.cc @@ -16,7 +16,8 @@ namespace content { MidiDispatcherHost::MidiDispatcherHost(int render_process_id, BrowserContext* browser_context) - : render_process_id_(render_process_id), + : BrowserMessageFilter(MidiMsgStart), + render_process_id_(render_process_id), browser_context_(browser_context) { } diff --git a/content/browser/renderer_host/media/midi_host.cc b/content/browser/renderer_host/media/midi_host.cc index b6e2688..3c09ba6 100644 --- a/content/browser/renderer_host/media/midi_host.cc +++ b/content/browser/renderer_host/media/midi_host.cc @@ -49,7 +49,8 @@ using media::kSysExByte; using media::kEndOfSysExByte; MidiHost::MidiHost(int renderer_process_id, media::MidiManager* midi_manager) - : renderer_process_id_(renderer_process_id), + : BrowserMessageFilter(MidiMsgStart), + renderer_process_id_(renderer_process_id), has_sys_ex_permission_(false), midi_manager_(midi_manager), sent_bytes_in_flight_(0), diff --git a/content/browser/renderer_host/media/peer_connection_tracker_host.cc b/content/browser/renderer_host/media/peer_connection_tracker_host.cc index b937073..96029b9 100644 --- a/content/browser/renderer_host/media/peer_connection_tracker_host.cc +++ b/content/browser/renderer_host/media/peer_connection_tracker_host.cc @@ -9,7 +9,8 @@ namespace content { PeerConnectionTrackerHost::PeerConnectionTrackerHost(int render_process_id) - : render_process_id_(render_process_id) {} + : BrowserMessageFilter(PeerConnectionTrackerMsgStart), + render_process_id_(render_process_id) {} bool PeerConnectionTrackerHost::OnMessageReceived(const IPC::Message& message, bool* message_was_ok) { diff --git a/content/browser/renderer_host/media/video_capture_host.cc b/content/browser/renderer_host/media/video_capture_host.cc index 71ec081..11958c2 100644 --- a/content/browser/renderer_host/media/video_capture_host.cc +++ b/content/browser/renderer_host/media/video_capture_host.cc @@ -14,7 +14,8 @@ namespace content { VideoCaptureHost::VideoCaptureHost(MediaStreamManager* media_stream_manager) - : media_stream_manager_(media_stream_manager) { + : BrowserMessageFilter(VideoCaptureMsgStart), + media_stream_manager_(media_stream_manager) { } VideoCaptureHost::~VideoCaptureHost() {} diff --git a/content/browser/renderer_host/media/webrtc_identity_service_host.cc b/content/browser/renderer_host/media/webrtc_identity_service_host.cc index 16f7b6e..1c7291e2 100644 --- a/content/browser/renderer_host/media/webrtc_identity_service_host.cc +++ b/content/browser/renderer_host/media/webrtc_identity_service_host.cc @@ -16,7 +16,8 @@ namespace content { WebRTCIdentityServiceHost::WebRTCIdentityServiceHost( int renderer_process_id, scoped_refptr<WebRTCIdentityStore> identity_store) - : renderer_process_id_(renderer_process_id), + : BrowserMessageFilter(WebRTCIdentityMsgStart), + renderer_process_id_(renderer_process_id), identity_store_(identity_store), weak_factory_(this) {} diff --git a/content/browser/renderer_host/memory_benchmark_message_filter.cc b/content/browser/renderer_host/memory_benchmark_message_filter.cc index d559852..35b2884 100644 --- a/content/browser/renderer_host/memory_benchmark_message_filter.cc +++ b/content/browser/renderer_host/memory_benchmark_message_filter.cc @@ -12,7 +12,8 @@ namespace content { -MemoryBenchmarkMessageFilter::MemoryBenchmarkMessageFilter() { +MemoryBenchmarkMessageFilter::MemoryBenchmarkMessageFilter() + : BrowserMessageFilter(MemoryBenchmarkMsgStart) { } bool MemoryBenchmarkMessageFilter::OnMessageReceived( diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc index 7e9b835..7780970 100644 --- a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc +++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc @@ -96,7 +96,8 @@ class P2PSocketDispatcherHost::DnsRequest { P2PSocketDispatcherHost::P2PSocketDispatcherHost( content::ResourceContext* resource_context, net::URLRequestContextGetter* url_context) - : resource_context_(resource_context), + : BrowserMessageFilter(P2PMsgStart), + resource_context_(resource_context), url_context_(url_context), monitoring_networks_(false) { } diff --git a/content/browser/renderer_host/pepper/pepper_message_filter.cc b/content/browser/renderer_host/pepper/pepper_message_filter.cc index 1394d95..0668f2a 100644 --- a/content/browser/renderer_host/pepper/pepper_message_filter.cc +++ b/content/browser/renderer_host/pepper/pepper_message_filter.cc @@ -11,7 +11,9 @@ namespace content { -PepperMessageFilter::PepperMessageFilter() {} +PepperMessageFilter::PepperMessageFilter() + : BrowserMessageFilter(PpapiMsgStart) {} + PepperMessageFilter::~PepperMessageFilter() {} bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg, diff --git a/content/browser/renderer_host/pepper/pepper_renderer_connection.cc b/content/browser/renderer_host/pepper/pepper_renderer_connection.cc index 1c00388..f20562e 100644 --- a/content/browser/renderer_host/pepper/pepper_renderer_connection.cc +++ b/content/browser/renderer_host/pepper/pepper_renderer_connection.cc @@ -26,6 +26,11 @@ namespace content { namespace { +const uint32 kFilteredMessageClasses[] = { + PpapiMsgStart, + ViewMsgStart, +}; + // Responsible for creating the pending resource hosts, holding their IDs until // all of them have been created for a single message, and sending the reply to // say that the hosts have been created. @@ -87,7 +92,9 @@ PendingHostCreator::~PendingHostCreator() { } // namespace PepperRendererConnection::PepperRendererConnection(int render_process_id) - : render_process_id_(render_process_id) { + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + render_process_id_(render_process_id) { // Only give the renderer permission for stable APIs. in_process_host_.reset(new BrowserPpapiHostImpl(this, ppapi::PpapiPermissions(), diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc index 1597d78..6a436e2 100644 --- a/content/browser/renderer_host/render_message_filter.cc +++ b/content/browser/renderer_host/render_message_filter.cc @@ -101,6 +101,13 @@ const int kPluginsRefreshThresholdInSeconds = 3; // usage only once and send it as a response for both queries. static const int64 kCPUUsageSampleIntervalMs = 900; +const uint32 kFilteredMessageClasses[] = { + ChildProcessMsgStart, + DesktopNotificationMsgStart, + FrameMsgStart, + ViewMsgStart, +}; + #if defined(OS_WIN) // On Windows, |g_color_profile| can run on an arbitrary background thread. // We avoid races by using LazyInstance's constructor lock to initialize the @@ -320,7 +327,9 @@ RenderMessageFilter::RenderMessageFilter( media::AudioManager* audio_manager, MediaInternals* media_internals, DOMStorageContextWrapper* dom_storage_context) - : resource_dispatcher_host_(ResourceDispatcherHostImpl::Get()), + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + resource_dispatcher_host_(ResourceDispatcherHostImpl::Get()), plugin_service_(plugin_service), profile_data_directory_(browser_context->GetPath()), request_context_(request_context), diff --git a/content/browser/renderer_host/socket_stream_dispatcher_host.cc b/content/browser/renderer_host/socket_stream_dispatcher_host.cc index 204bf8e..5c5e2b8a 100644 --- a/content/browser/renderer_host/socket_stream_dispatcher_host.cc +++ b/content/browser/renderer_host/socket_stream_dispatcher_host.cc @@ -32,7 +32,8 @@ SocketStreamDispatcherHost::SocketStreamDispatcherHost( int render_process_id, const GetRequestContextCallback& request_context_callback, ResourceContext* resource_context) - : render_process_id_(render_process_id), + : BrowserMessageFilter(SocketStreamMsgStart), + render_process_id_(render_process_id), request_context_callback_(request_context_callback), resource_context_(resource_context), weak_ptr_factory_(this), diff --git a/content/browser/renderer_host/text_input_client_message_filter.mm b/content/browser/renderer_host/text_input_client_message_filter.mm index 7af5a8f..f3e10fd3 100644 --- a/content/browser/renderer_host/text_input_client_message_filter.mm +++ b/content/browser/renderer_host/text_input_client_message_filter.mm @@ -16,7 +16,7 @@ namespace content { TextInputClientMessageFilter::TextInputClientMessageFilter(int child_id) - : BrowserMessageFilter(), + : BrowserMessageFilter(TextInputClientMsgStart), child_process_id_(child_id) { } diff --git a/content/browser/renderer_host/websocket_dispatcher_host.cc b/content/browser/renderer_host/websocket_dispatcher_host.cc index 2a7ed76..9756354 100644 --- a/content/browser/renderer_host/websocket_dispatcher_host.cc +++ b/content/browser/renderer_host/websocket_dispatcher_host.cc @@ -25,7 +25,8 @@ typedef WebSocketDispatcherHost::WebSocketHostState WebSocketHostState; WebSocketDispatcherHost::WebSocketDispatcherHost( const GetRequestContextCallback& get_context_callback) - : get_context_callback_(get_context_callback), + : BrowserMessageFilter(WebSocketMsgStart), + get_context_callback_(get_context_callback), websocket_host_factory_( base::Bind(&WebSocketDispatcherHost::CreateWebSocketHost, base::Unretained(this))) {} @@ -33,7 +34,8 @@ WebSocketDispatcherHost::WebSocketDispatcherHost( WebSocketDispatcherHost::WebSocketDispatcherHost( const GetRequestContextCallback& get_context_callback, const WebSocketHostFactory& websocket_host_factory) - : get_context_callback_(get_context_callback), + : BrowserMessageFilter(WebSocketMsgStart), + get_context_callback_(get_context_callback), websocket_host_factory_(websocket_host_factory) {} WebSocketHost* WebSocketDispatcherHost::CreateWebSocketHost(int routing_id) { diff --git a/content/browser/resolve_proxy_msg_helper.cc b/content/browser/resolve_proxy_msg_helper.cc index 52d0987..9932f77 100644 --- a/content/browser/resolve_proxy_msg_helper.cc +++ b/content/browser/resolve_proxy_msg_helper.cc @@ -16,12 +16,14 @@ namespace content { ResolveProxyMsgHelper::ResolveProxyMsgHelper( net::URLRequestContextGetter* getter) - : context_getter_(getter), + : BrowserMessageFilter(ViewMsgStart), + context_getter_(getter), proxy_service_(NULL) { } ResolveProxyMsgHelper::ResolveProxyMsgHelper(net::ProxyService* proxy_service) - : proxy_service_(proxy_service) { + : BrowserMessageFilter(ViewMsgStart), + proxy_service_(proxy_service) { } bool ResolveProxyMsgHelper::OnMessageReceived(const IPC::Message& message, diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc index 8710ee9..162047c 100644 --- a/content/browser/service_worker/service_worker_dispatcher_host.cc +++ b/content/browser/service_worker/service_worker_dispatcher_host.cc @@ -24,13 +24,20 @@ const char kDisabledErrorMessage[] = const char kDomainMismatchErrorMessage[] = "Scope and scripts do not have the same origin"; +const uint32 kFilteredMessageClasses[] = { + ServiceWorkerMsgStart, + EmbeddedWorkerMsgStart, +}; + } // namespace namespace content { ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost( int render_process_id) - : render_process_id_(render_process_id) { + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + render_process_id_(render_process_id) { } ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() { diff --git a/content/browser/shared_worker/shared_worker_message_filter.cc b/content/browser/shared_worker/shared_worker_message_filter.cc index 1269ac3..ca6abe7 100644 --- a/content/browser/shared_worker/shared_worker_message_filter.cc +++ b/content/browser/shared_worker/shared_worker_message_filter.cc @@ -12,13 +12,21 @@ #include "content/common/worker_messages.h" namespace content { +namespace { +const uint32 kFilteredMessageClasses[] = { + ViewMsgStart, + WorkerMsgStart, +}; +} // namespace SharedWorkerMessageFilter::SharedWorkerMessageFilter( int render_process_id, ResourceContext* resource_context, const WorkerStoragePartition& partition, MessagePortMessageFilter* message_port_message_filter) - : render_process_id_(render_process_id), + : BrowserMessageFilter( + kFilteredMessageClasses, arraysize(kFilteredMessageClasses)), + render_process_id_(render_process_id), resource_context_(resource_context), partition_(partition), message_port_message_filter_(message_port_message_filter) { diff --git a/content/browser/speech/input_tag_speech_dispatcher_host.cc b/content/browser/speech/input_tag_speech_dispatcher_host.cc index 7c974b1..6bd92ff 100644 --- a/content/browser/speech/input_tag_speech_dispatcher_host.cc +++ b/content/browser/speech/input_tag_speech_dispatcher_host.cc @@ -25,7 +25,8 @@ InputTagSpeechDispatcherHost::InputTagSpeechDispatcherHost( bool is_guest, int render_process_id, net::URLRequestContextGetter* url_request_context_getter) - : is_guest_(is_guest), + : BrowserMessageFilter(SpeechRecognitionMsgStart), + is_guest_(is_guest), render_process_id_(render_process_id), url_request_context_getter_(url_request_context_getter) { // Do not add any non-trivial initialization here, instead do it lazily when diff --git a/content/browser/speech/speech_recognition_dispatcher_host.cc b/content/browser/speech/speech_recognition_dispatcher_host.cc index 85799d1..1b42f2f 100644 --- a/content/browser/speech/speech_recognition_dispatcher_host.cc +++ b/content/browser/speech/speech_recognition_dispatcher_host.cc @@ -23,7 +23,8 @@ SpeechRecognitionDispatcherHost::SpeechRecognitionDispatcherHost( bool is_guest, int render_process_id, net::URLRequestContextGetter* context_getter) - : is_guest_(is_guest), + : BrowserMessageFilter(SpeechRecognitionMsgStart), + is_guest_(is_guest), render_process_id_(render_process_id), context_getter_(context_getter) { // Do not add any non-trivial initialization here, instead do it lazily when diff --git a/content/browser/tracing/trace_message_filter.cc b/content/browser/tracing/trace_message_filter.cc index 04d27a6..bc9bac8 100644 --- a/content/browser/tracing/trace_message_filter.cc +++ b/content/browser/tracing/trace_message_filter.cc @@ -9,11 +9,12 @@ namespace content { -TraceMessageFilter::TraceMessageFilter() : - has_child_(false), - is_awaiting_end_ack_(false), - is_awaiting_capture_monitoring_snapshot_ack_(false), - is_awaiting_buffer_percent_full_ack_(false) { +TraceMessageFilter::TraceMessageFilter() + : BrowserMessageFilter(TracingMsgStart), + has_child_(false), + is_awaiting_end_ack_(false), + is_awaiting_capture_monitoring_snapshot_ack_(false), + is_awaiting_buffer_percent_full_ack_(false) { } TraceMessageFilter::~TraceMessageFilter() {} diff --git a/content/browser/vibration/vibration_message_filter.cc b/content/browser/vibration/vibration_message_filter.cc index 99811a97..b404748 100644 --- a/content/browser/vibration/vibration_message_filter.cc +++ b/content/browser/vibration/vibration_message_filter.cc @@ -18,7 +18,8 @@ namespace content { // Minimum duration of a vibration is 1 millisecond. const int64 kMinimumVibrationDurationMs = 1; -VibrationMessageFilter::VibrationMessageFilter() { +VibrationMessageFilter::VibrationMessageFilter() + : BrowserMessageFilter(ViewMsgStart) { provider_.reset(GetContentClient()->browser()->OverrideVibrationProvider()); if (!provider_.get()) provider_.reset(CreateProvider()); diff --git a/content/browser/worker_host/worker_message_filter.cc b/content/browser/worker_host/worker_message_filter.cc index b332094..1e515e6 100644 --- a/content/browser/worker_host/worker_message_filter.cc +++ b/content/browser/worker_host/worker_message_filter.cc @@ -17,7 +17,8 @@ WorkerMessageFilter::WorkerMessageFilter( ResourceContext* resource_context, const WorkerStoragePartition& partition, MessagePortMessageFilter* message_port_message_filter) - : render_process_id_(render_process_id), + : BrowserMessageFilter(ViewMsgStart), + render_process_id_(render_process_id), resource_context_(resource_context), partition_(partition), message_port_message_filter_(message_port_message_filter) { diff --git a/content/public/browser/browser_message_filter.cc b/content/public/browser/browser_message_filter.cc index e72a484..72b4a1c 100644 --- a/content/public/browser/browser_message_filter.cc +++ b/content/public/browser/browser_message_filter.cc @@ -76,6 +76,14 @@ class BrowserMessageFilter::Internal : public IPC::ChannelProxy::MessageFilter { return true; } + virtual bool GetSupportedMessageClasses( + std::vector<uint32>* supported_message_classes) const OVERRIDE { + supported_message_classes->assign( + filter_->message_classes_to_filter().begin(), + filter_->message_classes_to_filter().end()); + return true; + } + // Dispatches a message to the derived class. bool DispatchMessage(const IPC::Message& message) { bool message_was_ok = true; @@ -96,12 +104,28 @@ class BrowserMessageFilter::Internal : public IPC::ChannelProxy::MessageFilter { DISALLOW_COPY_AND_ASSIGN(Internal); }; -BrowserMessageFilter::BrowserMessageFilter() - : internal_(NULL), channel_(NULL), +BrowserMessageFilter::BrowserMessageFilter(uint32 message_class_to_filter) + : internal_(NULL), + channel_(NULL), +#if defined(OS_WIN) + peer_handle_(base::kNullProcessHandle), +#endif + peer_pid_(base::kNullProcessId), + message_classes_to_filter_(1, message_class_to_filter) {} + +BrowserMessageFilter::BrowserMessageFilter( + const uint32* message_classes_to_filter, + size_t num_message_classes_to_filter) + : internal_(NULL), + channel_(NULL), #if defined(OS_WIN) peer_handle_(base::kNullProcessHandle), #endif - peer_pid_(base::kNullProcessId) { + peer_pid_(base::kNullProcessId), + message_classes_to_filter_( + message_classes_to_filter, + message_classes_to_filter + num_message_classes_to_filter) { + DCHECK(num_message_classes_to_filter); } base::ProcessHandle BrowserMessageFilter::PeerHandle() { diff --git a/content/public/browser/browser_message_filter.h b/content/public/browser/browser_message_filter.h index ad1f069..5505c1c 100644 --- a/content/public/browser/browser_message_filter.h +++ b/content/public/browser/browser_message_filter.h @@ -29,7 +29,9 @@ class CONTENT_EXPORT BrowserMessageFilter BrowserMessageFilter, BrowserMessageFilterTraits>, public IPC::Sender { public: - BrowserMessageFilter(); + explicit BrowserMessageFilter(uint32 message_class_to_filter); + BrowserMessageFilter(const uint32* message_classes_to_filter, + size_t num_message_classes_to_filter); // These match the corresponding IPC::ChannelProxy::MessageFilter methods and // are always called on the IO thread. @@ -91,6 +93,10 @@ class CONTENT_EXPORT BrowserMessageFilter // Can be called on any thread. virtual void BadMessageReceived(); + const std::vector<uint32>& message_classes_to_filter() const { + return message_classes_to_filter_; + } + protected: virtual ~BrowserMessageFilter(); @@ -117,6 +123,8 @@ class CONTENT_EXPORT BrowserMessageFilter IPC::Channel* channel_; base::ProcessId peer_pid_; + std::vector<uint32> message_classes_to_filter_; + #if defined(OS_WIN) base::Lock peer_handle_lock_; base::ProcessHandle peer_handle_; diff --git a/content/shell/browser/shell_message_filter.cc b/content/shell/browser/shell_message_filter.cc index fcbde2f..d913734 100644 --- a/content/shell/browser/shell_message_filter.cc +++ b/content/shell/browser/shell_message_filter.cc @@ -26,7 +26,8 @@ ShellMessageFilter::ShellMessageFilter( webkit_database::DatabaseTracker* database_tracker, quota::QuotaManager* quota_manager, net::URLRequestContextGetter* request_context_getter) - : render_process_id_(render_process_id), + : BrowserMessageFilter(ShellMsgStart), + render_process_id_(render_process_id), database_tracker_(database_tracker), quota_manager_(quota_manager), request_context_getter_(request_context_getter) { diff --git a/extensions/browser/extension_message_filter.cc b/extensions/browser/extension_message_filter.cc index 3a1c0d2..ea5bfa7 100644 --- a/extensions/browser/extension_message_filter.cc +++ b/extensions/browser/extension_message_filter.cc @@ -20,7 +20,9 @@ namespace extensions { ExtensionMessageFilter::ExtensionMessageFilter(int render_process_id, content::BrowserContext* context) - : render_process_id_(render_process_id), browser_context_(context) { + : BrowserMessageFilter(ExtensionMsgStart), + render_process_id_(render_process_id), + browser_context_(context) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); } diff --git a/ipc/ipc.gyp b/ipc/ipc.gyp index 95c6fd12..e546a99 100644 --- a/ipc/ipc.gyp +++ b/ipc/ipc.gyp @@ -46,6 +46,7 @@ 'sources': [ 'file_descriptor_set_posix_unittest.cc', 'ipc_channel_posix_unittest.cc', + 'ipc_channel_proxy_unittest.cc', 'ipc_channel_unittest.cc', 'ipc_fuzzing_tests.cc', 'ipc_message_unittest.cc', diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc index 3a0cf30..776b423 100644 --- a/ipc/ipc_channel_proxy.cc +++ b/ipc/ipc_channel_proxy.cc @@ -14,12 +14,96 @@ #include "ipc/ipc_listener.h" #include "ipc/ipc_logging.h" #include "ipc/ipc_message_macros.h" +#include "ipc/ipc_message_start.h" #include "ipc/ipc_message_utils.h" namespace IPC { //------------------------------------------------------------------------------ +class ChannelProxy::Context::MessageFilterRouter { + public: + typedef std::vector<MessageFilter*> MessageFilters; + + MessageFilterRouter() {} + ~MessageFilterRouter() {} + + void AddFilter(MessageFilter* filter) { + // Determine if the filter should be applied to all messages, or only + // messages of a certain class. + std::vector<uint32> supported_message_classes; + if (filter->GetSupportedMessageClasses(&supported_message_classes)) { + DCHECK(!supported_message_classes.empty()); + for (size_t i = 0; i < supported_message_classes.size(); ++i) { + DCHECK(ValidMessageClass(supported_message_classes[i])); + message_class_filters_[supported_message_classes[i]].push_back(filter); + } + } else { + global_filters_.push_back(filter); + } + } + + void RemoveFilter(MessageFilter* filter) { + if (RemoveFilter(global_filters_, filter)) + return; + + for (size_t i = 0; i < arraysize(message_class_filters_); ++i) + RemoveFilter(message_class_filters_[i], filter); + } + + bool TryFilters(const Message& message) { + if (TryFilters(global_filters_, message)) + return true; + + const int message_class = IPC_MESSAGE_CLASS(message); + if (!ValidMessageClass(message_class)) + return false; + + return TryFilters(message_class_filters_[message_class], message); + } + + void Clear() { + global_filters_.clear(); + for (size_t i = 0; i < arraysize(message_class_filters_); ++i) + message_class_filters_[i].clear(); + } + + private: + static bool TryFilters(MessageFilters& filters, const IPC::Message& message) { + for (size_t i = 0; i < filters.size(); ++i) { + if (filters[i]->OnMessageReceived(message)) { + return true; + } + } + return false; + } + + static bool RemoveFilter(MessageFilters& filters, MessageFilter* filter) { + MessageFilters::iterator it = + std::find(filters.begin(), filters.end(), filter); + if (it == filters.end()) + return false; + + filters.erase(it); + return true; + } + + static bool ValidMessageClass(int message_class) { + return message_class >= 0 && message_class < LastIPCMsgStart; + } + + // List of global and selective filters; a given filter will exist in either + // |message_global_filters_| OR |message_class_filters_|, but not both. + // Note that |message_global_filters_| will be given first offering of any + // given message. It's the filter implementer and installer's + // responsibility to ensure that a filter is either global or selective to + // ensure proper message filtering order. + MessageFilters global_filters_; + MessageFilters message_class_filters_[LastIPCMsgStart]; +}; + +//------------------------------------------------------------------------------ + ChannelProxy::MessageFilter::MessageFilter() {} void ChannelProxy::MessageFilter::OnFilterAdded(Channel* channel) {} @@ -36,6 +120,11 @@ bool ChannelProxy::MessageFilter::OnMessageReceived(const Message& message) { return false; } +bool ChannelProxy::MessageFilter::GetSupportedMessageClasses( + std::vector<uint32>* /*supported_message_classes*/) const { + return false; +} + ChannelProxy::MessageFilter::~MessageFilter() {} //------------------------------------------------------------------------------ @@ -46,6 +135,7 @@ ChannelProxy::Context::Context(Listener* listener, listener_(listener), ipc_task_runner_(ipc_task_runner), channel_connected_called_(false), + message_filter_router_(new MessageFilterRouter()), peer_pid_(base::kNullProcessId) { DCHECK(ipc_task_runner_.get()); } @@ -65,20 +155,19 @@ void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle, } bool ChannelProxy::Context::TryFilters(const Message& message) { + DCHECK(message_filter_router_); #ifdef IPC_MESSAGE_LOG_ENABLED Logging* logger = Logging::GetInstance(); if (logger->Enabled()) logger->OnPreDispatchMessage(message); #endif - for (size_t i = 0; i < filters_.size(); ++i) { - if (filters_[i]->OnMessageReceived(message)) { + if (message_filter_router_->TryFilters(message)) { #ifdef IPC_MESSAGE_LOG_ENABLED - if (logger->Enabled()) - logger->OnPostDispatchMessage(message, channel_id_); + if (logger->Enabled()) + logger->OnPostDispatchMessage(message, channel_id_); #endif - return true; - } + return true; } return false; } @@ -157,6 +246,7 @@ void ChannelProxy::Context::OnChannelClosed() { // We don't need the filters anymore. filters_.clear(); + message_filter_router_->Clear(); channel_.reset(); @@ -190,6 +280,8 @@ void ChannelProxy::Context::OnAddFilter() { for (size_t i = 0; i < new_filters.size(); ++i) { filters_.push_back(new_filters[i]); + message_filter_router_->AddFilter(new_filters[i].get()); + // If the channel has already been created, then we need to send this // message so that the filter gets access to the Channel. if (channel_.get()) @@ -205,6 +297,8 @@ void ChannelProxy::Context::OnRemoveFilter(MessageFilter* filter) { if (!channel_.get()) return; // The filters have already been deleted. + message_filter_router_->RemoveFilter(filter); + for (size_t i = 0; i < filters_.size(); ++i) { if (filters_[i].get() == filter) { filter->OnFilterRemoved(); diff --git a/ipc/ipc_channel_proxy.h b/ipc/ipc_channel_proxy.h index 1f5ecf4..dca8c97 100644 --- a/ipc/ipc_channel_proxy.h +++ b/ipc/ipc_channel_proxy.h @@ -88,6 +88,13 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe { // the message be handled in the default way. virtual bool OnMessageReceived(const Message& message); + // Called to query the Message classes supported by the filter. Return + // false to indicate that all message types should reach the filter, or true + // if the resulting contents of |supported_message_classes| may be used to + // selectively offer messages of a particular class to the filter. + virtual bool GetSupportedMessageClasses( + std::vector<uint32>* supported_message_classes) const; + protected: virtual ~MessageFilter(); @@ -230,6 +237,11 @@ class IPC_EXPORT ChannelProxy : public Sender, public base::NonThreadSafe { std::string channel_id_; bool channel_connected_called_; + // Routes a given message to a proper subset of |filters_|, depending + // on which message classes a filter might support. + class MessageFilterRouter; + scoped_ptr<MessageFilterRouter> message_filter_router_; + // Holds filters between the AddFilter call on the listerner thread and the // IPC thread when they're added to filters_. std::vector<scoped_refptr<MessageFilter> > pending_filters_; diff --git a/ipc/ipc_channel_proxy_unittest.cc b/ipc/ipc_channel_proxy_unittest.cc new file mode 100644 index 0000000..431f410 --- /dev/null +++ b/ipc/ipc_channel_proxy_unittest.cc @@ -0,0 +1,270 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "build/build_config.h" + +#include "base/message_loop/message_loop.h" +#include "base/pickle.h" +#include "base/threading/thread.h" +#include "ipc/ipc_message.h" +#include "ipc/ipc_message_macros.h" +#include "ipc/ipc_test_base.h" + +namespace { + +#if defined(IPC_MESSAGE_START) +#undef IPC_MESSAGE_START +#endif + +enum Command { + SEND, + QUIT +}; + +static void Send(IPC::Sender* sender, + int message_class, + Command command) { + const int IPC_MESSAGE_START = message_class; + IPC::Message* message = new IPC::Message(0, + IPC_MESSAGE_ID(), + IPC::Message::PRIORITY_NORMAL); + message->WriteInt(command); + sender->Send(message); +} + +class QuitListener : public IPC::Listener { + public: + QuitListener() {} + virtual ~QuitListener() {} + + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { + PickleIterator iter(message); + + int command = SEND; + EXPECT_TRUE(iter.ReadInt(&command)); + if (command == QUIT) + base::MessageLoop::current()->QuitWhenIdle(); + + return true; + } +}; + +class ChannelReflectorListener : public IPC::Listener { + public: + ChannelReflectorListener() : channel_(NULL) {} + virtual ~ChannelReflectorListener() {} + + void Init(IPC::Channel* channel) { + DCHECK(!channel_); + channel_ = channel; + } + + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { + CHECK(channel_); + + PickleIterator iter(message); + + int command = SEND; + EXPECT_TRUE(iter.ReadInt(&command)); + if (command == QUIT) { + channel_->Send(new IPC::Message(message)); + base::MessageLoop::current()->QuitWhenIdle(); + return true; + } + + channel_->Send(new IPC::Message(message)); + return true; + } + + private: + IPC::Channel* channel_; +}; + +class MessageCountFilter : public IPC::ChannelProxy::MessageFilter { + public: + MessageCountFilter() + : messages_received_(0), + supported_message_class_(0), + is_global_filter_(true), + filter_removed_(false), + message_filtering_enabled_(false) {} + + MessageCountFilter(uint32 supported_message_class) + : messages_received_(0), + supported_message_class_(supported_message_class), + is_global_filter_(false), + filter_removed_(false), + message_filtering_enabled_(false) {} + + virtual void OnFilterRemoved() OVERRIDE { + EXPECT_FALSE(filter_removed_); + filter_removed_ = true; + } + + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { + if (!is_global_filter_) { + EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message)); + } + ++messages_received_; + return message_filtering_enabled_; + } + + virtual bool GetSupportedMessageClasses( + std::vector<uint32>* supported_message_classes) const OVERRIDE { + if (is_global_filter_) + return false; + supported_message_classes->push_back(supported_message_class_); + return true; + } + + void set_message_filtering_enabled(bool enabled) { + message_filtering_enabled_ = enabled; + } + + size_t messages_received() const { return messages_received_; } + bool filter_removed() const { return filter_removed_; } + + private: + virtual ~MessageCountFilter() {} + + size_t messages_received_; + uint32 supported_message_class_; + bool is_global_filter_; + bool filter_removed_; + bool message_filtering_enabled_; +}; + +class IPCChannelProxyTest : public IPCTestBase { + public: + IPCChannelProxyTest() {} + virtual ~IPCChannelProxyTest() {} + + virtual void SetUp() OVERRIDE { + IPCTestBase::SetUp(); + + Init("ChannelProxyClient"); + + thread_.reset(new base::Thread("ChannelProxyTestServerThread")); + base::Thread::Options options; + options.message_loop_type = base::MessageLoop::TYPE_IO; + thread_->StartWithOptions(options); + + listener_.reset(new QuitListener()); + CreateChannelProxy(listener_.get(), thread_->message_loop_proxy().get()); + + ASSERT_TRUE(StartClient()); + } + + virtual void TearDown() { + DestroyChannelProxy(); + thread_.reset(); + listener_.reset(); + IPCTestBase::TearDown(); + } + + void SendQuitMessageAndWaitForIdle() { + Send(sender(), -1, QUIT); + base::MessageLoop::current()->Run(); + EXPECT_TRUE(WaitForClientShutdown()); + } + + private: + scoped_ptr<base::Thread> thread_; + scoped_ptr<QuitListener> listener_; +}; + +TEST_F(IPCChannelProxyTest, MessageClassFilters) { + // Construct a filter per message class. + std::vector<scoped_refptr<MessageCountFilter> > class_filters; + for (uint32 i = 0; i < LastIPCMsgStart; ++i) { + class_filters.push_back(make_scoped_refptr( + new MessageCountFilter(i))); + channel_proxy()->AddFilter(class_filters.back().get()); + } + + // Send a message for each class; each filter should receive just one message. + for (uint32 i = 0; i < LastIPCMsgStart; ++i) + Send(sender(), i, SEND); + + // Send some messages not assigned to a specific or valid message class. + Send(sender(), -1, SEND); + Send(sender(), LastIPCMsgStart, SEND); + Send(sender(), LastIPCMsgStart + 1, SEND); + + // Each filter should have received just the one sent message of the + // corresponding class. + SendQuitMessageAndWaitForIdle(); + for (size_t i = 0; i < class_filters.size(); ++i) + EXPECT_EQ(1U, class_filters[i]->messages_received()); +} + +TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) { + // Add a class and global filter. + const int kMessageClass = 7; + scoped_refptr<MessageCountFilter> class_filter( + new MessageCountFilter(kMessageClass)); + class_filter->set_message_filtering_enabled(false); + channel_proxy()->AddFilter(class_filter.get()); + + scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter()); + global_filter->set_message_filtering_enabled(false); + channel_proxy()->AddFilter(global_filter.get()); + + // A message of class |kMessageClass| should be seen by both the global + // filter and |kMessageClass|-specific filter. + Send(sender(), kMessageClass, SEND); + + // A message of a different class should be seen only by the global filter. + Send(sender(), kMessageClass + 1, SEND); + + // Flush all messages. + SendQuitMessageAndWaitForIdle(); + + // The class filter should have received only the class-specific message. + EXPECT_EQ(1U, class_filter->messages_received()); + + // The global filter should have received both SEND messages, as well as the + // final QUIT message. + EXPECT_EQ(3U, global_filter->messages_received()); +} + +TEST_F(IPCChannelProxyTest, FilterRemoval) { + // Add a class and global filter. + const int kMessageClass = 7; + scoped_refptr<MessageCountFilter> class_filter( + new MessageCountFilter(kMessageClass)); + scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter()); + + // Add and remove both types of filters. + channel_proxy()->AddFilter(class_filter.get()); + channel_proxy()->AddFilter(global_filter.get()); + channel_proxy()->RemoveFilter(global_filter.get()); + channel_proxy()->RemoveFilter(class_filter.get()); + + // Send some messages; they should not be seen by either filter. + Send(sender(), 0, SEND); + Send(sender(), kMessageClass, SEND); + + // Ensure that the filters were removed and did not receive any messages. + SendQuitMessageAndWaitForIdle(); + EXPECT_TRUE(global_filter->filter_removed()); + EXPECT_TRUE(class_filter->filter_removed()); + EXPECT_EQ(0U, class_filter->messages_received()); + EXPECT_EQ(0U, global_filter->messages_received()); +} + +MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ChannelProxyClient) { + base::MessageLoopForIO main_message_loop; + ChannelReflectorListener listener; + IPC::Channel channel(IPCTestBase::GetChannelName("ChannelProxyClient"), + IPC::Channel::MODE_CLIENT, + &listener); + CHECK(channel.Connect()); + listener.Init(&channel); + + base::MessageLoop::current()->Run(); + return 0; +} + +} // namespace |