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

Side by Side Diff: chrome/renderer/extensions/miscellaneous_bindings.cc

Issue 9693048: Make sure ports are closed when they're no longer used. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/renderer/extensions/miscellaneous_bindings.h" 5 #include "chrome/renderer/extensions/miscellaneous_bindings.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( 77 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
78 v8::Handle<v8::String> name) { 78 v8::Handle<v8::String> name) {
79 if (name->Equals(v8::String::New("PostMessage"))) { 79 if (name->Equals(v8::String::New("PostMessage"))) {
80 return v8::FunctionTemplate::New(PostMessage); 80 return v8::FunctionTemplate::New(PostMessage);
81 } else if (name->Equals(v8::String::New("CloseChannel"))) { 81 } else if (name->Equals(v8::String::New("CloseChannel"))) {
82 return v8::FunctionTemplate::New(CloseChannel); 82 return v8::FunctionTemplate::New(CloseChannel);
83 } else if (name->Equals(v8::String::New("PortAddRef"))) { 83 } else if (name->Equals(v8::String::New("PortAddRef"))) {
84 return v8::FunctionTemplate::New(PortAddRef); 84 return v8::FunctionTemplate::New(PortAddRef);
85 } else if (name->Equals(v8::String::New("PortRelease"))) { 85 } else if (name->Equals(v8::String::New("PortRelease"))) {
86 return v8::FunctionTemplate::New(PortRelease); 86 return v8::FunctionTemplate::New(PortRelease);
87 } else if (name->Equals(v8::String::New("BindToGC"))) {
88 return v8::FunctionTemplate::New(BindToGC);
87 } 89 }
88 return ChromeV8Extension::GetNativeFunction(name); 90 return ChromeV8Extension::GetNativeFunction(name);
89 } 91 }
90 92
91 // Sends a message along the given channel. 93 // Sends a message along the given channel.
92 static v8::Handle<v8::Value> PostMessage(const v8::Arguments& args) { 94 static v8::Handle<v8::Value> PostMessage(const v8::Arguments& args) {
93 content::RenderView* renderview = GetCurrentRenderView(); 95 content::RenderView* renderview = GetCurrentRenderView();
94 if (!renderview) 96 if (!renderview)
95 return v8::Undefined(); 97 return v8::Undefined();
96 98
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 int port_id = args[0]->Int32Value(); 144 int port_id = args[0]->Int32Value();
143 if (HasPortData(port_id) && --GetPortData(port_id).ref_count == 0) { 145 if (HasPortData(port_id) && --GetPortData(port_id).ref_count == 0) {
144 // Send via the RenderThread because the RenderView might be closing. 146 // Send via the RenderThread because the RenderView might be closing.
145 content::RenderThread::Get()->Send( 147 content::RenderThread::Get()->Send(
146 new ExtensionHostMsg_CloseChannel(port_id)); 148 new ExtensionHostMsg_CloseChannel(port_id));
147 ClearPortData(port_id); 149 ClearPortData(port_id);
148 } 150 }
149 } 151 }
150 return v8::Undefined(); 152 return v8::Undefined();
151 } 153 }
154
155 struct GCCallbackArgs {
156 v8::Persistent<v8::Object> object;
157 v8::Persistent<v8::Function> callback;
158 };
159
160 static void GCCallback(v8::Persistent<v8::Value> object, void* parameter) {
161 v8::HandleScope handle_scope;
162 GCCallbackArgs* args = reinterpret_cast<GCCallbackArgs*>(parameter);
163 args->callback->Call(args->callback->CreationContext()->Global(), 0, NULL);
164 args->callback.Dispose();
165 args->object.Dispose();
166 delete args;
167 }
168
169 // Binds a callback to be invoked when the given object is garbage collected.
170 static v8::Handle<v8::Value> BindToGC(const v8::Arguments& args) {
171 if (args.Length() == 2 && args[0]->IsObject() && args[1]->IsFunction()) {
172 GCCallbackArgs* context = new GCCallbackArgs;
173 context->callback = v8::Persistent<v8::Function>::New(
174 v8::Handle<v8::Function>::Cast(args[1]));
175 context->object = v8::Persistent<v8::Object>::New(
176 v8::Handle<v8::Object>::Cast(args[0]));
177 context->object.MakeWeak(context, GCCallback);
178 }
Matt Perry 2012/03/13 19:54:39 nit: can you add an "else NOTREACHED()" here so we
179 return v8::Undefined();
180 }
152 }; 181 };
153 182
154 } // namespace 183 } // namespace
155 184
156 namespace extensions { 185 namespace extensions {
157 186
158 v8::Extension* MiscellaneousBindings::Get(ExtensionDispatcher* dispatcher) { 187 v8::Extension* MiscellaneousBindings::Get(ExtensionDispatcher* dispatcher) {
159 static v8::Extension* extension = new ExtensionImpl(dispatcher); 188 static v8::Extension* extension = new ExtensionImpl(dispatcher);
160 return extension; 189 return extension;
161 } 190 }
(...skipping 30 matching lines...) Expand all
192 arguments.push_back(v8::String::New(message.c_str(), message.size())); 221 arguments.push_back(v8::String::New(message.c_str(), message.size()));
193 arguments.push_back(port_id_handle); 222 arguments.push_back(port_id_handle);
194 CHECK((*it)->CallChromeHiddenMethod("Port.dispatchOnMessage", 223 CHECK((*it)->CallChromeHiddenMethod("Port.dispatchOnMessage",
195 arguments.size(), 224 arguments.size(),
196 &arguments[0], 225 &arguments[0],
197 NULL)); 226 NULL));
198 } 227 }
199 } 228 }
200 229
201 } // namespace extension 230 } // namespace extension
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698