1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2009 Pawel Hajdan (phajdan.jr@chromium.org)
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions are
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * met:
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Redistributions of source code must retain the above copyright
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer.
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Redistributions in binary form must reproduce the above
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * copyright notice, this list of conditions and the following disclaimer
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * in the documentation and/or other materials provided with the
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * distribution.
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Neither the name of Google Inc. nor the names of its
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * contributors may be used to endorse or promote products derived from
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this software without specific prior written permission.
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  CppBoundClass class:
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  This base class serves as a parent for C++ classes designed to be bound to
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  JavaScript objects.
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  Subclasses should define the constructor to build the property and method
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  lists needed to bind this class to a JS object.  They should also declare
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  and define member variables and methods to be exposed to JS through
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  that object.
41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef CppBoundClass_h
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define CppBoundClass_h
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "CppVariant.h"
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/HashMap.h>
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Noncopyable.h>
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/OwnPtr.h>
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Vector.h>
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebKit {
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass WebFrame;
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass WebString;
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef Vector<CppVariant> CppArgumentList;
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// CppBoundClass lets you map Javascript method calls and property accesses
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// directly to C++ method calls and CppVariant* variable access.
61ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass CppBoundClass {
62ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(CppBoundClass);
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    class PropertyCallback {
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    public:
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual ~PropertyCallback() { }
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Sets |value| to the value of the property. Returns false in case of
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // failure. |value| is always non-0.
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual bool getValue(CppVariant* result) = 0;
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // sets the property value to |value|. Returns false in case of failure.
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual bool setValue(const CppVariant&) = 0;
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Callback class for "void function(CppVariant*)"
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    class GetterCallback {
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    public:
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual ~GetterCallback() {}
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual void run(CppVariant*) = 0;
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // The constructor should call BindMethod, BindProperty, and
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // SetFallbackMethod as needed to set up the methods, properties, and
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // fallback method.
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CppBoundClass() : m_boundToFrame(false) {}
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual ~CppBoundClass();
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Return a CppVariant representing this class, for use with BindProperty().
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // The variant type is guaranteed to be NPVariantType_Object.
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CppVariant* getAsCppVariant();
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Given a WebFrame, BindToJavascript builds the NPObject that will represent
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // the class and binds it to the frame's window under the given name.  This
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // should generally be called from the WebView delegate's
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // WindowObjectCleared(). A class so bound will be accessible to JavaScript
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // as window.<classname>. The owner of the CppBoundObject is responsible for
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // keeping the object around while the frame is alive, and for destroying it
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // afterwards.
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindToJavascript(WebKit::WebFrame*, const WebKit::WebString& classname);
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Used by a test.  Returns true if a method with name |name| exists,
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // regardless of whether a fallback is registered.
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool isMethodRegistered(const std::string&) const;
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprotected:
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Callback for "void function(const CppArguemntList&, CppVariant*)"
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    class Callback {
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    public:
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual ~Callback() {}
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual void run(const CppArgumentList&, CppVariant*) = 0;
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Callback for "void T::method(const CppArguemntList&, CppVariant*)"
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    template <class T> class MemberCallback : public Callback {
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    public:
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        typedef void (T::*MethodType)(const CppArgumentList&, CppVariant*);
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        MemberCallback(T* object, MethodType method)
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            : m_object(object)
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            , m_method(method) {}
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual ~MemberCallback() {}
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual void run(const CppArgumentList& arguments, CppVariant* result)
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        {
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            (m_object->*m_method)(arguments, result);
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    private:
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        T* m_object;
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        MethodType m_method;
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Callback class for "void T::method(CppVariant*)"
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    template <class T> class MemberGetterCallback : public GetterCallback {
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    public:
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        typedef void (T::*MethodType)(CppVariant*);
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        MemberGetterCallback(T* object, MethodType method)
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            : m_object(object)
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            , m_method(method) {}
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual ~MemberGetterCallback() {}
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        virtual void run(CppVariant* result) { (m_object->*m_method)(result); }
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    private:
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        T* m_object;
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        MethodType m_method;
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    };
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Bind the Javascript method called the string parameter to the C++ method.
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindCallback(const std::string&, Callback*);
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // A wrapper for bindCallback, to simplify the common case of binding a
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // method on the current object.  Though not verified here, |method|
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // must be a method of this CppBoundClass subclass.
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    template<class T>
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindMethod(const std::string& name, void (T::*method)(const CppArgumentList&, CppVariant*))
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Callback* callback = new MemberCallback<T>(static_cast<T*>(this), method);
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bindCallback(name, callback);
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Bind Javascript property |name| to the C++ getter callback |callback|.
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // This can be used to create read-only properties.
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindGetterCallback(const std::string&, GetterCallback*);
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // A wrapper for BindGetterCallback, to simplify the common case of binding a
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // property on the current object.  Though not verified here, |method|
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // must be a method of this CppBoundClass subclass.
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    template<class T>
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindProperty(const std::string& name, void (T::*method)(CppVariant*))
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        GetterCallback* callback = new MemberGetterCallback<T>(static_cast<T*>(this), method);
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bindGetterCallback(name, callback);
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Bind the Javascript property called |name| to a CppVariant.
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindProperty(const std::string&, CppVariant*);
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Bind Javascript property called |name| to a PropertyCallback.
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // CppBoundClass assumes control over the life time of the callback.
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindProperty(const std::string&, PropertyCallback*);
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Set the fallback callback, which is called when when a callback is
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // invoked that isn't bound.
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If it is 0 (its default value), a JavaScript exception is thrown in
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // that case (as normally expected). If non 0, the fallback method is
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // invoked and the script continues its execution.
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Passing 0 clears out any existing binding.
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // It is used for tests and should probably only be used in such cases
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // as it may cause unexpected behaviors (a JavaScript object with a
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // fallback always returns true when checked for a method's
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // existence).
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindFallbackCallback(Callback* fallbackCallback)
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_fallbackCallback.set(fallbackCallback);
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // A wrapper for BindFallbackCallback, to simplify the common case of
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // binding a method on the current object.  Though not verified here,
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // |method| must be a method of this CppBoundClass subclass.
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Passing 0 for |method| clears out any existing binding.
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    template<class T>
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void bindFallbackMethod(void (T::*method)(const CppArgumentList&, CppVariant*))
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (method) {
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Callback* callback = new MemberCallback<T>(static_cast<T*>(this), method);
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            bindFallbackCallback(callback);
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            bindFallbackCallback(0);
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Some fields are protected because some tests depend on accessing them,
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // but otherwise they should be considered private.
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    typedef HashMap<NPIdentifier, PropertyCallback*> PropertyList;
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    typedef HashMap<NPIdentifier, Callback*> MethodList;
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // These maps associate names with property and method pointers to be
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // exposed to JavaScript.
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    PropertyList m_properties;
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MethodList m_methods;
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // The callback gets invoked when a call is made to an nonexistent method.
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    OwnPtr<Callback> m_fallbackCallback;
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate:
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // NPObject callbacks.
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    friend struct CppNPObject;
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool hasMethod(NPIdentifier) const;
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool invoke(NPIdentifier, const NPVariant* args, size_t argCount,
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                NPVariant* result);
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool hasProperty(NPIdentifier) const;
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool getProperty(NPIdentifier, NPVariant* result) const;
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool setProperty(NPIdentifier, const NPVariant*);
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // A lazily-initialized CppVariant representing this class.  We retain 1
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // reference to this object, and it is released on deletion.
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CppVariant m_selfVariant;
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // True if our np_object has been bound to a WebFrame, in which case it must
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // be unregistered with V8 when we delete it.
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    bool m_boundToFrame;
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // CppBoundClass_h
243