bool nsScriptableObjectOverwolfSample::Add( NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { if (argCount < 3 || !NPVARIANT_IS_DOUBLE(args[0]) || !NPVARIANT_IS_DOUBLE(args[1]) || !NPVARIANT_IS_OBJECT(args[2])) { NPN_SetException(this, "invalid params passed to function"); return true; } // add ref count to callback object so it won't delete NPN_RetainObject(NPVARIANT_TO_OBJECT(args[2])); // post to separate thread so that we are responsive return thread_->PostTask( std::bind( &nsScriptableObjectOverwolfSample::AddTask, this, NPVARIANT_TO_DOUBLE(args[0]), NPVARIANT_TO_DOUBLE(args[1]), NPVARIANT_TO_OBJECT(args[2]))); }
static bool invalidateRect(PluginObject* obj, const NPVariant* args, uint32_t argCount, NPVariant* result) { if (argCount != 4) return false; NPRect rect; rect.left = static_cast<int>(NPVARIANT_TO_DOUBLE(args[0])); rect.top = static_cast<int>(NPVARIANT_TO_DOUBLE(args[1])); rect.right = static_cast<int>(NPVARIANT_TO_DOUBLE(args[2])); rect.bottom = static_cast<int>(NPVARIANT_TO_DOUBLE(args[3])); browser->invalidaterect(obj->npp, &rect); return true; }
bool convert_js_to_mrb_array(NPP npp, const NPVariant &variant, mrb_state *mrb, mrb_value *result) { NPVariant length; NPN_GetProperty(npp, NPVARIANT_TO_OBJECT(variant), NPN_GetStringIdentifier("length"), &length); int len; if (NPVARIANT_IS_INT32(length)){ len = NPVARIANT_TO_INT32(length); }else if (NPVARIANT_IS_DOUBLE(length)){ len = static_cast< int >(NPVARIANT_TO_DOUBLE(length)); // Why double?? }else{ NPN_ReleaseVariantValue(&length); return false; } NPN_ReleaseVariantValue(&length); mrb_value ret_array = mrb_ary_new_capa(mrb, len); for (int32_t i=0; i<len; i++){ NPVariant item; std::ostringstream oss; oss << i; NPN_GetProperty(npp, NPVARIANT_TO_OBJECT(variant), NPN_GetStringIdentifier(oss.str().c_str()), &item); mrb_value mrb_item; if (!convert_js_to_mrb(npp, item, mrb, &mrb_item)){ NPN_ReleaseVariantValue(&item); return false; } NPN_ReleaseVariantValue(&item); mrb_ary_push(mrb, ret_array, mrb_item); } *result = ret_array; return true; }
bool convert_js_to_mrb(NPP npp, const NPVariant &variant, mrb_state *mrb, mrb_value *result) { switch(variant.type){ case NPVariantType_Void: case NPVariantType_Null: *result = mrb_nil_value(); return true; case NPVariantType_Bool: if (NPVARIANT_TO_BOOLEAN(variant)){ *result = mrb_true_value(); }else{ *result = mrb_false_value(); } return true; case NPVariantType_Int32: *result = mrb_fixnum_value(NPVARIANT_TO_INT32(variant)); return true; case NPVariantType_Double: *result = mrb_float_value(NPVARIANT_TO_DOUBLE(variant)); return true; case NPVariantType_String: *result = mrb_str_new(mrb, NPVARIANT_TO_STRING(variant).UTF8Characters, NPVARIANT_TO_STRING(variant).UTF8Length); return true; case NPVariantType_Object: return convert_js_to_mrb_object(npp, variant, mrb, result); default: break; } return false; }
v8::Handle<v8::Value> convertNPVariantToV8Object(const NPVariant* variant, NPObject* owner, v8::Isolate* isolate) { NPVariantType type = variant->type; switch (type) { case NPVariantType_Int32: return v8::Integer::New(NPVARIANT_TO_INT32(*variant), isolate); case NPVariantType_Double: return v8::Number::New(isolate, NPVARIANT_TO_DOUBLE(*variant)); case NPVariantType_Bool: return v8Boolean(NPVARIANT_TO_BOOLEAN(*variant), isolate); case NPVariantType_Null: return v8::Null(isolate); case NPVariantType_Void: return v8::Undefined(isolate); case NPVariantType_String: { NPString src = NPVARIANT_TO_STRING(*variant); return v8::String::NewFromUtf8(isolate, src.UTF8Characters, v8::String::kNormalString, src.UTF8Length); } case NPVariantType_Object: { NPObject* object = NPVARIANT_TO_OBJECT(*variant); if (V8NPObject* v8Object = npObjectToV8NPObject(object)) return v8::Local<v8::Object>::New(isolate, v8Object->v8Object); return createV8ObjectForNPObject(object, owner, isolate); } default: return v8::Undefined(isolate); } }
v8::Handle<v8::Value> convertNPVariantToV8Object(const NPVariant* variant, NPObject* npobject) { NPVariantType type = variant->type; switch (type) { case NPVariantType_Int32: return v8Integer(NPVARIANT_TO_INT32(*variant)); case NPVariantType_Double: return v8::Number::New(NPVARIANT_TO_DOUBLE(*variant)); case NPVariantType_Bool: return v8Boolean(NPVARIANT_TO_BOOLEAN(*variant)); case NPVariantType_Null: return v8::Null(); case NPVariantType_Void: return v8::Undefined(); case NPVariantType_String: { NPString src = NPVARIANT_TO_STRING(*variant); return v8::String::New(src.UTF8Characters, src.UTF8Length); } case NPVariantType_Object: { NPObject* obj = NPVARIANT_TO_OBJECT(*variant); if (obj->_class == npScriptObjectClass) return reinterpret_cast<V8NPObject*>(obj)->v8Object; return createV8ObjectForNPObject(obj, npobject); } default: return v8::Undefined(); } }
bool nsScriptableObjectRawInput::DeleteInstance( NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { if (argCount != 2 || !NPVARIANT_IS_DOUBLE(args[0]) || !NPVARIANT_IS_OBJECT(args[1])) { NPN_SetException(this, "(DeleteInstance) invalid params passed to function"); return true; } int32_t id = (int32_t)(int)floor(NPVARIANT_TO_DOUBLE(args[0]) + 0.5); // all numbers come in as double in chrome... bool foundAndDeleted = PluginMethodKeyCapture::DeleteInstance(id); NPVariant out_args[2]; NPVariant ret_val; BOOLEAN_TO_NPVARIANT(foundAndDeleted, out_args[0]); INT32_TO_NPVARIANT(id, out_args[1]); // fire callback NPN_InvokeDefault( __super::npp_, NPVARIANT_TO_OBJECT(args[1]), out_args, 2, &ret_val); NPN_ReleaseVariantValue(&ret_val); return true; }
double CPlugin::GetZoomLevel() { double level = 1; NPVariant vLevel; VOID_TO_NPVARIANT(vLevel); try { NPObject* pContainer = GetContainer(); if (!NPN_Invoke(m_pNPInstance, pContainer, GetIdentifier("getZoomLevel"), NULL, 0, &vLevel)) { throw CString(_T("Cannot invoke window.Container.getZoomLevel()")); } if (NPVARIANT_IS_DOUBLE(vLevel)) level = NPVARIANT_TO_DOUBLE(vLevel); else if ( NPVARIANT_IS_INT32(vLevel) ) level = NPVARIANT_TO_INT32(vLevel); } catch (const CString& strMessage) { level = 1; UNUSED(strMessage); TRACE(_T("[CPlugin::GetZoomLevel Exception] %s\n"), strMessage); } if (!NPVARIANT_IS_VOID(vLevel)) NPN_ReleaseVariantValue(&vLevel); return level; }
NPIdentifier doubleVariantToIdentifier(NPVariant variant) { assert(NPVARIANT_IS_DOUBLE(variant)); double value = NPVARIANT_TO_DOUBLE(variant); // sadly there is no "getdoubleidentifier" int32_t integer = static_cast<int32_t>(value); return NPN_GetIntIdentifier(integer); }
JSValue convertNPVariantToValue(ExecState* exec, const NPVariant* variant, RootObject* rootObject) { JSLockHolder lock(exec); NPVariantType type = variant->type; if (type == NPVariantType_Bool) return jsBoolean(NPVARIANT_TO_BOOLEAN(*variant)); if (type == NPVariantType_Null) return jsNull(); if (type == NPVariantType_Void) return jsUndefined(); if (type == NPVariantType_Int32) return jsNumber(NPVARIANT_TO_INT32(*variant)); if (type == NPVariantType_Double) return jsNumber(NPVARIANT_TO_DOUBLE(*variant)); if (type == NPVariantType_String) return WebCore::jsString(exec, convertNPStringToUTF16(&variant->value.stringValue)); if (type == NPVariantType_Object) { NPObject* obj = variant->value.objectValue; if (obj->_class == NPScriptObjectClass) // Get JSObject from NP_JavaScriptObject. return ((JavaScriptObject*)obj)->imp; // Wrap NPObject in a CInstance. return CInstance::create(obj, rootObject)->createRuntimeObject(exec); } return jsUndefined(); }
bool NPSafeArray::GetItem(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { NPSafeArray *safe = static_cast<NPSafeArray*>(npobj); if (safe->arr_.m_psa == NULL) return false; LONG dim = safe->arr_.GetDimensions(); if (argCount < safe->arr_.GetDimensions()) { return false; } CAutoVectorPtr<LONG>pos(new LONG[dim]); for (int i = 0; i < dim; ++i) { if (NPVARIANT_IS_DOUBLE(args[i])) { pos[i] = (LONG)NPVARIANT_TO_DOUBLE(args[i]); } else if (NPVARIANT_IS_INT32(args[i])) { pos[i] = NPVARIANT_TO_INT32(args[i]); } else { return false; } } VARIANT var; if (!SUCCEEDED(safe->arr_.MultiDimGetAt(pos, var))) { return false; } Variant2NPVar(&var, result, safe->instance); return true; }
v8::Handle<v8::Value> ConvertNPVariantToV8Object(const NPVariant* variant, NPObject* npobject) { NPVariantType type = variant->type; if (type == NPVariantType_Int32) { return v8::Integer::New(NPVARIANT_TO_INT32(*variant)); } if (type == NPVariantType_Double) { return v8::Number::New(NPVARIANT_TO_DOUBLE(*variant)); } if (type == NPVariantType_Bool) { return NPVARIANT_TO_BOOLEAN(*variant) ? v8::True() : v8::False(); } if (type == NPVariantType_Null) { return v8::Null(); } if (type == NPVariantType_Void) { return v8::Undefined(); } if (type == NPVariantType_String) { NPString src = NPVARIANT_TO_STRING(*variant); return v8::String::New(src.UTF8Characters, src.UTF8Length); } if (type == NPVariantType_Object) { NPObject* obj = NPVARIANT_TO_OBJECT(*variant); if (obj->_class == NPScriptObjectClass) { return reinterpret_cast<V8NPObject*>(obj)->v8_object; } return CreateV8ObjectForNPObject(obj, npobject); } return v8::Undefined(); }
static NPIdentifier doubleVariantToIdentifier(NPVariant variant) { assert(NPVARIANT_IS_DOUBLE(variant)); double value = NPVARIANT_TO_DOUBLE(variant); // Sadly there is no "getdoubleidentifier" int32 integer = static_cast<int32>(value); return browser->getintidentifier(integer); }
static bool testGetIntIdentifier(PluginObject*, const NPVariant* args, uint32_t argCount, NPVariant* result) { if (argCount != 1 || !NPVARIANT_IS_DOUBLE(args[0])) return false; NPIdentifier identifier = browser->getintidentifier((int)NPVARIANT_TO_DOUBLE(args[0])); INT32_TO_NPVARIANT((int32_t)(long long)identifier, *result); return true; }
Any convertToAny(NPP npp, const NPVariant* variant) { switch (variant->type) { case NPVariantType_Void: case NPVariantType_Null: return Any(); break; case NPVariantType_Bool: return NPVARIANT_TO_BOOLEAN(*variant); break; case NPVariantType_Int32: return NPVARIANT_TO_INT32(*variant); break; case NPVariantType_Double: return NPVARIANT_TO_DOUBLE(*variant); break; case NPVariantType_String: return std::string(NPVARIANT_TO_STRING(*variant).utf8characters, NPVARIANT_TO_STRING(*variant).utf8length); break; case NPVariantType_Object: { NPObject* object = NPVARIANT_TO_OBJECT(*variant); if (!object) { break; } if (StubObject::isStub(object)) { StubObject* stub = static_cast<StubObject*>(object); return stub->getObject(); } PluginInstance* instance = static_cast<PluginInstance*>(npp->pdata); if (instance) { ProxyControl* proxyControl = instance->getProxyControl(); if (proxyControl) { return proxyControl->createProxy(object); } } break; } default: break; } return Any(); }
vector<string> CppVariant::toStringVector() const { WEBKIT_ASSERT(isObject()); vector<string> stringVector; NPObject* npValue = value.objectValue; NPIdentifier lengthId = WebBindings::getStringIdentifier("length"); if (!WebBindings::hasProperty(0, npValue, lengthId)) return stringVector; NPVariant lengthValue; if (!WebBindings::getProperty(0, npValue, lengthId, &lengthValue)) return stringVector; int length = 0; // The length is a double in some cases. if (NPVARIANT_IS_DOUBLE(lengthValue)) length = static_cast<int>(NPVARIANT_TO_DOUBLE(lengthValue)); else if (NPVARIANT_IS_INT32(lengthValue)) length = NPVARIANT_TO_INT32(lengthValue); WebBindings::releaseVariantValue(&lengthValue); // For sanity, only allow 100 items. length = min(100, length); for (int i = 0; i < length; ++i) { // Get each of the items. char indexInChar[20]; // Enough size to store 32-bit integer snprintf(indexInChar, 20, "%d", i); string index(indexInChar); NPIdentifier indexId = WebBindings::getStringIdentifier(index.c_str()); if (!WebBindings::hasProperty(0, npValue, indexId)) continue; NPVariant indexValue; if (!WebBindings::getProperty(0, npValue, indexId, &indexValue)) continue; if (NPVARIANT_IS_STRING(indexValue)) { string item(NPVARIANT_TO_STRING(indexValue).UTF8Characters, NPVARIANT_TO_STRING(indexValue).UTF8Length); stringVector.push_back(item); } WebBindings::releaseVariantValue(&indexValue); } return stringVector; }
bool xplayerNPObject::GetDoubleFromArguments (const NPVariant* argv, uint32_t argc, uint32_t argNum, double& _result) { if (!CheckArg (argv, argc, argNum, NPVariantType_Double)) return false; NPVariant arg = argv[argNum]; if (NPVARIANT_IS_DOUBLE (arg)) { _result = NPVARIANT_TO_DOUBLE (arg); } else if (NPVARIANT_IS_INT32 (arg)) { _result = double (NPVARIANT_TO_INT32 (arg)); } return true; }
double CPlugin::GetZoomLevel() { double level = 1; NPObject* pWindow = NULL; NPVariant vCOBA; VOID_TO_NPVARIANT(vCOBA); NPVariant vLevel; VOID_TO_NPVARIANT(vLevel); try { if ((NPN_GetValue( m_pNPInstance, NPNVWindowNPObject, &pWindow) != NPERR_NO_ERROR ) || !pWindow ) { throw(CString(_T("Cannot get window"))); } if ((!NPN_GetProperty( m_pNPInstance, pWindow, NPN_GetStringIdentifier ("COBA"), &vCOBA)) || !NPVARIANT_IS_OBJECT (vCOBA)) { throw(CString(_T("Cannot get window.COBA"))); } if (!NPN_Invoke(m_pNPInstance, NPVARIANT_TO_OBJECT(vCOBA), NPN_GetStringIdentifier("getZoomLevel"), NULL, 0, &vLevel)) { throw(CString(_T("Cannot execute window.COBA.getZoomLevel()"))); } if (NPVARIANT_IS_DOUBLE(vLevel)) level = NPVARIANT_TO_DOUBLE(vLevel); else if ( NPVARIANT_IS_INT32(vLevel) ) level = NPVARIANT_TO_INT32(vLevel); } catch (CString strMessage) { level = 1; TRACE(_T("[CPlugin::FireEvent Exception] %s"), strMessage); } if (!NPVARIANT_IS_VOID(vLevel)) NPN_ReleaseVariantValue(&vLevel); if (!NPVARIANT_IS_VOID(vCOBA)) NPN_ReleaseVariantValue(&vCOBA); if (pWindow != NULL) NPN_ReleaseObject(pWindow); return level; }
bool xplayerNPObject::GetInt32FromArguments (const NPVariant* argv, uint32_t argc, uint32_t argNum, int32_t& _result) { if (!CheckArg (argv, argc, argNum, NPVariantType_Int32)) return false; NPVariant arg = argv[argNum]; if (NPVARIANT_IS_INT32 (arg)) { _result = NPVARIANT_TO_INT32 (arg); } else if (NPVARIANT_IS_DOUBLE (arg)) { _result = int32_t (NPVARIANT_TO_DOUBLE (arg)); /* FIXMEchpe: overflow? */ } return true; }
static Eina_Bool ewk_js_npvariant_to_variant(Ewk_JS_Variant* data, const NPVariant* result) { EINA_SAFETY_ON_NULL_RETURN_VAL(data, false); EINA_SAFETY_ON_NULL_RETURN_VAL(result, false); switch (result->type) { case NPVariantType_Void: data->type = EWK_JS_VARIANT_VOID; data->value.o = 0; break; case NPVariantType_Null: data->type = EWK_JS_VARIANT_NULL; data->value.o = 0; break; case NPVariantType_Int32: data->type = EWK_JS_VARIANT_INT32; data->value.i = NPVARIANT_TO_INT32(*result); break; case NPVariantType_Double: data->type = EWK_JS_VARIANT_DOUBLE; data->value.d = NPVARIANT_TO_DOUBLE(*result); break; case NPVariantType_String: data->value.s = eina_stringshare_add_length(NPVARIANT_TO_STRING(*result).UTF8Characters, NPVARIANT_TO_STRING(*result).UTF8Length); data->type = EWK_JS_VARIANT_STRING; break; case NPVariantType_Bool: data->type = EWK_JS_VARIANT_BOOL; data->value.b = NPVARIANT_TO_BOOLEAN(*result); break; case NPVariantType_Object: data->type = EWK_JS_VARIANT_OBJECT; data->value.o = ewk_js_npobject_to_object(NPVARIANT_TO_OBJECT(*result)); break; default: return false; } return true; }
void printNPVariant(const NPVariant *value) { if (NPVARIANT_IS_DOUBLE(*value)) { double num = NPVARIANT_TO_DOUBLE(*value); log_debug("is double, value %g", num); } else if (NPVARIANT_IS_STRING(*value)) { std::string str = NPStringToString(NPVARIANT_TO_STRING(*value)); log_debug("is string, value %s", str); } else if (NPVARIANT_IS_BOOLEAN(*value)) { bool flag = NPVARIANT_TO_BOOLEAN(*value); log_debug("is boolean, value %d", flag); } else if (NPVARIANT_IS_INT32(*value)) { int num = NPVARIANT_TO_INT32(*value); log_debug("is int, value %d", num); } else if (NPVARIANT_IS_NULL(*value)) { log_debug("value is null"); } else if (NPVARIANT_IS_VOID(*value)) { log_debug("value is void"); } else if (NPVARIANT_IS_OBJECT(*value)) { log_debug("value is object"); } }
bool NPSafeArray::LBound(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result) { NPSafeArray *safe = static_cast<NPSafeArray*>(npobj); if (safe->arr_.m_psa == NULL) return false; int dim = 1; if (argCount >= 1) { if (NPVARIANT_IS_INT32(*args)) { dim = NPVARIANT_TO_INT32(*args); } else if (NPVARIANT_IS_DOUBLE(*args)) { dim = (LONG)NPVARIANT_TO_DOUBLE(*args); } else { return false; } } try{ INT32_TO_NPVARIANT(safe->arr_.GetLowerBound(dim - 1), *result); } catch (...) { return false; } return true; }
bool xplayerNPObject::GetBoolFromArguments (const NPVariant* argv, uint32_t argc, uint32_t argNum, bool& _result) { if (!CheckArg (argv, argc, argNum, NPVariantType_Bool)) return false; NPVariant arg = argv[argNum]; if (NPVARIANT_IS_BOOLEAN (arg)) { _result = NPVARIANT_TO_BOOLEAN (arg); } else if (NPVARIANT_IS_INT32 (arg)) { _result = NPVARIANT_TO_INT32 (arg) != 0; } else if (NPVARIANT_IS_DOUBLE (arg)) { _result = NPVARIANT_TO_DOUBLE (arg) != 0.0; } else { /* void/null */ _result = false; } return true; }
JSValue *convertNPVariantToValue(ExecState*, const NPVariant* variant, RootObject* rootObject) { JSLock lock; NPVariantType type = variant->type; if (type == NPVariantType_Bool) return jsBoolean(NPVARIANT_TO_BOOLEAN(*variant)); if (type == NPVariantType_Null) return jsNull(); if (type == NPVariantType_Void) return jsUndefined(); if (type == NPVariantType_Int32) return jsNumber(NPVARIANT_TO_INT32(*variant)); if (type == NPVariantType_Double) return jsNumber(NPVARIANT_TO_DOUBLE(*variant)); if (type == NPVariantType_String) { NPUTF16 *stringValue; unsigned int UTF16Length; convertNPStringToUTF16(&variant->value.stringValue, &stringValue, &UTF16Length); // requires free() of returned memory UString resultString((const UChar *)stringValue,UTF16Length); free(stringValue); return jsString(resultString); } if (type == NPVariantType_Object) { NPObject *obj = variant->value.objectValue; if (obj->_class == NPScriptObjectClass) // Get JSObject from NP_JavaScriptObject. return ((JavaScriptObject *)obj)->imp; // Wrap NPObject in a CInstance. return Instance::createRuntimeObject(Instance::CLanguage, obj, rootObject); } return jsUndefined(); }
NPError StatementObject::AddParam(const NPVariant *value) { nsODBCParam* pRec = NULL; if (NPVARIANT_IS_VOID(*value) || NPVARIANT_IS_NULL(*value)) { pRec = new nsODBCParam(); } else if (NPVARIANT_IS_BOOLEAN(*value)) { pRec = new nsODBCParam(NPVARIANT_TO_BOOLEAN(*value)); } else if (NPVARIANT_IS_INT32(*value)) { pRec = new nsODBCParam(NPVARIANT_TO_INT32(*value)); } else if (NPVARIANT_IS_DOUBLE(*value)) { double data = NPVARIANT_TO_DOUBLE(*value); double delta = ceil(data); if (data-0.000000001 <delta && data+0.000000001 > delta) pRec = new nsODBCParam((int)data); else pRec = new nsODBCParam(data); //--pRec = new nsODBCParam(NPVARIANT_TO_DOUBLE(*value)); } else if (NPVARIANT_IS_STRING(*value)) { pRec = new nsODBCParam((NPString*)&NPVARIANT_TO_STRING(*value)); } else { NPN_SetException(this, "Unsupported parameter type"); return NPERR_GENERIC_ERROR; } if (pRec) m_params.push_back(pRec); return NPERR_NO_ERROR; }
bool StatementObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { //sprintf(tmp, "stmt Invoke [%s]\n", NPN_UTF8FromIdentifier(name)); log(tmp); NPError rc; VOID_TO_NPVARIANT(*result); int index = 0; if (name == mc_Init_id) { if (argCount < 2) { NPN_SetException(this, "Too few parameters count"); return true; } #if 0 if (!(NPVARIANT_IS_INT32(args[0]) && NPVARIANT_IS_OBJECT(args[1]))) { NPN_SetException(this, "Wrong argument type"); return true; } SQLHANDLE hdbc = (SQLHANDLE)(long)NPVARIANT_TO_INT32(args[0]); #else if (!(NPVARIANT_IS_OBJECT(args[0]) && NPVARIANT_IS_OBJECT(args[1]))) { NPN_SetException(this, "Wrong argument type"); return true; } SQLHANDLE hdbc = (SQLHANDLE)NPVARIANT_TO_OBJECT(args[0]); #endif Init(hdbc, NPVARIANT_TO_OBJECT(args[1])); return true; } else if (name == mc_AddParameter_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } AddParam(args); return true; } else if (name == mc_Execute_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (!NPVARIANT_IS_STRING(args[0])) { NPN_SetException(this, "Wrong argument type"); return true; } Execute((NPString*)&NPVARIANT_TO_STRING(args[0])); return true; } else if (name == mc_Close_id) { Close(); return true; } else if (name == mc_Fetch_id) { bool ret; rc = Fetch(&ret); if (rc != NPERR_NO_ERROR) return true; BOOLEAN_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_MoreResults_id) { bool ret; rc = MoreResults(&ret); if (rc != NPERR_NO_ERROR) return true; BOOLEAN_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_GetColumnName_id) { const char *ret; if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } rc = GetColumnName(index, &ret); if (rc != NPERR_NO_ERROR) return true; STRING_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_GetVariant_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } GetVariant(index, result); return true; } else if (name == mc_GetColumnType_id) { int ret; if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } rc = GetColumnType(index, &ret); if (rc != NPERR_NO_ERROR) return true; INT32_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_IsColumnNullable_id) { bool ret; if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } rc = IsColumnNullable(index, &ret); if (rc != NPERR_NO_ERROR) return true; BOOLEAN_TO_NPVARIANT(ret, *result); return true; } else if (name == mc_GetTables_id) { if (argCount < 4) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } GetTables(&args[0], &args[1], &args[2], &args[3]); return true; } else if (name == mc_GetColumns_id) { if (argCount < 4) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } GetColumns(&args[0], &args[1], &args[2], &args[3]); return true; } else if (name == mc_GetTypeInfo_id) { if (argCount < 1) { NPN_SetException(this, "Too few parameters count"); return true; } if (NPVARIANT_IS_INT32(args[0])) index = NPVARIANT_TO_INT32(args[0]); else if (NPVARIANT_IS_DOUBLE(args[0])) index = (int)NPVARIANT_TO_DOUBLE(args[0]); else { NPN_SetException(this, "Wrong argument type"); return true; } GetTypeInfo(index); return true; } else if (name == mc_GetPrimaryKeys_id) { if (argCount < 3) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } GetPrimaryKeys(&args[0], &args[1], &args[2]); return true; } else if (name == mc_GetForeignKeys_id) { if (argCount < 6) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[4]) || NPVARIANT_IS_STRING(args[4]))) { NPN_SetException(this, "Wrong 5 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[5]) || NPVARIANT_IS_STRING(args[5]))) { NPN_SetException(this, "Wrong 6 argument type"); return true; } GetForeignKeys(&args[0], &args[1], &args[2], &args[3], &args[4], &args[5]); return true; } else if (name == mc_GetProcedures_id) { if (argCount < 3) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } GetProcedures(&args[0], &args[1], &args[2]); return true; } else if (name == mc_GetProcedureColumns_id) { if (argCount < 4) { NPN_SetException(this, "Too few parameters count"); return true; } if (!(NPVARIANT_IS_NULL(args[0]) || NPVARIANT_IS_STRING(args[0]))) { NPN_SetException(this, "Wrong 1 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[1]) || NPVARIANT_IS_STRING(args[1]))) { NPN_SetException(this, "Wrong 2 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[2]) || NPVARIANT_IS_STRING(args[2]))) { NPN_SetException(this, "Wrong 3 argument type"); return true; } if (!(NPVARIANT_IS_NULL(args[3]) || NPVARIANT_IS_STRING(args[3]))) { NPN_SetException(this, "Wrong 4 argument type"); return true; } GetProcedureColumns(&args[0], &args[1], &args[2], &args[3]); return true; } return false; }
jvalue convertNPVariantToJValue(NPVariant value, JNIType jniType, const char* javaClassName) { jvalue result; NPVariantType type = value.type; switch (jniType) { case array_type: case object_type: { result.l = static_cast<jobject>(0); // First see if we have a Java instance. if (type == NPVariantType_Object) { NPObject* objectImp = NPVARIANT_TO_OBJECT(value); if (JavaInstance* instance = ExtractJavaInstance(objectImp)) result.l = instance->javaInstance(); } // Now convert value to a string if the target type is a java.lang.string, and we're not // converting from a Null. if (!result.l && !strcmp(javaClassName, "java.lang.String")) { #ifdef CONVERT_NULL_TO_EMPTY_STRING if (type == NPVariantType_Null) { JNIEnv* env = getJNIEnv(); jchar buf[2]; jobject javaString = env->functions->NewString(env, buf, 0); result.l = javaString; } else #else if (type == NPVariantType_String) #endif { NPString src = NPVARIANT_TO_STRING(value); JNIEnv* env = getJNIEnv(); jobject javaString = env->NewStringUTF(src.UTF8Characters); result.l = javaString; } } else if (!result.l) memset(&result, 0, sizeof(jvalue)); // Handle it the same as a void case } break; case boolean_type: { if (type == NPVariantType_Bool) result.z = NPVARIANT_TO_BOOLEAN(value); else memset(&result, 0, sizeof(jvalue)); // as void case } break; case byte_type: { if (type == NPVariantType_Int32) result.b = static_cast<char>(NPVARIANT_TO_INT32(value)); else memset(&result, 0, sizeof(jvalue)); } break; case char_type: { if (type == NPVariantType_Int32) result.c = static_cast<char>(NPVARIANT_TO_INT32(value)); else memset(&result, 0, sizeof(jvalue)); } break; case short_type: { if (type == NPVariantType_Int32) result.s = static_cast<jshort>(NPVARIANT_TO_INT32(value)); else memset(&result, 0, sizeof(jvalue)); } break; case int_type: { if (type == NPVariantType_Int32) result.i = static_cast<jint>(NPVARIANT_TO_INT32(value)); else memset(&result, 0, sizeof(jvalue)); } break; case long_type: { if (type == NPVariantType_Int32) result.j = static_cast<jlong>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.j = static_cast<jlong>(NPVARIANT_TO_DOUBLE(value)); else memset(&result, 0, sizeof(jvalue)); } break; case float_type: { if (type == NPVariantType_Int32) result.f = static_cast<jfloat>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.f = static_cast<jfloat>(NPVARIANT_TO_DOUBLE(value)); else memset(&result, 0, sizeof(jvalue)); } break; case double_type: { if (type == NPVariantType_Int32) result.d = static_cast<jdouble>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.d = static_cast<jdouble>(NPVARIANT_TO_DOUBLE(value)); else memset(&result, 0, sizeof(jvalue)); } break; break; case invalid_type: default: case void_type: { memset(&result, 0, sizeof(jvalue)); } break; } return result; }
bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { if (m_pMainWindow == NULL) return false; // void Navigate({string} URL, {string} post, {string} headers) if (name == m_NavigateID) { TRACE ("Navigate called!\n"); if (argCount < 3) return false; NPVariant vURL = args[0]; if (vURL.type != NPVariantType_String) return false; CString URL = NPStringToCString(vURL.value.stringValue); NPVariant vHeaders = args[1]; if (vHeaders.type != NPVariantType_String) return false; CString headers = NPStringToCString(vHeaders.value.stringValue); NPVariant vPost = args[2]; if (vPost.type != NPVariantType_String) return false; CString post = NPStringToCString(vPost.value.stringValue); m_pMainWindow->Navigate(URL, post, headers); VOID_TO_NPVARIANT(*result); return true; } // void Refresh() else if (name == m_RefreshID) { TRACE ("Refresh called!\n"); m_pMainWindow->Refresh(); return true; } // void Stop() else if (name == m_StopID) { TRACE ("Stop called!\n"); m_pMainWindow->Stop(); return true; } // void Back() else if (name == m_BackID) { TRACE ("Back called!\n"); m_pMainWindow->Back(); return true; } // void Forward() else if (name == m_ForwardID) { TRACE ("Forward called!\n"); m_pMainWindow->Forward(); return true; } // void Focus() else if (name == m_FocusID) { TRACE ("Focus called!\n"); m_pMainWindow->Focus(); return true; } // void Copy() else if (name == m_CopyID) { TRACE ("Copy called!\n"); m_pMainWindow->Copy(); return true; } // void Cut() else if (name == m_CutID) { TRACE ("Cut called!\n"); m_pMainWindow->Cut(); return true; } // void Paste() else if (name == m_PasteID) { TRACE ("Paste called!\n"); m_pMainWindow->Paste(); return true; } // void SelectAll() else if (name == m_SelectAllID) { TRACE ("SelectAll called!\n"); m_pMainWindow->SelectAll(); return true; } // void Find() else if (name == m_FindID) { TRACE ("Find called!\n"); m_pMainWindow->Find(); return true; } // void HandOverFocus() else if (name == m_HandOverFocusID) { TRACE ("HandOverFocus called!\n"); m_pMainWindow->HandOverFocus(); return true; } // void Zoom({number} level) else if (name == m_ZoomID) { TRACE ("Zoom called!\n"); if (argCount < 1) return false; double level = 1; if (NPVARIANT_IS_DOUBLE(args[0])) level = NPVARIANT_TO_DOUBLE(args[0]); else if ( NPVARIANT_IS_INT32(args[0]) ) level = NPVARIANT_TO_INT32(args[0]); m_pMainWindow->Zoom(level); return true; } // void DisplaySecurityInfo() else if (name == m_DisplaySecurityInfoID) { TRACE ("DisplaySecurityInfo called!\n"); m_pMainWindow->DisplaySecurityInfo(); return true; } // void SaveAs() else if (name == m_SaveAsID) { TRACE ("SaveAs called!\n"); m_pMainWindow->SaveAs(); return true; } // void Print() else if (name == m_PrintID) { TRACE ("Print called!\n"); m_pMainWindow->Print(); return true; } // void PrintPreview() else if (name == m_PrintPreviewID) { TRACE ("PrintPreview called!\n"); m_pMainWindow->PrintPreview(); return true; } // void PrintSetup() else if (name == m_PrintSetupID) { TRACE ("PrintSetup called!\n"); m_pMainWindow->PrintSetup(); return true; } return false; }
static bool pluginInvoke(NPObject *header, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) { PluginObject *obj = (PluginObject *)header; if (name == pluginMethodIdentifiers[ID_TEST_CALLBACK_METHOD]) { // call whatever method name we're given if (argCount > 0 && NPVARIANT_IS_STRING(args[0])) { NPObject *windowScriptObject; browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); NPUTF8* callbackString = createCStringFromNPVariant(&args[0]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); free(callbackString); NPVariant browserResult; browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, 0, 0, &browserResult); browser->releasevariantvalue(&browserResult); VOID_TO_NPVARIANT(*result); return true; } } else if (name == pluginMethodIdentifiers[ID_TEST_GETURL]) { if (argCount == 2 && NPVARIANT_IS_STRING(args[0]) && NPVARIANT_IS_STRING(args[1])) { NPUTF8* urlString = createCStringFromNPVariant(&args[0]); NPUTF8* targetString = createCStringFromNPVariant(&args[1]); browser->geturl(obj->npp, urlString, targetString); free(urlString); free(targetString); VOID_TO_NPVARIANT(*result); return true; } else if (argCount == 1 && NPVARIANT_IS_STRING(args[0])) { NPUTF8* urlString = createCStringFromNPVariant(&args[0]); browser->geturl(obj->npp, urlString, 0); free(urlString); VOID_TO_NPVARIANT(*result); return true; } } else if (name == pluginMethodIdentifiers[ID_REMOVE_DEFAULT_METHOD]) { pluginClass.invokeDefault = 0; VOID_TO_NPVARIANT(*result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_DOM_ACCESS]) { testDOMAccess(obj); VOID_TO_NPVARIANT(*result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_GET_URL_NOTIFY]) { if (argCount == 3 && NPVARIANT_IS_STRING(args[0]) && (NPVARIANT_IS_STRING(args[1]) || NPVARIANT_IS_NULL(args[1])) && NPVARIANT_IS_STRING(args[2])) { NPUTF8* urlString = createCStringFromNPVariant(&args[0]); NPUTF8* targetString = (NPVARIANT_IS_STRING(args[1]) ? createCStringFromNPVariant(&args[1]) : NULL); NPUTF8* callbackString = createCStringFromNPVariant(&args[2]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); browser->geturlnotify(obj->npp, urlString, targetString, callbackIdentifier); free(urlString); free(targetString); free(callbackString); VOID_TO_NPVARIANT(*result); return true; } } else if (name == pluginMethodIdentifiers[ID_TEST_INVOKE_DEFAULT] && NPVARIANT_IS_OBJECT(args[0])) { NPObject *callback = NPVARIANT_TO_OBJECT(args[0]); NPVariant args[1]; NPVariant browserResult; STRINGZ_TO_NPVARIANT("test", args[0]); bool retval = browser->invokeDefault(obj->npp, callback, args, 1, &browserResult); if (retval) browser->releasevariantvalue(&browserResult); BOOLEAN_TO_NPVARIANT(retval, *result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_ENUMERATE]) { if (argCount == 2 && NPVARIANT_IS_OBJECT(args[0]) && NPVARIANT_IS_OBJECT(args[1])) { uint32_t count; NPIdentifier* identifiers; if (browser->enumerate(obj->npp, NPVARIANT_TO_OBJECT(args[0]), &identifiers, &count)) { NPObject* outArray = NPVARIANT_TO_OBJECT(args[1]); NPIdentifier pushIdentifier = browser->getstringidentifier("push"); for (uint32_t i = 0; i < count; i++) { NPUTF8* string = browser->utf8fromidentifier(identifiers[i]); if (!string) continue; NPVariant args[1]; STRINGZ_TO_NPVARIANT(string, args[0]); NPVariant browserResult; browser->invoke(obj->npp, outArray, pushIdentifier, args, 1, &browserResult); browser->releasevariantvalue(&browserResult); browser->memfree(string); } browser->memfree(identifiers); } VOID_TO_NPVARIANT(*result); return true; } return false; } else if (name == pluginMethodIdentifiers[ID_DESTROY_STREAM]) { NPError npError = browser->destroystream(obj->npp, obj->stream, NPRES_USER_BREAK); INT32_TO_NPVARIANT(npError, *result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_GETINTIDENTIFIER]) { if (argCount == 1) { NPIdentifier identifier; if (NPVARIANT_IS_DOUBLE(args[0])) { identifier = browser->getintidentifier((int)NPVARIANT_TO_DOUBLE(args[0])); INT32_TO_NPVARIANT((int32)identifier, *result); return true; } else if (NPVARIANT_IS_INT32(args[0])) { identifier = browser->getintidentifier((int)NPVARIANT_TO_INT32(args[0])); INT32_TO_NPVARIANT((int32)identifier, *result); return true; } } } else if (name == pluginMethodIdentifiers[ID_TEST_EVALUATE] && argCount == 1 && NPVARIANT_IS_STRING(args[0])) { NPObject *windowScriptObject; browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); NPString s = NPVARIANT_TO_STRING(args[0]); bool retval = browser->evaluate(obj->npp, windowScriptObject, &s, result); browser->releaseobject(windowScriptObject); return retval; } else if (name == pluginMethodIdentifiers[ID_TEST_GET_PROPERTY] && argCount > 0) { NPObject *object; browser->getvalue(obj->npp, NPNVWindowNPObject, &object); for (uint32_t i = 0; i < argCount; i++) { //assert(NPVARIANT_IS_STRING(args[i])); NPUTF8* propertyString = createCStringFromNPVariant(&args[i]); NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString); free(propertyString); NPVariant variant; bool retval = browser->getproperty(obj->npp, object, propertyIdentifier, &variant); browser->releaseobject(object); if (!retval) break; if (i + 1 < argCount) { //assert(NPVARIANT_IS_OBJECT(variant)); object = NPVARIANT_TO_OBJECT(variant); } else { *result = variant; return true; } } VOID_TO_NPVARIANT(*result); return false; } else if (name == pluginMethodIdentifiers[ID_TEST_GET_PROPERTY_RETURN_VALUE] && argCount == 2 && NPVARIANT_IS_OBJECT(args[0]) && NPVARIANT_IS_STRING(args[1])) { NPUTF8* propertyString = createCStringFromNPVariant(&args[1]); NPIdentifier propertyIdentifier = browser->getstringidentifier(propertyString); free(propertyString); NPVariant variant; bool retval = browser->getproperty(obj->npp, NPVARIANT_TO_OBJECT(args[0]), propertyIdentifier, &variant); if (retval) browser->releasevariantvalue(&variant); BOOLEAN_TO_NPVARIANT(retval, *result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_CALLBACK_METHOD_RET]) { // call whatever method name we're given, and pass it the 'window' obj. // we expect the function to return its argument. if (argCount > 0 && NPVARIANT_IS_STRING(args[0])) { NPObject *windowScriptObject; browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); NPUTF8* callbackString = createCStringFromNPVariant(&args[0]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); free(callbackString); NPVariant callbackArgs[1]; OBJECT_TO_NPVARIANT(windowScriptObject, callbackArgs[0]); NPVariant browserResult; browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, callbackArgs, 1, &browserResult); if (NPVARIANT_IS_OBJECT(browserResult)) { // Now return the callbacks return value back to our caller. // BUG 897451: This should be the same as the // windowScriptObject, but its not (in Chrome) - or at least, it // has a different refcount. This means Chrome will delete the // object before returning it and the calling JS gets a garbage // value. Firefox handles it fine. OBJECT_TO_NPVARIANT(NPVARIANT_TO_OBJECT(browserResult), *result); } else { browser->releasevariantvalue(&browserResult); VOID_TO_NPVARIANT(*result); } return true; } } else if (name == pluginMethodIdentifiers[ID_TEST_CREATE_TEST_OBJECT]) { NPObject *testObject = browser->createobject(obj->npp, getTestClass()); //assert(testObject->referenceCount == 1); OBJECT_TO_NPVARIANT(testObject, *result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_PASS_TEST_OBJECT]) { // call whatever method name we're given, and pass it our second // argument. if (argCount > 1 && NPVARIANT_IS_STRING(args[0])) { NPObject *windowScriptObject; browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); NPUTF8* callbackString = createCStringFromNPVariant(&args[0]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); free(callbackString); NPVariant browserResult; browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, &args[1], 1, &browserResult); browser->releasevariantvalue(&browserResult); VOID_TO_NPVARIANT(*result); return true; } } else if (name == pluginMethodIdentifiers[ID_TEST_CLONE_OBJECT]) { // Create another instance of the same class NPObject *new_object = browser->createobject(obj->npp, &pluginClass); //assert(new_object->referenceCount == 1); OBJECT_TO_NPVARIANT(new_object, *result); return true; } else if (name == pluginMethodIdentifiers[ID_TEST_SCRIPT_OBJECT_INVOKE]) { if (argCount > 1 && NPVARIANT_IS_STRING(args[0])) { // Invoke a script callback to get a script NPObject. Then call // a method on the script NPObject passing it a freshly created // NPObject. // Arguments: // arg1: Callback that returns a script object. // arg2: Name of the method to call on the script object returned // from the callback NPObject *windowScriptObject; browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject); // Arg1 is the name of the callback NPUTF8* callbackString = createCStringFromNPVariant(&args[0]); NPIdentifier callbackIdentifier = browser->getstringidentifier(callbackString); free(callbackString); // Invoke a callback that returns a script object NPVariant object_result; browser->invoke(obj->npp, windowScriptObject, callbackIdentifier, &args[1], 1, &object_result); // Script object returned NPObject *script_object = object_result.value.objectValue; // Arg2 is the name of the method to be called on the script object NPUTF8* object_mehod_string = createCStringFromNPVariant(&args[1]); NPIdentifier object_method = browser->getstringidentifier(object_mehod_string); free(object_mehod_string); // Create a fresh NPObject to be passed as an argument NPObject *object_arg = browser->createobject(obj->npp, &pluginClass); NPVariant invoke_args[1]; OBJECT_TO_NPVARIANT(object_arg, invoke_args[0]); // Invoke the script method NPVariant object_method_result; browser->invoke(obj->npp, script_object, object_method, invoke_args, 1, &object_method_result); browser->releasevariantvalue(&object_result); VOID_TO_NPVARIANT(*result); if (NPVARIANT_IS_OBJECT(object_method_result)) { // Now return the callbacks return value back to our caller. // BUG 897451: This should be the same as the // windowScriptObject, but its not (in Chrome) - or at least, it // has a different refcount. This means Chrome will delete the // object before returning it and the calling JS gets a garbage // value. Firefox handles it fine. OBJECT_TO_NPVARIANT(NPVARIANT_TO_OBJECT(object_method_result), *result); } else { browser->releasevariantvalue(&object_method_result); VOID_TO_NPVARIANT(*result); } return true; } } return false; }
JavaValue convertNPVariantToJavaValue(NPVariant value, const String& javaClass) { CString javaClassName = javaClass.utf8(); JavaType javaType = javaTypeFromClassName(javaClassName.data()); JavaValue result; result.m_type = javaType; NPVariantType type = value.type; switch (javaType) { case JavaTypeArray: case JavaTypeObject: { // See if we have a Java instance. if (type == NPVariantType_Object) { NPObject* objectImp = NPVARIANT_TO_OBJECT(value); result.m_objectValue = ExtractJavaInstance(objectImp); } } break; case JavaTypeString: { #ifdef CONVERT_NULL_TO_EMPTY_STRING if (type == NPVariantType_Null) { result.m_type = JavaTypeString; result.m_stringValue = String::fromUTF8(""); } else #else if (type == NPVariantType_String) #endif { NPString src = NPVARIANT_TO_STRING(value); result.m_type = JavaTypeString; result.m_stringValue = String::fromUTF8(src.UTF8Characters); } } break; case JavaTypeBoolean: { if (type == NPVariantType_Bool) result.m_booleanValue = NPVARIANT_TO_BOOLEAN(value); } break; case JavaTypeByte: { if (type == NPVariantType_Int32) result.m_byteValue = static_cast<signed char>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.m_byteValue = static_cast<signed char>(NPVARIANT_TO_DOUBLE(value)); } break; case JavaTypeChar: { if (type == NPVariantType_Int32) result.m_charValue = static_cast<unsigned short>(NPVARIANT_TO_INT32(value)); } break; case JavaTypeShort: { if (type == NPVariantType_Int32) result.m_shortValue = static_cast<short>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.m_shortValue = static_cast<short>(NPVARIANT_TO_DOUBLE(value)); } break; case JavaTypeInt: { if (type == NPVariantType_Int32) result.m_intValue = static_cast<int>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.m_intValue = static_cast<int>(NPVARIANT_TO_DOUBLE(value)); } break; case JavaTypeLong: { if (type == NPVariantType_Int32) result.m_longValue = static_cast<long long>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.m_longValue = static_cast<long long>(NPVARIANT_TO_DOUBLE(value)); } break; case JavaTypeFloat: { if (type == NPVariantType_Int32) result.m_floatValue = static_cast<float>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.m_floatValue = static_cast<float>(NPVARIANT_TO_DOUBLE(value)); } break; case JavaTypeDouble: { if (type == NPVariantType_Int32) result.m_doubleValue = static_cast<double>(NPVARIANT_TO_INT32(value)); else if (type == NPVariantType_Double) result.m_doubleValue = static_cast<double>(NPVARIANT_TO_DOUBLE(value)); } break; default: break; } return result; }