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

Side by Side Diff: content/renderer/java/java_bridge_dispatcher.cc

Issue 8834013: Fix a race condition in the Java Bridge when adding objects (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed nits Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/java/java_bridge_dispatcher.h" 5 #include "content/renderer/java/java_bridge_dispatcher.h"
6 6
7 #include "content/common/child_process.h" 7 #include "content/common/child_process.h"
8 #include "content/common/java_bridge_messages.h" 8 #include "content/common/java_bridge_messages.h"
9 #include "content/common/npobject_util.h" // For CreateNPVariant() 9 #include "content/common/npobject_util.h" // For CreateNPVariant()
10 #include "content/public/renderer/render_thread.h" 10 #include "content/public/renderer/render_thread.h"
11 #include "content/public/renderer/render_view.h" 11 #include "content/public/renderer/render_view.h"
12 #include "content/renderer/java/java_bridge_channel.h" 12 #include "content/renderer/java/java_bridge_channel.h"
13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
17 17
18 JavaBridgeDispatcher::JavaBridgeDispatcher( 18 JavaBridgeDispatcher::JavaBridgeDispatcher(
19 content::RenderView* render_view, 19 content::RenderView* render_view)
20 const IPC::ChannelHandle& channel_handle)
21 : RenderViewObserver(render_view) { 20 : RenderViewObserver(render_view) {
21 }
22
23 void JavaBridgeDispatcher::EnsureChannelIsSetUp() {
24 if (channel_.get()) {
25 return;
26 }
27
28 IPC::ChannelHandle channel_handle;
29 Send(new JavaBridgeHostMsg_GetChannelHandle(routing_id(), &channel_handle));
30
22 channel_.reset(JavaBridgeChannel::GetJavaBridgeChannel( 31 channel_.reset(JavaBridgeChannel::GetJavaBridgeChannel(
23 channel_handle, ChildProcess::current()->io_message_loop_proxy())); 32 channel_handle, ChildProcess::current()->io_message_loop_proxy()));
24 } 33 }
25 34
26 JavaBridgeDispatcher::~JavaBridgeDispatcher() { 35 JavaBridgeDispatcher::~JavaBridgeDispatcher() {
27 for (ObjectMap::const_iterator iter = objects_.begin(); 36 for (ObjectMap::const_iterator iter = objects_.begin();
28 iter != objects_.end(); ++iter) { 37 iter != objects_.end(); ++iter) {
29 WebKit::WebBindings::releaseObject(NPVARIANT_TO_OBJECT(iter->second)); 38 WebKit::WebBindings::releaseObject(NPVARIANT_TO_OBJECT(iter->second));
30 } 39 }
31 } 40 }
(...skipping 23 matching lines...) Expand all
55 // deleted at any time after OnRemoveNamedObject() is called. 64 // deleted at any time after OnRemoveNamedObject() is called.
56 web_frame->bindToWindowObject(iter->first, 65 web_frame->bindToWindowObject(iter->first,
57 NPVARIANT_TO_OBJECT(iter->second)); 66 NPVARIANT_TO_OBJECT(iter->second));
58 } 67 }
59 } 68 }
60 69
61 void JavaBridgeDispatcher::OnAddNamedObject( 70 void JavaBridgeDispatcher::OnAddNamedObject(
62 const string16& name, 71 const string16& name,
63 const NPVariant_Param& variant_param) { 72 const NPVariant_Param& variant_param) {
64 DCHECK_EQ(variant_param.type, NPVARIANT_PARAM_SENDER_OBJECT_ROUTING_ID); 73 DCHECK_EQ(variant_param.type, NPVARIANT_PARAM_SENDER_OBJECT_ROUTING_ID);
74
75 EnsureChannelIsSetUp();
76
65 // This creates an NPObject, wrapped as an NPVariant. We don't need the 77 // This creates an NPObject, wrapped as an NPVariant. We don't need the
66 // containing window or the page URL, as we don't do re-entrant sync IPC. 78 // containing window or the page URL, as we don't do re-entrant sync IPC.
67 NPVariant variant; 79 NPVariant variant;
68 bool created = 80 bool created =
69 CreateNPVariant(variant_param, channel_.get(), &variant, 0, GURL()); 81 CreateNPVariant(variant_param, channel_.get(), &variant, 0, GURL());
70 DCHECK(created); 82 DCHECK(created);
71 DCHECK_EQ(variant.type, NPVariantType_Object); 83 DCHECK_EQ(variant.type, NPVariantType_Object);
72 84
73 // The NPObject is created with a ref count of one, which we remove when 85 // The NPObject is created with a ref count of one, which we remove when
74 // OnRemoveNamedObject() is called for that object. 86 // OnRemoveNamedObject() is called for that object.
75 ObjectMap::iterator iter = objects_.find(name); 87 ObjectMap::iterator iter = objects_.find(name);
76 if (iter != objects_.end()) { 88 if (iter != objects_.end()) {
77 WebKit::WebBindings::releaseObject(NPVARIANT_TO_OBJECT(iter->second)); 89 WebKit::WebBindings::releaseObject(NPVARIANT_TO_OBJECT(iter->second));
78 } 90 }
79 objects_[name] = variant; 91 objects_[name] = variant;
80 } 92 }
81 93
82 void JavaBridgeDispatcher::OnRemoveNamedObject(const string16& name) { 94 void JavaBridgeDispatcher::OnRemoveNamedObject(const string16& name) {
83 // Removing an object does not unbind it from JavaScript until the window 95 // Removing an object does not unbind it from JavaScript until the window
84 // object is next cleared. Note that the browser checks that the named object 96 // object is next cleared. Note that the browser checks that the named object
85 // is present. 97 // is present.
86 ObjectMap::iterator iter = objects_.find(name); 98 ObjectMap::iterator iter = objects_.find(name);
87 DCHECK(iter != objects_.end()); 99 DCHECK(iter != objects_.end());
88 WebKit::WebBindings::releaseObject(NPVARIANT_TO_OBJECT(iter->second)); 100 WebKit::WebBindings::releaseObject(NPVARIANT_TO_OBJECT(iter->second));
89 objects_.erase(iter); 101 objects_.erase(iter);
90 } 102 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698