Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Unified Diff: components/nacl/renderer/progress_event.cc

Issue 270453004: Pepper: Clean up ProgressEvent logic. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: probable crash fix Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/nacl/renderer/progress_event.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..1e05366a0b95c776bd76da7b9d6bb23503e9e042
--- /dev/null
+++ b/components/nacl/renderer/progress_event.cc
@@ -0,0 +1,97 @@
+// 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();
+}
+
+void DispatchProgressEventOnMainThread(PP_Instance instance,
+ const ProgressEvent &event) {
+ content::PepperPluginInstance* plugin_instance =
+ content::PepperPluginInstance::Get(instance);
+ if (!plugin_instance)
+ return;
+
+ 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);
+ }
+}
+
+} // namespace
+
+void DispatchProgressEvent(PP_Instance instance, const ProgressEvent &event) {
+ ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
+ FROM_HERE,
+ base::Bind(&DispatchProgressEventOnMainThread, instance, event));
+}
+
+} // namespace nacl
« no previous file with comments | « components/nacl/renderer/progress_event.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698