Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Unified Diff: content/browser/android/java/gin_java_bridge_dispatcher_host.cc

Issue 498633003: Cache pending JS bridge sync IPC replies, and send in case of RenderFrame deletion. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove logging Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698