diff options
Diffstat (limited to 'chrome/renderer/extensions/extension_request_sender.cc')
-rw-r--r-- | chrome/renderer/extensions/extension_request_sender.cc | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/chrome/renderer/extensions/extension_request_sender.cc b/chrome/renderer/extensions/extension_request_sender.cc index 9b6ce3f..dd9d712 100644 --- a/chrome/renderer/extensions/extension_request_sender.cc +++ b/chrome/renderer/extensions/extension_request_sender.cc @@ -10,10 +10,13 @@ #include "chrome/renderer/extensions/chrome_v8_context_set.h" #include "chrome/renderer/extensions/extension_dispatcher.h" #include "content/public/renderer/render_view.h" +#include "content/public/renderer/v8_value_converter.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h" +using content::V8ValueConverter; + // Contains info relevant to a pending API request. struct PendingRequest { public : @@ -122,7 +125,7 @@ void ExtensionRequestSender::StartRequest( void ExtensionRequestSender::HandleResponse(int request_id, bool success, - const std::string& response, + const base::ListValue& response, const std::string& error) { linked_ptr<PendingRequest> request = RemoveRequest(request_id); @@ -138,11 +141,24 @@ void ExtensionRequestSender::HandleResponse(int request_id, return; // The frame went away. v8::HandleScope handle_scope; + v8::Handle<v8::Value> response_value = v8::Undefined(); + DCHECK(response.GetSize() <= 1); + if (response.GetSize() == 1) { + // We use a ListValue as a wrapper (our IPC system can't handle Value + // directly since it has a private constructor) so we need to extract the + // value at index 0. + Value* value = NULL; + CHECK(response.Get(0, &value)); + CHECK(value); + scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); + response_value = converter->ToV8Value(value, v8_context->v8_context()); + } + v8::Handle<v8::Value> argv[5]; argv[0] = v8::Integer::New(request_id); argv[1] = v8::String::New(request->name.c_str()); argv[2] = v8::Boolean::New(success); - argv[3] = v8::String::New(response.c_str()); + argv[3] = response_value; argv[4] = v8::String::New(error.c_str()); v8::Handle<v8::Value> retval; |