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..6f076ebda2d0738cd28b6ed8e3187f86dbb6e1db 100644 |
--- a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc |
+++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc |
@@ -56,6 +56,7 @@ GinJavaBridgeDispatcherHost::GinJavaBridgeDispatcherHost( |
} |
GinJavaBridgeDispatcherHost::~GinJavaBridgeDispatcherHost() { |
+ DCHECK(pending_replies_.empty()); |
} |
void GinJavaBridgeDispatcherHost::RenderFrameCreated( |
@@ -70,6 +71,18 @@ void GinJavaBridgeDispatcherHost::RenderFrameCreated( |
void GinJavaBridgeDispatcherHost::RenderFrameDeleted( |
RenderFrameHost* render_frame_host) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ PendingReplyMap::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, kGinJavaBridgeRenderFrameDeleted); |
+ render_frame_host->Send(reply_msg); |
+ pending_replies_.erase(render_frame_host); |
+ } |
RemoveHolder(render_frame_host, |
GinJavaBoundObject::ObjectMap::iterator(&objects_), |
objects_.size()); |
@@ -356,11 +369,17 @@ void GinJavaBridgeDispatcherHost::SendReply( |
RenderFrameHost* render_frame_host, |
IPC::Message* reply_msg) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (IsValidRenderFrameHost(render_frame_host)) { |
- render_frame_host->Send(reply_msg); |
- } else { |
- delete reply_msg; |
+ |
+ if (!IsValidRenderFrameHost(render_frame_host)) { |
+ // 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()); |
boliu
2014/08/27 17:47:34
delete reply_msg here I think?
benm (inactive)
2014/08/27 17:53:34
I don't think so, as in this case we should have s
boliu
2014/08/27 17:55:56
Hmm? I mean |reply_msg| argument to this function,
benm (inactive)
2014/08/27 17:57:50
They are one and the same I believe. the param her
boliu
2014/08/27 18:23:48
Oh god. That's just freaking confusing. That means
benm (inactive)
2014/08/27 18:30:02
Mmm, yes that's true. We can always get it from th
|
+ return; |
} |
+ |
+ DCHECK(pending_replies_.find(render_frame_host) != pending_replies_.end()); |
+ render_frame_host->Send(reply_msg); |
+ pending_replies_.erase(render_frame_host); |
} |
void GinJavaBridgeDispatcherHost::OnGetMethods( |
@@ -381,6 +400,8 @@ void GinJavaBridgeDispatcherHost::OnGetMethods( |
render_frame_host->Send(reply_msg); |
return; |
} |
+ DCHECK(pending_replies_.find(render_frame_host) == pending_replies_.end()); |
+ pending_replies_[render_frame_host] = reply_msg; |
base::PostTaskAndReplyWithResult( |
g_background_thread.Get().message_loop()->message_loop_proxy(), |
FROM_HERE, |
@@ -413,6 +434,8 @@ void GinJavaBridgeDispatcherHost::OnHasMethod( |
render_frame_host->Send(reply_msg); |
return; |
} |
+ DCHECK(pending_replies_.find(render_frame_host) == pending_replies_.end()); |
+ pending_replies_[render_frame_host] = reply_msg; |
base::PostTaskAndReplyWithResult( |
g_background_thread.Get().message_loop()->message_loop_proxy(), |
FROM_HERE, |
@@ -449,6 +472,8 @@ void GinJavaBridgeDispatcherHost::OnInvokeMethod( |
render_frame_host->Send(reply_msg); |
return; |
} |
+ DCHECK(pending_replies_.find(render_frame_host) == pending_replies_.end()); |
+ pending_replies_[render_frame_host] = reply_msg; |
scoped_refptr<GinJavaMethodInvocationHelper> result = |
new GinJavaMethodInvocationHelper( |
make_scoped_ptr(new GinJavaBoundObjectDelegate(object)) |
@@ -488,10 +513,14 @@ void GinJavaBridgeDispatcherHost::ProcessMethodInvocationObjectResult( |
IPC::Message* reply_msg, |
scoped_refptr<GinJavaMethodInvocationHelper> result) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
if (!IsValidRenderFrameHost(render_frame_host)) { |
- delete reply_msg; |
+ // 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()); |
boliu
2014/08/27 17:47:34
delete reply_msg?
benm (inactive)
2014/08/27 17:53:34
same reply as above.
|
return; |
} |
+ |
base::ListValue wrapped_result; |
if (!result->GetObjectResult().is_null()) { |
GinJavaBoundObject::ObjectID returned_object_id; |
@@ -504,13 +533,14 @@ void GinJavaBridgeDispatcherHost::ProcessMethodInvocationObjectResult( |
render_frame_host); |
} |
wrapped_result.Append( |
- GinJavaBridgeValue::CreateObjectIDValue(returned_object_id).release()); |
+ GinJavaBridgeValue::CreateObjectIDValue( |
+ returned_object_id).release()); |
} else { |
wrapped_result.Append(base::Value::CreateNullValue()); |
} |
IPC::WriteParam(reply_msg, wrapped_result); |
IPC::WriteParam(reply_msg, result->GetInvocationError()); |
- render_frame_host->Send(reply_msg); |
+ SendReply(render_frame_host, reply_msg); |
} |
void GinJavaBridgeDispatcherHost::OnObjectWrapperDeleted( |