Index: chrome/renderer/pepper/pepper_extensions_common_host.cc |
diff --git a/chrome/renderer/pepper/pepper_extensions_common_host.cc b/chrome/renderer/pepper/pepper_extensions_common_host.cc |
index dacfd7ca49b6b8c16f488344ada2b86cb4ba652d..63a17c70439a640993fcc18ad7798ffb94bef502 100644 |
--- a/chrome/renderer/pepper/pepper_extensions_common_host.cc |
+++ b/chrome/renderer/pepper/pepper_extensions_common_host.cc |
@@ -4,25 +4,38 @@ |
#include "chrome/renderer/pepper/pepper_extensions_common_host.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
#include "base/values.h" |
+#include "chrome/renderer/extensions/chrome_v8_context.h" |
+#include "chrome/renderer/extensions/dispatcher.h" |
+#include "chrome/renderer/extensions/extension_helper.h" |
+#include "content/public/renderer/render_view.h" |
#include "content/public/renderer/renderer_ppapi_host.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/host/dispatch_host_message.h" |
#include "ppapi/host/host_message_context.h" |
#include "ppapi/host/ppapi_host.h" |
#include "ppapi/proxy/ppapi_messages.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" |
namespace chrome { |
PepperExtensionsCommonHost::PepperExtensionsCommonHost( |
content::RendererPpapiHost* host, |
PP_Instance instance, |
- PP_Resource resource) |
+ PP_Resource resource, |
+ extensions::Dispatcher* dispatcher) |
: ResourceHost(host->GetPpapiHost(), instance, resource), |
- renderer_ppapi_host_(host) { |
+ renderer_ppapi_host_(host), |
+ dispatcher_(dispatcher) { |
} |
PepperExtensionsCommonHost::~PepperExtensionsCommonHost() { |
+ dispatcher_->request_sender()->InvalidateSource(this); |
} |
// static |
@@ -30,7 +43,18 @@ PepperExtensionsCommonHost* PepperExtensionsCommonHost::Create( |
content::RendererPpapiHost* host, |
PP_Instance instance, |
PP_Resource resource) { |
- return new PepperExtensionsCommonHost(host, instance, resource); |
+ content::RenderView* render_view = host->GetRenderViewForInstance(instance); |
+ if (!render_view) |
+ return NULL; |
+ extensions::ExtensionHelper* extension_helper = |
+ extensions::ExtensionHelper::Get(render_view); |
+ if (!extension_helper) |
+ return NULL; |
+ extensions::Dispatcher* dispatcher = extension_helper->dispatcher(); |
+ if (!dispatcher) |
+ return NULL; |
+ |
+ return new PepperExtensionsCommonHost(host, instance, resource, dispatcher); |
} |
int32_t PepperExtensionsCommonHost::OnResourceMessageReceived( |
@@ -45,20 +69,66 @@ int32_t PepperExtensionsCommonHost::OnResourceMessageReceived( |
return PP_ERROR_FAILED; |
} |
+extensions::ChromeV8Context* PepperExtensionsCommonHost::GetContext() { |
+ WebKit::WebPluginContainer* container = |
+ renderer_ppapi_host_->GetContainerForInstance(pp_instance()); |
+ if (!container) |
+ return NULL; |
+ |
+ WebKit::WebFrame* frame = container->element().document().frame(); |
+ v8::HandleScope scope; |
+ return dispatcher_->v8_context_set().GetByV8Context( |
+ frame->mainWorldScriptContext()); |
+} |
+ |
+void PepperExtensionsCommonHost::OnResponseReceived( |
+ const std::string& /* name */, |
+ int request_id, |
+ bool success, |
+ const base::ListValue& response, |
+ const std::string& /* error */) { |
+ PendingRequestMap::iterator iter = pending_request_map_.find(request_id); |
+ |
+ // Ignore responses resulted from calls to OnPost(). |
+ if (iter == pending_request_map_.end()) { |
+ DCHECK_EQ(0u, response.GetSize()); |
+ return; |
+ } |
+ |
+ linked_ptr<ppapi::host::ReplyMessageContext> context = iter->second; |
+ pending_request_map_.erase(iter); |
+ |
+ context->params.set_result(success ? PP_OK : PP_ERROR_FAILED); |
+ SendReply(*context, PpapiPluginMsg_ExtensionsCommon_CallReply(response)); |
+} |
+ |
int32_t PepperExtensionsCommonHost::OnPost( |
ppapi::host::HostMessageContext* context, |
const std::string& request_name, |
- const base::ListValue& args) { |
- // TODO(yzshen): Implement it. |
- return PP_ERROR_NOTSUPPORTED; |
+ base::ListValue& args) { |
+ // TODO(yzshen): Add support for calling into JS for APIs that have custom |
+ // bindings. |
+ int request_id = dispatcher_->request_sender()->GetNextRequestId(); |
+ dispatcher_->request_sender()->StartRequest(this, request_name, request_id, |
+ false, false, &args); |
+ return PP_OK; |
} |
int32_t PepperExtensionsCommonHost::OnCall( |
ppapi::host::HostMessageContext* context, |
const std::string& request_name, |
- const base::ListValue& args) { |
- // TODO(yzshen): Implement it. |
- return PP_ERROR_NOTSUPPORTED; |
+ base::ListValue& args) { |
+ // TODO(yzshen): Add support for calling into JS for APIs that have custom |
+ // bindings. |
+ int request_id = dispatcher_->request_sender()->GetNextRequestId(); |
+ pending_request_map_[request_id] = |
+ linked_ptr<ppapi::host::ReplyMessageContext>( |
+ new ppapi::host::ReplyMessageContext( |
+ context->MakeReplyMessageContext())); |
+ |
+ dispatcher_->request_sender()->StartRequest(this, request_name, request_id, |
+ true, false, &args); |
+ return PP_OK_COMPLETIONPENDING; |
} |
} // namespace chrome |