| 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 "content/renderer/pepper/message_channel.h" | 5 #include "content/renderer/pepper/message_channel.h" |
| 6 | 6 |
| 7 #include <cstdlib> | 7 #include <cstdlib> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 114 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 115 | 115 |
| 116 // Because V8 is probably not on the stack for Native->JS calls, we need to | 116 // Because V8 is probably not on the stack for Native->JS calls, we need to |
| 117 // enter the appropriate context for the plugin. | 117 // enter the appropriate context for the plugin. |
| 118 v8::Local<v8::Context> context = instance_->GetMainWorldContext(); | 118 v8::Local<v8::Context> context = instance_->GetMainWorldContext(); |
| 119 if (context.IsEmpty()) | 119 if (context.IsEmpty()) |
| 120 return; | 120 return; |
| 121 | 121 |
| 122 v8::Context::Scope context_scope(context); | 122 v8::Context::Scope context_scope(context); |
| 123 | 123 |
| 124 v8::Handle<v8::Value> v8_val; | 124 v8::Local<v8::Value> v8_val; |
| 125 if (!var_converter_.ToV8Value(message_data, context, &v8_val)) { | 125 if (!var_converter_.ToV8Value(message_data, context, &v8_val)) { |
| 126 PpapiGlobals::Get()->LogWithSource(instance_->pp_instance(), | 126 PpapiGlobals::Get()->LogWithSource(instance_->pp_instance(), |
| 127 PP_LOGLEVEL_ERROR, | 127 PP_LOGLEVEL_ERROR, |
| 128 std::string(), | 128 std::string(), |
| 129 kVarToV8ConversionError); | 129 kVarToV8ConversionError); |
| 130 return; | 130 return; |
| 131 } | 131 } |
| 132 | 132 |
| 133 WebSerializedScriptValue serialized_val = | 133 WebSerializedScriptValue serialized_val = |
| 134 WebSerializedScriptValue::serialize(v8_val); | 134 WebSerializedScriptValue::serialize(v8_val); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 160 | 160 |
| 161 // We can't drain the JS message queue directly since we haven't finished | 161 // We can't drain the JS message queue directly since we haven't finished |
| 162 // initializing the PepperWebPluginImpl yet, so the plugin isn't available in | 162 // initializing the PepperWebPluginImpl yet, so the plugin isn't available in |
| 163 // the DOM. | 163 // the DOM. |
| 164 DrainJSMessageQueueSoon(); | 164 DrainJSMessageQueueSoon(); |
| 165 | 165 |
| 166 plugin_message_queue_state_ = SEND_DIRECTLY; | 166 plugin_message_queue_state_ = SEND_DIRECTLY; |
| 167 DrainCompletedPluginMessages(); | 167 DrainCompletedPluginMessages(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 void MessageChannel::SetPassthroughObject(v8::Handle<v8::Object> passthrough) { | 170 void MessageChannel::SetPassthroughObject(v8::Local<v8::Object> passthrough) { |
| 171 passthrough_object_.Reset(instance_->GetIsolate(), passthrough); | 171 passthrough_object_.Reset(instance_->GetIsolate(), passthrough); |
| 172 } | 172 } |
| 173 | 173 |
| 174 void MessageChannel::SetReadOnlyProperty(PP_Var key, PP_Var value) { | 174 void MessageChannel::SetReadOnlyProperty(PP_Var key, PP_Var value) { |
| 175 StringVar* key_string = StringVar::FromPPVar(key); | 175 StringVar* key_string = StringVar::FromPPVar(key); |
| 176 if (key_string) { | 176 if (key_string) { |
| 177 internal_named_properties_[key_string->value()] = ScopedPPVar(value); | 177 internal_named_properties_[key_string->value()] = ScopedPPVar(value); |
| 178 } else { | 178 } else { |
| 179 NOTREACHED(); | 179 NOTREACHED(); |
| 180 } | 180 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 ->GetFunction(); | 223 ->GetFunction(); |
| 224 } else if (identifier == kPostMessageAndAwaitResponse) { | 224 } else if (identifier == kPostMessageAndAwaitResponse) { |
| 225 return GetFunctionTemplate(isolate, identifier, | 225 return GetFunctionTemplate(isolate, identifier, |
| 226 &MessageChannel::PostBlockingMessageToNative) | 226 &MessageChannel::PostBlockingMessageToNative) |
| 227 ->GetFunction(); | 227 ->GetFunction(); |
| 228 } | 228 } |
| 229 | 229 |
| 230 std::map<std::string, ScopedPPVar>::const_iterator it = | 230 std::map<std::string, ScopedPPVar>::const_iterator it = |
| 231 internal_named_properties_.find(identifier); | 231 internal_named_properties_.find(identifier); |
| 232 if (it != internal_named_properties_.end()) { | 232 if (it != internal_named_properties_.end()) { |
| 233 v8::Handle<v8::Value> result = try_catch.ToV8(it->second.get()); | 233 v8::Local<v8::Value> result = try_catch.ToV8(it->second.get()); |
| 234 if (try_catch.ThrowException()) | 234 if (try_catch.ThrowException()) |
| 235 return v8::Local<v8::Value>(); | 235 return v8::Local<v8::Value>(); |
| 236 return result; | 236 return result; |
| 237 } | 237 } |
| 238 | 238 |
| 239 PluginObject* plugin_object = GetPluginObject(isolate); | 239 PluginObject* plugin_object = GetPluginObject(isolate); |
| 240 if (plugin_object) | 240 if (plugin_object) |
| 241 return plugin_object->GetNamedProperty(isolate, identifier); | 241 return plugin_object->GetNamedProperty(isolate, identifier); |
| 242 return v8::Local<v8::Value>(); | 242 return v8::Local<v8::Value>(); |
| 243 } | 243 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 277 |
| 278 void MessageChannel::PostMessageToNative(gin::Arguments* args) { | 278 void MessageChannel::PostMessageToNative(gin::Arguments* args) { |
| 279 if (!instance_) | 279 if (!instance_) |
| 280 return; | 280 return; |
| 281 if (args->Length() != 1) { | 281 if (args->Length() != 1) { |
| 282 // TODO(raymes): Consider throwing an exception here. We don't now for | 282 // TODO(raymes): Consider throwing an exception here. We don't now for |
| 283 // backward compatibility. | 283 // backward compatibility. |
| 284 return; | 284 return; |
| 285 } | 285 } |
| 286 | 286 |
| 287 v8::Handle<v8::Value> message_data; | 287 v8::Local<v8::Value> message_data; |
| 288 if (!args->GetNext(&message_data)) { | 288 if (!args->GetNext(&message_data)) { |
| 289 NOTREACHED(); | 289 NOTREACHED(); |
| 290 } | 290 } |
| 291 | 291 |
| 292 EnqueuePluginMessage(message_data); | 292 EnqueuePluginMessage(message_data); |
| 293 DrainCompletedPluginMessages(); | 293 DrainCompletedPluginMessages(); |
| 294 } | 294 } |
| 295 | 295 |
| 296 void MessageChannel::PostBlockingMessageToNative(gin::Arguments* args) { | 296 void MessageChannel::PostBlockingMessageToNative(gin::Arguments* args) { |
| 297 if (!instance_) | 297 if (!instance_) |
| 298 return; | 298 return; |
| 299 PepperTryCatchV8 try_catch(instance_, &var_converter_, args->isolate()); | 299 PepperTryCatchV8 try_catch(instance_, &var_converter_, args->isolate()); |
| 300 if (args->Length() != 1) { | 300 if (args->Length() != 1) { |
| 301 try_catch.ThrowException( | 301 try_catch.ThrowException( |
| 302 "postMessageAndAwaitResponse requires one argument"); | 302 "postMessageAndAwaitResponse requires one argument"); |
| 303 return; | 303 return; |
| 304 } | 304 } |
| 305 | 305 |
| 306 v8::Handle<v8::Value> message_data; | 306 v8::Local<v8::Value> message_data; |
| 307 if (!args->GetNext(&message_data)) { | 307 if (!args->GetNext(&message_data)) { |
| 308 NOTREACHED(); | 308 NOTREACHED(); |
| 309 } | 309 } |
| 310 | 310 |
| 311 if (plugin_message_queue_state_ == WAITING_TO_START) { | 311 if (plugin_message_queue_state_ == WAITING_TO_START) { |
| 312 try_catch.ThrowException( | 312 try_catch.ThrowException( |
| 313 "Attempted to call a synchronous method on a plugin that was not " | 313 "Attempted to call a synchronous method on a plugin that was not " |
| 314 "yet loaded."); | 314 "yet loaded."); |
| 315 return; | 315 return; |
| 316 } | 316 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 338 | 338 |
| 339 ScopedPPVar pp_result; | 339 ScopedPPVar pp_result; |
| 340 bool was_handled = instance_->HandleBlockingMessage(param, &pp_result); | 340 bool was_handled = instance_->HandleBlockingMessage(param, &pp_result); |
| 341 if (!was_handled) { | 341 if (!was_handled) { |
| 342 try_catch.ThrowException( | 342 try_catch.ThrowException( |
| 343 "The plugin has not registered a handler for synchronous messages. " | 343 "The plugin has not registered a handler for synchronous messages. " |
| 344 "See the documentation for PPB_Messaging::RegisterMessageHandler " | 344 "See the documentation for PPB_Messaging::RegisterMessageHandler " |
| 345 "and PPP_MessageHandler."); | 345 "and PPP_MessageHandler."); |
| 346 return; | 346 return; |
| 347 } | 347 } |
| 348 v8::Handle<v8::Value> v8_result = try_catch.ToV8(pp_result.get()); | 348 v8::Local<v8::Value> v8_result = try_catch.ToV8(pp_result.get()); |
| 349 if (try_catch.ThrowException()) | 349 if (try_catch.ThrowException()) |
| 350 return; | 350 return; |
| 351 | 351 |
| 352 args->Return(v8_result); | 352 args->Return(v8_result); |
| 353 } | 353 } |
| 354 | 354 |
| 355 void MessageChannel::PostMessageToJavaScriptImpl( | 355 void MessageChannel::PostMessageToJavaScriptImpl( |
| 356 const WebSerializedScriptValue& message_data) { | 356 const WebSerializedScriptValue& message_data) { |
| 357 DCHECK(instance_); | 357 DCHECK(instance_); |
| 358 | 358 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 381 // TODO(dmichael): Add origin if we change to a more iframe-like origin | 381 // TODO(dmichael): Add origin if we change to a more iframe-like origin |
| 382 // policy (see crbug.com/81537) | 382 // policy (see crbug.com/81537) |
| 383 container->element().dispatchEvent(msg_event); | 383 container->element().dispatchEvent(msg_event); |
| 384 } | 384 } |
| 385 | 385 |
| 386 PluginObject* MessageChannel::GetPluginObject(v8::Isolate* isolate) { | 386 PluginObject* MessageChannel::GetPluginObject(v8::Isolate* isolate) { |
| 387 return PluginObject::FromV8Object(isolate, | 387 return PluginObject::FromV8Object(isolate, |
| 388 v8::Local<v8::Object>::New(isolate, passthrough_object_)); | 388 v8::Local<v8::Object>::New(isolate, passthrough_object_)); |
| 389 } | 389 } |
| 390 | 390 |
| 391 void MessageChannel::EnqueuePluginMessage(v8::Handle<v8::Value> v8_value) { | 391 void MessageChannel::EnqueuePluginMessage(v8::Local<v8::Value> v8_value) { |
| 392 plugin_message_queue_.push_back(VarConversionResult()); | 392 plugin_message_queue_.push_back(VarConversionResult()); |
| 393 // Convert the v8 value in to an appropriate PP_Var like Dictionary, | 393 // Convert the v8 value in to an appropriate PP_Var like Dictionary, |
| 394 // Array, etc. (We explicitly don't want an "Object" PP_Var, which we don't | 394 // Array, etc. (We explicitly don't want an "Object" PP_Var, which we don't |
| 395 // support for Messaging.) | 395 // support for Messaging.) |
| 396 // TODO(raymes): Possibly change this to use TryCatch to do the conversion and | 396 // TODO(raymes): Possibly change this to use TryCatch to do the conversion and |
| 397 // throw an exception if necessary. | 397 // throw an exception if necessary. |
| 398 V8VarConverter::VarResult conversion_result = | 398 V8VarConverter::VarResult conversion_result = |
| 399 var_converter_.FromV8Value( | 399 var_converter_.FromV8Value( |
| 400 v8_value, | 400 v8_value, |
| 401 v8::Isolate::GetCurrent()->GetCurrentContext(), | 401 v8::Isolate::GetCurrent()->GetCurrentContext(), |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 v8::Local<v8::FunctionTemplate> function_template = template_cache_.Get(name); | 476 v8::Local<v8::FunctionTemplate> function_template = template_cache_.Get(name); |
| 477 if (!function_template.IsEmpty()) | 477 if (!function_template.IsEmpty()) |
| 478 return function_template; | 478 return function_template; |
| 479 function_template = gin::CreateFunctionTemplate( | 479 function_template = gin::CreateFunctionTemplate( |
| 480 isolate, base::Bind(memberFuncPtr, weak_ptr_factory_.GetWeakPtr())); | 480 isolate, base::Bind(memberFuncPtr, weak_ptr_factory_.GetWeakPtr())); |
| 481 template_cache_.Set(name, function_template); | 481 template_cache_.Set(name, function_template); |
| 482 return function_template; | 482 return function_template; |
| 483 } | 483 } |
| 484 | 484 |
| 485 } // namespace content | 485 } // namespace content |
| OLD | NEW |