1/*
2 * Copyright (C) 2010 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#import "WebPlatformStrategies.h"
27
28#import "WebFrameNetworkingContext.h"
29#import "WebPluginDatabase.h"
30#import "WebPluginPackage.h"
31#import <WebCore/BlockExceptions.h>
32#import <WebCore/Color.h>
33#import <WebCore/Page.h>
34#import <WebCore/PageGroup.h>
35#import <WebCore/PlatformCookieJar.h>
36#import <WebCore/PlatformPasteboard.h>
37#import <WebKitSystemInterface.h>
38
39using namespace WebCore;
40
41void WebPlatformStrategies::initializeIfNecessary()
42{
43    static WebPlatformStrategies* platformStrategies;
44    if (!platformStrategies) {
45        platformStrategies = new WebPlatformStrategies;
46        setPlatformStrategies(platformStrategies);
47    }
48}
49
50WebPlatformStrategies::WebPlatformStrategies()
51{
52}
53
54CookiesStrategy* WebPlatformStrategies::createCookiesStrategy()
55{
56    return this;
57}
58
59DatabaseStrategy* WebPlatformStrategies::createDatabaseStrategy()
60{
61    return this;
62}
63
64LoaderStrategy* WebPlatformStrategies::createLoaderStrategy()
65{
66    return this;
67}
68
69PasteboardStrategy* WebPlatformStrategies::createPasteboardStrategy()
70{
71    return this;
72}
73
74PluginStrategy* WebPlatformStrategies::createPluginStrategy()
75{
76    return this;
77}
78
79SharedWorkerStrategy* WebPlatformStrategies::createSharedWorkerStrategy()
80{
81    return this;
82}
83
84StorageStrategy* WebPlatformStrategies::createStorageStrategy()
85{
86    return this;
87}
88
89VisitedLinkStrategy* WebPlatformStrategies::createVisitedLinkStrategy()
90{
91    return this;
92}
93
94String WebPlatformStrategies::cookiesForDOM(const NetworkStorageSession& session, const KURL& firstParty, const KURL& url)
95{
96    return WebCore::cookiesForDOM(session, firstParty, url);
97}
98
99void WebPlatformStrategies::setCookiesFromDOM(const NetworkStorageSession& session, const KURL& firstParty, const KURL& url, const String& cookieString)
100{
101    WebCore::setCookiesFromDOM(session, firstParty, url, cookieString);
102}
103
104bool WebPlatformStrategies::cookiesEnabled(const NetworkStorageSession& session, const KURL& firstParty, const KURL& url)
105{
106    return WebCore::cookiesEnabled(session, firstParty, url);
107}
108
109String WebPlatformStrategies::cookieRequestHeaderFieldValue(const NetworkStorageSession& session, const KURL& firstParty, const KURL& url)
110{
111    return WebCore::cookieRequestHeaderFieldValue(session, firstParty, url);
112}
113
114bool WebPlatformStrategies::getRawCookies(const NetworkStorageSession& session, const KURL& firstParty, const KURL& url, Vector<Cookie>& rawCookies)
115{
116    return WebCore::getRawCookies(session, firstParty, url, rawCookies);
117}
118
119void WebPlatformStrategies::deleteCookie(const NetworkStorageSession& session, const KURL& url, const String& cookieName)
120{
121    WebCore::deleteCookie(session, url, cookieName);
122}
123
124void WebPlatformStrategies::refreshPlugins()
125{
126    [[WebPluginDatabase sharedDatabaseIfExists] refresh];
127}
128
129void WebPlatformStrategies::getPluginInfo(const Page* page, Vector<PluginInfo>& plugins)
130{
131    BEGIN_BLOCK_OBJC_EXCEPTIONS;
132
133    // WebKit1 has no application plug-ins, so we don't need to add them here.
134    if (!page->mainFrame()->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin))
135        return;
136
137    NSArray* pluginsArray = [[WebPluginDatabase sharedDatabase] plugins];
138    for (unsigned int i = 0; i < [pluginsArray count]; ++i) {
139        WebPluginPackage *plugin = [pluginsArray objectAtIndex:i];
140
141        plugins.append([plugin pluginInfo]);
142    }
143
144    END_BLOCK_OBJC_EXCEPTIONS;
145}
146
147bool WebPlatformStrategies::isLinkVisited(Page* page, LinkHash hash, const KURL&, const AtomicString&)
148{
149    return page->group().isLinkVisited(hash);
150}
151
152void WebPlatformStrategies::addVisitedLink(Page* page, LinkHash hash)
153{
154    return page->group().addVisitedLinkHash(hash);
155}
156
157void WebPlatformStrategies::getTypes(Vector<String>& types, const String& pasteboardName)
158{
159    PlatformPasteboard(pasteboardName).getTypes(types);
160}
161
162PassRefPtr<SharedBuffer> WebPlatformStrategies::bufferForType(const String& pasteboardType, const String& pasteboardName)
163{
164    return PlatformPasteboard(pasteboardName).bufferForType(pasteboardType);
165}
166
167void WebPlatformStrategies::getPathnamesForType(Vector<String>& pathnames, const String& pasteboardType, const String& pasteboardName)
168{
169    PlatformPasteboard(pasteboardName).getPathnamesForType(pathnames, pasteboardType);
170}
171
172String WebPlatformStrategies::stringForType(const String& pasteboardType, const String& pasteboardName)
173{
174    return PlatformPasteboard(pasteboardName).stringForType(pasteboardType);
175}
176
177void WebPlatformStrategies::copy(const String& fromPasteboard, const String& toPasteboard)
178{
179    PlatformPasteboard(toPasteboard).copy(fromPasteboard);
180}
181
182int WebPlatformStrategies::changeCount(const String &pasteboardName)
183{
184    return PlatformPasteboard(pasteboardName).changeCount();
185}
186
187String WebPlatformStrategies::uniqueName()
188{
189    return PlatformPasteboard::uniqueName();
190}
191
192Color WebPlatformStrategies::color(const String& pasteboardName)
193{
194    return PlatformPasteboard(pasteboardName).color();
195}
196
197KURL WebPlatformStrategies::url(const String& pasteboardName)
198{
199    return PlatformPasteboard(pasteboardName).url();
200}
201
202void WebPlatformStrategies::addTypes(const Vector<String>& pasteboardTypes, const String& pasteboardName)
203{
204    PlatformPasteboard(pasteboardName).addTypes(pasteboardTypes);
205}
206
207void WebPlatformStrategies::setTypes(const Vector<String>& pasteboardTypes, const String& pasteboardName)
208{
209    PlatformPasteboard(pasteboardName).setTypes(pasteboardTypes);
210}
211
212void WebPlatformStrategies::setBufferForType(PassRefPtr<SharedBuffer> buffer, const String& pasteboardType, const String& pasteboardName)
213{
214    PlatformPasteboard(pasteboardName).setBufferForType(buffer, pasteboardType);
215}
216
217void WebPlatformStrategies::setPathnamesForType(const Vector<String>& pathnames, const String& pasteboardType, const String& pasteboardName)
218{
219    PlatformPasteboard(pasteboardName).setPathnamesForType(pathnames, pasteboardType);
220}
221
222void WebPlatformStrategies::setStringForType(const String& string, const String& pasteboardType, const String& pasteboardName)
223{
224    PlatformPasteboard(pasteboardName).setStringForType(string, pasteboardType);
225}
226