Index: chrome/renderer/pepper/ppb_nacl_private_impl.cc |
diff --git a/chrome/renderer/pepper/ppb_nacl_private_impl.cc b/chrome/renderer/pepper/ppb_nacl_private_impl.cc |
index 18193f323316c06b94a23b4e0ab212c5013b4b2c..45e8710bc61086c0db43f2a04b691afa73a845c7 100644 |
--- a/chrome/renderer/pepper/ppb_nacl_private_impl.cc |
+++ b/chrome/renderer/pepper/ppb_nacl_private_impl.cc |
@@ -29,11 +29,13 @@ |
#include "ppapi/shared_impl/ppapi_preferences.h" |
#include "ppapi/shared_impl/var.h" |
#include "ppapi/thunk/enter.h" |
+#include "third_party/WebKit/public/web/WebDOMResourceProgressEvent.h" |
#include "third_party/WebKit/public/web/WebDocument.h" |
#include "third_party/WebKit/public/web/WebElement.h" |
#include "third_party/WebKit/public/web/WebFrame.h" |
#include "third_party/WebKit/public/web/WebPluginContainer.h" |
#include "third_party/WebKit/public/web/WebView.h" |
+#include "v8/include/v8.h" |
namespace { |
@@ -79,15 +81,15 @@ static int GetRoutingID(PP_Instance instance) { |
// Launch NaCl's sel_ldr process. |
PP_ExternalPluginResult LaunchSelLdr(PP_Instance instance, |
- const char* alleged_url, |
- PP_Bool uses_irt, |
- PP_Bool uses_ppapi, |
- PP_Bool enable_ppapi_dev, |
- PP_Bool enable_dyncode_syscalls, |
- PP_Bool enable_exception_handling, |
- PP_Bool enable_crash_throttling, |
- void* imc_handle, |
- struct PP_Var* error_message) { |
+ const char* alleged_url, |
+ PP_Bool uses_irt, |
+ PP_Bool uses_ppapi, |
+ PP_Bool enable_ppapi_dev, |
+ PP_Bool enable_dyncode_syscalls, |
+ PP_Bool enable_exception_handling, |
+ PP_Bool enable_crash_throttling, |
+ void* imc_handle, |
+ struct PP_Var* error_message) { |
nacl::FileDescriptor result_socket; |
IPC::Sender* sender = content::RenderThread::Get(); |
DCHECK(sender); |
@@ -336,6 +338,75 @@ PP_FileHandle OpenNaClExecutable(PP_Instance instance, |
return handle; |
} |
+WebKit::WebString EventTypeToString(PP_NaClEventType event_type) { |
+ switch (event_type) { |
+ case PP_NACL_EVENT_LOADSTART: |
+ return WebKit::WebString::fromUTF8("loadstart"); |
+ case PP_NACL_EVENT_PROGRESS: |
+ return WebKit::WebString::fromUTF8("progress"); |
+ case PP_NACL_EVENT_ERROR: |
+ return WebKit::WebString::fromUTF8("error"); |
+ case PP_NACL_EVENT_ABORT: |
+ return WebKit::WebString::fromUTF8("abort"); |
+ case PP_NACL_EVENT_LOAD: |
+ return WebKit::WebString::fromUTF8("load"); |
+ case PP_NACL_EVENT_LOADEND: |
+ return WebKit::WebString::fromUTF8("loadend"); |
+ case PP_NACL_EVENT_CRASH: |
+ return WebKit::WebString::fromUTF8("crash"); |
+ } |
+ NOTIMPLEMENTED(); |
+ return WebKit::WebString(); |
+} |
+ |
+void DispatchEvent(PP_Instance instance, |
+ PP_NaClEventType event_type, |
+ struct PP_Var resource_url, |
+ PP_Bool length_is_computable, |
+ uint64_t loaded_bytes, |
+ uint64_t total_bytes) { |
+ content::PepperPluginInstance* plugin_instance = |
+ content::PepperPluginInstance::Get(instance); |
+ if (!plugin_instance) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ WebKit::WebPluginContainer* container = plugin_instance->GetContainer(); |
+ // It's possible that container() is NULL if the plugin has been removed from |
+ // the DOM (but the PluginInstance is not destroyed yet). |
+ if (!container) |
+ return; |
+ WebKit::WebFrame* frame = container->element().document().frame(); |
+ if (!frame) |
+ return; |
+ v8::HandleScope handle_scope(plugin_instance->GetIsolate()); |
+ v8::Local<v8::Context> context( |
+ plugin_instance->GetIsolate()->GetCurrentContext()); |
+ if (context.IsEmpty()) { |
+ // If there's no JavaScript on the stack, we have to make a new Context. |
+ context = v8::Context::New(plugin_instance->GetIsolate()); |
+ } |
+ v8::Context::Scope context_scope(context); |
+ |
+ ppapi::StringVar* url_var = ppapi::StringVar::FromPPVar(resource_url); |
+ if (url_var) { |
+ WebKit::WebString url_string = WebKit::WebString::fromUTF8( |
+ url_var->value().data(), url_var->value().size()); |
+ WebKit::WebDOMResourceProgressEvent event(EventTypeToString(event_type), |
+ PP_ToBool(length_is_computable), |
+ loaded_bytes, |
+ total_bytes, |
+ url_string); |
+ container->element().dispatchEvent(event); |
+ } else { |
+ WebKit::WebDOMProgressEvent event(EventTypeToString(event_type), |
+ PP_ToBool(length_is_computable), |
+ loaded_bytes, |
+ total_bytes); |
+ container->element().dispatchEvent(event); |
+ } |
+} |
+ |
const PPB_NaCl_Private nacl_interface = { |
&LaunchSelLdr, |
&StartPpapiProxy, |
@@ -348,7 +419,8 @@ const PPB_NaCl_Private nacl_interface = { |
&ReportTranslationFinished, |
&IsOffTheRecord, |
&ReportNaClError, |
- &OpenNaClExecutable |
+ &OpenNaClExecutable, |
+ &DispatchEvent |
}; |
} // namespace |