| Index: webkit/activex_shim/npn_scripting.cc
|
| ===================================================================
|
| --- webkit/activex_shim/npn_scripting.cc (revision 25626)
|
| +++ webkit/activex_shim/npn_scripting.cc (working copy)
|
| @@ -1,270 +0,0 @@
|
| -// Copyright (c) 2006-2008 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 "webkit/activex_shim/npn_scripting.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/string_util.h"
|
| -#include "webkit/activex_shim/npp_impl.h"
|
| -
|
| -namespace activex_shim {
|
| -
|
| -NPNScriptableObject::NPNScriptableObject() : npp_(NULL), object_(NULL) {
|
| -}
|
| -
|
| -NPNScriptableObject::NPNScriptableObject(NPP npp, NPObject* object)
|
| - : npp_(npp),
|
| - object_(object) {
|
| -}
|
| -
|
| -NPNScriptableObject::NPNScriptableObject(NPNScriptableObject& object)
|
| - : npp_(object.npp_),
|
| - object_(object.object_) {
|
| - if (object_)
|
| - g_browser->retainobject(object_);
|
| -}
|
| -
|
| -NPNScriptableObject::~NPNScriptableObject() {
|
| - Release();
|
| -}
|
| -
|
| -NPNScriptableObject& NPNScriptableObject::operator=(
|
| - NPNScriptableObject& object) {
|
| - if (this == &object)
|
| - return *this;
|
| - if (object_)
|
| - g_browser->releaseobject(object_);
|
| - npp_ = object.npp_;
|
| - object_ = object.object_;
|
| - if (object_)
|
| - g_browser->retainobject(object_);
|
| - return *this;
|
| -}
|
| -
|
| -void NPNScriptableObject::Init(NPP npp, NPObject* object) {
|
| - Release();
|
| - npp_ = npp;
|
| - object_ = object;
|
| -}
|
| -
|
| -void NPNScriptableObject::Release() {
|
| - if (object_) {
|
| - g_browser->releaseobject(object_);
|
| - object_ = NULL;
|
| - }
|
| - npp_ = NULL;
|
| -}
|
| -
|
| -bool NPNScriptableObject::HasProperty(const std::string& name) {
|
| - if (!IsValid())
|
| - return false;
|
| - NPIdentifier id = g_browser->getstringidentifier(name.c_str());
|
| - bool res = g_browser->hasproperty(npp_, object_, id);
|
| - // How do we release id since it's coming from the browser? the answer is
|
| - // we never release them. See implementation of NPN_GetStringIdentifier
|
| - // in npruntime.cpp.
|
| - return res;
|
| -}
|
| -
|
| -bool NPNScriptableObject::GetProperty(const std::string& name, NPVariant* ret) {
|
| - if (!IsValid())
|
| - return false;
|
| - NPIdentifier id = g_browser->getstringidentifier(name.c_str());
|
| - return g_browser->getproperty(npp_, object_, id, ret);
|
| -}
|
| -
|
| -bool NPNScriptableObject::SetProperty(const std::string& name,
|
| - const NPVariant& val) {
|
| - if (!IsValid())
|
| - return false;
|
| - NPIdentifier id = g_browser->getstringidentifier(name.c_str());
|
| - return g_browser->setproperty(npp_, object_, id, &val);
|
| -}
|
| -
|
| -NPNScriptableObject NPNScriptableObject::GetObjectProperty(
|
| - const std::string& name,
|
| - bool* succeeded) {
|
| - NPNScriptableObject res;
|
| - if (succeeded)
|
| - *succeeded = false;
|
| - NPVariant var;
|
| - if (!GetProperty(name, &var))
|
| - return res;
|
| - if (var.type == NPVariantType_Object) {
|
| - res.Init(npp_, var.value.objectValue);
|
| - // From now, the object should have reference count as 1. We shall not
|
| - // release the variant cause it will release the object.
|
| - if (succeeded)
|
| - *succeeded = true;
|
| - } else {
|
| - g_browser->releasevariantvalue(&var);
|
| - }
|
| - return res;
|
| -}
|
| -
|
| -std::wstring NPNScriptableObject::GetStringProperty(const std::string& name,
|
| - bool* succeeded) {
|
| - std::wstring res;
|
| - if (succeeded)
|
| - *succeeded = false;
|
| - NPVariant var;
|
| - if (!GetProperty(name, &var))
|
| - return res;
|
| - if (var.type == NPVariantType_String) {
|
| - std::string tmp(var.value.stringValue.UTF8Characters,
|
| - var.value.stringValue.UTF8Length);
|
| - res = UTF8ToWide(tmp.c_str());
|
| - if (succeeded)
|
| - *succeeded = true;
|
| - }
|
| - // We've made a copy of the string. Thus we should release the variant in
|
| - // any case.
|
| - g_browser->releasevariantvalue(&var);
|
| - return res;
|
| -}
|
| -
|
| -bool NPNScriptableObject::SetStringProperty(const std::string& name,
|
| - const std::wstring& val) {
|
| - NPVariantWrap var;
|
| - var.SetString(val);
|
| - return SetProperty(name, var);
|
| -}
|
| -
|
| -bool NPNScriptableObject::Invoke(const std::string& name,
|
| - const char* format, ...) {
|
| - if (!IsValid())
|
| - return false;
|
| - NPIdentifier id = g_browser->getstringidentifier(name.c_str());
|
| - std::vector<NPVariantWrap> args;
|
| - va_list argptr;
|
| - va_start(argptr, format);
|
| - for (const char* p = format; *p; ++p) {
|
| - char c = *p;
|
| - DCHECK(c == '%' && *(p + 1) != 0);
|
| - if (c != '%' || *(p + 1) == 0)
|
| - continue;
|
| - ++p;
|
| - c = *p;
|
| - NPVariantWrap var;
|
| - switch(c) {
|
| - case 's': {
|
| - // String
|
| - wchar_t *s = va_arg(argptr, wchar_t*);
|
| - var.SetString(s);
|
| - break;
|
| - }
|
| - case 'd': {
|
| - // String
|
| - int n = va_arg(argptr, int);
|
| - var.SetInt(n);
|
| - break;
|
| - }
|
| - default: {
|
| - DCHECK(false);
|
| - break;
|
| - }
|
| - }
|
| - args.push_back(var);
|
| - }
|
| - NPVariant ret;
|
| - ret.type = NPVariantType_Void;
|
| - bool res = false;
|
| - if (args.size())
|
| - res = g_browser->invoke(npp_, object_, id, &args[0],
|
| - static_cast<unsigned int>(args.size()), &ret);
|
| - else
|
| - res = g_browser->invoke(npp_, object_, id, NULL, 0, &ret);
|
| -
|
| - g_browser->releasevariantvalue(&ret);
|
| - return res;
|
| -}
|
| -
|
| -NPVariantWrap::NPVariantWrap() {
|
| - type = NPVariantType_Void;
|
| -}
|
| -
|
| -NPVariantWrap::NPVariantWrap(const NPVariantWrap& v) {
|
| - type = NPVariantType_Void;
|
| - Copy(v);
|
| -}
|
| -
|
| -NPVariantWrap::~NPVariantWrap() {
|
| - Release();
|
| -}
|
| -
|
| -NPVariantWrap& NPVariantWrap::operator=(const NPVariantWrap& v) {
|
| - if (this != &v)
|
| - Copy(v);
|
| - return *this;
|
| -}
|
| -
|
| -void NPVariantWrap::Copy(const NPVariant& v) {
|
| - if (this == &v)
|
| - return;
|
| - Release();
|
| - switch(v.type) {
|
| - case NPVariantType_Void:
|
| - break;
|
| - case NPVariantType_Null:
|
| - break;
|
| - case NPVariantType_Bool:
|
| - value.boolValue = v.value.boolValue;
|
| - break;
|
| - case NPVariantType_Int32:
|
| - value.intValue = v.value.intValue;
|
| - break;
|
| - case NPVariantType_Double:
|
| - value.doubleValue = v.value.doubleValue;
|
| - break;
|
| - case NPVariantType_String:
|
| - SetUTF8String(v.value.stringValue.UTF8Characters,
|
| - v.value.stringValue.UTF8Length);
|
| - break;
|
| - case NPVariantType_Object:
|
| - g_browser->retainobject(v.value.objectValue);
|
| - value.objectValue = v.value.objectValue;
|
| - break;
|
| - default:
|
| - DCHECK(false);
|
| - break;
|
| - }
|
| - type = v.type;
|
| -}
|
| -
|
| -void NPVariantWrap::Release() {
|
| - if (type == NPVariantType_String) {
|
| - delete[] value.stringValue.UTF8Characters;
|
| - } else if (type == NPVariantType_Object) {
|
| - g_browser->releaseobject(value.objectValue);
|
| - }
|
| - type = NPVariantType_Void;
|
| -}
|
| -
|
| -void NPVariantWrap::SetBool(bool val) {
|
| - Release();
|
| - value.boolValue = val;
|
| - type = NPVariantType_Bool;
|
| -}
|
| -
|
| -void NPVariantWrap::SetInt(int val) {
|
| - Release();
|
| - value.intValue = val;
|
| - type = NPVariantType_Int32;
|
| -}
|
| -
|
| -void NPVariantWrap::SetUTF8String(const NPUTF8* p, unsigned int size) {
|
| - Release();
|
| - value.stringValue.UTF8Characters = new char[size + 1];
|
| - memcpy(const_cast<NPUTF8*>(value.stringValue.UTF8Characters),
|
| - p, size + 1);
|
| - value.stringValue.UTF8Length = size;
|
| - type = NPVariantType_String;
|
| -}
|
| -
|
| -void NPVariantWrap::SetString(const std::wstring& val) {
|
| - std::string s = WideToUTF8(val);
|
| - SetUTF8String(s.c_str(), static_cast<unsigned int>(s.size()));
|
| -}
|
| -
|
| -} // namespace activex_shim
|
|
|