15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Pawel Hajdan (phajdan.jr@chromium.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  CppBoundClass class:
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  This base class serves as a parent for C++ classes designed to be bound to
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  JavaScript objects.
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Subclasses should define the constructor to build the property and method
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  lists needed to bind this class to a JS object.  They should also declare
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  and define member variables and methods to be exposed to JS through
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  that object.
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CppBoundClass_h
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CppBoundClass_h
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CppVariant.h"
479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "public/platform/WebNonCopyable.h"
48a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "public/testing/WebScopedPtr.h"
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include <map>
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include <vector>
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WebFrame;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WebString;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace WebTestRunner {
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)typedef std::vector<CppVariant> CppArgumentList;
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// CppBoundClass lets you map Javascript method calls and property accesses
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// directly to C++ method calls and CppVariant* variable access.
6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class CppBoundClass : public blink::WebNonCopyable {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class PropertyCallback {
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~PropertyCallback() { }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Sets |value| to the value of the property. Returns false in case of
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // failure. |value| is always non-0.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual bool getValue(CppVariant* result) = 0;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // sets the property value to |value|. Returns false in case of failure.
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual bool setValue(const CppVariant&) = 0;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Callback class for "void function(CppVariant*)"
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class GetterCallback {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~GetterCallback() { }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void run(CppVariant*) = 0;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The constructor should call BindMethod, BindProperty, and
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // SetFallbackMethod as needed to set up the methods, properties, and
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fallback method.
87e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    CppBoundClass() : m_boundToFrame(false) { }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~CppBoundClass();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return a CppVariant representing this class, for use with BindProperty().
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The variant type is guaranteed to be NPVariantType_Object.
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CppVariant* getAsCppVariant();
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Given a WebFrame, BindToJavascript builds the NPObject that will represent
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the class and binds it to the frame's window under the given name. This
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // should generally be called from the WebView delegate's
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // WindowObjectCleared(). A class so bound will be accessible to JavaScript
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // as window.<classname>. The owner of the CppBoundObject is responsible for
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // keeping the object around while the frame is alive, and for destroying it
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // afterwards.
10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    void bindToJavascript(blink::WebFrame*, const blink::WebString& classname);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used by a test. Returns true if a method with the specified name exists,
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // regardless of whether a fallback is registered.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isMethodRegistered(const std::string&) const;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Callback for "void function(const CppArguemntList&, CppVariant*)"
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class Callback {
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~Callback() { }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void run(const CppArgumentList&, CppVariant*) = 0;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Callback for "void T::method(const CppArguemntList&, CppVariant*)"
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <class T> class MemberCallback : public Callback {
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef void (T::*MethodType)(const CppArgumentList&, CppVariant*);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        MemberCallback(T* object, MethodType method)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : m_object(object)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , m_method(method) { }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~MemberCallback() { }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void run(const CppArgumentList& arguments, CppVariant* result)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            (m_object->*m_method)(arguments, result);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* m_object;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        MethodType m_method;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Callback class for "void T::method(CppVariant*)"
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <class T> class MemberGetterCallback : public GetterCallback {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef void (T::*MethodType)(CppVariant*);
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        MemberGetterCallback(T* object, MethodType method)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : m_object(object)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , m_method(method) { }
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~MemberGetterCallback() { }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void run(CppVariant* result) { (m_object->*m_method)(result); }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        T* m_object;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        MethodType m_method;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Bind the Javascript method called the string parameter to the C++ method.
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void bindCallback(const std::string&, Callback*);
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A wrapper for bindCallback, to simplify the common case of binding a
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // method on the current object. Though not verified here, the method parameter
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // must be a method of this CppBoundClass subclass.
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<class T>
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void bindMethod(const std::string& name, void (T::*method)(const CppArgumentList&, CppVariant*))
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Callback* callback = new MemberCallback<T>(static_cast<T*>(this), method);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bindCallback(name, callback);
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Bind Javascript property |name| to the C++ getter callback |callback|.
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This can be used to create read-only properties.
165a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void bindGetterCallback(const std::string&, WebScopedPtr<GetterCallback>);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A wrapper for BindGetterCallback, to simplify the common case of binding a
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // property on the current object. Though not verified here, the method parameter
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // must be a method of this CppBoundClass subclass.
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<class T>
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void bindProperty(const std::string& name, void (T::*method)(CppVariant*))
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
173a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        WebScopedPtr<GetterCallback> callback(new MemberGetterCallback<T>(static_cast<T*>(this), method));
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bindGetterCallback(name, callback);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Bind the Javascript property called |name| to a CppVariant.
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void bindProperty(const std::string&, CppVariant*);
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Bind Javascript property called |name| to a PropertyCallback.
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // CppBoundClass assumes control over the life time of the callback.
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void bindProperty(const std::string&, PropertyCallback*);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set the fallback callback, which is called when when a callback is
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // invoked that isn't bound.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If it is 0 (its default value), a JavaScript exception is thrown in
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that case (as normally expected). If non 0, the fallback method is
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // invoked and the script continues its execution.
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Passing 0 clears out any existing binding.
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It is used for tests and should probably only be used in such cases
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // as it may cause unexpected behaviors (a JavaScript object with a
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fallback always returns true when checked for a method's
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // existence).
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void bindFallbackCallback(WebScopedPtr<Callback> fallbackCallback)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_fallbackCallback = fallbackCallback;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A wrapper for BindFallbackCallback, to simplify the common case of
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // binding a method on the current object. Though not verified here,
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // |method| must be a method of this CppBoundClass subclass.
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Passing 0 for |method| clears out any existing binding.
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template<class T>
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void bindFallbackMethod(void (T::*method)(const CppArgumentList&, CppVariant*))
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (method)
207a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            bindFallbackCallback(WebScopedPtr<Callback>(new MemberCallback<T>(static_cast<T*>(this), method)));
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else
209a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            bindFallbackCallback(WebScopedPtr<Callback>());
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Some fields are protected because some tests depend on accessing them,
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but otherwise they should be considered private.
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    typedef std::map<NPIdentifier, PropertyCallback*> PropertyList;
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    typedef std::map<NPIdentifier, Callback*> MethodList;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These maps associate names with property and method pointers to be
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // exposed to JavaScript.
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PropertyList m_properties;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MethodList m_methods;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The callback gets invoked when a call is made to an nonexistent method.
223a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    WebScopedPtr<Callback> m_fallbackCallback;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NPObject callbacks.
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    friend struct CppNPObject;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasMethod(NPIdentifier) const;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool invoke(NPIdentifier, const NPVariant* args, size_t argCount,
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                NPVariant* result);
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasProperty(NPIdentifier) const;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool getProperty(NPIdentifier, NPVariant* result) const;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool setProperty(NPIdentifier, const NPVariant*);
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A lazily-initialized CppVariant representing this class. We retain 1
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // reference to this object, and it is released on deletion.
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CppVariant m_selfVariant;
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
239e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // True if our np_object has been bound to a WebFrame, in which case it must
240e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    // be unregistered with V8 when we delete it.
241e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bool m_boundToFrame;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // CppBoundClass_h
247