summaryrefslogtreecommitdiffstats
path: root/chromium/webkit/renderer/cpp_bound_class.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/webkit/renderer/cpp_bound_class.cc')
-rw-r--r--chromium/webkit/renderer/cpp_bound_class.cc329
1 files changed, 0 insertions, 329 deletions
diff --git a/chromium/webkit/renderer/cpp_bound_class.cc b/chromium/webkit/renderer/cpp_bound_class.cc
deleted file mode 100644
index 6a652f48505..00000000000
--- a/chromium/webkit/renderer/cpp_bound_class.cc
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright (c) 2012 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.
-
-// This file contains definitions for CppBoundClass
-
-// Here's the control flow of a JS method getting forwarded to a class.
-// - Something calls our NPObject with a function like "Invoke".
-// - CppNPObject's static invoke() function forwards it to its attached
-// CppBoundClass's Invoke() method.
-// - CppBoundClass has then overridden Invoke() to look up the function
-// name in its internal map of methods, and then calls the appropriate
-// method.
-
-#include "webkit/renderer/cpp_bound_class.h"
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "third_party/WebKit/public/web/WebBindings.h"
-#include "third_party/WebKit/public/web/WebFrame.h"
-#include "third_party/WebKit/public/platform/WebString.h"
-
-using blink::WebBindings;
-using blink::WebFrame;
-
-namespace webkit_glue {
-
-namespace {
-
-class CppVariantPropertyCallback : public CppBoundClass::PropertyCallback {
- public:
- CppVariantPropertyCallback(CppVariant* value) : value_(value) { }
-
- virtual bool GetValue(CppVariant* value) OVERRIDE {
- value->Set(*value_);
- return true;
- }
- virtual bool SetValue(const CppVariant& value) OVERRIDE {
- value_->Set(value);
- return true;
- }
-
- private:
- CppVariant* value_;
-};
-
-class GetterPropertyCallback : public CppBoundClass::PropertyCallback {
-public:
- GetterPropertyCallback(const CppBoundClass::GetterCallback& callback)
- : callback_(callback) { }
-
- virtual bool GetValue(CppVariant* value) OVERRIDE {
- callback_.Run(value);
- return true;
- }
-
- virtual bool SetValue(const CppVariant& value) OVERRIDE {
- return false;
- }
-
-private:
- CppBoundClass::GetterCallback callback_;
-};
-
-}
-
-// Our special NPObject type. We extend an NPObject with a pointer to a
-// CppBoundClass, which is just a C++ interface that we forward all NPObject
-// callbacks to.
-struct CppNPObject {
- NPObject parent; // This must be the first field in the struct.
- CppBoundClass* bound_class;
-
- //
- // All following objects and functions are static, and just used to interface
- // with NPObject/NPClass.
- //
-
- // An NPClass associates static functions of CppNPObject with the
- // function pointers used by the JS runtime.
- static NPClass np_class_;
-
- // Allocate a new NPObject with the specified class.
- static NPObject* allocate(NPP npp, NPClass* aClass);
-
- // Free an object.
- static void deallocate(NPObject* obj);
-
- // Returns true if the C++ class associated with this NPObject exposes the
- // given property. Called by the JS runtime.
- static bool hasProperty(NPObject *obj, NPIdentifier ident);
-
- // Returns true if the C++ class associated with this NPObject exposes the
- // given method. Called by the JS runtime.
- static bool hasMethod(NPObject *obj, NPIdentifier ident);
-
- // If the given method is exposed by the C++ class associated with this
- // NPObject, invokes it with the given args and returns a result. Otherwise,
- // returns "undefined" (in the JavaScript sense). Called by the JS runtime.
- static bool invoke(NPObject *obj, NPIdentifier ident,
- const NPVariant *args, uint32_t arg_count,
- NPVariant *result);
-
- // If the given property is exposed by the C++ class associated with this
- // NPObject, returns its value. Otherwise, returns "undefined" (in the
- // JavaScript sense). Called by the JS runtime.
- static bool getProperty(NPObject *obj, NPIdentifier ident,
- NPVariant *result);
-
- // If the given property is exposed by the C++ class associated with this
- // NPObject, sets its value. Otherwise, does nothing. Called by the JS
- // runtime.
- static bool setProperty(NPObject *obj, NPIdentifier ident,
- const NPVariant *value);
-};
-
-// Build CppNPObject's static function pointers into an NPClass, for use
-// in constructing NPObjects for the C++ classes.
-NPClass CppNPObject::np_class_ = {
- NP_CLASS_STRUCT_VERSION,
- CppNPObject::allocate,
- CppNPObject::deallocate,
- /* NPInvalidateFunctionPtr */ NULL,
- CppNPObject::hasMethod,
- CppNPObject::invoke,
- /* NPInvokeDefaultFunctionPtr */ NULL,
- CppNPObject::hasProperty,
- CppNPObject::getProperty,
- CppNPObject::setProperty,
- /* NPRemovePropertyFunctionPtr */ NULL
-};
-
-/* static */ NPObject* CppNPObject::allocate(NPP npp, NPClass* aClass) {
- CppNPObject* obj = new CppNPObject;
- // obj->parent will be initialized by the NPObject code calling this.
- obj->bound_class = NULL;
- return &obj->parent;
-}
-
-/* static */ void CppNPObject::deallocate(NPObject* np_obj) {
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- delete obj;
-}
-
-/* static */ bool CppNPObject::hasMethod(NPObject* np_obj,
- NPIdentifier ident) {
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- return obj->bound_class->HasMethod(ident);
-}
-
-/* static */ bool CppNPObject::hasProperty(NPObject* np_obj,
- NPIdentifier ident) {
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- return obj->bound_class->HasProperty(ident);
-}
-
-/* static */ bool CppNPObject::invoke(NPObject* np_obj, NPIdentifier ident,
- const NPVariant* args, uint32_t arg_count,
- NPVariant* result) {
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- return obj->bound_class->Invoke(ident, args, arg_count, result);
-}
-
-/* static */ bool CppNPObject::getProperty(NPObject* np_obj,
- NPIdentifier ident,
- NPVariant* result) {
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- return obj->bound_class->GetProperty(ident, result);
-}
-
-/* static */ bool CppNPObject::setProperty(NPObject* np_obj,
- NPIdentifier ident,
- const NPVariant* value) {
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- return obj->bound_class->SetProperty(ident, value);
-}
-
-CppBoundClass::CppBoundClass() : bound_to_frame_(false), npp_(new NPP_t) {
- WebBindings::registerObjectOwner(npp_.get());
-}
-
-CppBoundClass::~CppBoundClass() {
- STLDeleteValues(&properties_);
-
- // TODO(wez): Remove once crrev.com/14019005 lands.
- if (bound_to_frame_)
- WebBindings::unregisterObject(NPVARIANT_TO_OBJECT(self_variant_));
-
- WebBindings::unregisterObjectOwner(npp_.get());
-}
-
-bool CppBoundClass::HasMethod(NPIdentifier ident) const {
- return (methods_.find(ident) != methods_.end());
-}
-
-bool CppBoundClass::HasProperty(NPIdentifier ident) const {
- return (properties_.find(ident) != properties_.end());
-}
-
-bool CppBoundClass::Invoke(NPIdentifier ident,
- const NPVariant* args,
- size_t arg_count,
- NPVariant* result) {
- MethodList::const_iterator method = methods_.find(ident);
- Callback callback;
- if (method == methods_.end()) {
- if (!fallback_callback_.is_null()) {
- callback = fallback_callback_;
- } else {
- VOID_TO_NPVARIANT(*result);
- return false;
- }
- } else {
- callback = method->second;
- }
-
- // Build a CppArgumentList argument vector from the NPVariants coming in.
- CppArgumentList cpp_args(arg_count);
- for (size_t i = 0; i < arg_count; i++)
- cpp_args[i].Set(args[i]);
-
- CppVariant cpp_result;
- callback.Run(cpp_args, &cpp_result);
-
- cpp_result.CopyToNPVariant(result);
- return true;
-}
-
-bool CppBoundClass::GetProperty(NPIdentifier ident, NPVariant* result) const {
- PropertyList::const_iterator callback = properties_.find(ident);
- if (callback == properties_.end()) {
- VOID_TO_NPVARIANT(*result);
- return false;
- }
-
- CppVariant cpp_value;
- if (!callback->second->GetValue(&cpp_value))
- return false;
- cpp_value.CopyToNPVariant(result);
- return true;
-}
-
-bool CppBoundClass::SetProperty(NPIdentifier ident,
- const NPVariant* value) {
- PropertyList::iterator callback = properties_.find(ident);
- if (callback == properties_.end())
- return false;
-
- CppVariant cpp_value;
- cpp_value.Set(*value);
- return (*callback).second->SetValue(cpp_value);
-}
-
-void CppBoundClass::BindCallback(const std::string& name,
- const Callback& callback) {
- NPIdentifier ident = WebBindings::getStringIdentifier(name.c_str());
- if (callback.is_null()) {
- methods_.erase(ident);
- return;
- }
-
- methods_[ident] = callback;
-}
-
-void CppBoundClass::BindGetterCallback(const std::string& name,
- const GetterCallback& callback) {
- PropertyCallback* property_callback = callback.is_null() ?
- NULL : new GetterPropertyCallback(callback);
-
- BindProperty(name, property_callback);
-}
-
-void CppBoundClass::BindProperty(const std::string& name, CppVariant* prop) {
- PropertyCallback* property_callback = prop == NULL ?
- NULL : new CppVariantPropertyCallback(prop);
-
- BindProperty(name, property_callback);
-}
-
-void CppBoundClass::BindProperty(const std::string& name,
- PropertyCallback* callback) {
- NPIdentifier ident = WebBindings::getStringIdentifier(name.c_str());
- PropertyList::iterator old_callback = properties_.find(ident);
- if (old_callback != properties_.end()) {
- delete old_callback->second;
- if (callback == NULL) {
- properties_.erase(old_callback);
- return;
- }
- }
-
- properties_[ident] = callback;
-}
-
-bool CppBoundClass::IsMethodRegistered(const std::string& name) const {
- NPIdentifier ident = WebBindings::getStringIdentifier(name.c_str());
- MethodList::const_iterator callback = methods_.find(ident);
- return (callback != methods_.end());
-}
-
-CppVariant* CppBoundClass::GetAsCppVariant() {
- if (!self_variant_.isObject()) {
- // Create an NPObject using our static NPClass. The first argument has type
- // NPP, but is only used to track object ownership, so passing this is fine.
- NPObject* np_obj = WebBindings::createObject(
- npp_.get(), &CppNPObject::np_class_);
- CppNPObject* obj = reinterpret_cast<CppNPObject*>(np_obj);
- obj->bound_class = this;
- self_variant_.Set(np_obj);
- WebBindings::releaseObject(np_obj); // CppVariant takes the reference.
- }
- DCHECK(self_variant_.isObject());
- return &self_variant_;
-}
-
-void CppBoundClass::BindToJavascript(WebFrame* frame,
- const std::string& classname) {
- // BindToWindowObject will take its own reference to the NPObject, and clean
- // up after itself. It will also (indirectly) register the object with V8,
- // against an owner pointer we supply, so we must register that as an owner,
- // and unregister when we teardown.
- frame->bindToWindowObject(ASCIIToUTF16(classname),
- NPVARIANT_TO_OBJECT(*GetAsCppVariant()));
- bound_to_frame_ = true;
-}
-
-} // namespace webkit_glue