Index: webkit/activex_shim/dispatch_object.cc |
=================================================================== |
--- webkit/activex_shim/dispatch_object.cc (revision 25626) |
+++ webkit/activex_shim/dispatch_object.cc (working copy) |
@@ -1,290 +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/dispatch_object.h" |
- |
-#include <algorithm> |
-#include <string> |
-#include <vector> |
- |
-#include "base/logging.h" |
-#include "webkit/activex_shim/activex_util.h" |
-#include "webkit/activex_shim/npp_impl.h" |
- |
-using std::string; |
-using std::wstring; |
- |
-namespace activex_shim { |
- |
-// Used when the browser asks for scriptable object. |
-static NPClass npclass = { |
- 1, // NP_CLASS_STRUCT_VERSION, |
- NPAllocate, |
- NPDeallocate, |
- NPInvalidate, |
- NPHasMethod, |
- NPInvoke, |
- NPInvokeDefault, |
- NPHasProperty, |
- NPGetProperty, |
- NPSetProperty, |
- NPRemoveProperty |
-}; |
- |
-DispatchObject::DispatchObject(DispatchObject* root) |
- : npobject_(NULL), |
- root_(root), |
- deleting_spawned_children_(false) { |
-} |
- |
-DispatchObject::~DispatchObject() { |
- if (npobject_) { |
- // We are gone, but the NPObject may still be there. So remove |
- // the reference to myself to avoid future trouble. |
- npobject_->dispatch_object = NULL; |
- } |
-} |
- |
-NPObject* DispatchObject::GetScriptableNPObject() { |
- if (npobject_ == NULL) { |
- npobject_ = static_cast<DispatchNPObject*>(NPAllocate(&npclass)); |
- } else { |
- // If it is requesting the object again, we should just return the |
- // object with increased reference count. |
- g_browser->retainobject(npobject_); |
- } |
- return npobject_; |
-} |
- |
-NPObject* DispatchObject::NPAllocate(NPClass* cls) { |
- DispatchNPObject* obj = new DispatchNPObject(); |
- obj->_class = cls; |
- obj->referenceCount = 1; |
- obj->dispatch_object = this; |
- return obj; |
-} |
- |
-void DispatchObject::NPInvalidate() { |
-} |
- |
-void DispatchObject::OnDeallocateObject(DispatchNPObject* obj) { |
- DCHECK_EQ(obj, npobject_); |
- if (obj == npobject_) { |
- // Just null our reference so that we won't accidentally access it |
- // during destruction. |
- npobject_ = NULL; |
- if (NPObjectOwnsMe()) { |
- delete this; |
- } |
- } |
-} |
- |
-bool DispatchObject::NPHasMethod(NPIdentifier name) { |
- wstring wname; |
- if (!NPIdentifierToWString(name, &wname)) |
- return false; |
- return DispIsMethodOrProperty(GetDispatch(), wname.c_str(), true); |
-} |
- |
-bool DispatchObject::NPHasProperty(NPIdentifier name) { |
- wstring wname; |
- if (!NPIdentifierToWString(name, &wname)) |
- return false; |
- return DispIsMethodOrProperty(GetDispatch(), wname.c_str(), false); |
- // Here is another way. But the problem is it can not distiguish between |
- // method and property. |
- // DISPID dispid; |
- // if (GetDispID(npobj->dispatch_object->GetDispatch(), wname.c_str(), &dispid)) |
- // return true; |
-} |
- |
-bool DispatchObject::NPInvoke(NPIdentifier name, const NPVariant* args, |
- uint32_t argCount, NPVariant* result) { |
- wstring wname; |
- if (!NPIdentifierToWString(name, &wname)) |
- return false; |
- std::vector<ScopedVariant> vars; |
- ScopedVariant vtres; |
- bool res = false; |
- do { |
- if (argCount > 0) { |
- vars.resize(argCount); |
- unsigned int i; |
- for (i = 0; i < argCount; i++) { |
- // Note that we need to reverse the order of arguments for |
- // IDispatch::Invoke. |
- if (!NPVariantToVariant(&args[argCount - i - 1], &vars[i])) |
- break; |
- } |
- if (i < argCount) |
- break; |
- } |
- if (!DispInvoke(GetDispatch(), wname.c_str(), |
- argCount > 0 ? &vars[0] : NULL, |
- argCount, &vtres)) |
- break; |
- if (!VariantToNPVariant(this, &vtres, result)) |
- break; |
- res = true; |
- } while (false); |
- return res; |
-} |
- |
-bool DispatchObject::NPInvokeDefault(const NPVariant* args, uint32_t argCount, |
- NPVariant* result) { |
- return false; |
-} |
- |
-bool DispatchObject::NPGetProperty(NPIdentifier name, NPVariant* variant) { |
- wstring wname; |
- if (!NPIdentifierToWString(name, &wname)) |
- return false; |
- ScopedVariant result; |
- if (!DispInvoke(GetDispatch(), wname.c_str(), NULL, 0, &result)) |
- return false; |
- if (!VariantToNPVariant(this, &result, variant)) |
- return false; |
- return true; |
-} |
- |
-bool DispatchObject::NPSetProperty(NPIdentifier name, const NPVariant* variant) { |
- wstring wname; |
- if (!NPIdentifierToWString(name, &wname)) |
- return false; |
- ScopedVariant rvalue; |
- if (!NPVariantToVariant(variant, &rvalue)) |
- return false; |
- if (!DispSetProperty(GetDispatch(), wname.c_str(), rvalue)) |
- return false; |
- return true; |
-} |
- |
-bool DispatchObject::NPRemoveProperty(NPIdentifier propertyName) { |
- return false; |
-} |
- |
-void DispatchObject::AddSpawned(DispatchObject* obj) { |
- // I myself must be the root. |
- DCHECK(root_ == NULL); |
- spawned_children_.push_back(obj); |
-} |
- |
-void DispatchObject::RemoveSpawned(DispatchObject* obj) { |
- // This is to avoid problem when the root object is calling ReleaseSpawned to |
- // delete all spawned children. |
- if (deleting_spawned_children_) |
- return; |
- DCHECK(root_ == NULL); |
- SpawnedChildrenList::iterator it = std::find(spawned_children_.begin(), |
- spawned_children_.end(), obj); |
- if (it == spawned_children_.end()) { |
- DCHECK(false); |
- return; |
- } |
- spawned_children_.erase(it); |
-} |
- |
-void DispatchObject::ReleaseSpawned() { |
- DCHECK(root_ == NULL); |
- deleting_spawned_children_ = true; |
- for (SpawnedChildrenList::iterator it = spawned_children_.begin(); |
- it != spawned_children_.end(); ++it) |
- delete *it; |
- deleting_spawned_children_ = false; |
- spawned_children_.clear(); |
-} |
- |
-SpawnedDispatchObject::SpawnedDispatchObject(IDispatch* dispatch, |
- DispatchObject* root) |
- : DispatchObject(root), |
- dispatch_(dispatch) { |
- if (dispatch) |
- dispatch->AddRef(); |
- DCHECK(root != NULL); |
- root->AddSpawned(this); |
-} |
- |
-SpawnedDispatchObject::~SpawnedDispatchObject() { |
- if (dispatch_) |
- dispatch_->Release(); |
- DCHECK(root_ != NULL); |
- root_->RemoveSpawned(this); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// Scripting object functions implementation. |
- |
-NPObject* NPAllocate(NPP npp, NPClass* theClass) { |
- DispatchObject* dispatch_object = static_cast<DispatchObject*>(npp->pdata); |
- return dispatch_object->NPAllocate(theClass); |
-} |
- |
-void NPDeallocate(NPObject* obj) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- // The dispatch_object could be well gone before the NPObject is released. |
- if (npobj->dispatch_object != NULL) { |
- npobj->dispatch_object->OnDeallocateObject(npobj); |
- } |
- delete npobj; |
-} |
- |
-void NPInvalidate(NPObject* obj) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return; |
- npobj->dispatch_object->NPInvalidate(); |
-} |
- |
-bool NPHasMethod(NPObject* obj, NPIdentifier name) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPHasMethod(name); |
-} |
- |
-bool NPInvoke(NPObject* obj, NPIdentifier name, const NPVariant* args, |
- uint32_t argCount, NPVariant* result) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPInvoke(name, args, argCount, result); |
-} |
- |
-bool NPInvokeDefault(NPObject* obj, const NPVariant* args, uint32_t argCount, |
- NPVariant* result) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPInvokeDefault(args, argCount, result); |
-} |
- |
-bool NPHasProperty(NPObject* obj, NPIdentifier name) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPHasProperty(name); |
-} |
- |
-bool NPGetProperty(NPObject* obj, NPIdentifier name, NPVariant* variant) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPGetProperty(name, variant); |
-} |
- |
-bool NPSetProperty(NPObject* obj, NPIdentifier name, const NPVariant* variant) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPSetProperty(name, variant); |
-} |
- |
-bool NPRemoveProperty(NPObject* obj, NPIdentifier name) { |
- DispatchNPObject* npobj = static_cast<DispatchNPObject*>(obj); |
- if (npobj->dispatch_object == NULL) |
- return false; |
- return npobj->dispatch_object->NPRemoveProperty(name); |
-} |
- |
-} // namespace activex_shim |