1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/plugins/ipc/PluginScriptableObjectUtils-inl.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,162 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * vim: sw=2 ts=2 et : 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "PluginScriptableObjectUtils.h" 1.11 + 1.12 +namespace { 1.13 + 1.14 +template<class InstanceType> 1.15 +class VariantTraits; 1.16 + 1.17 +template<> 1.18 +class VariantTraits<mozilla::plugins::PluginInstanceParent> 1.19 +{ 1.20 +public: 1.21 + typedef mozilla::plugins::PluginScriptableObjectParent ScriptableObjectType; 1.22 +}; 1.23 + 1.24 +template<> 1.25 +class VariantTraits<mozilla::plugins::PluginInstanceChild> 1.26 +{ 1.27 +public: 1.28 + typedef mozilla::plugins::PluginScriptableObjectChild ScriptableObjectType; 1.29 +}; 1.30 + 1.31 +} /* anonymous namespace */ 1.32 + 1.33 +inline bool 1.34 +mozilla::plugins::ConvertToVariant(const Variant& aRemoteVariant, 1.35 + NPVariant& aVariant, 1.36 + PluginInstanceParent* aInstance) 1.37 +{ 1.38 + switch (aRemoteVariant.type()) { 1.39 + case Variant::Tvoid_t: { 1.40 + VOID_TO_NPVARIANT(aVariant); 1.41 + break; 1.42 + } 1.43 + 1.44 + case Variant::Tnull_t: { 1.45 + NULL_TO_NPVARIANT(aVariant); 1.46 + break; 1.47 + } 1.48 + 1.49 + case Variant::Tbool: { 1.50 + BOOLEAN_TO_NPVARIANT(aRemoteVariant.get_bool(), aVariant); 1.51 + break; 1.52 + } 1.53 + 1.54 + case Variant::Tint: { 1.55 + INT32_TO_NPVARIANT(aRemoteVariant.get_int(), aVariant); 1.56 + break; 1.57 + } 1.58 + 1.59 + case Variant::Tdouble: { 1.60 + DOUBLE_TO_NPVARIANT(aRemoteVariant.get_double(), aVariant); 1.61 + break; 1.62 + } 1.63 + 1.64 + case Variant::TnsCString: { 1.65 + const nsCString& string = aRemoteVariant.get_nsCString(); 1.66 + NPUTF8* buffer = reinterpret_cast<NPUTF8*>(strdup(string.get())); 1.67 + if (!buffer) { 1.68 + NS_ERROR("Out of memory!"); 1.69 + return false; 1.70 + } 1.71 + STRINGN_TO_NPVARIANT(buffer, string.Length(), aVariant); 1.72 + break; 1.73 + } 1.74 + 1.75 + case Variant::TPPluginScriptableObjectParent: { 1.76 + NS_ASSERTION(aInstance, "Must have an instance!"); 1.77 + NPObject* object = NPObjectFromVariant(aRemoteVariant); 1.78 + if (!object) { 1.79 + NS_ERROR("Er, this shouldn't fail!"); 1.80 + return false; 1.81 + } 1.82 + 1.83 + const NPNetscapeFuncs* npn = GetNetscapeFuncs(aInstance); 1.84 + if (!npn) { 1.85 + NS_ERROR("Null netscape funcs!"); 1.86 + return false; 1.87 + } 1.88 + 1.89 + npn->retainobject(object); 1.90 + OBJECT_TO_NPVARIANT(object, aVariant); 1.91 + break; 1.92 + } 1.93 + 1.94 + case Variant::TPPluginScriptableObjectChild: { 1.95 + NS_ASSERTION(!aInstance, "No instance should be given!"); 1.96 + NS_ASSERTION(PluginModuleChild::current(), 1.97 + "Should be running on child only!"); 1.98 + 1.99 + NPObject* object = NPObjectFromVariant(aRemoteVariant); 1.100 + NS_ASSERTION(object, "Null object?!"); 1.101 + 1.102 + PluginModuleChild::sBrowserFuncs.retainobject(object); 1.103 + OBJECT_TO_NPVARIANT(object, aVariant); 1.104 + break; 1.105 + } 1.106 + 1.107 + default: 1.108 + NS_NOTREACHED("Shouldn't get here!"); 1.109 + return false; 1.110 + } 1.111 + 1.112 + return true; 1.113 +} 1.114 + 1.115 +template <class InstanceType> 1.116 +bool 1.117 +mozilla::plugins::ConvertToRemoteVariant(const NPVariant& aVariant, 1.118 + Variant& aRemoteVariant, 1.119 + InstanceType* aInstance, 1.120 + bool aProtectActors) 1.121 +{ 1.122 + if (NPVARIANT_IS_VOID(aVariant)) { 1.123 + aRemoteVariant = mozilla::void_t(); 1.124 + } 1.125 + else if (NPVARIANT_IS_NULL(aVariant)) { 1.126 + aRemoteVariant = mozilla::null_t(); 1.127 + } 1.128 + else if (NPVARIANT_IS_BOOLEAN(aVariant)) { 1.129 + aRemoteVariant = NPVARIANT_TO_BOOLEAN(aVariant); 1.130 + } 1.131 + else if (NPVARIANT_IS_INT32(aVariant)) { 1.132 + aRemoteVariant = NPVARIANT_TO_INT32(aVariant); 1.133 + } 1.134 + else if (NPVARIANT_IS_DOUBLE(aVariant)) { 1.135 + aRemoteVariant = NPVARIANT_TO_DOUBLE(aVariant); 1.136 + } 1.137 + else if (NPVARIANT_IS_STRING(aVariant)) { 1.138 + NPString str = NPVARIANT_TO_STRING(aVariant); 1.139 + nsCString string(str.UTF8Characters, str.UTF8Length); 1.140 + aRemoteVariant = string; 1.141 + } 1.142 + else if (NPVARIANT_IS_OBJECT(aVariant)) { 1.143 + NPObject* object = NPVARIANT_TO_OBJECT(aVariant); 1.144 + 1.145 + typename VariantTraits<InstanceType>::ScriptableObjectType* actor = 1.146 + aInstance->GetActorForNPObject(object); 1.147 + 1.148 + if (!actor) { 1.149 + NS_ERROR("Null actor!"); 1.150 + return false; 1.151 + } 1.152 + 1.153 + if (aProtectActors) { 1.154 + actor->Protect(); 1.155 + } 1.156 + 1.157 + aRemoteVariant = actor; 1.158 + } 1.159 + else { 1.160 + NS_NOTREACHED("Shouldn't get here!"); 1.161 + return false; 1.162 + } 1.163 + 1.164 + return true; 1.165 +}