OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ipc/ipc_channel_proxy.h" | 5 #include "ipc/ipc_channel_proxy.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 // Called on the listener's thread | 245 // Called on the listener's thread |
246 void ChannelProxy::Context::AddFilter(MessageFilter* filter) { | 246 void ChannelProxy::Context::AddFilter(MessageFilter* filter) { |
247 base::AutoLock auto_lock(pending_filters_lock_); | 247 base::AutoLock auto_lock(pending_filters_lock_); |
248 pending_filters_.push_back(make_scoped_refptr(filter)); | 248 pending_filters_.push_back(make_scoped_refptr(filter)); |
249 ipc_task_runner_->PostTask( | 249 ipc_task_runner_->PostTask( |
250 FROM_HERE, base::Bind(&Context::OnAddFilter, this)); | 250 FROM_HERE, base::Bind(&Context::OnAddFilter, this)); |
251 } | 251 } |
252 | 252 |
253 // Called on the listener's thread | 253 // Called on the listener's thread |
254 void ChannelProxy::Context::OnDispatchMessage(const Message& message) { | 254 void ChannelProxy::Context::OnDispatchMessage(const Message& message) { |
255 #ifdef IPC_MESSAGE_LOG_ENABLED | 255 #if defined(IPC_MESSAGE_LOG_ENABLED) |
256 Logging* logger = Logging::GetInstance(); | 256 Logging* logger = Logging::GetInstance(); |
257 std::string name; | 257 std::string name; |
258 logger->GetMessageText(message.type(), &name, &message, NULL); | 258 logger->GetMessageText(message.type(), &name, &message, NULL); |
259 TRACE_EVENT1("ipc", "ChannelProxy::Context::OnDispatchMessage", | 259 TRACE_EVENT1("ipc", "ChannelProxy::Context::OnDispatchMessage", |
260 "name", name); | 260 "name", name); |
261 #else | 261 #else |
262 TRACE_EVENT2("ipc", "ChannelProxy::Context::OnDispatchMessage", | 262 TRACE_EVENT2("ipc", "ChannelProxy::Context::OnDispatchMessage", |
263 "class", IPC_MESSAGE_ID_CLASS(message.type()), | 263 "class", IPC_MESSAGE_ID_CLASS(message.type()), |
264 "line", IPC_MESSAGE_ID_LINE(message.type())); | 264 "line", IPC_MESSAGE_ID_LINE(message.type())); |
265 #endif | 265 #endif |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 Listener* listener, | 330 Listener* listener, |
331 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { | 331 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) { |
332 scoped_ptr<ChannelProxy> channel(new ChannelProxy(listener, ipc_task_runner)); | 332 scoped_ptr<ChannelProxy> channel(new ChannelProxy(listener, ipc_task_runner)); |
333 channel->Init(factory.Pass(), true); | 333 channel->Init(factory.Pass(), true); |
334 return channel.Pass(); | 334 return channel.Pass(); |
335 } | 335 } |
336 | 336 |
337 ChannelProxy::ChannelProxy(Context* context) | 337 ChannelProxy::ChannelProxy(Context* context) |
338 : context_(context), | 338 : context_(context), |
339 did_init_(false) { | 339 did_init_(false) { |
| 340 #if defined(ENABLE_IPC_FUZZER) |
| 341 outgoing_message_filter_ = NULL; |
| 342 #endif |
340 } | 343 } |
341 | 344 |
342 ChannelProxy::ChannelProxy( | 345 ChannelProxy::ChannelProxy( |
343 Listener* listener, | 346 Listener* listener, |
344 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) | 347 const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner) |
345 : context_(new Context(listener, ipc_task_runner)), did_init_(false) { | 348 : context_(new Context(listener, ipc_task_runner)), did_init_(false) { |
| 349 #if defined(ENABLE_IPC_FUZZER) |
| 350 outgoing_message_filter_ = NULL; |
| 351 #endif |
346 } | 352 } |
347 | 353 |
348 ChannelProxy::~ChannelProxy() { | 354 ChannelProxy::~ChannelProxy() { |
349 DCHECK(CalledOnValidThread()); | 355 DCHECK(CalledOnValidThread()); |
350 | 356 |
351 Close(); | 357 Close(); |
352 } | 358 } |
353 | 359 |
354 void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle, | 360 void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle, |
355 Channel::Mode mode, | 361 Channel::Mode mode, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 FROM_HERE, base::Bind(&Context::OnChannelClosed, context_.get())); | 410 FROM_HERE, base::Bind(&Context::OnChannelClosed, context_.get())); |
405 } | 411 } |
406 } | 412 } |
407 | 413 |
408 bool ChannelProxy::Send(Message* message) { | 414 bool ChannelProxy::Send(Message* message) { |
409 DCHECK(did_init_); | 415 DCHECK(did_init_); |
410 | 416 |
411 // TODO(alexeypa): add DCHECK(CalledOnValidThread()) here. Currently there are | 417 // TODO(alexeypa): add DCHECK(CalledOnValidThread()) here. Currently there are |
412 // tests that call Send() from a wrong thread. See http://crbug.com/163523. | 418 // tests that call Send() from a wrong thread. See http://crbug.com/163523. |
413 | 419 |
| 420 #ifdef ENABLE_IPC_FUZZER |
| 421 // In IPC fuzzing builds, it is possible to define a filter to apply to |
| 422 // outgoing messages. It will either rewrite the message and return a new |
| 423 // one, freeing the original, or return the message unchanged. |
| 424 if (outgoing_message_filter()) |
| 425 message = outgoing_message_filter()->Rewrite(message); |
| 426 #endif |
| 427 |
414 #ifdef IPC_MESSAGE_LOG_ENABLED | 428 #ifdef IPC_MESSAGE_LOG_ENABLED |
415 Logging::GetInstance()->OnSendMessage(message, context_->channel_id()); | 429 Logging::GetInstance()->OnSendMessage(message, context_->channel_id()); |
416 #endif | 430 #endif |
417 | 431 |
418 context_->ipc_task_runner()->PostTask( | 432 context_->ipc_task_runner()->PostTask( |
419 FROM_HERE, | 433 FROM_HERE, |
420 base::Bind(&ChannelProxy::Context::OnSendMessage, | 434 base::Bind(&ChannelProxy::Context::OnSendMessage, |
421 context_, base::Passed(scoped_ptr<Message>(message)))); | 435 context_, base::Passed(scoped_ptr<Message>(message)))); |
422 return true; | 436 return true; |
423 } | 437 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 Channel* channel = context_.get()->channel_.get(); | 481 Channel* channel = context_.get()->channel_.get(); |
468 // Channel must have been created first. | 482 // Channel must have been created first. |
469 DCHECK(channel) << context_.get()->channel_id_; | 483 DCHECK(channel) << context_.get()->channel_id_; |
470 return channel->TakeClientFileDescriptor(); | 484 return channel->TakeClientFileDescriptor(); |
471 } | 485 } |
472 #endif | 486 #endif |
473 | 487 |
474 //----------------------------------------------------------------------------- | 488 //----------------------------------------------------------------------------- |
475 | 489 |
476 } // namespace IPC | 490 } // namespace IPC |
OLD | NEW |