Chromium Code Reviews| 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 "content/renderer/pepper/pepper_in_process_router.h" | 5 #include "content/renderer/pepper/pepper_in_process_router.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "content/public/renderer/render_thread.h" | 9 #include "content/public/renderer/render_thread.h" |
| 10 #include "content/renderer/pepper/renderer_ppapi_host_impl.h" | 10 #include "content/renderer/pepper/renderer_ppapi_host_impl.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 // If the resource doesn't exist, it may have been destroyed so just ignore | 96 // If the resource doesn't exist, it may have been destroyed so just ignore |
| 97 // the message. | 97 // the message. |
| 98 if (resource) | 98 if (resource) |
| 99 resource->OnReplyReceived(reply_params, nested_msg); | 99 resource->OnReplyReceived(reply_params, nested_msg); |
| 100 return true; | 100 return true; |
| 101 } | 101 } |
| 102 | 102 |
| 103 bool PepperInProcessRouter::SendToHost(IPC::Message* msg) { | 103 bool PepperInProcessRouter::SendToHost(IPC::Message* msg) { |
| 104 scoped_ptr<IPC::Message> message(msg); | 104 scoped_ptr<IPC::Message> message(msg); |
| 105 | 105 |
| 106 // Unpack the message so we can peak at its nested type. | |
|
dmichael (off chromium)
2014/06/03 19:40:34
peak->peek
raymes
2014/06/04 00:07:01
Done.
| |
| 107 uint32 call_type = 0; | |
| 108 if (message->type() == PpapiHostMsg_ResourceCall::ID) { | |
| 109 ppapi::proxy::ResourceMessageCallParams call_params; | |
| 110 IPC::Message nested_msg; | |
| 111 if (!UnpackMessage<PpapiHostMsg_ResourceCall>(*msg, &call_params, | |
| 112 &nested_msg)) { | |
| 113 NOTREACHED(); | |
| 114 return false; | |
| 115 } | |
| 116 call_type = nested_msg.type(); | |
| 117 // Repack the message. | |
| 118 message.reset(new PpapiHostMsg_ResourceCall(call_params, nested_msg)); | |
| 119 } | |
| 120 | |
| 106 if (!message->is_sync()) { | 121 if (!message->is_sync()) { |
| 107 // If this is a resource destroyed message, post a task to dispatch it. | |
| 108 // Dispatching it synchronously can cause the host to re-enter the proxy | |
| 109 // code while we're still in the resource destructor, leading to a crash. | |
| 110 // http://crbug.com/276368. | |
| 111 // This won't cause message reordering problems because the resource | |
| 112 // destroyed message is always the last one sent for a resource. | |
| 113 if (message->type() == PpapiHostMsg_ResourceDestroyed::ID) { | 122 if (message->type() == PpapiHostMsg_ResourceDestroyed::ID) { |
| 123 // If this is a resource destroyed message, post a task to dispatch it. | |
| 124 // Dispatching it synchronously can cause the host to re-enter the proxy | |
| 125 // code while we're still in the resource destructor, leading to a crash. | |
| 126 // http://crbug.com/276368. | |
| 127 // This won't cause message reordering problems because the resource | |
| 128 // destroyed message is always the last one sent for a resource. | |
| 114 base::MessageLoop::current()->PostTask( | 129 base::MessageLoop::current()->PostTask( |
| 115 FROM_HERE, | 130 FROM_HERE, |
| 116 base::Bind(&PepperInProcessRouter::DispatchHostMsg, | 131 base::Bind(&PepperInProcessRouter::DispatchHostMsg, |
| 132 weak_factory_.GetWeakPtr(), | |
| 133 base::Owned(message.release()))); | |
| 134 return true; | |
| 135 } else if (call_type == PpapiHostMsg_URLLoader_Close::ID) { | |
| 136 // If this is a PpapiHostMsg_URLLoader_Close, it could trigger the | |
| 137 // destruction of the instance (crbug.com/372548) so post a task to | |
| 138 // dispatch it as well. Because PpapiHostMsg_ResourceDestroyed messages | |
| 139 // are also posted above, ordering with respect to those messages will | |
| 140 // still be correct. Ordering with respect to other messages should not | |
| 141 // be important. | |
| 142 base::MessageLoop::current()->PostTask( | |
| 143 FROM_HERE, | |
| 144 base::Bind(&PepperInProcessRouter::DispatchHostMsg, | |
| 117 weak_factory_.GetWeakPtr(), | 145 weak_factory_.GetWeakPtr(), |
| 118 base::Owned(message.release()))); | 146 base::Owned(message.release()))); |
| 119 return true; | 147 return true; |
| 120 } else { | 148 } else { |
| 121 bool result = host_impl_->GetPpapiHost()->OnMessageReceived(*message); | 149 bool result = host_impl_->GetPpapiHost()->OnMessageReceived(*message); |
| 122 DCHECK(result) << "The message was not handled by the host."; | 150 DCHECK(result) << "The message was not handled by the host."; |
| 123 return true; | 151 return true; |
| 124 } | 152 } |
| 125 } | 153 } |
| 126 | 154 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 void PepperInProcessRouter::DispatchPluginMsg(IPC::Message* msg) { | 191 void PepperInProcessRouter::DispatchPluginMsg(IPC::Message* msg) { |
| 164 bool handled = OnPluginMsgReceived(*msg); | 192 bool handled = OnPluginMsgReceived(*msg); |
| 165 DCHECK(handled); | 193 DCHECK(handled); |
| 166 } | 194 } |
| 167 | 195 |
| 168 bool PepperInProcessRouter::SendToBrowser(IPC::Message* msg) { | 196 bool PepperInProcessRouter::SendToBrowser(IPC::Message* msg) { |
| 169 return RenderThread::Get()->Send(msg); | 197 return RenderThread::Get()->Send(msg); |
| 170 } | 198 } |
| 171 | 199 |
| 172 } // namespace content | 200 } // namespace content |
| OLD | NEW |