#ifndef APIObject_h
#define APIObject_h
#include <functional>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#include <wtf/ThreadSafeRefCounted.h>
#if PLATFORM(COCOA)
#include "WKFoundation.h"
#ifdef __OBJC__
#include "WKObject.h"
#endif
#endif
#define DELEGATE_REF_COUNTING_TO_COCOA (PLATFORM(COCOA) && WK_API_ENABLED)
#if DELEGATE_REF_COUNTING_TO_COCOA
OBJC_CLASS NSObject;
#endif
namespace API {
class Object
#if !DELEGATE_REF_COUNTING_TO_COCOA
: public ThreadSafeRefCounted<Object>
#endif
{
public:
enum class Type {
Null = 0,
Array,
AuthenticationChallenge,
AuthenticationDecisionListener,
CertificateInfo,
Connection,
ContextMenuItem,
Credential,
Data,
Dictionary,
Error,
FrameHandle,
Image,
PageGroupData,
PageHandle,
ProtectionSpace,
RenderLayer,
RenderObject,
SecurityOrigin,
SessionState,
SerializedScriptValue,
String,
URL,
URLRequest,
URLResponse,
UserContentURLPattern,
WebArchive,
WebArchiveResource,
Boolean,
Double,
UInt64,
Point,
Size,
Rect,
ApplicationCacheManager,
BackForwardList,
BackForwardListItem,
BatteryManager,
BatteryStatus,
CacheManager,
ColorPickerResultListener,
Context,
ContextConfiguration,
CookieManager,
DatabaseManager,
Download,
FormSubmissionListener,
Frame,
FramePolicyListener,
FullScreenManager,
GeolocationManager,
GeolocationPermissionRequest,
HitTestResult,
GeolocationPosition,
GrammarDetail,
IconDatabase,
Inspector,
KeyValueStorageManager,
MediaCacheManager,
NavigationData,
Notification,
NotificationManager,
NotificationPermissionRequest,
OpenPanelParameters,
OpenPanelResultListener,
OriginDataManager,
Page,
PageGroup,
PluginSiteDataManager,
Preferences,
Session,
TextChecker,
Vibration,
ViewportAttributes,
Bundle,
BundleBackForwardList,
BundleBackForwardListItem,
BundleDOMWindowExtension,
BundleFrame,
BundleHitTestResult,
BundleInspector,
BundleNavigationAction,
BundleNodeHandle,
BundlePage,
BundlePageBanner,
BundlePageGroup,
BundlePageOverlay,
BundleRangeHandle,
BundleScriptWorld,
EditCommandProxy,
ObjCObjectGraph,
View,
#if USE(SOUP)
SoupRequestManager,
SoupCustomProtocolRequestManager,
#endif
#if PLATFORM(EFL)
PopupMenuItem,
#if ENABLE(TOUCH_EVENTS)
TouchPoint,
TouchEvent,
#endif
#endif
};
virtual ~Object()
{
}
virtual Type type() const = 0;
#if DELEGATE_REF_COUNTING_TO_COCOA
#ifdef __OBJC__
template<typename T, typename... Args>
static void constructInWrapper(NSObject <WKObject> *wrapper, Args&&... args)
{
Object* object = new (&wrapper._apiObject) T(std::forward<Args>(args)...);
object->m_wrapper = wrapper;
}
#endif
NSObject *wrapper() { return m_wrapper; }
void ref();
void deref();
#endif // DELEGATE_REF_COUNTING_TO_COCOA
protected:
Object();
#if DELEGATE_REF_COUNTING_TO_COCOA
static void* newObject(size_t, Type);
private:
void* operator new(size_t) = delete;
NSObject *m_wrapper;
#endif // DELEGATE_REF_COUNTING_TO_COCOA
};
template <Object::Type ArgumentType>
class ObjectImpl : public Object {
public:
static const Type APIType = ArgumentType;
virtual ~ObjectImpl()
{
}
protected:
friend class Object;
ObjectImpl()
{
}
virtual Type type() const override { return APIType; }
#if DELEGATE_REF_COUNTING_TO_COCOA
void* operator new(size_t size) { return newObject(size, APIType); }
void* operator new(size_t size, void* value) { return value; }
#endif
};
}
#undef DELEGATE_REF_COUNTING_TO_COCOA
#endif // APIObject_h