IconDatabaseBase.h revision 2bde8e466a4451c7319e3a072d118917957d6554
1/*
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef IconDatabaseBase_h
27#define IconDatabaseBase_h
28
29#include "SharedBuffer.h"
30
31#include <wtf/Forward.h>
32#include <wtf/Noncopyable.h>
33#include <wtf/PassRefPtr.h>
34
35namespace WebCore {
36
37class DocumentLoader;
38class IconDatabaseClient;
39class Image;
40class IntSize;
41
42enum IconLoadDecision {
43    IconLoadYes,
44    IconLoadNo,
45    IconLoadUnknown
46};
47
48class CallbackBase : public RefCounted<CallbackBase> {
49public:
50    virtual ~CallbackBase()
51    {
52    }
53
54    uint64_t callbackID() const { return m_callbackID; }
55
56protected:
57    CallbackBase(void* context)
58        : m_context(context)
59        , m_callbackID(generateCallbackID())
60    {
61    }
62
63    void* context() const { return m_context; }
64
65private:
66    static uint64_t generateCallbackID()
67    {
68        static uint64_t uniqueCallbackID = 1;
69        return uniqueCallbackID++;
70    }
71
72    void* m_context;
73    uint64_t m_callbackID;
74};
75
76template<typename EnumType>
77class EnumCallback : public CallbackBase {
78public:
79    typedef void (*CallbackFunction)(EnumType, void*);
80
81    static PassRefPtr<EnumCallback> create(void* context, CallbackFunction callback)
82    {
83        return adoptRef(new EnumCallback(context, callback));
84    }
85
86    virtual ~EnumCallback()
87    {
88        ASSERT(!m_callback);
89    }
90
91    void performCallback(EnumType result)
92    {
93        if (!m_callback)
94            return;
95        m_callback(result, context());
96        m_callback = 0;
97    }
98
99    void invalidate()
100    {
101        m_callback = 0;
102    }
103
104private:
105    EnumCallback(void* context, CallbackFunction callback)
106        : CallbackBase(context)
107        , m_callback(callback)
108    {
109        ASSERT(m_callback);
110    }
111
112    CallbackFunction m_callback;
113};
114
115template<typename ObjectType>
116class ObjectCallback : public CallbackBase {
117public:
118    typedef void (*CallbackFunction)(ObjectType, void*);
119
120    static PassRefPtr<ObjectCallback> create(void* context, CallbackFunction callback)
121    {
122        return adoptRef(new ObjectCallback(context, callback));
123    }
124
125    virtual ~ObjectCallback()
126    {
127        ASSERT(!m_callback);
128    }
129
130    void performCallback(ObjectType result)
131    {
132        if (!m_callback)
133            return;
134        m_callback(result, context());
135        m_callback = 0;
136    }
137
138    void invalidate()
139    {
140        m_callback = 0;
141    }
142
143private:
144    ObjectCallback(void* context, CallbackFunction callback)
145        : CallbackBase(context)
146        , m_callback(callback)
147    {
148        ASSERT(m_callback);
149    }
150
151    CallbackFunction m_callback;
152};
153
154typedef EnumCallback<IconLoadDecision> IconLoadDecisionCallback;
155typedef ObjectCallback<SharedBuffer*> IconDataCallback;
156
157class IconDatabaseBase {
158    WTF_MAKE_NONCOPYABLE(IconDatabaseBase);
159
160protected:
161    IconDatabaseBase() { }
162
163public:
164    virtual ~IconDatabaseBase() { }
165
166    // Used internally by WebCore
167    virtual bool isEnabled() const { return false; }
168
169    virtual void retainIconForPageURL(const String&) { }
170    virtual void releaseIconForPageURL(const String&) { }
171
172    virtual void setIconURLForPageURL(const String&, const String&) { }
173    virtual void setIconDataForIconURL(PassRefPtr<SharedBuffer>, const String&) { }
174
175    // Synchronous calls used internally by WebCore.
176    // Usage should be replaced by asynchronous calls.
177    virtual String synchronousIconURLForPageURL(const String&);
178    virtual bool synchronousIconDataKnownForIconURL(const String&) { return false; }
179    virtual IconLoadDecision synchronousLoadDecisionForIconURL(const String&, DocumentLoader*) { return IconLoadNo; }
180    virtual Image* synchronousIconForPageURL(const String&, const IntSize&) { return 0; }
181
182    // Asynchronous calls we should use to replace the above when supported.
183    virtual bool supportsAsynchronousMode() { return false; }
184    virtual void loadDecisionForIconURL(const String&, PassRefPtr<IconLoadDecisionCallback>) { }
185    virtual void iconDataForIconURL(const String&, PassRefPtr<IconDataCallback>) { }
186
187
188    // Used within one or more WebKit ports.
189    // We should try to remove these dependencies from the IconDatabaseBase class.
190    virtual void setEnabled(bool) { }
191
192    virtual Image* defaultIcon(const IntSize&) { return 0; }
193
194    virtual size_t pageURLMappingCount() { return 0; }
195    virtual size_t retainedPageURLCount() { return 0; }
196    virtual size_t iconRecordCount() { return 0; }
197    virtual size_t iconRecordCountWithData() { return 0; }
198
199    virtual void importIconURLForPageURL(const String&, const String&) { }
200    virtual void importIconDataForIconURL(PassRefPtr<SharedBuffer>, const String&) { }
201    virtual bool shouldStopThreadActivity() const { return true; }
202
203    virtual bool open(const String& directory, const String& filename);
204    virtual void close() { }
205    virtual void removeAllIcons() { }
206
207    virtual void setPrivateBrowsingEnabled(bool) { }
208    virtual void setClient(IconDatabaseClient*) { }
209
210    virtual bool isOpen() const { return false; }
211    virtual String databasePath() const;
212
213};
214
215// Functions to get/set the global icon database.
216IconDatabaseBase& iconDatabase();
217void setGlobalIconDatabase(IconDatabaseBase*);
218
219} // namespace WebCore
220
221#endif // IconDatabaseBase_h
222