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

Unified Diff: content/renderer/pepper/npapi_glue.cc

Issue 400823004: gin (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | « content/renderer/pepper/npapi_glue.h ('k') | content/renderer/pepper/npobject_var.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/pepper/npapi_glue.cc
diff --git a/content/renderer/pepper/npapi_glue.cc b/content/renderer/pepper/npapi_glue.cc
deleted file mode 100644
index 990d3302e89f7c7bca1adc0c0ae476eccaa8dd7f..0000000000000000000000000000000000000000
--- a/content/renderer/pepper/npapi_glue.cc
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright (c) 2011 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 "content/renderer/pepper/npapi_glue.h"
-
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_util.h"
-#include "content/renderer/pepper/host_array_buffer_var.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/host_var_tracker.h"
-#include "content/renderer/pepper/npobject_var.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/plugin_object.h"
-#include "ppapi/c/pp_var.h"
-#include "third_party/npapi/bindings/npapi.h"
-#include "third_party/npapi/bindings/npruntime.h"
-#include "third_party/WebKit/public/web/WebBindings.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"
-
-using ppapi::NPObjectVar;
-using ppapi::PpapiGlobals;
-using ppapi::StringVar;
-using ppapi::Var;
-using blink::WebArrayBuffer;
-using blink::WebBindings;
-using blink::WebLocalFrame;
-using blink::WebPluginContainer;
-
-namespace content {
-
-namespace {
-
-const char kInvalidPluginValue[] = "Error: Plugin returned invalid value.";
-
-PP_Var NPObjectToPPVarImpl(PepperPluginInstanceImpl* instance,
- NPObject* object,
- v8::Local<v8::Context> context) {
- DCHECK(object);
- if (context.IsEmpty())
- return PP_MakeUndefined();
- v8::Context::Scope context_scope(context);
-
- WebArrayBuffer buffer;
- // TODO(dmichael): Should I protect against duplicate Vars representing the
- // same array buffer? It's probably not worth the trouble, since it will only
- // affect in-process plugins.
- if (WebBindings::getArrayBuffer(object, &buffer)) {
- scoped_refptr<HostArrayBufferVar> buffer_var(
- new HostArrayBufferVar(buffer));
- return buffer_var->GetPPVar();
- }
- scoped_refptr<NPObjectVar> object_var(
- HostGlobals::Get()->host_var_tracker()->NPObjectVarForNPObject(
- instance->pp_instance(), object));
- if (!object_var.get()) { // No object for this module yet, make a new one.
- object_var = new NPObjectVar(instance->pp_instance(), object);
- }
- return object_var->GetPPVar();
-}
-
-} // namespace
-
-// Utilities -------------------------------------------------------------------
-
-bool PPVarToNPVariant(PP_Var var, NPVariant* result) {
- switch (var.type) {
- case PP_VARTYPE_UNDEFINED:
- VOID_TO_NPVARIANT(*result);
- break;
- case PP_VARTYPE_NULL:
- NULL_TO_NPVARIANT(*result);
- break;
- case PP_VARTYPE_BOOL:
- BOOLEAN_TO_NPVARIANT(var.value.as_bool, *result);
- break;
- case PP_VARTYPE_INT32:
- INT32_TO_NPVARIANT(var.value.as_int, *result);
- break;
- case PP_VARTYPE_DOUBLE:
- DOUBLE_TO_NPVARIANT(var.value.as_double, *result);
- break;
- case PP_VARTYPE_STRING: {
- StringVar* string = StringVar::FromPPVar(var);
- if (!string) {
- VOID_TO_NPVARIANT(*result);
- return false;
- }
- const std::string& value = string->value();
- char* c_string = static_cast<char*>(malloc(value.size()));
- memcpy(c_string, value.data(), value.size());
- STRINGN_TO_NPVARIANT(c_string, value.size(), *result);
- break;
- }
- case PP_VARTYPE_OBJECT: {
- scoped_refptr<NPObjectVar> object(NPObjectVar::FromPPVar(var));
- if (!object.get()) {
- VOID_TO_NPVARIANT(*result);
- return false;
- }
- OBJECT_TO_NPVARIANT(WebBindings::retainObject(object->np_object()),
- *result);
- break;
- }
- // The following types are not supported for use with PPB_Var_Deprecated,
- // because PPB_Var_Deprecated is only for trusted plugins, and the trusted
- // plugins we have don't need these types. We can add support in the future
- // if it becomes necessary.
- case PP_VARTYPE_ARRAY:
- case PP_VARTYPE_DICTIONARY:
- case PP_VARTYPE_ARRAY_BUFFER:
- case PP_VARTYPE_RESOURCE:
- VOID_TO_NPVARIANT(*result);
- break;
- }
- return true;
-}
-
-PP_Var NPVariantToPPVar(PepperPluginInstanceImpl* instance,
- const NPVariant* variant) {
- switch (variant->type) {
- case NPVariantType_Void:
- return PP_MakeUndefined();
- case NPVariantType_Null:
- return PP_MakeNull();
- case NPVariantType_Bool:
- return PP_MakeBool(PP_FromBool(NPVARIANT_TO_BOOLEAN(*variant)));
- case NPVariantType_Int32:
- return PP_MakeInt32(NPVARIANT_TO_INT32(*variant));
- case NPVariantType_Double:
- return PP_MakeDouble(NPVARIANT_TO_DOUBLE(*variant));
- case NPVariantType_String:
- return StringVar::StringToPPVar(
- NPVARIANT_TO_STRING(*variant).UTF8Characters,
- NPVARIANT_TO_STRING(*variant).UTF8Length);
- case NPVariantType_Object:
- return NPObjectToPPVar(instance, NPVARIANT_TO_OBJECT(*variant));
- }
- NOTREACHED();
- return PP_MakeUndefined();
-}
-
-NPIdentifier PPVarToNPIdentifier(PP_Var var) {
- switch (var.type) {
- case PP_VARTYPE_STRING: {
- StringVar* string = StringVar::FromPPVar(var);
- if (!string)
- return NULL;
- return WebBindings::getStringIdentifier(string->value().c_str());
- }
- case PP_VARTYPE_INT32:
- return WebBindings::getIntIdentifier(var.value.as_int);
- default:
- return NULL;
- }
-}
-
-PP_Var NPIdentifierToPPVar(NPIdentifier id) {
- const NPUTF8* string_value = NULL;
- int32_t int_value = 0;
- bool is_string = false;
- WebBindings::extractIdentifierData(id, string_value, int_value, is_string);
- if (is_string)
- return StringVar::StringToPPVar(string_value);
-
- return PP_MakeInt32(int_value);
-}
-
-PP_Var NPObjectToPPVar(PepperPluginInstanceImpl* instance, NPObject* object) {
- WebPluginContainer* container = instance->container();
- // 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 PP_MakeUndefined();
- WebLocalFrame* frame = container->element().document().frame();
- if (!frame)
- return PP_MakeUndefined();
-
- v8::HandleScope scope(instance->GetIsolate());
- v8::Local<v8::Context> context = frame->mainWorldScriptContext();
- return NPObjectToPPVarImpl(instance, object, context);
-}
-
-PP_Var NPObjectToPPVarForTest(PepperPluginInstanceImpl* instance,
- NPObject* object) {
- v8::Isolate* test_isolate = v8::Isolate::New();
- PP_Var result = PP_MakeUndefined();
- {
- v8::HandleScope scope(test_isolate);
- v8::Isolate::Scope isolate_scope(test_isolate);
- v8::Local<v8::Context> context = v8::Context::New(test_isolate);
- result = NPObjectToPPVarImpl(instance, object, context);
- }
- test_isolate->Dispose();
- return result;
-}
-
-// PPResultAndExceptionToNPResult ----------------------------------------------
-
-PPResultAndExceptionToNPResult::PPResultAndExceptionToNPResult(
- NPObject* object_var,
- NPVariant* np_result)
- : object_var_(object_var),
- np_result_(np_result),
- exception_(PP_MakeUndefined()),
- success_(false),
- checked_exception_(false) {}
-
-PPResultAndExceptionToNPResult::~PPResultAndExceptionToNPResult() {
- // The user should have called SetResult or CheckExceptionForNoResult
- // before letting this class go out of scope, or the exception will have
- // been lost.
- DCHECK(checked_exception_);
-
- PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(exception_);
-}
-
-// Call this with the return value of the PPAPI function. It will convert
-// the result to the NPVariant output parameter and pass any exception on to
-// the JS engine. It will update the success flag and return it.
-bool PPResultAndExceptionToNPResult::SetResult(PP_Var result) {
- DCHECK(!checked_exception_); // Don't call more than once.
- DCHECK(np_result_); // Should be expecting a result.
-
- checked_exception_ = true;
-
- if (has_exception()) {
- ThrowException();
- success_ = false;
- } else if (!PPVarToNPVariant(result, np_result_)) {
- WebBindings::setException(object_var_, kInvalidPluginValue);
- success_ = false;
- } else {
- success_ = true;
- }
-
- // No matter what happened, we need to release the reference to the
- // value passed in. On success, a reference to this value will be in
- // the np_result_.
- PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(result);
- return success_;
-}
-
-// Call this after calling a PPAPI function that could have set the
-// exception. It will pass the exception on to the JS engine and update
-// the success flag.
-//
-// The success flag will be returned.
-bool PPResultAndExceptionToNPResult::CheckExceptionForNoResult() {
- DCHECK(!checked_exception_); // Don't call more than once.
- DCHECK(!np_result_); // Can't have a result when doing this.
-
- checked_exception_ = true;
-
- if (has_exception()) {
- ThrowException();
- success_ = false;
- return false;
- }
- success_ = true;
- return true;
-}
-
-// Call this to ignore any exception. This prevents the DCHECK from failing
-// in the destructor.
-void PPResultAndExceptionToNPResult::IgnoreException() {
- checked_exception_ = true;
-}
-
-// Throws the current exception to JS. The exception must be set.
-void PPResultAndExceptionToNPResult::ThrowException() {
- StringVar* string = StringVar::FromPPVar(exception_);
- if (string)
- WebBindings::setException(object_var_, string->value().c_str());
-}
-
-// PPVarArrayFromNPVariantArray ------------------------------------------------
-
-PPVarArrayFromNPVariantArray::PPVarArrayFromNPVariantArray(
- PepperPluginInstanceImpl* instance,
- size_t size,
- const NPVariant* variants)
- : size_(size) {
- if (size_ > 0) {
- array_.reset(new PP_Var[size_]);
- for (size_t i = 0; i < size_; i++)
- array_[i] = NPVariantToPPVar(instance, &variants[i]);
- }
-}
-
-PPVarArrayFromNPVariantArray::~PPVarArrayFromNPVariantArray() {
- ppapi::VarTracker* var_tracker = PpapiGlobals::Get()->GetVarTracker();
- for (size_t i = 0; i < size_; i++)
- var_tracker->ReleaseVar(array_[i]);
-}
-
-// PPVarFromNPObject -----------------------------------------------------------
-
-PPVarFromNPObject::PPVarFromNPObject(PepperPluginInstanceImpl* instance,
- NPObject* object)
- : var_(NPObjectToPPVar(instance, object)) {}
-
-PPVarFromNPObject::~PPVarFromNPObject() {
- PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(var_);
-}
-
-// NPObjectAccessorWithIdentifier ----------------------------------------------
-
-NPObjectAccessorWithIdentifier::NPObjectAccessorWithIdentifier(
- NPObject* object,
- NPIdentifier identifier,
- bool allow_integer_identifier)
- : object_(PluginObject::FromNPObject(object)),
- identifier_(PP_MakeUndefined()) {
- if (object_) {
- identifier_ = NPIdentifierToPPVar(identifier);
- if (identifier_.type == PP_VARTYPE_INT32 && !allow_integer_identifier)
- identifier_.type = PP_VARTYPE_UNDEFINED; // Mark it invalid.
- }
-}
-
-NPObjectAccessorWithIdentifier::~NPObjectAccessorWithIdentifier() {
- PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(identifier_);
-}
-
-// TryCatch --------------------------------------------------------------------
-
-TryCatch::TryCatch(PP_Var* exception)
- : has_exception_(exception && exception->type != PP_VARTYPE_UNDEFINED),
- exception_(exception) {
- WebBindings::pushExceptionHandler(&TryCatch::Catch, this);
-}
-
-TryCatch::~TryCatch() { WebBindings::popExceptionHandler(); }
-
-void TryCatch::SetException(const char* message) {
- if (!has_exception()) {
- has_exception_ = true;
- if (exception_) {
- if (!message)
- message = "Unknown exception.";
- *exception_ = ppapi::StringVar::StringToPPVar(message, strlen(message));
- }
- }
-}
-
-// static
-void TryCatch::Catch(void* self, const char* message) {
- static_cast<TryCatch*>(self)->SetException(message);
-}
-
-} // namespace content
« no previous file with comments | « content/renderer/pepper/npapi_glue.h ('k') | content/renderer/pepper/npobject_var.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698