15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/*
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved.
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * modification, are permitted provided that the following conditions
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * are met:
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *    documentation and/or other materials provided with the distribution.
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE.
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef PluginTest_h
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define PluginTest_h
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <assert.h>
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <bindings/npfunctions.h>
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map>
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Helper classes for implementing has_member
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef char (&no_tag)[1];
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef char (&yes_tag)[2];
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define DEFINE_HAS_MEMBER_CHECK(member, returnType, argumentTypes)             \
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <typename T, returnType(T::*member) argumentTypes>                  \
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct pmf_##member##_helper {};                                             \
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <typename T>                                                        \
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  no_tag has_member_##member##_helper(...);                                    \
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <typename T>                                                        \
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  yes_tag has_member_##member##_helper(pmf_##member##_helper<T, &T::member>*); \
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <typename T>                                                        \
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct has_member_##member {                                                 \
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static const bool value =                                                  \
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        sizeof(has_member_##member##_helper<T>(0)) == sizeof(yes_tag);         \
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(hasMethod, bool, (NPIdentifier methodName));
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    invoke,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool,
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    (NPIdentifier methodName, const NPVariant*, uint32_t, NPVariant* result));
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(invokeDefault,
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        bool,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        (const NPVariant*, uint32_t, NPVariant* result));
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(hasProperty, bool, (NPIdentifier propertyName));
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(getProperty,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        bool,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        (NPIdentifier propertyName, NPVariant* result));
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)DEFINE_HAS_MEMBER_CHECK(removeProperty, bool, (NPIdentifier propertyName));
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PluginTest {
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static PluginTest* create(NPP, const std::string& identifier);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~PluginTest();
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void NP_Shutdown();
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NPP functions.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_New(NPMIMEType pluginType,
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          uint16_t mode,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          int16_t argc,
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          char* argn[],
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          char* argv[],
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          NPSavedData* saved);
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_Destroy(NPSavedData**);
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_SetWindow(NPWindow*);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_NewStream(NPMIMEType,
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                NPStream*,
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                NPBool seekable,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                uint16_t* stype);
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_DestroyStream(NPStream*, NPReason);
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual int32_t NPP_WriteReady(NPStream*);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual int32_t NPP_Write(NPStream*,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            int32_t offset,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            int32_t len,
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            void* buffer);
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual int16_t NPP_HandleEvent(void* event);
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool NPP_URLNotify(const char* url, NPReason, void* notifyData);
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_GetValue(NPPVariable, void* value);
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual NPError NPP_SetValue(NPNVariable, void* value);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NPN functions.
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPError NPN_GetURL(const char* url, const char* target);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPError NPN_GetURLNotify(const char* url,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const char* target,
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           void* notifyData);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPError NPN_GetValue(NPNVariable, void* value);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void NPN_InvalidateRect(NPRect* invalidRect);
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool NPN_Invoke(NPObject*,
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  NPIdentifier methodName,
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  const NPVariant* args,
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  uint32_t argCount,
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  NPVariant* result);
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void* NPN_MemAlloc(uint32_t size);
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NPRuntime NPN functions.
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPIdentifier NPN_GetStringIdentifier(const NPUTF8* name);
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPIdentifier NPN_GetIntIdentifier(int32_t intid);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool NPN_IdentifierIsString(NPIdentifier);
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPUTF8* NPN_UTF8FromIdentifier(NPIdentifier);
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t NPN_IntFromIdentifier(NPIdentifier);
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPObject* NPN_CreateObject(NPClass*);
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPObject* NPN_RetainObject(NPObject*);
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void NPN_ReleaseObject(NPObject*);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool NPN_GetProperty(NPObject*, NPIdentifier propertyName, NPVariant* value);
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool NPN_RemoveProperty(NPObject*, NPIdentifier propertyName);
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void NPN_ReleaseVariantValue(NPVariant*);
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef XP_MACOSX
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool NPN_ConvertPoint(double sourceX,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        double sourceY,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        NPCoordinateSpace sourceSpace,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        double* destX,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        double* destY,
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        NPCoordinateSpace destSpace);
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool executeScript(const NPString*, NPVariant* result);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void executeScript(const char*);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void log(const char* format, ...);
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void registerNPShutdownFunction(void (*)());
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void indicateTestFailure();
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <typename TestClassTy>
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class Register {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Register(const std::string& identifier) {
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      registerCreateTestFunction(identifier, Register::create);
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   private:
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static PluginTest* create(NPP npp, const std::string& identifier) {
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return new TestClassTy(npp, identifier);
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PluginTest(NPP npp, const std::string& identifier);
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FIXME: A plug-in test shouldn't need to know about it's NPP. Make this
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // private.
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NPP m_npp;
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& identifier() const { return m_identifier; }
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static NPNetscapeFuncs* netscapeFuncs();
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void waitUntilDone();
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void notifyDone();
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NPObject helper template.
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <typename T>
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct Object : NPObject {
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static NPObject* create(PluginTest* pluginTest) {
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Object* object =
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          static_cast<Object*>(pluginTest->NPN_CreateObject(npClass()));
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      object->m_pluginTest = pluginTest;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return object;
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // These should never be called.
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool hasMethod(NPIdentifier methodName) {
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      assert(false);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool invoke(NPIdentifier methodName,
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                const NPVariant*,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                uint32_t,
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                NPVariant* result) {
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      assert(false);
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool invokeDefault(const NPVariant*, uint32_t, NPVariant* result) {
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      assert(false);
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool hasProperty(NPIdentifier propertyName) {
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      assert(false);
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool getProperty(NPIdentifier propertyName, NPVariant* result) {
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      assert(false);
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool removeProperty(NPIdentifier propertyName) {
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      assert(false);
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Helper functions.
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool identifierIs(NPIdentifier identifier, const char* value) {
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return pluginTest()->NPN_GetStringIdentifier(value) == identifier;
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   protected:
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Object() : m_pluginTest(0) {}
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual ~Object() {}
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PluginTest* pluginTest() const { return m_pluginTest; }
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   private:
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static NPObject* NP_Allocate(NPP npp, NPClass* aClass) { return new T; }
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static void NP_Deallocate(NPObject* npObject) {
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete static_cast<T*>(npObject);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static bool NP_HasMethod(NPObject* npObject, NPIdentifier methodName) {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<T*>(npObject)->hasMethod(methodName);
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static bool NP_Invoke(NPObject* npObject,
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          NPIdentifier methodName,
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const NPVariant* arguments,
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          uint32_t argumentCount,
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          NPVariant* result) {
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<T*>(npObject)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ->invoke(methodName, arguments, argumentCount, result);
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static bool NP_InvokeDefault(NPObject* npObject,
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 const NPVariant* arguments,
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 uint32_t argumentCount,
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 NPVariant* result) {
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<T*>(npObject)
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ->invokeDefault(arguments, argumentCount, result);
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static bool NP_HasProperty(NPObject* npObject, NPIdentifier propertyName) {
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<T*>(npObject)->hasProperty(propertyName);
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static bool NP_GetProperty(NPObject* npObject,
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               NPIdentifier propertyName,
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               NPVariant* result) {
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<T*>(npObject)->getProperty(propertyName, result);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static bool NP_RemoveProperty(NPObject* npObject,
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  NPIdentifier propertyName) {
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return static_cast<T*>(npObject)->removeProperty(propertyName);
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    static NPClass* npClass() {
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static NPClass npClass = {
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          NP_CLASS_STRUCT_VERSION, NP_Allocate, NP_Deallocate,
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          0,  // NPClass::invalidate
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          has_member_hasMethod<T>::value ? NP_HasMethod : 0,
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          has_member_invoke<T>::value ? NP_Invoke : 0,
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          has_member_invokeDefault<T>::value ? NP_InvokeDefault : 0,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          has_member_hasProperty<T>::value ? NP_HasProperty : 0,
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          has_member_getProperty<T>::value ? NP_GetProperty : 0,
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          0,  // NPClass::setProperty
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          has_member_removeProperty<T>::value ? NP_RemoveProperty : 0,
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          0,  // NPClass::enumerate
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          0   // NPClass::construct
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      };
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return &npClass;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    };
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PluginTest* m_pluginTest;
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef PluginTest* (*CreateTestFunction)(NPP, const std::string&);
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void registerCreateTestFunction(const std::string&,
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         CreateTestFunction);
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static std::map<std::string, CreateTestFunction>& createTestFunctions();
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string m_identifier;
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // PluginTest_h
305