| 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
 | 
| 
 |