165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef GenericCallback_h 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define GenericCallback_h 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WKAPICast.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebError.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/HashMap.h> 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h> 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RefCounted.h> 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass CallbackBase : public RefCounted<CallbackBase> { 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic: 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual ~CallbackBase() 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch uint64_t callbackID() const { return m_callbackID; } 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprotected: 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch CallbackBase(void* context) 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : m_context(context) 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_callbackID(generateCallbackID()) 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void* context() const { return m_context; } 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate: 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static uint64_t generateCallbackID() 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static uint64_t uniqueCallbackID = 1; 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return uniqueCallbackID++; 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void* m_context; 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch uint64_t m_callbackID; 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass VoidCallback : public CallbackBase { 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic: 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block typedef void (*CallbackFunction)(WKErrorRef, void*); 692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static PassRefPtr<VoidCallback> create(void* context, CallbackFunction callback) 712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return adoptRef(new VoidCallback(context, callback)); 732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual ~VoidCallback() 762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(!m_callback); 782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void performCallback() 812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_callback); 832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_callback(0, context()); 852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_callback = 0; 872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void invalidate() 902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_callback); 922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RefPtr<WebError> error = WebError::create(); 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_callback(toAPI(error.get()), context()); 952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_callback = 0; 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 992fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate: 1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block VoidCallback(void* context, CallbackFunction callback) 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : CallbackBase(context) 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_callback(callback) 1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CallbackFunction m_callback; 1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}; 1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtemplate<typename APIReturnValueType, typename InternalReturnValueType = typename APITypeInfo<APIReturnValueType>::ImplType> 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass GenericCallback : public CallbackBase { 1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic: 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch typedef void (*CallbackFunction)(APIReturnValueType, WKErrorRef, void*); 1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static PassRefPtr<GenericCallback> create(void* context, CallbackFunction callback) 1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return adoptRef(new GenericCallback(context, callback)); 1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual ~GenericCallback() 1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(!m_callback); 1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void performCallbackWithReturnValue(InternalReturnValueType returnValue) 1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_callback); 1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_callback(toAPI(returnValue), 0, context()); 1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_callback = 0; 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void invalidate() 1342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(m_callback); 1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RefPtr<WebError> error = WebError::create(); 13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_callback(0, toAPI(error.get()), context()); 1392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_callback = 0; 1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate: 14481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch GenericCallback(void* context, CallbackFunction callback) 14581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : CallbackBase(context) 1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_callback(callback) 1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block { 1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CallbackFunction m_callback; 1512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}; 1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 15381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// FIXME: Make a version of CallbackBase with two arguments, and define ComputedPagesCallback as a specialization. 15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass ComputedPagesCallback : public CallbackBase { 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch typedef void (*CallbackFunction)(const Vector<WebCore::IntRect>&, double, WKErrorRef, void*); 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static PassRefPtr<ComputedPagesCallback> create(void* context, CallbackFunction callback) 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return adoptRef(new ComputedPagesCallback(context, callback)); 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual ~ComputedPagesCallback() 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(!m_callback); 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void performCallbackWithReturnValue(const Vector<WebCore::IntRect>& returnValue1, double returnValue2) 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_callback); 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_callback(returnValue1, returnValue2, 0, context()); 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_callback = 0; 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void invalidate() 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(m_callback); 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<WebError> error = WebError::create(); 18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_callback(Vector<WebCore::IntRect>(), 0, toAPI(error.get()), context()); 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_callback = 0; 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate: 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ComputedPagesCallback(void* context, CallbackFunction callback) 19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : CallbackBase(context) 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_callback(callback) 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CallbackFunction m_callback; 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename T> 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid invalidateCallbackMap(HashMap<uint64_t, T>& map) 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<T> callbacksVector; 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch copyValuesToVector(map, callbacksVector); 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0, size = callbacksVector.size(); i < size; ++i) 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch callbacksVector[i]->invalidate(); 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map.clear(); 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // GenericCallback_h 211