2011-02-03 Maciej Stachowiak <mjs@apple.com>
[WebKit.git] / Source / WebKit2 / Shared / API / c / WKSharedAPICast.h
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 #ifndef WKSharedAPICast_h
27 #define WKSharedAPICast_h
28
29 #include "ImageOptions.h"
30 #include "SameDocumentNavigationType.h"
31 #include "WKBase.h"
32 #include "WKContextMenuItemTypes.h"
33 #include "WKEvent.h"
34 #include "WKFindOptions.h"
35 #include "WKGeometry.h"
36 #include "WKImage.h"
37 #include "WKPageLoadTypes.h"
38 #include "WebError.h"
39 #include "WebEvent.h"
40 #include "WebFindOptions.h"
41 #include "WebNumber.h"
42 #include "WebString.h"
43 #include "WebURL.h"
44 #include "WebURLRequest.h"
45 #include "WebURLResponse.h"
46 #include <WebCore/ContextMenuItem.h>
47 #include <WebCore/FloatRect.h>
48 #include <WebCore/FrameLoaderTypes.h>
49 #include <WebCore/IntRect.h>
50 #include <wtf/TypeTraits.h>
51
52 namespace WebKit {
53
54 class ImmutableArray;
55 class ImmutableDictionary;
56 class MutableArray;
57 class MutableDictionary;
58 class WebCertificateInfo;
59 class WebContextMenuItem;
60 class WebData;
61 class WebGraphicsContext;
62 class WebImage;
63 class WebSecurityOrigin;
64 class WebSerializedScriptValue;
65 class WebURLRequest;
66 class WebURLResponse;
67 class WebUserContentURLPattern;
68
69 template<typename APIType> struct APITypeInfo { };
70 template<typename ImplType> struct ImplTypeInfo { };
71
72 #define WK_ADD_API_MAPPING(TheAPIType, TheImplType) \
73     template<> struct APITypeInfo<TheAPIType> { typedef TheImplType* ImplType; }; \
74     template<> struct ImplTypeInfo<TheImplType*> { typedef TheAPIType APIType; };
75
76 WK_ADD_API_MAPPING(WKArrayRef, ImmutableArray)
77 WK_ADD_API_MAPPING(WKBooleanRef, WebBoolean)
78 WK_ADD_API_MAPPING(WKCertificateInfoRef, WebCertificateInfo)
79 WK_ADD_API_MAPPING(WKContextMenuItemRef, WebContextMenuItem)
80 WK_ADD_API_MAPPING(WKDataRef, WebData)
81 WK_ADD_API_MAPPING(WKDictionaryRef, ImmutableDictionary)
82 WK_ADD_API_MAPPING(WKDoubleRef, WebDouble)
83 WK_ADD_API_MAPPING(WKErrorRef, WebError)
84 WK_ADD_API_MAPPING(WKGraphicsContextRef, WebGraphicsContext)
85 WK_ADD_API_MAPPING(WKImageRef, WebImage)
86 WK_ADD_API_MAPPING(WKMutableArrayRef, MutableArray)
87 WK_ADD_API_MAPPING(WKMutableDictionaryRef, MutableDictionary)
88 WK_ADD_API_MAPPING(WKSecurityOriginRef, WebSecurityOrigin)
89 WK_ADD_API_MAPPING(WKSerializedScriptValueRef, WebSerializedScriptValue)
90 WK_ADD_API_MAPPING(WKStringRef, WebString)
91 WK_ADD_API_MAPPING(WKTypeRef, APIObject)
92 WK_ADD_API_MAPPING(WKUInt64Ref, WebUInt64)
93 WK_ADD_API_MAPPING(WKURLRef, WebURL)
94 WK_ADD_API_MAPPING(WKURLRequestRef, WebURLRequest)
95 WK_ADD_API_MAPPING(WKURLResponseRef, WebURLResponse)
96 WK_ADD_API_MAPPING(WKUserContentURLPatternRef, WebUserContentURLPattern)
97
98 template<typename ImplType, typename APIType = typename ImplTypeInfo<ImplType*>::APIType>
99 class ProxyingRefPtr {
100 public:
101     ProxyingRefPtr(PassRefPtr<ImplType> impl)
102         : m_impl(impl)
103     {
104     }
105
106     operator APIType() { return toAPI(m_impl.get()); }
107
108 private:
109     RefPtr<ImplType> m_impl;
110 };
111
112 /* Opaque typing convenience methods */
113
114 template<typename T>
115 inline typename APITypeInfo<T>::ImplType toImpl(T t)
116 {
117     // An example of the conversions that take place:
118     // const struct OpaqueWKArray* -> const struct OpaqueWKArray -> struct OpaqueWKArray -> struct OpaqueWKArray* -> ImmutableArray*
119     
120     typedef typename WTF::RemovePointer<T>::Type PotentiallyConstValueType;
121     typedef typename WTF::RemoveConst<PotentiallyConstValueType>::Type NonConstValueType;
122
123     return reinterpret_cast<typename APITypeInfo<T>::ImplType>(const_cast<NonConstValueType*>(t));
124 }
125
126 template<typename T>
127 inline typename ImplTypeInfo<T>::APIType toAPI(T t)
128 {
129     return reinterpret_cast<typename ImplTypeInfo<T>::APIType>(t);
130 }
131
132 /* Special cases. */
133
134 inline ProxyingRefPtr<WebString> toAPI(StringImpl* string)
135 {
136     return ProxyingRefPtr<WebString>(WebString::create(string));
137 }
138
139 inline WKStringRef toCopiedAPI(const String& string)
140 {
141     RefPtr<WebString> webString = WebString::create(string);
142     return toAPI(webString.release().releaseRef());
143 }
144
145 inline ProxyingRefPtr<WebURL> toURLRef(StringImpl* string)
146 {
147     if (!string)
148         ProxyingRefPtr<WebURL>(0);
149     return ProxyingRefPtr<WebURL>(WebURL::create(String(string)));
150 }
151
152 inline WKURLRef toCopiedURLAPI(const String& string)
153 {
154     if (!string)
155         return 0;
156     RefPtr<WebURL> webURL = WebURL::create(string);
157     return toAPI(webURL.release().releaseRef());
158 }
159
160 inline String toWTFString(WKStringRef stringRef)
161 {
162     if (!stringRef)
163         return String();
164     return toImpl(stringRef)->string();
165 }
166
167 inline String toWTFString(WKURLRef urlRef)
168 {
169     if (!urlRef)
170         return String();
171     return toImpl(urlRef)->string();
172 }
173
174 inline ProxyingRefPtr<WebError> toAPI(const WebCore::ResourceError& error)
175 {
176     return ProxyingRefPtr<WebError>(WebError::create(error));
177 }
178
179 inline ProxyingRefPtr<WebURLRequest> toAPI(const WebCore::ResourceRequest& request)
180 {
181     return ProxyingRefPtr<WebURLRequest>(WebURLRequest::create(request));
182 }
183
184 inline ProxyingRefPtr<WebURLResponse> toAPI(const WebCore::ResourceResponse& response)
185 {
186     return ProxyingRefPtr<WebURLResponse>(WebURLResponse::create(response));
187 }
188
189 /* Geometry conversions */
190
191 inline WebCore::FloatRect toFloatRect(const WKRect& wkRect)
192 {
193     return WebCore::FloatRect(static_cast<float>(wkRect.origin.x), static_cast<float>(wkRect.origin.y),
194                               static_cast<float>(wkRect.size.width), static_cast<float>(wkRect.size.height));
195 }
196
197 inline WebCore::IntSize toIntSize(const WKSize& wkSize)
198 {
199     return WebCore::IntSize(static_cast<int>(wkSize.width), static_cast<int>(wkSize.height));
200 }
201
202 inline WebCore::IntPoint toIntPoint(const WKPoint& wkPoint)
203 {
204     return WebCore::IntPoint(static_cast<int>(wkPoint.x), static_cast<int>(wkPoint.y));
205 }
206
207 inline WebCore::IntRect toIntRect(const WKRect& wkRect)
208 {
209     return WebCore::IntRect(static_cast<int>(wkRect.origin.x), static_cast<int>(wkRect.origin.y),
210                             static_cast<int>(wkRect.size.width), static_cast<int>(wkRect.size.height));
211 }
212
213 inline WKRect toAPI(const WebCore::FloatRect& rect)
214 {
215     WKRect wkRect;
216     wkRect.origin.x = rect.x();
217     wkRect.origin.y = rect.y();
218     wkRect.size.width = rect.width();
219     wkRect.size.height = rect.height();
220     return wkRect;
221 }
222
223 inline WKRect toAPI(const WebCore::IntRect& rect)
224 {
225     WKRect wkRect;
226     wkRect.origin.x = rect.x();
227     wkRect.origin.y = rect.y();
228     wkRect.size.width = rect.width();
229     wkRect.size.height = rect.height();
230     return wkRect;
231 }
232
233 inline WKSize toAPI(const WebCore::IntSize& size)
234 {
235     WKSize wkSize;
236     wkSize.width = size.width();
237     wkSize.height = size.height();
238     return wkSize;
239 }
240
241 inline WKPoint toAPI(const WebCore::IntPoint& point)
242 {
243     WKPoint wkPoint;
244     wkPoint.x = point.x();
245     wkPoint.y = point.y();
246     return wkPoint;
247 }
248
249 /* Enum conversions */
250
251 inline WKTypeID toAPI(APIObject::Type type)
252 {
253     return static_cast<WKTypeID>(type);
254 }
255
256 inline WKEventModifiers toAPI(WebEvent::Modifiers modifiers)
257 {
258     WKEventModifiers wkModifiers = 0;
259     if (modifiers & WebEvent::ShiftKey)
260         wkModifiers |= kWKEventModifiersShiftKey;
261     if (modifiers & WebEvent::ControlKey)
262         wkModifiers |= kWKEventModifiersControlKey;
263     if (modifiers & WebEvent::AltKey)
264         wkModifiers |= kWKEventModifiersAltKey;
265     if (modifiers & WebEvent::MetaKey)
266         wkModifiers |= kWKEventModifiersMetaKey;
267     return wkModifiers;
268 }
269
270 inline WKEventMouseButton toAPI(WebMouseEvent::Button mouseButton)
271 {
272     WKEventMouseButton wkMouseButton = kWKEventMouseButtonNoButton;
273
274     switch (mouseButton) {
275     case WebMouseEvent::NoButton:
276         wkMouseButton = kWKEventMouseButtonNoButton;
277         break;
278     case WebMouseEvent::LeftButton:
279         wkMouseButton = kWKEventMouseButtonLeftButton;
280         break;
281     case WebMouseEvent::MiddleButton:
282         wkMouseButton = kWKEventMouseButtonMiddleButton;
283         break;
284     case WebMouseEvent::RightButton:
285         wkMouseButton = kWKEventMouseButtonRightButton;
286         break;
287     }
288
289     return wkMouseButton;
290 }
291
292 inline WKContextMenuItemTag toAPI(WebCore::ContextMenuAction action)
293 {
294     switch (action) {
295     case WebCore::ContextMenuItemTagNoAction:
296         return kWKContextMenuItemTagNoAction;
297     case WebCore::ContextMenuItemTagOpenLinkInNewWindow:
298         return kWKContextMenuItemTagOpenLinkInNewWindow;
299     case WebCore::ContextMenuItemTagDownloadLinkToDisk:
300         return kWKContextMenuItemTagDownloadLinkToDisk;
301     case WebCore::ContextMenuItemTagCopyLinkToClipboard:
302         return kWKContextMenuItemTagCopyLinkToClipboard;
303     case WebCore::ContextMenuItemTagOpenImageInNewWindow:
304         return kWKContextMenuItemTagOpenImageInNewWindow;
305     case WebCore::ContextMenuItemTagDownloadImageToDisk:
306         return kWKContextMenuItemTagDownloadImageToDisk;
307     case WebCore::ContextMenuItemTagCopyImageToClipboard:
308         return kWKContextMenuItemTagCopyImageToClipboard;
309     case WebCore::ContextMenuItemTagOpenFrameInNewWindow:
310         return kWKContextMenuItemTagOpenFrameInNewWindow;
311     case WebCore::ContextMenuItemTagCopy:
312         return kWKContextMenuItemTagCopy;
313     case WebCore::ContextMenuItemTagGoBack:
314         return kWKContextMenuItemTagGoBack;
315     case WebCore::ContextMenuItemTagGoForward:
316         return kWKContextMenuItemTagGoForward;
317     case WebCore::ContextMenuItemTagStop:
318         return kWKContextMenuItemTagStop;
319     case WebCore::ContextMenuItemTagReload:
320         return kWKContextMenuItemTagReload;
321     case WebCore::ContextMenuItemTagCut:
322         return kWKContextMenuItemTagCut;
323     case WebCore::ContextMenuItemTagPaste:
324         return kWKContextMenuItemTagPaste;
325     case WebCore::ContextMenuItemTagSpellingGuess:
326         return kWKContextMenuItemTagSpellingGuess;
327     case WebCore::ContextMenuItemTagNoGuessesFound:
328         return kWKContextMenuItemTagNoGuessesFound;
329     case WebCore::ContextMenuItemTagIgnoreSpelling:
330         return kWKContextMenuItemTagIgnoreSpelling;
331     case WebCore::ContextMenuItemTagLearnSpelling:
332         return kWKContextMenuItemTagLearnSpelling;
333     case WebCore::ContextMenuItemTagOther:
334         return kWKContextMenuItemTagOther;
335     case WebCore::ContextMenuItemTagSearchInSpotlight:
336         return kWKContextMenuItemTagSearchInSpotlight;
337     case WebCore::ContextMenuItemTagSearchWeb:
338         return kWKContextMenuItemTagSearchWeb;
339     case WebCore::ContextMenuItemTagLookUpInDictionary:
340         return kWKContextMenuItemTagLookUpInDictionary;
341     case WebCore::ContextMenuItemTagOpenWithDefaultApplication:
342         return kWKContextMenuItemTagOpenWithDefaultApplication;
343     case WebCore::ContextMenuItemPDFActualSize:
344         return kWKContextMenuItemTagPDFActualSize;
345     case WebCore::ContextMenuItemPDFZoomIn:
346         return kWKContextMenuItemTagPDFZoomIn;
347     case WebCore::ContextMenuItemPDFZoomOut:
348         return kWKContextMenuItemTagPDFZoomOut;
349     case WebCore::ContextMenuItemPDFAutoSize:
350         return kWKContextMenuItemTagPDFAutoSize;
351     case WebCore::ContextMenuItemPDFSinglePage:
352         return kWKContextMenuItemTagPDFSinglePage;
353     case WebCore::ContextMenuItemPDFFacingPages:
354         return kWKContextMenuItemTagPDFFacingPages;
355     case WebCore::ContextMenuItemPDFContinuous:
356         return kWKContextMenuItemTagPDFContinuous;
357     case WebCore::ContextMenuItemPDFNextPage:
358         return kWKContextMenuItemTagPDFNextPage;
359     case WebCore::ContextMenuItemPDFPreviousPage:
360         return kWKContextMenuItemTagPDFPreviousPage;
361     case WebCore::ContextMenuItemTagOpenLink:
362         return kWKContextMenuItemTagOpenLink;
363     case WebCore::ContextMenuItemTagIgnoreGrammar:
364         return kWKContextMenuItemTagIgnoreGrammar;
365     case WebCore::ContextMenuItemTagSpellingMenu:
366         return kWKContextMenuItemTagSpellingMenu;
367     case WebCore::ContextMenuItemTagShowSpellingPanel:
368         return kWKContextMenuItemTagShowSpellingPanel;
369     case WebCore::ContextMenuItemTagCheckSpelling:
370         return kWKContextMenuItemTagCheckSpelling;
371     case WebCore::ContextMenuItemTagCheckSpellingWhileTyping:
372         return kWKContextMenuItemTagCheckSpellingWhileTyping;
373     case WebCore::ContextMenuItemTagCheckGrammarWithSpelling:
374         return kWKContextMenuItemTagCheckGrammarWithSpelling;
375     case WebCore::ContextMenuItemTagFontMenu:
376         return kWKContextMenuItemTagFontMenu;
377     case WebCore::ContextMenuItemTagShowFonts:
378         return kWKContextMenuItemTagShowFonts;
379     case WebCore::ContextMenuItemTagBold:
380         return kWKContextMenuItemTagBold;
381     case WebCore::ContextMenuItemTagItalic:
382         return kWKContextMenuItemTagItalic;
383     case WebCore::ContextMenuItemTagUnderline:
384         return kWKContextMenuItemTagUnderline;
385     case WebCore::ContextMenuItemTagOutline:
386         return kWKContextMenuItemTagOutline;
387     case WebCore::ContextMenuItemTagStyles:
388         return kWKContextMenuItemTagStyles;
389     case WebCore::ContextMenuItemTagShowColors:
390         return kWKContextMenuItemTagShowColors;
391     case WebCore::ContextMenuItemTagSpeechMenu:
392         return kWKContextMenuItemTagSpeechMenu;
393     case WebCore::ContextMenuItemTagStartSpeaking:
394         return kWKContextMenuItemTagStartSpeaking;
395     case WebCore::ContextMenuItemTagStopSpeaking:
396         return kWKContextMenuItemTagStopSpeaking;
397     case WebCore::ContextMenuItemTagWritingDirectionMenu:
398         return kWKContextMenuItemTagWritingDirectionMenu;
399     case WebCore::ContextMenuItemTagDefaultDirection:
400         return kWKContextMenuItemTagDefaultDirection;
401     case WebCore::ContextMenuItemTagLeftToRight:
402         return kWKContextMenuItemTagLeftToRight;
403     case WebCore::ContextMenuItemTagRightToLeft:
404         return kWKContextMenuItemTagRightToLeft;
405     case WebCore::ContextMenuItemTagPDFSinglePageScrolling:
406         return kWKContextMenuItemTagPDFSinglePageScrolling;
407     case WebCore::ContextMenuItemTagPDFFacingPagesScrolling:
408         return kWKContextMenuItemTagPDFFacingPagesScrolling;
409 #if ENABLE(INSPECTOR)
410     case WebCore::ContextMenuItemTagInspectElement:
411         return kWKContextMenuItemTagInspectElement;
412 #endif
413     case WebCore::ContextMenuItemTagTextDirectionMenu:
414         return kWKContextMenuItemTagTextDirectionMenu;
415     case WebCore::ContextMenuItemTagTextDirectionDefault:
416         return kWKContextMenuItemTagTextDirectionDefault;
417     case WebCore::ContextMenuItemTagTextDirectionLeftToRight:
418         return kWKContextMenuItemTagTextDirectionLeftToRight;
419     case WebCore::ContextMenuItemTagTextDirectionRightToLeft:
420         return kWKContextMenuItemTagTextDirectionRightToLeft;
421     case WebCore::ContextMenuItemTagOpenMediaInNewWindow:
422         return kWKContextMenuItemTagOpenMediaInNewWindow;
423     case WebCore::ContextMenuItemTagCopyMediaLinkToClipboard:
424         return kWKContextMenuItemTagCopyMediaLinkToClipboard;
425     case WebCore::ContextMenuItemTagToggleMediaControls:
426         return kWKContextMenuItemTagToggleMediaControls;
427     case WebCore::ContextMenuItemTagToggleMediaLoop:
428         return kWKContextMenuItemTagToggleMediaLoop;
429     case WebCore::ContextMenuItemTagEnterVideoFullscreen:
430         return kWKContextMenuItemTagEnterVideoFullscreen;
431     case WebCore::ContextMenuItemTagMediaPlayPause:
432         return kWKContextMenuItemTagMediaPlayPause;
433     case WebCore::ContextMenuItemTagMediaMute:
434         return kWKContextMenuItemTagMediaMute;
435 #if PLATFORM(MAC)
436     case WebCore::ContextMenuItemTagCorrectSpellingAutomatically:
437         return kWKContextMenuItemTagCorrectSpellingAutomatically;
438     case WebCore::ContextMenuItemTagSubstitutionsMenu:
439         return kWKContextMenuItemTagSubstitutionsMenu;
440     case WebCore::ContextMenuItemTagShowSubstitutions:
441         return kWKContextMenuItemTagShowSubstitutions;
442     case WebCore::ContextMenuItemTagSmartCopyPaste:
443         return kWKContextMenuItemTagSmartCopyPaste;
444     case WebCore::ContextMenuItemTagSmartQuotes:
445         return kWKContextMenuItemTagSmartQuotes;
446     case WebCore::ContextMenuItemTagSmartDashes:
447         return kWKContextMenuItemTagSmartDashes;
448     case WebCore::ContextMenuItemTagSmartLinks:
449         return kWKContextMenuItemTagSmartLinks;
450     case WebCore::ContextMenuItemTagTextReplacement:
451         return kWKContextMenuItemTagTextReplacement;
452     case WebCore::ContextMenuItemTagTransformationsMenu:
453         return kWKContextMenuItemTagTransformationsMenu;
454     case WebCore::ContextMenuItemTagMakeUpperCase:
455         return kWKContextMenuItemTagMakeUpperCase;
456     case WebCore::ContextMenuItemTagMakeLowerCase:
457         return kWKContextMenuItemTagMakeLowerCase;
458     case WebCore::ContextMenuItemTagCapitalize:
459         return kWKContextMenuItemTagCapitalize;
460     case WebCore::ContextMenuItemTagChangeBack:
461         return kWKContextMenuItemTagChangeBack;
462 #endif
463     default:
464         if (action < WebCore::ContextMenuItemBaseApplicationTag)
465             LOG_ERROR("ContextMenuAction %i is an unknown tag but is below the allowable custom tag value of %i", action, WebCore::  ContextMenuItemBaseApplicationTag);
466         return static_cast<WKContextMenuItemTag>(action);
467     }
468 }
469
470 inline WebCore::ContextMenuAction toImpl(WKContextMenuItemTag tag)
471 {
472     switch (tag) {
473     case kWKContextMenuItemTagNoAction:
474         return WebCore::ContextMenuItemTagNoAction;
475     case kWKContextMenuItemTagOpenLinkInNewWindow:
476         return WebCore::ContextMenuItemTagOpenLinkInNewWindow;
477     case kWKContextMenuItemTagDownloadLinkToDisk:
478         return WebCore::ContextMenuItemTagDownloadLinkToDisk;
479     case kWKContextMenuItemTagCopyLinkToClipboard:
480         return WebCore::ContextMenuItemTagCopyLinkToClipboard;
481     case kWKContextMenuItemTagOpenImageInNewWindow:
482         return WebCore::ContextMenuItemTagOpenImageInNewWindow;
483     case kWKContextMenuItemTagDownloadImageToDisk:
484         return WebCore::ContextMenuItemTagDownloadImageToDisk;
485     case kWKContextMenuItemTagCopyImageToClipboard:
486         return WebCore::ContextMenuItemTagCopyImageToClipboard;
487     case kWKContextMenuItemTagOpenFrameInNewWindow:
488         return WebCore::ContextMenuItemTagOpenFrameInNewWindow;
489     case kWKContextMenuItemTagCopy:
490         return WebCore::ContextMenuItemTagCopy;
491     case kWKContextMenuItemTagGoBack:
492         return WebCore::ContextMenuItemTagGoBack;
493     case kWKContextMenuItemTagGoForward:
494         return WebCore::ContextMenuItemTagGoForward;
495     case kWKContextMenuItemTagStop:
496         return WebCore::ContextMenuItemTagStop;
497     case kWKContextMenuItemTagReload:
498         return WebCore::ContextMenuItemTagReload;
499     case kWKContextMenuItemTagCut:
500         return WebCore::ContextMenuItemTagCut;
501     case kWKContextMenuItemTagPaste:
502         return WebCore::ContextMenuItemTagPaste;
503     case kWKContextMenuItemTagSpellingGuess:
504         return WebCore::ContextMenuItemTagSpellingGuess;
505     case kWKContextMenuItemTagNoGuessesFound:
506         return WebCore::ContextMenuItemTagNoGuessesFound;
507     case kWKContextMenuItemTagIgnoreSpelling:
508         return WebCore::ContextMenuItemTagIgnoreSpelling;
509     case kWKContextMenuItemTagLearnSpelling:
510         return WebCore::ContextMenuItemTagLearnSpelling;
511     case kWKContextMenuItemTagOther:
512         return WebCore::ContextMenuItemTagOther;
513     case kWKContextMenuItemTagSearchInSpotlight:
514         return WebCore::ContextMenuItemTagSearchInSpotlight;
515     case kWKContextMenuItemTagSearchWeb:
516         return WebCore::ContextMenuItemTagSearchWeb;
517     case kWKContextMenuItemTagLookUpInDictionary:
518         return WebCore::ContextMenuItemTagLookUpInDictionary;
519     case kWKContextMenuItemTagOpenWithDefaultApplication:
520         return WebCore::ContextMenuItemTagOpenWithDefaultApplication;
521     case kWKContextMenuItemTagPDFActualSize:
522         return WebCore::ContextMenuItemPDFActualSize;
523     case kWKContextMenuItemTagPDFZoomIn:
524         return WebCore::ContextMenuItemPDFZoomIn;
525     case kWKContextMenuItemTagPDFZoomOut:
526         return WebCore::ContextMenuItemPDFZoomOut;
527     case kWKContextMenuItemTagPDFAutoSize:
528         return WebCore::ContextMenuItemPDFAutoSize;
529     case kWKContextMenuItemTagPDFSinglePage:
530         return WebCore::ContextMenuItemPDFSinglePage;
531     case kWKContextMenuItemTagPDFFacingPages:
532         return WebCore::ContextMenuItemPDFFacingPages;
533     case kWKContextMenuItemTagPDFContinuous:
534         return WebCore::ContextMenuItemPDFContinuous;
535     case kWKContextMenuItemTagPDFNextPage:
536         return WebCore::ContextMenuItemPDFNextPage;
537     case kWKContextMenuItemTagPDFPreviousPage:
538         return WebCore::ContextMenuItemPDFPreviousPage;
539     case kWKContextMenuItemTagOpenLink:
540         return WebCore::ContextMenuItemTagOpenLink;
541     case kWKContextMenuItemTagIgnoreGrammar:
542         return WebCore::ContextMenuItemTagIgnoreGrammar;
543     case kWKContextMenuItemTagSpellingMenu:
544         return WebCore::ContextMenuItemTagSpellingMenu;
545     case kWKContextMenuItemTagShowSpellingPanel:
546         return WebCore::ContextMenuItemTagShowSpellingPanel;
547     case kWKContextMenuItemTagCheckSpelling:
548         return WebCore::ContextMenuItemTagCheckSpelling;
549     case kWKContextMenuItemTagCheckSpellingWhileTyping:
550         return WebCore::ContextMenuItemTagCheckSpellingWhileTyping;
551     case kWKContextMenuItemTagCheckGrammarWithSpelling:
552         return WebCore::ContextMenuItemTagCheckGrammarWithSpelling;
553     case kWKContextMenuItemTagFontMenu:
554         return WebCore::ContextMenuItemTagFontMenu;
555     case kWKContextMenuItemTagShowFonts:
556         return WebCore::ContextMenuItemTagShowFonts;
557     case kWKContextMenuItemTagBold:
558         return WebCore::ContextMenuItemTagBold;
559     case kWKContextMenuItemTagItalic:
560         return WebCore::ContextMenuItemTagItalic;
561     case kWKContextMenuItemTagUnderline:
562         return WebCore::ContextMenuItemTagUnderline;
563     case kWKContextMenuItemTagOutline:
564         return WebCore::ContextMenuItemTagOutline;
565     case kWKContextMenuItemTagStyles:
566         return WebCore::ContextMenuItemTagStyles;
567     case kWKContextMenuItemTagShowColors:
568         return WebCore::ContextMenuItemTagShowColors;
569     case kWKContextMenuItemTagSpeechMenu:
570         return WebCore::ContextMenuItemTagSpeechMenu;
571     case kWKContextMenuItemTagStartSpeaking:
572         return WebCore::ContextMenuItemTagStartSpeaking;
573     case kWKContextMenuItemTagStopSpeaking:
574         return WebCore::ContextMenuItemTagStopSpeaking;
575     case kWKContextMenuItemTagWritingDirectionMenu:
576         return WebCore::ContextMenuItemTagWritingDirectionMenu;
577     case kWKContextMenuItemTagDefaultDirection:
578         return WebCore::ContextMenuItemTagDefaultDirection;
579     case kWKContextMenuItemTagLeftToRight:
580         return WebCore::ContextMenuItemTagLeftToRight;
581     case kWKContextMenuItemTagRightToLeft:
582         return WebCore::ContextMenuItemTagRightToLeft;
583     case kWKContextMenuItemTagPDFSinglePageScrolling:
584         return WebCore::ContextMenuItemTagPDFSinglePageScrolling;
585     case kWKContextMenuItemTagPDFFacingPagesScrolling:
586         return WebCore::ContextMenuItemTagPDFFacingPagesScrolling;
587 #if ENABLE(INSPECTOR)
588     case kWKContextMenuItemTagInspectElement:
589         return WebCore::ContextMenuItemTagInspectElement;
590 #endif
591     case kWKContextMenuItemTagTextDirectionMenu:
592         return WebCore::ContextMenuItemTagTextDirectionMenu;
593     case kWKContextMenuItemTagTextDirectionDefault:
594         return WebCore::ContextMenuItemTagTextDirectionDefault;
595     case kWKContextMenuItemTagTextDirectionLeftToRight:
596         return WebCore::ContextMenuItemTagTextDirectionLeftToRight;
597     case kWKContextMenuItemTagTextDirectionRightToLeft:
598         return WebCore::ContextMenuItemTagTextDirectionRightToLeft;
599     case kWKContextMenuItemTagOpenMediaInNewWindow:
600         return WebCore::ContextMenuItemTagOpenMediaInNewWindow;
601     case kWKContextMenuItemTagCopyMediaLinkToClipboard:
602         return WebCore::ContextMenuItemTagCopyMediaLinkToClipboard;
603     case kWKContextMenuItemTagToggleMediaControls:
604         return WebCore::ContextMenuItemTagToggleMediaControls;
605     case kWKContextMenuItemTagToggleMediaLoop:
606         return WebCore::ContextMenuItemTagToggleMediaLoop;
607     case kWKContextMenuItemTagEnterVideoFullscreen:
608         return WebCore::ContextMenuItemTagEnterVideoFullscreen;
609     case kWKContextMenuItemTagMediaPlayPause:
610         return WebCore::ContextMenuItemTagMediaPlayPause;
611     case kWKContextMenuItemTagMediaMute:
612         return WebCore::ContextMenuItemTagMediaMute;
613 #if PLATFORM(MAC)
614     case kWKContextMenuItemTagCorrectSpellingAutomatically:
615         return WebCore::ContextMenuItemTagCorrectSpellingAutomatically;
616     case kWKContextMenuItemTagSubstitutionsMenu:
617         return WebCore::ContextMenuItemTagSubstitutionsMenu;
618     case kWKContextMenuItemTagShowSubstitutions:
619         return WebCore::ContextMenuItemTagShowSubstitutions;
620     case kWKContextMenuItemTagSmartCopyPaste:
621         return WebCore::ContextMenuItemTagSmartCopyPaste;
622     case kWKContextMenuItemTagSmartQuotes:
623         return WebCore::ContextMenuItemTagSmartQuotes;
624     case kWKContextMenuItemTagSmartDashes:
625         return WebCore::ContextMenuItemTagSmartDashes;
626     case kWKContextMenuItemTagSmartLinks:
627         return WebCore::ContextMenuItemTagSmartLinks;
628     case kWKContextMenuItemTagTextReplacement:
629         return WebCore::ContextMenuItemTagTextReplacement;
630     case kWKContextMenuItemTagTransformationsMenu:
631         return WebCore::ContextMenuItemTagTransformationsMenu;
632     case kWKContextMenuItemTagMakeUpperCase:
633         return WebCore::ContextMenuItemTagMakeUpperCase;
634     case kWKContextMenuItemTagMakeLowerCase:
635         return WebCore::ContextMenuItemTagMakeLowerCase;
636     case kWKContextMenuItemTagCapitalize:
637         return WebCore::ContextMenuItemTagCapitalize;
638     case kWKContextMenuItemTagChangeBack:
639         return WebCore::ContextMenuItemTagChangeBack;
640 #endif
641     default:
642         if (tag < kWKContextMenuItemBaseApplicationTag)
643             LOG_ERROR("WKContextMenuItemTag %i is an unknown tag but is below the allowable custom tag value of %i", tag, kWKContextMenuItemBaseApplicationTag);
644         return static_cast<WebCore::ContextMenuAction>(tag);
645     }
646 }
647
648 inline WKContextMenuItemType toAPI(WebCore::ContextMenuItemType type)
649 {
650     switch(type) {
651     case WebCore::ActionType:
652         return kWKContextMenuItemTypeAction;
653     case WebCore::CheckableActionType:
654         return kWKContextMenuItemTypeCheckableAction;
655     case WebCore::SeparatorType:
656         return kWKContextMenuItemTypeSeparator;
657     case WebCore::SubmenuType:
658         return kWKContextMenuItemTypeSubmenu;
659     default:
660         ASSERT_NOT_REACHED();
661         return kWKContextMenuItemTypeAction;
662     }
663 }
664
665 inline FindOptions toFindOptions(WKFindOptions wkFindOptions)
666 {
667     unsigned findOptions = 0;
668
669     if (wkFindOptions & kWKFindOptionsCaseInsensitive)
670         findOptions |= FindOptionsCaseInsensitive;
671     if (wkFindOptions & kWKFindOptionsAtWordStarts)
672         findOptions |= FindOptionsAtWordStarts;
673     if (wkFindOptions & kWKFindOptionsTreatMedialCapitalAsWordStart)
674         findOptions |= FindOptionsTreatMedialCapitalAsWordStart;
675     if (wkFindOptions & kWKFindOptionsBackwards)
676         findOptions |= FindOptionsBackwards;
677     if (wkFindOptions & kWKFindOptionsWrapAround)
678         findOptions |= FindOptionsWrapAround;
679     if (wkFindOptions & kWKFindOptionsShowOverlay)
680         findOptions |= FindOptionsShowOverlay;
681     if (wkFindOptions & kWKFindOptionsShowFindIndicator)
682         findOptions |= FindOptionsShowFindIndicator;
683
684     return static_cast<FindOptions>(findOptions);
685 }
686
687 inline WKFrameNavigationType toAPI(WebCore::NavigationType type)
688 {
689     WKFrameNavigationType wkType = kWKFrameNavigationTypeOther;
690
691     switch (type) {
692     case WebCore::NavigationTypeLinkClicked:
693         wkType = kWKFrameNavigationTypeLinkClicked;
694         break;
695     case WebCore::NavigationTypeFormSubmitted:
696         wkType = kWKFrameNavigationTypeFormSubmitted;
697         break;
698     case WebCore::NavigationTypeBackForward:
699         wkType = kWKFrameNavigationTypeBackForward;
700         break;
701     case WebCore::NavigationTypeReload:
702         wkType = kWKFrameNavigationTypeReload;
703         break;
704     case WebCore::NavigationTypeFormResubmitted:
705         wkType = kWKFrameNavigationTypeFormResubmitted;
706         break;
707     case WebCore::NavigationTypeOther:
708         wkType = kWKFrameNavigationTypeOther;
709         break;
710     }
711     
712     return wkType;
713 }
714
715 inline WKSameDocumentNavigationType toAPI(SameDocumentNavigationType type)
716 {
717     WKFrameNavigationType wkType = kWKSameDocumentNavigationAnchorNavigation;
718
719     switch (type) {
720     case SameDocumentNavigationAnchorNavigation:
721         wkType = kWKSameDocumentNavigationAnchorNavigation;
722         break;
723     case SameDocumentNavigationSessionStatePush:
724         wkType = kWKSameDocumentNavigationSessionStatePush;
725         break;
726     case SameDocumentNavigationSessionStateReplace:
727         wkType = kWKSameDocumentNavigationSessionStateReplace;
728         break;
729     case SameDocumentNavigationSessionStatePop:
730         wkType = kWKSameDocumentNavigationSessionStatePop;
731         break;
732     }
733     
734     return wkType;
735 }
736
737 inline ImageOptions toImageOptions(WKImageOptions wkImageOptions)
738 {
739     unsigned imageOptions = 0;
740
741     if (wkImageOptions & kWKImageOptionsShareable)
742         imageOptions |= ImageOptionsShareable;
743
744     return static_cast<ImageOptions>(imageOptions);
745 }
746
747 } // namespace WebKit
748
749 #endif // WKSharedAPICast_h