#pragma once
#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)
#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,
Int64,
Point,
Size,
Rect,
ApplicationCacheManager,
#if ENABLE(APPLICATION_MANIFEST)
ApplicationManifest,
#endif
Attachment,
AutomationSession,
BackForwardList,
BackForwardListItem,
CacheManager,
ColorPickerResultListener,
ContentRuleList,
ContentRuleListAction,
ContentRuleListStore,
#if PLATFORM(IOS_FAMILY)
ContextMenuElementInfo,
#endif
ContextMenuListener,
CookieManager,
CustomHeaderFields,
InternalDebugFeature,
DebuggableInfo,
Download,
ExperimentalFeature,
FormSubmissionListener,
Frame,
FrameInfo,
FramePolicyListener,
FullScreenManager,
GeolocationManager,
GeolocationPermissionRequest,
HTTPCookieStore,
HitTestResult,
GeolocationPosition,
GrammarDetail,
IconDatabase,
Inspector,
KeyValueStorageManager,
MediaCacheManager,
MessageListener,
Navigation,
NavigationAction,
NavigationData,
NavigationResponse,
Notification,
NotificationManager,
NotificationPermissionRequest,
OpenPanelParameters,
OpenPanelResultListener,
OriginDataManager,
Page,
PageConfiguration,
PageGroup,
ProcessPool,
ProcessPoolConfiguration,
PluginSiteDataManager,
Preferences,
RequestStorageAccessConfirmResultListener,
ResourceLoadStatisticsStore,
ResourceLoadStatisticsFirstParty,
ResourceLoadStatisticsThirdParty,
RunBeforeUnloadConfirmPanelResultListener,
RunJavaScriptAlertResultListener,
RunJavaScriptConfirmResultListener,
RunJavaScriptPromptResultListener,
TextChecker,
URLSchemeTask,
UserContentController,
UserContentWorld,
UserInitiatedAction,
UserMediaPermissionCheck,
UserMediaPermissionRequest,
ViewportAttributes,
VisitedLinkStore,
WebResourceLoadStatisticsManager,
WebsiteDataRecord,
WebsiteDataStore,
WebsiteDataStoreConfiguration,
WebsitePolicies,
WindowFeatures,
#if ENABLE(MEDIA_SESSION)
MediaSessionFocusManager,
MediaSessionMetadata,
#endif
#if ENABLE(WEB_AUTHN)
WebAuthenticationPanel,
#endif
Bundle,
BundleBackForwardList,
BundleBackForwardListItem,
BundleCSSStyleDeclarationHandle,
BundleDOMWindowExtension,
BundleFrame,
BundleHitTestResult,
BundleInspector,
BundleNavigationAction,
BundleNodeHandle,
BundlePage,
BundlePageBanner,
BundlePageGroup,
BundlePageOverlay,
BundleRangeHandle,
BundleScriptWorld,
EditCommandProxy,
ObjCObjectGraph,
View,
#if USE(SOUP)
SoupRequestManager,
SoupCustomProtocolRequestManager,
#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() const { return m_wrapper; }
void ref() const;
void deref() const;
#endif // DELEGATE_REF_COUNTING_TO_COCOA
static void* wrap(API::Object*);
static API::Object* unwrap(void*);
#if PLATFORM(COCOA) && defined(__OBJC__)
static API::Object& fromWKObjectExtraSpace(id <WKObject>);
#endif
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