| 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 a60310d5abcb804f415011450955e94f6b491d3e..65263812a549ccffb39007b448c113629e8375d3 100644
|
| --- a/content/browser/android/java/gin_java_bridge_dispatcher_host.cc
|
| +++ b/content/browser/android/java/gin_java_bridge_dispatcher_host.cc
|
| @@ -18,6 +18,7 @@
|
| #include "content/common/gin_java_bridge_messages.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/render_frame_host.h"
|
| +#include "content/public/browser/web_contents.h"
|
| #include "ipc/ipc_message_utils.h"
|
|
|
| #if !defined(OS_ANDROID)
|
| @@ -59,7 +60,6 @@ GinJavaBridgeDispatcherHost::~GinJavaBridgeDispatcherHost() {
|
|
|
| void GinJavaBridgeDispatcherHost::RenderFrameCreated(
|
| RenderFrameHost* render_frame_host) {
|
| - renderers_.insert(render_frame_host);
|
| for (NamedObjectMap::const_iterator iter = named_objects_.begin();
|
| iter != named_objects_.end();
|
| ++iter) {
|
| @@ -70,7 +70,6 @@ void GinJavaBridgeDispatcherHost::RenderFrameCreated(
|
|
|
| void GinJavaBridgeDispatcherHost::RenderFrameDeleted(
|
| RenderFrameHost* render_frame_host) {
|
| - renderers_.erase(render_frame_host);
|
| RemoveHolder(render_frame_host,
|
| GinJavaBoundObject::ObjectMap::iterator(&objects_),
|
| objects_.size());
|
| @@ -182,11 +181,8 @@ void GinJavaBridgeDispatcherHost::AddNamedObject(
|
| }
|
| named_objects_[name] = object_id;
|
|
|
| - for (RendererSet::iterator iter = renderers_.begin();
|
| - iter != renderers_.end(); ++iter) {
|
| - (*iter)->Send(new GinJavaBridgeMsg_AddNamedObject(
|
| - (*iter)->GetRoutingID(), name, object_id));
|
| - }
|
| + web_contents()->SendToAllFrames(
|
| + new GinJavaBridgeMsg_AddNamedObject(MSG_ROUTING_NONE, name, object_id));
|
| }
|
|
|
| void GinJavaBridgeDispatcherHost::RemoveNamedObject(
|
| @@ -213,11 +209,8 @@ void GinJavaBridgeDispatcherHost::RemoveNamedObject(
|
| }
|
| }
|
|
|
| - for (RendererSet::iterator iter = renderers_.begin();
|
| - iter != renderers_.end(); ++iter) {
|
| - (*iter)->Send(new GinJavaBridgeMsg_RemoveNamedObject(
|
| - (*iter)->GetRoutingID(), name));
|
| - }
|
| + web_contents()->SendToAllFrames(
|
| + new GinJavaBridgeMsg_RemoveNamedObject(MSG_ROUTING_NONE, name));
|
| }
|
|
|
| void GinJavaBridgeDispatcherHost::SetAllowObjectContentsInspection(bool allow) {
|
| @@ -319,11 +312,47 @@ bool GinJavaBridgeDispatcherHost::OnMessageReceived(
|
| return handled;
|
| }
|
|
|
| +namespace {
|
| +
|
| +class IsValidRenderFrameHostHelper
|
| + : public base::RefCounted<IsValidRenderFrameHostHelper> {
|
| + public:
|
| + explicit IsValidRenderFrameHostHelper(RenderFrameHost* rfh_to_match)
|
| + : rfh_to_match_(rfh_to_match), rfh_found_(false) {}
|
| +
|
| + bool rfh_found() { return rfh_found_; }
|
| +
|
| + void OnFrame(RenderFrameHost* rfh) {
|
| + if (rfh_to_match_ == rfh) rfh_found_ = true;
|
| + }
|
| +
|
| + private:
|
| + friend class base::RefCounted<IsValidRenderFrameHostHelper>;
|
| +
|
| + ~IsValidRenderFrameHostHelper() {}
|
| +
|
| + RenderFrameHost* rfh_to_match_;
|
| + bool rfh_found_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(IsValidRenderFrameHostHelper);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +bool GinJavaBridgeDispatcherHost::IsValidRenderFrameHost(
|
| + RenderFrameHost* render_frame_host) {
|
| + scoped_refptr<IsValidRenderFrameHostHelper> helper =
|
| + new IsValidRenderFrameHostHelper(render_frame_host);
|
| + web_contents()->ForEachFrame(
|
| + base::Bind(&IsValidRenderFrameHostHelper::OnFrame, helper));
|
| + return helper->rfh_found();
|
| +}
|
| +
|
| void GinJavaBridgeDispatcherHost::SendReply(
|
| RenderFrameHost* render_frame_host,
|
| IPC::Message* reply_msg) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - if (renderers_.find(render_frame_host) != renderers_.end()) {
|
| + if (IsValidRenderFrameHost(render_frame_host)) {
|
| render_frame_host->Send(reply_msg);
|
| } else {
|
| delete reply_msg;
|
| @@ -455,7 +484,7 @@ void GinJavaBridgeDispatcherHost::ProcessMethodInvocationObjectResult(
|
| IPC::Message* reply_msg,
|
| scoped_refptr<GinJavaMethodInvocationHelper> result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - if (renderers_.find(render_frame_host) == renderers_.end()) {
|
| + if (!IsValidRenderFrameHost(render_frame_host)) {
|
| delete reply_msg;
|
| return;
|
| }
|
|
|