OLD | NEW |
---|---|
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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
127 CHECK_EQ(2, args.Length()); | 127 CHECK_EQ(2, args.Length()); |
128 CHECK(args[0]->IsInt32()); | 128 CHECK(args[0]->IsInt32()); |
129 CHECK(args[1]->IsBoolean()); | 129 CHECK(args[1]->IsBoolean()); |
130 | 130 |
131 int port_id = args[0]->Int32Value(); | 131 int port_id = args[0]->Int32Value(); |
132 if (!HasPortData(port_id)) | 132 if (!HasPortData(port_id)) |
133 return v8::Undefined(); | 133 return v8::Undefined(); |
134 | 134 |
135 // Send via the RenderThread because the RenderView might be closing. | 135 // Send via the RenderThread because the RenderView might be closing. |
136 bool notify_browser = args[1]->BooleanValue(); | 136 bool notify_browser = args[1]->BooleanValue(); |
137 if (notify_browser) { | 137 if (notify_browser) |
138 content::RenderThread::Get()->Send( | 138 content::RenderThread::Get()->Send( |
139 new ExtensionHostMsg_CloseChannel(port_id, std::string())); | 139 new ExtensionHostMsg_CloseChannel(port_id, std::string())); |
140 } | |
141 | |
142 ClearPortData(port_id); | 140 ClearPortData(port_id); |
143 | 141 |
144 return v8::Undefined(); | 142 return v8::Undefined(); |
145 } | 143 } |
146 | 144 |
147 // A new port has been created for a context. This occurs both when script | 145 // A new port has been created for a context. This occurs both when script |
148 // opens a connection, and when a connection is opened to this script. | 146 // opens a connection, and when a connection is opened to this script. |
149 v8::Handle<v8::Value> PortAddRef(const v8::Arguments& args) { | 147 v8::Handle<v8::Value> PortAddRef(const v8::Arguments& args) { |
150 // Arguments are (int32 port_id). | 148 // Arguments are (int32 port_id). |
151 CHECK_EQ(1, args.Length()); | 149 CHECK_EQ(1, args.Length()); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
253 | 251 |
254 v8::Handle<v8::Value> arguments[] = { | 252 v8::Handle<v8::Value> arguments[] = { |
255 v8::Integer::New(target_port_id), | 253 v8::Integer::New(target_port_id), |
256 v8::String::New(channel_name.c_str(), channel_name.size()), | 254 v8::String::New(channel_name.c_str(), channel_name.size()), |
257 tab, | 255 tab, |
258 v8::String::New(source_extension_id.c_str(), source_extension_id.size()), | 256 v8::String::New(source_extension_id.c_str(), source_extension_id.size()), |
259 v8::String::New(target_extension_id.c_str(), target_extension_id.size()), | 257 v8::String::New(target_extension_id.c_str(), target_extension_id.size()), |
260 v8::String::New(source_url_spec.c_str(), source_url_spec.size()) | 258 v8::String::New(source_url_spec.c_str(), source_url_spec.size()) |
261 }; | 259 }; |
262 | 260 |
263 v8::Handle<v8::Value> retval; | 261 v8::Handle<v8::Value> retval = (*it)->module_system()->CallModuleMethod( |
koz (OOO until 15th September)
2013/05/31 04:28:44
No more need for v8::TryCatch?
not at google - send to devlin
2013/05/31 22:47:07
Yeah CallModuleMethod handles it. I figure it's si
| |
264 v8::TryCatch try_catch; | 262 "miscellaneous_bindings", |
265 if (!(*it)->CallChromeHiddenMethod("Port.dispatchOnConnect", | 263 "dispatchOnConnect", |
266 arraysize(arguments), arguments, | 264 arraysize(arguments), arguments); |
267 &retval)) { | |
268 continue; | |
269 } | |
270 | |
271 if (try_catch.HasCaught()) { | |
272 LOG(ERROR) << "Exception caught when calling Port.dispatchOnConnect."; | |
273 continue; | |
274 } | |
275 | 265 |
276 if (retval.IsEmpty()) { | 266 if (retval.IsEmpty()) { |
277 LOG(ERROR) << "Empty return value from Port.dispatchOnConnect."; | 267 LOG(ERROR) << "Empty return value from dispatchOnConnect."; |
278 continue; | 268 continue; |
279 } | 269 } |
280 | 270 |
281 CHECK(retval->IsBoolean()); | 271 CHECK(retval->IsBoolean()); |
282 if (retval->BooleanValue()) | 272 port_created |= retval->BooleanValue(); |
283 port_created = true; | |
284 } | 273 } |
285 | 274 |
286 // If we didn't create a port, notify the other end of the channel (treat it | 275 // If we didn't create a port, notify the other end of the channel (treat it |
287 // as a disconnect). | 276 // as a disconnect). |
288 if (!port_created) { | 277 if (!port_created) { |
289 content::RenderThread::Get()->Send( | 278 content::RenderThread::Get()->Send( |
290 new ExtensionHostMsg_CloseChannel( | 279 new ExtensionHostMsg_CloseChannel( |
291 target_port_id, kReceivingEndDoesntExistError)); | 280 target_port_id, kReceivingEndDoesntExistError)); |
292 } | 281 } |
293 } | 282 } |
(...skipping 12 matching lines...) Expand all Loading... | |
306 restrict_to_render_view != (*it)->GetRenderView()) { | 295 restrict_to_render_view != (*it)->GetRenderView()) { |
307 continue; | 296 continue; |
308 } | 297 } |
309 | 298 |
310 v8::Handle<v8::Context> context = (*it)->v8_context(); | 299 v8::Handle<v8::Context> context = (*it)->v8_context(); |
311 v8::Context::Scope context_scope(context); | 300 v8::Context::Scope context_scope(context); |
312 | 301 |
313 // Check to see whether the context has this port before bothering to create | 302 // Check to see whether the context has this port before bothering to create |
314 // the message. | 303 // the message. |
315 v8::Handle<v8::Value> port_id_handle = v8::Integer::New(target_port_id); | 304 v8::Handle<v8::Value> port_id_handle = v8::Integer::New(target_port_id); |
316 v8::Handle<v8::Value> has_port; | 305 v8::Handle<v8::Value> has_port = (*it)->module_system()->CallModuleMethod( |
317 v8::TryCatch try_catch; | 306 "miscellaneous_bindings", |
318 if (!(*it)->CallChromeHiddenMethod("Port.hasPort", 1, &port_id_handle, | 307 "hasPort", |
319 &has_port)) { | 308 1, &port_id_handle); |
320 continue; | |
321 } | |
322 | |
323 if (try_catch.HasCaught()) { | |
324 LOG(ERROR) << "Exception caught when calling Port.hasPort."; | |
325 continue; | |
326 } | |
327 | 309 |
328 CHECK(!has_port.IsEmpty()); | 310 CHECK(!has_port.IsEmpty()); |
329 if (!has_port->BooleanValue()) | 311 if (!has_port->BooleanValue()) |
330 continue; | 312 continue; |
331 | 313 |
332 std::vector<v8::Handle<v8::Value> > arguments; | 314 std::vector<v8::Handle<v8::Value> > arguments; |
333 | 315 |
334 // Convert the message to a v8 object; either a value or undefined. | 316 // Convert the message to a v8 object; either a value or undefined. |
335 // See PostMessage for more details. | 317 // See PostMessage for more details. |
336 if (message.empty()) { | 318 if (message.empty()) { |
337 arguments.push_back(v8::Undefined()); | 319 arguments.push_back(v8::Undefined()); |
338 } else { | 320 } else { |
339 CHECK_EQ(1u, message.GetSize()); | 321 CHECK_EQ(1u, message.GetSize()); |
340 const base::Value* message_value = NULL; | 322 const base::Value* message_value = NULL; |
341 message.Get(0, &message_value); | 323 message.Get(0, &message_value); |
342 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 324 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
343 arguments.push_back(converter->ToV8Value(message_value, context)); | 325 arguments.push_back(converter->ToV8Value(message_value, context)); |
344 } | 326 } |
345 | 327 |
346 arguments.push_back(port_id_handle); | 328 arguments.push_back(port_id_handle); |
347 CHECK((*it)->CallChromeHiddenMethod("Port.dispatchOnMessage", | 329 (*it)->module_system()->CallModuleMethod("miscellaneous_bindings", |
348 arguments.size(), | 330 "dispatchOnMessage", |
349 &arguments[0], | 331 &arguments); |
350 NULL)); | |
351 } | 332 } |
352 } | 333 } |
353 | 334 |
354 // static | 335 // static |
355 void MiscellaneousBindings::DispatchOnDisconnect( | 336 void MiscellaneousBindings::DispatchOnDisconnect( |
356 const ChromeV8ContextSet::ContextSet& contexts, | 337 const ChromeV8ContextSet::ContextSet& contexts, |
357 int port_id, | 338 int port_id, |
358 const std::string& error_message, | 339 const std::string& error_message, |
359 content::RenderView* restrict_to_render_view) { | 340 content::RenderView* restrict_to_render_view) { |
360 v8::HandleScope handle_scope; | 341 v8::HandleScope handle_scope; |
361 | 342 |
362 for (ChromeV8ContextSet::ContextSet::const_iterator it = contexts.begin(); | 343 for (ChromeV8ContextSet::ContextSet::const_iterator it = contexts.begin(); |
363 it != contexts.end(); ++it) { | 344 it != contexts.end(); ++it) { |
364 if (restrict_to_render_view && | 345 if (restrict_to_render_view && |
365 restrict_to_render_view != (*it)->GetRenderView()) { | 346 restrict_to_render_view != (*it)->GetRenderView()) { |
366 continue; | 347 continue; |
367 } | 348 } |
368 | 349 |
369 std::vector<v8::Handle<v8::Value> > arguments; | 350 std::vector<v8::Handle<v8::Value> > arguments; |
370 arguments.push_back(v8::Integer::New(port_id)); | 351 arguments.push_back(v8::Integer::New(port_id)); |
371 if (!error_message.empty()) { | 352 if (!error_message.empty()) { |
372 arguments.push_back(v8::String::New(error_message.c_str())); | 353 arguments.push_back(v8::String::New(error_message.c_str())); |
373 } else { | 354 } else { |
374 arguments.push_back(v8::Null()); | 355 arguments.push_back(v8::Null()); |
375 } | 356 } |
376 (*it)->CallChromeHiddenMethod("Port.dispatchOnDisconnect", | 357 (*it)->module_system()->CallModuleMethod("miscellaneous_bindings", |
377 arguments.size(), &arguments[0], | 358 "dispatchOnDisconnect", |
378 NULL); | 359 &arguments); |
379 } | 360 } |
380 } | 361 } |
381 | 362 |
382 } // namespace extensions | 363 } // namespace extensions |
OLD | NEW |