#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,
PageGroupHandle,
ProtectionSpace,
RenderLayer,
RenderObject,
SecurityOrigin,
SessionState,
SerializedScriptValue,
String,
URL,
URLRequest,
URLResponse,
UserContentURLPattern,
UserScript,
UserStyleSheet,
WebArchive,
WebArchiveResource,
Boolean,
Double,
UInt64,
Point,
Size,
Rect,
ApplicationCacheManager,
AutomationSession,
BackForwardList,
BackForwardListItem,
BatteryManager,
BatteryStatus,
CacheManager,
ColorPickerResultListener,
CookieManager,
Download,
ExperimentalFeature,
FormSubmissionListener,
Frame,
FrameInfo,
FramePolicyListener,
FullScreenManager,
GeolocationManager,
GeolocationPermissionRequest,
HitTestResult,
GeolocationPosition,
GrammarDetail,
IconDatabase,
Inspector,
KeyValueStorageManager,
MediaCacheManager,
Navigation,
NavigationAction,
NavigationData,
NavigationResponse,
Notification,
NotificationManager,
NotificationPermissionRequest,
OpenPanelParameters,
OpenPanelResultListener,
OriginDataManager,
Page,
PageConfiguration,
PageGroup,
ProcessPool,
ProcessPoolConfiguration,
PluginSiteDataManager,
Preferences,
ResourceLoadStatisticsStore,
RunBeforeUnloadConfirmPanelResultListener,
RunJavaScriptAlertResultListener,
RunJavaScriptConfirmResultListener,
RunJavaScriptPromptResultListener,
Session,
TextChecker,
UserContentController,
UserContentExtension,
UserContentExtensionStore,
UserContentWorld,
UserInitiatedAction,
UserMediaPermissionCheck,
UserMediaPermissionRequest,
Vibration,
ViewportAttributes,
VisitedLinkStore,
WebsiteDataRecord,
WebsiteDataStore,
WindowFeatures,
#if ENABLE(MEDIA_SESSION)
MediaSessionFocusManager,
MediaSessionMetadata,
#endif
Bundle,
BundleBackForwardList,
BundleBackForwardListItem,
BundleCSSStyleDeclarationHandle,
BundleDOMWindowExtension,
BundleFileHandle,
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
static void* wrap(API::Object*);
static API::Object* unwrap(void*);
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()
{
}
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, void* value) { return value; }
#endif
};
#if !DELEGATE_REF_COUNTING_TO_COCOA
inline void* Object::wrap(API::Object* object)
{
return static_cast<void*>(object);
}
inline API::Object* Object::unwrap(void* object)
{
return static_cast<API::Object*>(object);
}
#endif
}
#undef DELEGATE_REF_COUNTING_TO_COCOA
#endif // APIObject_h