summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/browser/appcache/appcache_dispatcher_host.cc1
-rw-r--r--content/browser/browser_child_process_host_impl.cc10
-rw-r--r--content/browser/browser_child_process_host_impl.h4
-rw-r--r--content/browser/dom_storage/dom_storage_message_filter.cc4
-rw-r--r--content/browser/fileapi/fileapi_message_filter.cc2
-rw-r--r--content/browser/fileapi/fileapi_message_filter_unittest.cc23
-rw-r--r--content/browser/histogram_message_filter.cc4
-rw-r--r--content/browser/histogram_message_filter.h3
-rw-r--r--content/browser/indexed_db/indexed_db_dispatcher_host.cc2
-rw-r--r--content/browser/loader/resource_dispatcher_host_unittest.cc5
-rw-r--r--content/browser/loader/resource_message_filter.cc2
-rw-r--r--content/browser/plugin_process_host.cc6
-rw-r--r--content/browser/plugin_process_host.h3
-rw-r--r--content/browser/ppapi_plugin_process_host.cc2
-rw-r--r--content/browser/profiler_message_filter.cc2
-rw-r--r--content/browser/renderer_host/DEPS1
-rw-r--r--content/browser/renderer_host/database_message_filter.cc1
-rw-r--r--content/browser/renderer_host/media/audio_input_renderer_host.cc2
-rw-r--r--content/browser/renderer_host/media/audio_input_renderer_host.h1
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host.cc4
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host.h1
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host_unittest.cc2
-rw-r--r--content/browser/renderer_host/media/device_request_message_filter.cc2
-rw-r--r--content/browser/renderer_host/media/media_stream_dispatcher_host.cc1
-rw-r--r--content/browser/renderer_host/media/midi_host.cc6
-rw-r--r--content/browser/renderer_host/media/midi_host.h1
-rw-r--r--content/browser/renderer_host/media/video_capture_host.cc2
-rw-r--r--content/browser/renderer_host/p2p/socket_dispatcher_host.cc2
-rw-r--r--content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc6
-rw-r--r--content/browser/renderer_host/render_message_filter.cc2
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc92
-rw-r--r--content/browser/renderer_host/render_process_host_impl.h1
-rw-r--r--content/browser/resolve_proxy_msg_helper_unittest.cc22
-rw-r--r--content/browser/tracing/trace_message_filter.cc8
-rw-r--r--content/browser/tracing/trace_message_filter.h3
-rw-r--r--content/browser/worker_host/worker_message_filter.cc2
-rw-r--r--content/browser/worker_host/worker_process_host.cc24
-rw-r--r--content/public/browser/browser_message_filter.cc135
-rw-r--r--content/public/browser/browser_message_filter.h55
-rw-r--r--content/public/browser/render_process_host.h13
-rw-r--r--content/public/test/mock_render_process_host.cc3
-rw-r--r--content/public/test/mock_render_process_host.h1
-rw-r--r--content/shell/browser/shell_content_browser_client.cc2
-rw-r--r--content/test/webrtc_audio_device_test.cc84
-rw-r--r--content/test/webrtc_audio_device_test.h8
45 files changed, 322 insertions, 238 deletions
diff --git a/content/browser/appcache/appcache_dispatcher_host.cc b/content/browser/appcache/appcache_dispatcher_host.cc
index b68a73d..25e33cf 100644
--- a/content/browser/appcache/appcache_dispatcher_host.cc
+++ b/content/browser/appcache/appcache_dispatcher_host.cc
@@ -21,7 +21,6 @@ AppCacheDispatcherHost::AppCacheDispatcherHost(
}
void AppCacheDispatcherHost::OnChannelConnected(int32 peer_pid) {
- BrowserMessageFilter::OnChannelConnected(peer_pid);
if (appcache_service_.get()) {
backend_impl_.Initialize(
appcache_service_.get(), &frontend_proxy_, process_id_);
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index 5cc9532..8e6bde3 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -100,9 +100,9 @@ BrowserChildProcessHostImpl::BrowserChildProcessHostImpl(
data_.id = ChildProcessHostImpl::GenerateChildProcessUniqueId();
child_process_host_.reset(ChildProcessHost::Create(this));
- child_process_host_->AddFilter(new TraceMessageFilter);
- child_process_host_->AddFilter(new ProfilerMessageFilter(process_type));
- child_process_host_->AddFilter(new HistogramMessageFilter());
+ AddFilter(new TraceMessageFilter);
+ AddFilter(new ProfilerMessageFilter(process_type));
+ AddFilter(new HistogramMessageFilter);
g_child_process_list.Get().push_back(this);
GetContentClient()->browser()->BrowserChildProcessHostCreated(this);
@@ -218,6 +218,10 @@ void BrowserChildProcessHostImpl::SetTerminateChildOnShutdown(
child_process_->SetTerminateChildOnShutdown(terminate_on_shutdown);
}
+void BrowserChildProcessHostImpl::AddFilter(BrowserMessageFilter* filter) {
+ child_process_host_->AddFilter(filter->GetFilter());
+}
+
void BrowserChildProcessHostImpl::NotifyProcessInstanceCreated(
const ChildProcessData& data) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
diff --git a/content/browser/browser_child_process_host_impl.h b/content/browser/browser_child_process_host_impl.h
index 7540209..6345595 100644
--- a/content/browser/browser_child_process_host_impl.h
+++ b/content/browser/browser_child_process_host_impl.h
@@ -21,6 +21,7 @@ namespace content {
class BrowserChildProcessHostIterator;
class BrowserChildProcessObserver;
+class BrowserMessageFilter;
// Plugins/workers and other child processes that live on the IO thread use this
// class. RenderProcessHostImpl is the main exception that doesn't use this
@@ -70,6 +71,9 @@ class CONTENT_EXPORT BrowserChildProcessHostImpl
// shutdown. Default is to always terminate.
void SetTerminateChildOnShutdown(bool terminate_on_shutdown);
+ // Adds an IPC message filter.
+ void AddFilter(BrowserMessageFilter* filter);
+
// Called when an instance of a particular child is created in a page.
static void NotifyProcessInstanceCreated(const ChildProcessData& data);
diff --git a/content/browser/dom_storage/dom_storage_message_filter.cc b/content/browser/dom_storage/dom_storage_message_filter.cc
index 52aabe1..7b62529 100644
--- a/content/browser/dom_storage/dom_storage_message_filter.cc
+++ b/content/browser/dom_storage/dom_storage_message_filter.cc
@@ -46,8 +46,6 @@ void DOMStorageMessageFilter::UninitializeInSequence() {
}
void DOMStorageMessageFilter::OnFilterAdded(IPC::Channel* channel) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- BrowserMessageFilter::OnFilterAdded(channel);
context_->task_runner()->PostShutdownBlockingTask(
FROM_HERE,
DOMStorageTaskRunner::PRIMARY_SEQUENCE,
@@ -55,8 +53,6 @@ void DOMStorageMessageFilter::OnFilterAdded(IPC::Channel* channel) {
}
void DOMStorageMessageFilter::OnFilterRemoved() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- BrowserMessageFilter::OnFilterRemoved();
context_->task_runner()->PostShutdownBlockingTask(
FROM_HERE,
DOMStorageTaskRunner::PRIMARY_SEQUENCE,
diff --git a/content/browser/fileapi/fileapi_message_filter.cc b/content/browser/fileapi/fileapi_message_filter.cc
index ecef755..7277a3b 100644
--- a/content/browser/fileapi/fileapi_message_filter.cc
+++ b/content/browser/fileapi/fileapi_message_filter.cc
@@ -107,7 +107,6 @@ FileAPIMessageFilter::FileAPIMessageFilter(
void FileAPIMessageFilter::OnChannelConnected(int32 peer_pid) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- BrowserMessageFilter::OnChannelConnected(peer_pid);
if (request_context_getter_.get()) {
DCHECK(!request_context_);
@@ -124,7 +123,6 @@ void FileAPIMessageFilter::OnChannelConnected(int32 peer_pid) {
void FileAPIMessageFilter::OnChannelClosing() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- BrowserMessageFilter::OnChannelClosing();
// Unregister all the blob and stream URLs that are previously registered in
// this process.
diff --git a/content/browser/fileapi/fileapi_message_filter_unittest.cc b/content/browser/fileapi/fileapi_message_filter_unittest.cc
index 90e422c..288ffa1 100644
--- a/content/browser/fileapi/fileapi_message_filter_unittest.cc
+++ b/content/browser/fileapi/fileapi_message_filter_unittest.cc
@@ -76,12 +76,10 @@ class FileAPIMessageFilterTest : public testing::Test {
}
// Tests via OnMessageReceived(const IPC::Message&). The channel proxy calls
- // this method. Since OnMessageReceived is hidden on FileAPIMessageFilter,
- // we need to cast it.
+ // this method.
bool InvokeOnMessageReceived(const IPC::Message& message) {
- IPC::ChannelProxy::MessageFilter* casted_filter =
- static_cast<IPC::ChannelProxy::MessageFilter*>(filter_.get());
- return casted_filter->OnMessageReceived(message);
+ bool message_was_ok;
+ return filter_->OnMessageReceived(message, &message_was_ok);
}
base::MessageLoop message_loop_;
@@ -108,13 +106,11 @@ TEST_F(FileAPIMessageFilterTest, CloseChannelWithInflightRequest) {
// Complete initialization.
message_loop_.RunUntilIdle();
- IPC::ChannelProxy::MessageFilter* casted_filter =
- static_cast<IPC::ChannelProxy::MessageFilter*>(filter.get());
-
int request_id = 0;
const GURL kUrl("filesystem:http://example.com/temporary/foo");
FileSystemHostMsg_ReadMetadata read_metadata(request_id++, kUrl);
- EXPECT_TRUE(casted_filter->OnMessageReceived(read_metadata));
+ bool message_was_ok;
+ EXPECT_TRUE(filter->OnMessageReceived(read_metadata, &message_was_ok));
// Close the filter while it has inflight request.
filter->OnChannelClosing();
@@ -144,13 +140,11 @@ TEST_F(FileAPIMessageFilterTest, MultipleFilters) {
// Complete initialization.
message_loop_.RunUntilIdle();
- IPC::ChannelProxy::MessageFilter* casted_filter =
- static_cast<IPC::ChannelProxy::MessageFilter*>(filter1.get());
-
int request_id = 0;
const GURL kUrl("filesystem:http://example.com/temporary/foo");
FileSystemHostMsg_ReadMetadata read_metadata(request_id++, kUrl);
- EXPECT_TRUE(casted_filter->OnMessageReceived(read_metadata));
+ bool message_was_ok;
+ EXPECT_TRUE(filter1->OnMessageReceived(read_metadata, &message_was_ok));
// Close the other filter before the request for filter1 is processed.
filter2->OnChannelClosing();
@@ -251,8 +245,7 @@ TEST_F(FileAPIMessageFilterTest, BuildStreamWithSharedMemory) {
// OnAppendSharedMemoryToStream passes the peer process's handle to
// SharedMemory's constructor. If it's incorrect, DuplicateHandle won't work
// correctly.
- static_cast<IPC::ChannelProxy::MessageFilter*>(
- filter_.get())->OnChannelConnected(base::Process::Current().pid());
+ filter_->set_peer_pid_for_testing(base::Process::Current().pid());
StreamHostMsg_StartBuilding start_message(kUrl, kFakeContentType);
EXPECT_TRUE(InvokeOnMessageReceived(start_message));
diff --git a/content/browser/histogram_message_filter.cc b/content/browser/histogram_message_filter.cc
index d46b96b..f44accdc 100644
--- a/content/browser/histogram_message_filter.cc
+++ b/content/browser/histogram_message_filter.cc
@@ -16,10 +16,6 @@ namespace content {
HistogramMessageFilter::HistogramMessageFilter() {}
-void HistogramMessageFilter::OnChannelConnected(int32 peer_pid) {
- BrowserMessageFilter::OnChannelConnected(peer_pid);
-}
-
bool HistogramMessageFilter::OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) {
bool handled = true;
diff --git a/content/browser/histogram_message_filter.h b/content/browser/histogram_message_filter.h
index 2118d4a..64c13cb 100644
--- a/content/browser/histogram_message_filter.h
+++ b/content/browser/histogram_message_filter.h
@@ -19,9 +19,6 @@ class HistogramMessageFilter : public BrowserMessageFilter {
HistogramMessageFilter();
// BrowserMessageFilter implementation.
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
-
- // BrowserMessageFilter implementation.
virtual bool OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) OVERRIDE;
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc
index 1cbc4b8..86277ec 100644
--- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc
+++ b/content/browser/indexed_db/indexed_db_dispatcher_host.cc
@@ -44,8 +44,6 @@ IndexedDBDispatcherHost::IndexedDBDispatcherHost(
IndexedDBDispatcherHost::~IndexedDBDispatcherHost() {}
void IndexedDBDispatcherHost::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
bool success = indexed_db_context_->TaskRunner()->PostTask(
FROM_HERE,
base::Bind(&IndexedDBDispatcherHost::ResetDispatcherHosts, this));
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index 449b515..75f3c7b 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -176,7 +176,7 @@ class ForwardingFilter : public ResourceMessageFilter {
base::Unretained(this))),
dest_(dest),
resource_context_(resource_context) {
- OnChannelConnected(base::GetCurrentProcId());
+ set_peer_pid_for_testing(base::GetCurrentProcId());
}
// ResourceMessageFilter override
@@ -1804,9 +1804,6 @@ TEST_F(ResourceDispatcherHostTest, TransferNavigationWithProcessCrash) {
// Make sure we don't hold onto the ResourceMessageFilter after it is deleted.
GlobalRequestID first_global_request_id(first_child_id, request_id);
- const ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(
- host_.GetURLRequest(first_global_request_id));
- EXPECT_FALSE(info->filter());
// This second filter is used to emulate a second process.
scoped_refptr<ForwardingFilter> second_filter = new ForwardingFilter(
diff --git a/content/browser/loader/resource_message_filter.cc b/content/browser/loader/resource_message_filter.cc
index c55f2d1..c3f30ff 100644
--- a/content/browser/loader/resource_message_filter.cc
+++ b/content/browser/loader/resource_message_filter.cc
@@ -32,8 +32,6 @@ ResourceMessageFilter::~ResourceMessageFilter() {
}
void ResourceMessageFilter::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
// Unhook us from all pending network requests so they don't get sent to a
// deleted object.
ResourceDispatcherHostImpl::Get()->CancelRequestsForProcess(child_id_);
diff --git a/content/browser/plugin_process_host.cc b/content/browser/plugin_process_host.cc
index 86d3134..e22b32f 100644
--- a/content/browser/plugin_process_host.cc
+++ b/content/browser/plugin_process_host.cc
@@ -265,7 +265,7 @@ bool PluginProcessHost::Init(const WebPluginInfo& info) {
ResourceMessageFilter* resource_message_filter = new ResourceMessageFilter(
process_->GetData().id, PROCESS_TYPE_PLUGIN, NULL, NULL, NULL,
get_contexts_callback);
- process_->GetHost()->AddFilter(resource_message_filter);
+ process_->AddFilter(resource_message_filter);
return true;
}
@@ -275,10 +275,6 @@ void PluginProcessHost::ForceShutdown() {
process_->ForceShutdown();
}
-void PluginProcessHost::AddFilter(IPC::ChannelProxy::MessageFilter* filter) {
- process_->GetHost()->AddFilter(filter);
-}
-
bool PluginProcessHost::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PluginProcessHost, msg)
diff --git a/content/browser/plugin_process_host.h b/content/browser/plugin_process_host.h
index 75c667d..0b60062 100644
--- a/content/browser/plugin_process_host.h
+++ b/content/browser/plugin_process_host.h
@@ -120,9 +120,6 @@ class CONTENT_EXPORT PluginProcessHost : public BrowserChildProcessHostDelegate,
void AddWindow(HWND window);
#endif
- // Adds an IPC message filter. A reference will be kept to the filter.
- void AddFilter(IPC::ChannelProxy::MessageFilter* filter);
-
private:
// Sends a message to the plugin process to request creation of a new channel
// for the given mime type.
diff --git a/content/browser/ppapi_plugin_process_host.cc b/content/browser/ppapi_plugin_process_host.cc
index ecbbfd6..e42d5499 100644
--- a/content/browser/ppapi_plugin_process_host.cc
+++ b/content/browser/ppapi_plugin_process_host.cc
@@ -218,7 +218,7 @@ PpapiPluginProcessHost::PpapiPluginProcessHost(
false));
filter_ = new PepperMessageFilter();
- process_->GetHost()->AddFilter(filter_.get());
+ process_->AddFilter(filter_.get());
process_->GetHost()->AddFilter(host_impl_->message_filter().get());
GetContentClient()->browser()->DidCreatePpapiPlugin(host_impl_.get());
diff --git a/content/browser/profiler_message_filter.cc b/content/browser/profiler_message_filter.cc
index cb30f25..adea8e7 100644
--- a/content/browser/profiler_message_filter.cc
+++ b/content/browser/profiler_message_filter.cc
@@ -16,8 +16,6 @@ ProfilerMessageFilter::ProfilerMessageFilter(int process_type)
}
void ProfilerMessageFilter::OnChannelConnected(int32 peer_pid) {
- BrowserMessageFilter::OnChannelConnected(peer_pid);
-
tracked_objects::ThreadData::Status status =
tracked_objects::ThreadData::status();
Send(new ChildProcessMsg_SetProfilerStatus(status));
diff --git a/content/browser/renderer_host/DEPS b/content/browser/renderer_host/DEPS
index 0848d36..a0f0ecf 100644
--- a/content/browser/renderer_host/DEPS
+++ b/content/browser/renderer_host/DEPS
@@ -9,6 +9,7 @@ include_rules = [
# delegate interfaces.
"-content/browser/web_contents",
"-content/public/browser/web_contents.h",
+ "-content/public/browser/web_contents_delegate.h",
"-content/public/browser/web_contents_view.h",
]
diff --git a/content/browser/renderer_host/database_message_filter.cc b/content/browser/renderer_host/database_message_filter.cc
index 38cc49a..d41be65 100644
--- a/content/browser/renderer_host/database_message_filter.cc
+++ b/content/browser/renderer_host/database_message_filter.cc
@@ -47,7 +47,6 @@ DatabaseMessageFilter::DatabaseMessageFilter(
}
void DatabaseMessageFilter::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
if (observer_added_) {
observer_added_ = false;
BrowserThread::PostTask(
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 1c02109..a04a8cc 100644
--- a/content/browser/renderer_host/media/audio_input_renderer_host.cc
+++ b/content/browser/renderer_host/media/audio_input_renderer_host.cc
@@ -63,8 +63,6 @@ AudioInputRendererHost::~AudioInputRendererHost() {
}
void AudioInputRendererHost::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
// Since the IPC channel is gone, close all requested audio streams.
DeleteEntries();
}
diff --git a/content/browser/renderer_host/media/audio_input_renderer_host.h b/content/browser/renderer_host/media/audio_input_renderer_host.h
index 5df1fc6..122df13 100644
--- a/content/browser/renderer_host/media/audio_input_renderer_host.h
+++ b/content/browser/renderer_host/media/audio_input_renderer_host.h
@@ -79,6 +79,7 @@ class CONTENT_EXPORT AudioInputRendererHost
private:
// TODO(henrika): extend test suite (compare AudioRenderHost)
friend class BrowserThread;
+ friend class TestAudioInputRendererHost;
friend class base::DeleteHelper<AudioInputRendererHost>;
struct AudioEntry;
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc
index c09dc6c..1181fbe 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host.cc
@@ -128,10 +128,6 @@ AudioRendererHost::~AudioRendererHost() {
}
void AudioRendererHost::OnChannelClosing() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- BrowserMessageFilter::OnChannelClosing();
-
// Since the IPC channel is gone, close all requested audio streams.
while (!audio_entries_.empty()) {
// Note: OnCloseStream() removes the entries from audio_entries_.
diff --git a/content/browser/renderer_host/media/audio_renderer_host.h b/content/browser/renderer_host/media/audio_renderer_host.h
index 47dbee9..486d55f 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.h
+++ b/content/browser/renderer_host/media/audio_renderer_host.h
@@ -83,6 +83,7 @@ class CONTENT_EXPORT AudioRendererHost : public BrowserMessageFilter {
friend class BrowserThread;
friend class base::DeleteHelper<AudioRendererHost>;
friend class MockAudioRendererHost;
+ friend class TestAudioRendererHost;
FRIEND_TEST_ALL_PREFIXES(AudioRendererHostTest, CreateMockStream);
FRIEND_TEST_ALL_PREFIXES(AudioRendererHostTest, MockStreamDataConversation);
diff --git a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
index 26c0963..ac837c2 100644
--- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
@@ -179,7 +179,7 @@ class AudioRendererHostTest : public testing::Test {
media_stream_manager_.get());
// Simulate IPC channel connected.
- host_->OnChannelConnected(base::GetCurrentProcId());
+ host_->set_peer_pid_for_testing(base::GetCurrentProcId());
}
virtual void TearDown() {
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 1ebfa1a..56fdff4 100644
--- a/content/browser/renderer_host/media/device_request_message_filter.cc
+++ b/content/browser/renderer_host/media/device_request_message_filter.cc
@@ -146,8 +146,6 @@ bool DeviceRequestMessageFilter::OnMessageReceived(const IPC::Message& message,
}
void DeviceRequestMessageFilter::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
// Since the IPC channel is gone, cancel outstanding device requests.
for (DeviceRequestList::iterator it = requests_.begin();
it != requests_.end();
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 ebc4d89..cb0af34 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -125,7 +125,6 @@ bool MediaStreamDispatcherHost::OnMessageReceived(
}
void MediaStreamDispatcherHost::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
DVLOG(1) << "MediaStreamDispatcherHost::OnChannelClosing";
// Since the IPC channel is gone, close all requesting/requested streams.
diff --git a/content/browser/renderer_host/media/midi_host.cc b/content/browser/renderer_host/media/midi_host.cc
index 0467404..934d5a2 100644
--- a/content/browser/renderer_host/media/midi_host.cc
+++ b/content/browser/renderer_host/media/midi_host.cc
@@ -46,12 +46,6 @@ MIDIHost::~MIDIHost() {
midi_manager_->EndSession(this);
}
-void MIDIHost::OnChannelClosing() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
- BrowserMessageFilter::OnChannelClosing();
-}
-
void MIDIHost::OnDestruct() const {
BrowserThread::DeleteOnIOThread::Destruct(this);
}
diff --git a/content/browser/renderer_host/media/midi_host.h b/content/browser/renderer_host/media/midi_host.h
index 944325d..e3b9df1 100644
--- a/content/browser/renderer_host/media/midi_host.h
+++ b/content/browser/renderer_host/media/midi_host.h
@@ -28,7 +28,6 @@ class CONTENT_EXPORT MIDIHost
MIDIHost(int renderer_process_id, media::MIDIManager* midi_manager);
// BrowserMessageFilter implementation.
- virtual void OnChannelClosing() OVERRIDE;
virtual void OnDestruct() const OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message,
bool* message_was_ok) OVERRIDE;
diff --git a/content/browser/renderer_host/media/video_capture_host.cc b/content/browser/renderer_host/media/video_capture_host.cc
index 7ed77ae..1c22199 100644
--- a/content/browser/renderer_host/media/video_capture_host.cc
+++ b/content/browser/renderer_host/media/video_capture_host.cc
@@ -20,8 +20,6 @@ VideoCaptureHost::VideoCaptureHost(MediaStreamManager* media_stream_manager)
VideoCaptureHost::~VideoCaptureHost() {}
void VideoCaptureHost::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
// Since the IPC channel is gone, close all requested VideoCaptureDevices.
for (EntryMap::iterator it = entries_.begin(); it != entries_.end(); it++) {
const base::WeakPtr<VideoCaptureController>& controller = it->second;
diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
index d1a60b4..21463a1 100644
--- a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
+++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
@@ -94,8 +94,6 @@ P2PSocketDispatcherHost::P2PSocketDispatcherHost(
}
void P2PSocketDispatcherHost::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
// Since the IPC channel is gone, close pending connections.
STLDeleteContainerPairSecondPointers(sockets_.begin(), sockets_.end());
sockets_.clear();
diff --git a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
index db3f8ef..8fca534 100644
--- a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
+++ b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.cc
@@ -30,9 +30,9 @@ BrowserPpapiHost* BrowserPpapiHost::CreateExternalPluginProcess(
scoped_refptr<PepperMessageFilter> pepper_message_filter(
new PepperMessageFilter());
- channel->AddFilter(pepper_message_filter);
- channel->AddFilter(browser_ppapi_host->message_filter().get());
- channel->AddFilter(new TraceMessageFilter());
+ channel->AddFilter(pepper_message_filter->GetFilter());
+ channel->AddFilter(browser_ppapi_host->message_filter());
+ channel->AddFilter((new TraceMessageFilter())->GetFilter());
return browser_ppapi_host;
}
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc
index 29e1e1f..e78ea69 100644
--- a/content/browser/renderer_host/render_message_filter.cc
+++ b/content/browser/renderer_host/render_message_filter.cc
@@ -321,7 +321,6 @@ RenderMessageFilter::~RenderMessageFilter() {
}
void RenderMessageFilter::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
#if defined(ENABLE_PLUGINS)
for (std::set<OpenChannelToNpapiPluginCallback*>::iterator it =
plugin_host_clients_.begin(); it != plugin_host_clients_.end(); ++it) {
@@ -342,7 +341,6 @@ void RenderMessageFilter::OnChannelClosing() {
}
void RenderMessageFilter::OnChannelConnected(int32 peer_id) {
- BrowserMessageFilter::OnChannelConnected(peer_id);
base::ProcessHandle handle = PeerHandle();
#if defined(OS_MACOSX)
process_metrics_.reset(base::ProcessMetrics::CreateProcessMetrics(handle,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 6e6a92e..0a2dcb5 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -531,7 +531,7 @@ bool RenderProcessHostImpl::Init() {
void RenderProcessHostImpl::CreateMessageFilters() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- channel_->AddFilter(new ResourceSchedulerFilter(GetID()));
+ AddFilter(new ResourceSchedulerFilter(GetID()));
MediaInternals* media_internals = MediaInternals::GetInstance();;
media::AudioManager* audio_manager =
BrowserMainLoop::GetInstance()->audio_manager();
@@ -540,7 +540,7 @@ void RenderProcessHostImpl::CreateMessageFilters() {
if (supports_browser_plugin_) {
scoped_refptr<BrowserPluginMessageFilter> bp_message_filter(
new BrowserPluginMessageFilter(GetID(), IsGuest()));
- channel_->AddFilter(bp_message_filter.get());
+ AddFilter(bp_message_filter.get());
}
scoped_refptr<RenderMessageFilter> render_message_filter(
@@ -558,7 +558,7 @@ void RenderProcessHostImpl::CreateMessageFilters() {
audio_manager,
media_internals,
storage_partition_impl_->GetDOMStorageContext()));
- channel_->AddFilter(render_message_filter.get());
+ AddFilter(render_message_filter.get());
BrowserContext* browser_context = GetBrowserContext();
ResourceContext* resource_context = browser_context->GetResourceContext();
@@ -578,86 +578,86 @@ void RenderProcessHostImpl::CreateMessageFilters() {
storage_partition_impl_->GetFileSystemContext(),
get_contexts_callback);
- channel_->AddFilter(resource_message_filter);
+ AddFilter(resource_message_filter);
MediaStreamManager* media_stream_manager =
BrowserMainLoop::GetInstance()->media_stream_manager();
- channel_->AddFilter(new AudioInputRendererHost(
+ AddFilter(new AudioInputRendererHost(
audio_manager,
media_stream_manager,
BrowserMainLoop::GetInstance()->audio_mirroring_manager(),
BrowserMainLoop::GetInstance()->user_input_monitor()));
- channel_->AddFilter(new AudioRendererHost(
+ AddFilter(new AudioRendererHost(
GetID(),
audio_manager,
BrowserMainLoop::GetInstance()->audio_mirroring_manager(),
media_internals,
media_stream_manager));
- channel_->AddFilter(
+ AddFilter(
new MIDIHost(GetID(), BrowserMainLoop::GetInstance()->midi_manager()));
- channel_->AddFilter(new MIDIDispatcherHost(GetID(), browser_context));
- channel_->AddFilter(new VideoCaptureHost(media_stream_manager));
- channel_->AddFilter(new AppCacheDispatcherHost(
+ AddFilter(new MIDIDispatcherHost(GetID(), browser_context));
+ AddFilter(new VideoCaptureHost(media_stream_manager));
+ AddFilter(new AppCacheDispatcherHost(
storage_partition_impl_->GetAppCacheService(),
GetID()));
- channel_->AddFilter(new ClipboardMessageFilter);
- channel_->AddFilter(new DOMStorageMessageFilter(
+ AddFilter(new ClipboardMessageFilter);
+ AddFilter(new DOMStorageMessageFilter(
GetID(),
storage_partition_impl_->GetDOMStorageContext()));
- channel_->AddFilter(new IndexedDBDispatcherHost(
+ AddFilter(new IndexedDBDispatcherHost(
GetID(),
storage_partition_impl_->GetIndexedDBContext()));
- channel_->AddFilter(new ServiceWorkerDispatcherHost(
+ AddFilter(new ServiceWorkerDispatcherHost(
storage_partition_impl_->GetServiceWorkerContext()));
if (IsGuest()) {
if (!g_browser_plugin_geolocation_context.Get().get()) {
g_browser_plugin_geolocation_context.Get() =
new BrowserPluginGeolocationPermissionContext();
}
- channel_->AddFilter(GeolocationDispatcherHost::New(
+ AddFilter(GeolocationDispatcherHost::New(
GetID(), g_browser_plugin_geolocation_context.Get().get()));
} else {
- channel_->AddFilter(GeolocationDispatcherHost::New(
+ AddFilter(GeolocationDispatcherHost::New(
GetID(), browser_context->GetGeolocationPermissionContext()));
}
gpu_message_filter_ = new GpuMessageFilter(GetID(), widget_helper_.get());
- channel_->AddFilter(gpu_message_filter_);
+ AddFilter(gpu_message_filter_);
#if defined(ENABLE_WEBRTC)
- channel_->AddFilter(new WebRTCIdentityServiceHost(
+ AddFilter(new WebRTCIdentityServiceHost(
GetID(), storage_partition_impl_->GetWebRTCIdentityStore()));
peer_connection_tracker_host_ = new PeerConnectionTrackerHost(GetID());
- channel_->AddFilter(peer_connection_tracker_host_.get());
- channel_->AddFilter(new MediaStreamDispatcherHost(
+ AddFilter(peer_connection_tracker_host_.get());
+ AddFilter(new MediaStreamDispatcherHost(
GetID(), media_stream_manager));
- channel_->AddFilter(
+ AddFilter(
new DeviceRequestMessageFilter(resource_context, media_stream_manager));
#endif
#if defined(ENABLE_PLUGINS)
- channel_->AddFilter(new PepperRendererConnection(GetID()));
+ AddFilter(new PepperRendererConnection(GetID()));
#endif
#if defined(ENABLE_INPUT_SPEECH)
- channel_->AddFilter(new InputTagSpeechDispatcherHost(
+ AddFilter(new InputTagSpeechDispatcherHost(
IsGuest(), GetID(), storage_partition_impl_->GetURLRequestContext()));
#endif
- channel_->AddFilter(new SpeechRecognitionDispatcherHost(
+ AddFilter(new SpeechRecognitionDispatcherHost(
GetID(), storage_partition_impl_->GetURLRequestContext()));
- channel_->AddFilter(new FileAPIMessageFilter(
+ AddFilter(new FileAPIMessageFilter(
GetID(),
storage_partition_impl_->GetURLRequestContext(),
storage_partition_impl_->GetFileSystemContext(),
ChromeBlobStorageContext::GetFor(browser_context),
StreamContext::GetFor(browser_context)));
- channel_->AddFilter(new OrientationMessageFilter());
- channel_->AddFilter(new FileUtilitiesMessageFilter(GetID()));
- channel_->AddFilter(new MimeRegistryMessageFilter());
- channel_->AddFilter(new DatabaseMessageFilter(
+ AddFilter(new OrientationMessageFilter());
+ AddFilter(new FileUtilitiesMessageFilter(GetID()));
+ AddFilter(new MimeRegistryMessageFilter());
+ AddFilter(new DatabaseMessageFilter(
storage_partition_impl_->GetDatabaseTracker()));
#if defined(OS_MACOSX)
- channel_->AddFilter(new TextInputClientMessageFilter(GetID()));
+ AddFilter(new TextInputClientMessageFilter(GetID()));
#elif defined(OS_WIN)
channel_->AddFilter(new FontCacheDispatcher());
#elif defined(OS_ANDROID)
browser_demuxer_android_ = new BrowserDemuxerAndroid();
- channel_->AddFilter(browser_demuxer_android_);
+ AddFilter(browser_demuxer_android_);
#endif
SocketStreamDispatcherHost::GetRequestContextCallback
@@ -668,9 +668,9 @@ void RenderProcessHostImpl::CreateMessageFilters() {
SocketStreamDispatcherHost* socket_stream_dispatcher_host =
new SocketStreamDispatcherHost(
GetID(), request_context_callback, resource_context);
- channel_->AddFilter(socket_stream_dispatcher_host);
+ AddFilter(socket_stream_dispatcher_host);
- channel_->AddFilter(new WorkerMessageFilter(
+ AddFilter(new WorkerMessageFilter(
GetID(),
resource_context,
WorkerStoragePartition(
@@ -685,30 +685,30 @@ void RenderProcessHostImpl::CreateMessageFilters() {
base::Unretained(widget_helper_.get()))));
#if defined(ENABLE_WEBRTC)
- channel_->AddFilter(new P2PSocketDispatcherHost(
+ AddFilter(new P2PSocketDispatcherHost(
resource_context,
browser_context->GetRequestContextForRenderProcess(GetID())));
#endif
- channel_->AddFilter(new TraceMessageFilter());
- channel_->AddFilter(new ResolveProxyMsgHelper(
+ AddFilter(new TraceMessageFilter());
+ AddFilter(new ResolveProxyMsgHelper(
browser_context->GetRequestContextForRenderProcess(GetID())));
- channel_->AddFilter(new QuotaDispatcherHost(
+ AddFilter(new QuotaDispatcherHost(
GetID(),
storage_partition_impl_->GetQuotaManager(),
GetContentClient()->browser()->CreateQuotaPermissionContext()));
- channel_->AddFilter(new GamepadBrowserMessageFilter());
- channel_->AddFilter(new DeviceMotionMessageFilter());
- channel_->AddFilter(new DeviceOrientationMessageFilter());
- channel_->AddFilter(new ProfilerMessageFilter(PROCESS_TYPE_RENDERER));
- channel_->AddFilter(new HistogramMessageFilter());
+ AddFilter(new GamepadBrowserMessageFilter());
+ AddFilter(new DeviceMotionMessageFilter());
+ AddFilter(new DeviceOrientationMessageFilter());
+ AddFilter(new ProfilerMessageFilter(PROCESS_TYPE_RENDERER));
+ AddFilter(new HistogramMessageFilter());
#if defined(USE_TCMALLOC) && (defined(OS_LINUX) || defined(OS_ANDROID))
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableMemoryBenchmarking))
- channel_->AddFilter(new MemoryBenchmarkMessageFilter());
+ AddFilter(new MemoryBenchmarkMessageFilter());
#endif
#if defined(OS_ANDROID)
- channel_->AddFilter(new VibrationMessageFilter());
+ AddFilter(new VibrationMessageFilter());
#endif
}
@@ -1377,6 +1377,10 @@ IPC::ChannelProxy* RenderProcessHostImpl::GetChannel() {
return channel_.get();
}
+void RenderProcessHostImpl::AddFilter(BrowserMessageFilter* filter) {
+ channel_->AddFilter(filter->GetFilter());
+}
+
bool RenderProcessHostImpl::FastShutdownForPageCount(size_t count) {
if (static_cast<size_t>(GetActiveViewCount()) == count)
return FastShutdownIfPossible();
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 0e9ae1b..567b629b 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -107,6 +107,7 @@ class CONTENT_EXPORT RenderProcessHostImpl
virtual void SetSuddenTerminationAllowed(bool enabled) OVERRIDE;
virtual bool SuddenTerminationAllowed() const OVERRIDE;
virtual IPC::ChannelProxy* GetChannel() OVERRIDE;
+ virtual void AddFilter(BrowserMessageFilter* filter) OVERRIDE;
virtual bool FastShutdownForPageCount(size_t count) OVERRIDE;
virtual bool FastShutdownStarted() const OVERRIDE;
virtual base::TimeDelta GetChildProcessIdleTime() const OVERRIDE;
diff --git a/content/browser/resolve_proxy_msg_helper_unittest.cc b/content/browser/resolve_proxy_msg_helper_unittest.cc
index 628df86..91f0243 100644
--- a/content/browser/resolve_proxy_msg_helper_unittest.cc
+++ b/content/browser/resolve_proxy_msg_helper_unittest.cc
@@ -27,6 +27,25 @@ class MockProxyConfigService : public net::ProxyConfigService {
}
};
+class TestResolveProxyMsgHelper : public ResolveProxyMsgHelper {
+ public:
+ TestResolveProxyMsgHelper(
+ net::ProxyService* proxy_service,
+ IPC::Listener* listener)
+ : ResolveProxyMsgHelper(proxy_service),
+ listener_(listener) {}
+ virtual bool Send(IPC::Message* message) OVERRIDE {
+ listener_->OnMessageReceived(*message);
+ delete message;
+ return true;
+ }
+
+ protected:
+ virtual ~TestResolveProxyMsgHelper() {}
+
+ IPC::Listener* listener_;
+};
+
class ResolveProxyMsgHelperTest : public testing::Test, public IPC::Listener {
public:
struct PendingResult {
@@ -43,11 +62,10 @@ class ResolveProxyMsgHelperTest : public testing::Test, public IPC::Listener {
: resolver_(new net::MockAsyncProxyResolver),
service_(
new net::ProxyService(new MockProxyConfigService, resolver_, NULL)),
- helper_(new ResolveProxyMsgHelper(service_.get())),
+ helper_(new TestResolveProxyMsgHelper(service_.get(), this)),
message_loop_(base::MessageLoop::TYPE_IO),
io_thread_(BrowserThread::IO, &message_loop_) {
test_sink_.AddFilter(this);
- helper_->OnFilterAdded(&test_sink_);
}
protected:
diff --git a/content/browser/tracing/trace_message_filter.cc b/content/browser/tracing/trace_message_filter.cc
index e75d786..b77c908 100644
--- a/content/browser/tracing/trace_message_filter.cc
+++ b/content/browser/tracing/trace_message_filter.cc
@@ -15,15 +15,7 @@ TraceMessageFilter::TraceMessageFilter() :
is_awaiting_buffer_percent_full_ack_(false) {
}
-void TraceMessageFilter::OnFilterAdded(IPC::Channel* channel) {
- // Always on IO thread (BrowserMessageFilter guarantee).
- BrowserMessageFilter::OnFilterAdded(channel);
-}
-
void TraceMessageFilter::OnChannelClosing() {
- // Always on IO thread (BrowserMessageFilter guarantee).
- BrowserMessageFilter::OnChannelClosing();
-
if (has_child_) {
if (is_awaiting_end_ack_)
OnEndTracingAck(std::vector<std::string>());
diff --git a/content/browser/tracing/trace_message_filter.h b/content/browser/tracing/trace_message_filter.h
index 41fd017..9f97184 100644
--- a/content/browser/tracing/trace_message_filter.h
+++ b/content/browser/tracing/trace_message_filter.h
@@ -20,9 +20,6 @@ class TraceMessageFilter : public BrowserMessageFilter {
public:
TraceMessageFilter();
- // BrowserMessageFilter override.
- virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE;
-
// BrowserMessageFilter implementation.
virtual void OnChannelClosing() OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message,
diff --git a/content/browser/worker_host/worker_message_filter.cc b/content/browser/worker_host/worker_message_filter.cc
index faedbdc..6631de3 100644
--- a/content/browser/worker_host/worker_message_filter.cc
+++ b/content/browser/worker_host/worker_message_filter.cc
@@ -30,8 +30,6 @@ WorkerMessageFilter::~WorkerMessageFilter() {
}
void WorkerMessageFilter::OnChannelClosing() {
- BrowserMessageFilter::OnChannelClosing();
-
MessagePortService::GetInstance()->OnWorkerMessageFilterClosing(this);
WorkerServiceImpl::GetInstance()->OnWorkerMessageFilterClosing(this);
}
diff --git a/content/browser/worker_host/worker_process_host.cc b/content/browser/worker_host/worker_process_host.cc
index a228f9c..7145af3 100644
--- a/content/browser/worker_host/worker_process_host.cc
+++ b/content/browser/worker_host/worker_process_host.cc
@@ -221,27 +221,26 @@ void WorkerProcessHost::CreateMessageFilters(int render_process_id) {
blob_storage_context,
partition_.filesystem_context(),
get_contexts_callback);
- process_->GetHost()->AddFilter(resource_message_filter);
+ process_->AddFilter(resource_message_filter);
worker_message_filter_ = new WorkerMessageFilter(
render_process_id, resource_context_, partition_,
base::Bind(&WorkerServiceImpl::next_worker_route_id,
base::Unretained(WorkerServiceImpl::GetInstance())));
- process_->GetHost()->AddFilter(worker_message_filter_.get());
- process_->GetHost()->AddFilter(new AppCacheDispatcherHost(
+ process_->AddFilter(worker_message_filter_.get());
+ process_->AddFilter(new AppCacheDispatcherHost(
partition_.appcache_service(), process_->GetData().id));
- process_->GetHost()->AddFilter(new FileAPIMessageFilter(
+ process_->AddFilter(new FileAPIMessageFilter(
process_->GetData().id,
url_request_context,
partition_.filesystem_context(),
blob_storage_context,
stream_context));
- process_->GetHost()->AddFilter(new FileUtilitiesMessageFilter(
+ process_->AddFilter(new FileUtilitiesMessageFilter(
process_->GetData().id));
- process_->GetHost()->AddFilter(new MimeRegistryMessageFilter());
- process_->GetHost()->AddFilter(
- new DatabaseMessageFilter(partition_.database_tracker()));
- process_->GetHost()->AddFilter(new QuotaDispatcherHost(
+ process_->AddFilter(new MimeRegistryMessageFilter());
+ process_->AddFilter(new DatabaseMessageFilter(partition_.database_tracker()));
+ process_->AddFilter(new QuotaDispatcherHost(
process_->GetData().id,
partition_.quota_manager(),
GetContentClient()->browser()->CreateQuotaPermissionContext()));
@@ -257,10 +256,9 @@ void WorkerProcessHost::CreateMessageFilters(int render_process_id) {
request_context_callback,
resource_context_);
socket_stream_dispatcher_host_ = socket_stream_dispatcher_host;
- process_->GetHost()->AddFilter(socket_stream_dispatcher_host);
- process_->GetHost()->AddFilter(
- new WorkerDevToolsMessageFilter(process_->GetData().id));
- process_->GetHost()->AddFilter(new IndexedDBDispatcherHost(
+ process_->AddFilter(socket_stream_dispatcher_host);
+ process_->AddFilter(new WorkerDevToolsMessageFilter(process_->GetData().id));
+ process_->AddFilter(new IndexedDBDispatcherHost(
process_->GetData().id, partition_.indexed_db_context()));
}
diff --git a/content/public/browser/browser_message_filter.cc b/content/public/browser/browser_message_filter.cc
index 53c0f87..bbc6b13 100644
--- a/content/public/browser/browser_message_filter.cc
+++ b/content/public/browser/browser_message_filter.cc
@@ -18,52 +18,87 @@ using content::BrowserMessageFilter;
namespace content {
-BrowserMessageFilter::BrowserMessageFilter()
- : channel_(NULL),
-#if defined(OS_WIN)
- peer_handle_(base::kNullProcessHandle),
-#endif
- peer_pid_(base::kNullProcessId) {
-}
+class BrowserMessageFilter::Internal : public IPC::ChannelProxy::MessageFilter {
+ public:
+ explicit Internal(BrowserMessageFilter* filter) : filter_(filter) {}
-void BrowserMessageFilter::OnFilterAdded(IPC::Channel* channel) {
- channel_ = channel;
-}
+ private:
+ virtual ~Internal() {}
-void BrowserMessageFilter::OnChannelClosing() {
- channel_ = NULL;
-}
+ // IPC::ChannelProxy::MessageFilter implementation:
+ virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE {
+ filter_->channel_ = channel;
+ filter_->OnFilterAdded(channel);
+ }
-void BrowserMessageFilter::OnChannelConnected(int32 peer_pid) {
- peer_pid_ = peer_pid;
-}
+ virtual void OnFilterRemoved() OVERRIDE {
+ filter_->OnFilterRemoved();
+ }
+
+ virtual void OnChannelClosing() OVERRIDE {
+ filter_->channel_ = NULL;
+ filter_->OnChannelClosing();
+ }
+
+ virtual void OnChannelConnected(int32 peer_pid) OVERRIDE {
+ filter_->peer_pid_ = peer_pid;
+ filter_->OnChannelConnected(peer_pid);
+ }
-bool BrowserMessageFilter::OnMessageReceived(const IPC::Message& message) {
- BrowserThread::ID thread = BrowserThread::IO;
- OverrideThreadForMessage(message, &thread);
-
- if (thread == BrowserThread::IO) {
- scoped_refptr<base::TaskRunner> runner =
- OverrideTaskRunnerForMessage(message);
- if (runner.get()) {
- runner->PostTask(
- FROM_HERE,
- base::Bind(base::IgnoreResult(&BrowserMessageFilter::DispatchMessage),
- this,
- message));
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
+ BrowserThread::ID thread = BrowserThread::IO;
+ filter_->OverrideThreadForMessage(message, &thread);
+
+ if (thread == BrowserThread::IO) {
+ scoped_refptr<base::TaskRunner> runner =
+ filter_->OverrideTaskRunnerForMessage(message);
+ if (runner.get()) {
+ runner->PostTask(
+ FROM_HERE,
+ base::Bind(
+ base::IgnoreResult(&Internal::DispatchMessage), this, message));
+ return true;
+ }
+ return DispatchMessage(message);
+ }
+
+ if (thread == BrowserThread::UI &&
+ !BrowserMessageFilter::CheckCanDispatchOnUI(message, filter_)) {
return true;
}
- return DispatchMessage(message);
- }
- if (thread == BrowserThread::UI && !CheckCanDispatchOnUI(message, this))
+ BrowserThread::PostTask(
+ thread, FROM_HERE,
+ base::Bind(
+ base::IgnoreResult(&Internal::DispatchMessage), this, message));
return true;
+ }
- BrowserThread::PostTask(
- thread, FROM_HERE,
- base::Bind(base::IgnoreResult(&BrowserMessageFilter::DispatchMessage),
- this, message));
- return true;
+ // Dispatches a message to the derived class.
+ bool DispatchMessage(const IPC::Message& message) {
+ bool message_was_ok = true;
+ bool rv = filter_->OnMessageReceived(message, &message_was_ok);
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) <<
+ "Must handle messages that were dispatched to another thread!";
+ if (!message_was_ok) {
+ content::RecordAction(UserMetricsAction("BadMessageTerminate_BMF"));
+ filter_->BadMessageReceived();
+ }
+
+ return rv;
+ }
+
+ scoped_refptr<BrowserMessageFilter> filter_;
+
+ DISALLOW_COPY_AND_ASSIGN(Internal);
+};
+
+BrowserMessageFilter::BrowserMessageFilter()
+ : internal_(NULL), channel_(NULL),
+#if defined(OS_WIN)
+ peer_handle_(base::kNullProcessHandle),
+#endif
+ peer_pid_(base::kNullProcessId) {
}
base::ProcessHandle BrowserMessageFilter::PeerHandle() {
@@ -80,6 +115,11 @@ base::ProcessHandle BrowserMessageFilter::PeerHandle() {
#endif
}
+
+void BrowserMessageFilter::OnDestruct() const {
+ delete this;
+}
+
bool BrowserMessageFilter::Send(IPC::Message* message) {
if (message->is_sync()) {
// We don't support sending synchronous messages from the browser. If we
@@ -106,10 +146,6 @@ bool BrowserMessageFilter::Send(IPC::Message* message) {
return false;
}
-void BrowserMessageFilter::OverrideThreadForMessage(const IPC::Message& message,
- BrowserThread::ID* thread) {
-}
-
base::TaskRunner* BrowserMessageFilter::OverrideTaskRunnerForMessage(
const IPC::Message& message) {
return NULL;
@@ -152,17 +188,12 @@ BrowserMessageFilter::~BrowserMessageFilter() {
#endif
}
-bool BrowserMessageFilter::DispatchMessage(const IPC::Message& message) {
- bool message_was_ok = true;
- bool rv = OnMessageReceived(message, &message_was_ok);
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) || rv) <<
- "Must handle messages that were dispatched to another thread!";
- if (!message_was_ok) {
- content::RecordAction(UserMetricsAction("BadMessageTerminate_BMF"));
- BadMessageReceived();
- }
-
- return rv;
+IPC::ChannelProxy::MessageFilter* BrowserMessageFilter::GetFilter() {
+ // We create this on demand so that if a filter is used in a unit test but
+ // never attached to a channel, we don't leak Internal and this;
+ DCHECK(!internal_) << "Should only be called once.";
+ internal_ = new Internal(this);
+ return internal_;
}
} // namespace content
diff --git a/content/public/browser/browser_message_filter.h b/content/public/browser/browser_message_filter.h
index c997cc6..ad1f069 100644
--- a/content/public/browser/browser_message_filter.h
+++ b/content/public/browser/browser_message_filter.h
@@ -5,6 +5,7 @@
#ifndef CONTENT_PUBLIC_BROWSER_BROWSER_MESSAGE_FILTER_H_
#define CONTENT_PUBLIC_BROWSER_BROWSER_MESSAGE_FILTER_H_
+#include "base/memory/ref_counted.h"
#include "base/process/process.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_thread.h"
@@ -19,22 +20,28 @@ class TaskRunner;
}
namespace content {
+struct BrowserMessageFilterTraits;
// Base class for message filters in the browser process. You can receive and
// send messages on any thread.
class CONTENT_EXPORT BrowserMessageFilter
- : public IPC::ChannelProxy::MessageFilter,
+ : public base::RefCountedThreadSafe<
+ BrowserMessageFilter, BrowserMessageFilterTraits>,
public IPC::Sender {
public:
BrowserMessageFilter();
- // IPC::ChannelProxy::MessageFilter methods. If you override them, make sure
- // to call them as well. These are always called on the IO thread.
- virtual void OnFilterAdded(IPC::Channel* channel) OVERRIDE;
- virtual void OnChannelClosing() OVERRIDE;
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
- // DON'T OVERRIDE THIS! Override the other version below.
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+ // These match the corresponding IPC::ChannelProxy::MessageFilter methods and
+ // are always called on the IO thread.
+ virtual void OnFilterAdded(IPC::Channel* channel) {}
+ virtual void OnFilterRemoved() {}
+ virtual void OnChannelClosing() {}
+ virtual void OnChannelConnected(int32 peer_pid) {}
+
+ // Called when the message filter is about to be deleted. This gives
+ // derived classes the option of controlling which thread they're deleted
+ // on etc.
+ virtual void OnDestruct() const;
// IPC::Sender implementation. Can be called on any thread. Can't send sync
// messages (since we don't want to block the browser on any other process).
@@ -49,7 +56,7 @@ class CONTENT_EXPORT BrowserMessageFilter
// browser thread, change |thread| to the id of the target thread
virtual void OverrideThreadForMessage(
const IPC::Message& message,
- BrowserThread::ID* thread);
+ BrowserThread::ID* thread) {}
// If you want the message to be dispatched via the SequencedWorkerPool,
// return a non-null task runner which will target tasks accordingly.
@@ -71,6 +78,10 @@ class CONTENT_EXPORT BrowserMessageFilter
// Can be called on any thread, after OnChannelConnected is called.
base::ProcessId peer_pid() const { return peer_pid_; }
+ void set_peer_pid_for_testing(base::ProcessId peer_pid) {
+ peer_pid_ = peer_pid;
+ }
+
// Checks that the given message can be dispatched on the UI thread, depending
// on the platform. If not, returns false and an error ot the sender.
static bool CheckCanDispatchOnUI(const IPC::Message& message,
@@ -84,8 +95,24 @@ class CONTENT_EXPORT BrowserMessageFilter
virtual ~BrowserMessageFilter();
private:
- // Dispatches a message to the derived class.
- bool DispatchMessage(const IPC::Message& message);
+ friend class base::RefCountedThreadSafe<BrowserMessageFilter,
+ BrowserMessageFilterTraits>;
+
+ class Internal;
+ friend class BrowserChildProcessHostImpl;
+ friend class BrowserPpapiHost;
+ friend class RenderProcessHostImpl;
+
+ // This is private because the only classes that need access to it are made
+ // friends above. This is only guaranteed to be valid on creation, after that
+ // this class could outlive the filter.
+ IPC::ChannelProxy::MessageFilter* GetFilter();
+
+ // This implements IPC::ChannelProxy::MessageFilter so that we can hide that
+ // from child classes. Internal keeps a reference to this class, which is why
+ // there's a weak pointer back. This class could outlive Internal based on
+ // what the child class does in its OnDestruct method.
+ Internal* internal_;
IPC::Channel* channel_;
base::ProcessId peer_pid_;
@@ -96,6 +123,12 @@ class CONTENT_EXPORT BrowserMessageFilter
#endif
};
+struct BrowserMessageFilterTraits {
+ static void Destruct(const BrowserMessageFilter* filter) {
+ filter->OnDestruct();
+ }
+};
+
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_BROWSER_MESSAGE_FILTER_H_
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h
index 35627c7..4d301c0 100644
--- a/content/public/browser/render_process_host.h
+++ b/content/public/browser/render_process_host.h
@@ -18,17 +18,15 @@
class GURL;
struct ViewMsg_SwapOut_Params;
-namespace content {
-class BrowserContext;
-class RenderWidgetHost;
-class StoragePartition;
-}
-
namespace base {
class TimeDelta;
}
namespace content {
+class BrowserContext;
+class BrowserMessageFilter;
+class RenderWidgetHost;
+class StoragePartition;
typedef base::Thread* (*RendererMainThreadFactoryFunction)(
const std::string& id);
@@ -160,6 +158,9 @@ class CONTENT_EXPORT RenderProcessHost : public IPC::Sender,
// Returns the renderer channel.
virtual IPC::ChannelProxy* GetChannel() = 0;
+ // Adds a message filter to the IPC channel.
+ virtual void AddFilter(BrowserMessageFilter* filter) = 0;
+
// Try to shutdown the associated render process as fast as possible
virtual bool FastShutdownForPageCount(size_t count) = 0;
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc
index 7375048..20f44cc 100644
--- a/content/public/test/mock_render_process_host.cc
+++ b/content/public/test/mock_render_process_host.cc
@@ -205,6 +205,9 @@ IPC::ChannelProxy* MockRenderProcessHost::GetChannel() {
return NULL;
}
+void MockRenderProcessHost::AddFilter(BrowserMessageFilter* filter) {
+}
+
int MockRenderProcessHost::GetActiveViewCount() {
int num_active_views = 0;
scoped_ptr<RenderWidgetHostIterator> widgets(
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h
index 700f63f..a11473a 100644
--- a/content/public/test/mock_render_process_host.h
+++ b/content/public/test/mock_render_process_host.h
@@ -67,6 +67,7 @@ class MockRenderProcessHost : public RenderProcessHost {
virtual bool InSameStoragePartition(
StoragePartition* partition) const OVERRIDE;
virtual IPC::ChannelProxy* GetChannel() OVERRIDE;
+ virtual void AddFilter(BrowserMessageFilter* filter) OVERRIDE;
virtual bool FastShutdownForPageCount(size_t count) OVERRIDE;
virtual base::TimeDelta GetChildProcessIdleTime() const OVERRIDE;
virtual void SurfaceUpdated(int32 surface_id) OVERRIDE;
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 040fce8..0facfaec 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -79,7 +79,7 @@ void ShellContentBrowserClient::RenderProcessHostCreated(
RenderProcessHost* host) {
if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
return;
- host->GetChannel()->AddFilter(new ShellMessageFilter(
+ host->AddFilter(new ShellMessageFilter(
host->GetID(),
BrowserContext::GetDefaultStoragePartition(browser_context())
->GetDatabaseTracker(),
diff --git a/content/test/webrtc_audio_device_test.cc b/content/test/webrtc_audio_device_test.cc
index 9b0a819..605713a 100644
--- a/content/test/webrtc_audio_device_test.cc
+++ b/content/test/webrtc_audio_device_test.cc
@@ -77,6 +77,61 @@ class WebRTCMockRenderProcess : public RenderProcess {
DISALLOW_COPY_AND_ASSIGN(WebRTCMockRenderProcess);
};
+class TestAudioRendererHost : public AudioRendererHost {
+ public:
+ TestAudioRendererHost(
+ int render_process_id,
+ media::AudioManager* audio_manager,
+ AudioMirroringManager* mirroring_manager,
+ MediaInternals* media_internals,
+ MediaStreamManager* media_stream_manager,
+ IPC::Channel* channel)
+ : AudioRendererHost(render_process_id, audio_manager, mirroring_manager,
+ media_internals, media_stream_manager),
+ channel_(channel) {}
+ virtual bool Send(IPC::Message* message) OVERRIDE {
+ if (channel_)
+ return channel_->Send(message);
+ return false;
+ }
+ void ResetChannel() {
+ channel_ = NULL;
+ }
+
+ protected:
+ virtual ~TestAudioRendererHost() {}
+
+ private:
+ IPC::Channel* channel_;
+};
+
+class TestAudioInputRendererHost : public AudioInputRendererHost {
+ public:
+ TestAudioInputRendererHost(
+ media::AudioManager* audio_manager,
+ MediaStreamManager* media_stream_manager,
+ AudioMirroringManager* audio_mirroring_manager,
+ media::UserInputMonitor* user_input_monitor,
+ IPC::Channel* channel)
+ : AudioInputRendererHost(audio_manager, media_stream_manager,
+ audio_mirroring_manager, user_input_monitor),
+ channel_(channel) {}
+ virtual bool Send(IPC::Message* message) OVERRIDE {
+ if (channel_)
+ return channel_->Send(message);
+ return false;
+ }
+ void ResetChannel() {
+ channel_ = NULL;
+ }
+
+ protected:
+ virtual ~TestAudioInputRendererHost() {}
+
+ private:
+ IPC::Channel* channel_;
+};
+
// Utility scoped class to replace the global content client's renderer for the
// duration of the test.
class ReplaceContentClientRenderer {
@@ -258,24 +313,23 @@ void MAYBE_WebRTCAudioDeviceTest::UninitializeIOThread() {
void MAYBE_WebRTCAudioDeviceTest::CreateChannel(const char* name) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ channel_.reset(new IPC::Channel(name, IPC::Channel::MODE_SERVER, this));
+ ASSERT_TRUE(channel_->Connect());
+
static const int kRenderProcessId = 1;
- audio_render_host_ = new AudioRendererHost(
+ audio_render_host_ = new TestAudioRendererHost(
kRenderProcessId, audio_manager_.get(), mirroring_manager_.get(),
- media_internals_.get(), media_stream_manager_.get());
- audio_render_host_->OnChannelConnected(base::GetCurrentProcId());
+ media_internals_.get(), media_stream_manager_.get(), channel_.get());
+ audio_render_host_->set_peer_pid_for_testing(base::GetCurrentProcId());
audio_input_renderer_host_ =
- new AudioInputRendererHost(audio_manager_.get(),
- media_stream_manager_.get(),
- mirroring_manager_.get(),
- NULL);
- audio_input_renderer_host_->OnChannelConnected(base::GetCurrentProcId());
-
- channel_.reset(new IPC::Channel(name, IPC::Channel::MODE_SERVER, this));
- ASSERT_TRUE(channel_->Connect());
-
- audio_render_host_->OnFilterAdded(channel_.get());
- audio_input_renderer_host_->OnFilterAdded(channel_.get());
+ new TestAudioInputRendererHost(audio_manager_.get(),
+ media_stream_manager_.get(),
+ mirroring_manager_.get(),
+ NULL,
+ channel_.get());
+ audio_input_renderer_host_->set_peer_pid_for_testing(
+ base::GetCurrentProcId());
}
void MAYBE_WebRTCAudioDeviceTest::DestroyChannel() {
@@ -284,6 +338,8 @@ void MAYBE_WebRTCAudioDeviceTest::DestroyChannel() {
audio_render_host_->OnFilterRemoved();
audio_input_renderer_host_->OnChannelClosing();
audio_input_renderer_host_->OnFilterRemoved();
+ audio_render_host_->ResetChannel();
+ audio_input_renderer_host_->ResetChannel();
channel_.reset();
audio_render_host_ = NULL;
audio_input_renderer_host_ = NULL;
diff --git a/content/test/webrtc_audio_device_test.h b/content/test/webrtc_audio_device_test.h
index 927e1dc..b22d7d9 100644
--- a/content/test/webrtc_audio_device_test.h
+++ b/content/test/webrtc_audio_device_test.h
@@ -45,13 +45,13 @@ class ScopedCOMInitializer;
namespace content {
-class AudioInputRendererHost;
class AudioMirroringManager;
-class AudioRendererHost;
class ContentRendererClient;
class MediaStreamManager;
class RenderThreadImpl;
class ResourceContext;
+class TestAudioInputRendererHost;
+class TestAudioRendererHost;
class TestBrowserThread;
class WebRtcAudioRenderer;
class WebRTCMockRenderProcess;
@@ -174,8 +174,8 @@ class MAYBE_WebRTCAudioDeviceTest : public ::testing::Test,
scoped_ptr<net::URLRequestContext> test_request_context_;
scoped_ptr<ResourceContext> resource_context_;
scoped_ptr<IPC::Channel> channel_;
- scoped_refptr<AudioRendererHost> audio_render_host_;
- scoped_refptr<AudioInputRendererHost> audio_input_renderer_host_;
+ scoped_refptr<TestAudioRendererHost> audio_render_host_;
+ scoped_refptr<TestAudioInputRendererHost> audio_input_renderer_host_;
media::AudioHardwareConfig* audio_hardware_config_; // Weak reference.