Home | History | Annotate | Download | only in c
      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
    750