| Index: components/nacl/renderer/progress_event.cc
|
| diff --git a/components/nacl/renderer/progress_event.cc b/components/nacl/renderer/progress_event.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fb3e087d2fb606fd6e48917ff24a43712a9455ca
|
| --- /dev/null
|
| +++ b/components/nacl/renderer/progress_event.cc
|
| @@ -0,0 +1,94 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/nacl/renderer/progress_event.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| +#include "base/message_loop/message_loop_proxy.h"
|
| +#include "content/public/renderer/pepper_plugin_instance.h"
|
| +#include "ppapi/c/private/ppb_nacl_private.h"
|
| +#include "ppapi/shared_impl/ppapi_globals.h"
|
| +#include "third_party/WebKit/public/platform/WebString.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/WebLocalFrame.h"
|
| +#include "third_party/WebKit/public/web/WebPluginContainer.h"
|
| +#include "v8/include/v8.h"
|
| +
|
| +namespace nacl {
|
| +
|
| +namespace {
|
| +blink::WebString EventTypeToString(PP_NaClEventType event_type) {
|
| + switch (event_type) {
|
| + case PP_NACL_EVENT_LOADSTART:
|
| + return blink::WebString::fromUTF8("loadstart");
|
| + case PP_NACL_EVENT_PROGRESS:
|
| + return blink::WebString::fromUTF8("progress");
|
| + case PP_NACL_EVENT_ERROR:
|
| + return blink::WebString::fromUTF8("error");
|
| + case PP_NACL_EVENT_ABORT:
|
| + return blink::WebString::fromUTF8("abort");
|
| + case PP_NACL_EVENT_LOAD:
|
| + return blink::WebString::fromUTF8("load");
|
| + case PP_NACL_EVENT_LOADEND:
|
| + return blink::WebString::fromUTF8("loadend");
|
| + case PP_NACL_EVENT_CRASH:
|
| + return blink::WebString::fromUTF8("crash");
|
| + }
|
| + NOTIMPLEMENTED();
|
| + return blink::WebString();
|
| +}
|
| +} // namespace
|
| +
|
| +void DispatchProgressEvent(PP_Instance instance, const ProgressEvent &event) {
|
| + content::PepperPluginInstance* plugin_instance_ =
|
| + content::PepperPluginInstance::Get(instance);
|
| +
|
| + blink::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;
|
| + blink::WebLocalFrame* 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);
|
| +
|
| + if (!event.resource_url.empty()) {
|
| + blink::WebString url_string = blink::WebString::fromUTF8(
|
| + event.resource_url.data(), event.resource_url.size());
|
| + blink::WebDOMResourceProgressEvent blink_event(
|
| + EventTypeToString(event.event_type),
|
| + event.length_is_computable,
|
| + event.loaded_bytes,
|
| + event.total_bytes,
|
| + url_string);
|
| + container->element().dispatchEvent(blink_event);
|
| + } else {
|
| + blink::WebDOMProgressEvent blink_event(EventTypeToString(event.event_type),
|
| + event.length_is_computable,
|
| + event.loaded_bytes,
|
| + event.total_bytes);
|
| + container->element().dispatchEvent(blink_event);
|
| + }
|
| +}
|
| +
|
| +void PostDispatchProgressEvent(PP_Instance instance,
|
| + const ProgressEvent &event) {
|
| + ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&DispatchProgressEvent, instance, event));
|
| +}
|
| +
|
| +} // namespace nacl
|
|
|