Chromium Code Reviews| Index: content/browser/android/java/gin_java_bridge_dispatcher_host.cc |
| diff --git a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc |
| index 74ccaa21aaf6b0352edd3d971c6d1630524292ae..57f37357b386742fdd715c3966ffd4337440a459 100644 |
| --- a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc |
| +++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc |
| @@ -70,6 +70,18 @@ void GinJavaBridgeDispatcherHost::RenderFrameCreated( |
| void GinJavaBridgeDispatcherHost::RenderFrameDeleted( |
| RenderFrameHost* render_frame_host) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + std::map<RenderFrameHost*, IPC::Message*>::const_iterator it = |
| + pending_replies_.find(render_frame_host); |
| + if (it != pending_replies_.end()) { |
| + IPC::Message* reply_msg = it->second; |
| + base::ListValue result; |
| + result.Append(base::Value::CreateNullValue()); |
| + IPC::WriteParam(reply_msg, result); |
| + IPC::WriteParam(reply_msg, kGinJavaBridgeObjectIsGone); |
|
mnaganov (inactive)
2014/08/24 13:31:49
Maybe, add a specific error code / message for thi
benm (inactive)
2014/08/26 15:42:40
Done.
|
| + render_frame_host->Send(reply_msg); |
| + pending_replies_.erase(render_frame_host); |
| + } |
| RemoveHolder(render_frame_host, |
| GinJavaBoundObject::ObjectMap::iterator(&objects_), |
| objects_.size()); |
| @@ -356,10 +368,15 @@ void GinJavaBridgeDispatcherHost::SendReply( |
| RenderFrameHost* render_frame_host, |
| IPC::Message* reply_msg) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + |
| if (IsValidRenderFrameHost(render_frame_host)) { |
| + DCHECK(pending_replies_.find(render_frame_host) != pending_replies_.end()); |
| render_frame_host->Send(reply_msg); |
| + pending_replies_.erase(render_frame_host); |
| } else { |
| - delete reply_msg; |
| + // In this case, we must've already sent the reply when the redner frame |
| + // was destroyed. |
| + DCHECK(pending_replies_.find(render_frame_host) == pending_replies_.end()); |
| } |
| } |
| @@ -381,6 +398,7 @@ void GinJavaBridgeDispatcherHost::OnGetMethods( |
| render_frame_host->Send(reply_msg); |
| return; |
| } |
| + pending_replies_[render_frame_host] = reply_msg; |
|
boliu
2014/08/22 21:05:17
DCHECK(pending_replies_.find(render_frame_host) ==
benm (inactive)
2014/08/26 15:42:40
good call.
|
| base::PostTaskAndReplyWithResult( |
| g_background_thread.Get().message_loop()->message_loop_proxy(), |
| FROM_HERE, |
| @@ -413,6 +431,7 @@ void GinJavaBridgeDispatcherHost::OnHasMethod( |
| render_frame_host->Send(reply_msg); |
| return; |
| } |
| + pending_replies_[render_frame_host] = reply_msg; |
| base::PostTaskAndReplyWithResult( |
| g_background_thread.Get().message_loop()->message_loop_proxy(), |
| FROM_HERE, |
| @@ -449,6 +468,7 @@ void GinJavaBridgeDispatcherHost::OnInvokeMethod( |
| render_frame_host->Send(reply_msg); |
| return; |
| } |
| + pending_replies_[render_frame_host] = reply_msg; |
| scoped_refptr<GinJavaMethodInvocationHelper> result = |
| new GinJavaMethodInvocationHelper( |
| make_scoped_ptr(new GinJavaBoundObjectDelegate(object)) |
| @@ -488,29 +508,33 @@ void GinJavaBridgeDispatcherHost::ProcessMethodInvocationObjectResult( |
| IPC::Message* reply_msg, |
| scoped_refptr<GinJavaMethodInvocationHelper> result) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
|
boliu
2014/08/22 21:05:17
nit: general chrome style is do the shorter branch
benm (inactive)
2014/08/26 15:42:40
Done.
|
| - if (!IsValidRenderFrameHost(render_frame_host)) { |
| - delete reply_msg; |
| - return; |
| - } |
| - base::ListValue wrapped_result; |
| - if (!result->GetObjectResult().is_null()) { |
| - GinJavaBoundObject::ObjectID returned_object_id; |
| - if (FindObjectId(result->GetObjectResult(), &returned_object_id)) { |
| - (*objects_.Lookup(returned_object_id))->AddHolder(render_frame_host); |
| + |
| + if (IsValidRenderFrameHost(render_frame_host)) { |
| + base::ListValue wrapped_result; |
| + if (!result->GetObjectResult().is_null()) { |
| + GinJavaBoundObject::ObjectID returned_object_id; |
| + if (FindObjectId(result->GetObjectResult(), &returned_object_id)) { |
| + (*objects_.Lookup(returned_object_id))->AddHolder(render_frame_host); |
| + } else { |
| + returned_object_id = AddObject(result->GetObjectResult(), |
| + result->GetSafeAnnotationClass(), |
| + false, |
| + render_frame_host); |
| + } |
| + wrapped_result.Append( |
| + GinJavaBridgeValue::CreateObjectIDValue( |
| + returned_object_id).release()); |
| } else { |
| - returned_object_id = AddObject(result->GetObjectResult(), |
| - result->GetSafeAnnotationClass(), |
| - false, |
| - render_frame_host); |
| + wrapped_result.Append(base::Value::CreateNullValue()); |
| } |
| - wrapped_result.Append( |
| - GinJavaBridgeValue::CreateObjectIDValue(returned_object_id).release()); |
| + IPC::WriteParam(reply_msg, wrapped_result); |
| + IPC::WriteParam(reply_msg, result->GetInvocationError()); |
|
boliu
2014/08/22 21:05:17
Erase rfh from pending_replies_ in this branch, an
benm (inactive)
2014/08/26 15:42:40
We do that in SendReply already.
|
| } else { |
| - wrapped_result.Append(base::Value::CreateNullValue()); |
| + // In this case, we must've already sent the reply when the render frame |
| + // was destroyed. |
| + DCHECK(pending_replies_.find(render_frame_host) == pending_replies_.end()); |
| } |
| - IPC::WriteParam(reply_msg, wrapped_result); |
| - IPC::WriteParam(reply_msg, result->GetInvocationError()); |
| - render_frame_host->Send(reply_msg); |
| + SendReply(render_frame_host, reply_msg); |
|
boliu
2014/08/22 21:05:17
SendReply will just delete the message if rfh is i
benm (inactive)
2014/08/26 15:42:40
Hold up; we shouldn't get into the case now where
|
| } |
| void GinJavaBridgeDispatcherHost::OnObjectWrapperDeleted( |