Changeset 163370 in webkit


Ignore:
Timestamp:
Feb 4, 2014 2:25:11 AM (10 years ago)
Author:
eunmi15.lee@samsung.com
Message:

[EFL][WK2] ewk_context needs to route InjectedBundle messages correctly.
https://bugs.webkit.org/show_bug.cgi?id=90772

Reviewed by Gyuyoung Kim.

Add APIs to post message to injected bundle and register callback to
get message from injected bundle. When callback is registered,
WKContextInjectedBundleClient is set to get messages from injected bundle.

  • UIProcess/API/efl/ewk_context.cpp:

(EwkContext::EwkContext):
(toEwkContext):
(EwkContext::didReceiveMessageFromInjectedBundle):
(EwkContext::didReceiveSynchronousMessageFromInjectedBundle):
(EwkContext::setMessageFromInjectedBundleCallback): register callback to get message from injected bundle.
(EwkContext::processReceivedMessageFromInjectedBundle): process message from injected bundle.
(ewk_context_message_post_to_injected_bundle):
(ewk_context_message_from_injected_bundle_callback_set):

  • UIProcess/API/efl/ewk_context.h:
  • UIProcess/API/efl/ewk_context_private.h:
Location:
trunk/Source/WebKit2
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r163367 r163370  
     12014-02-04  Eunmi Lee  <eunmi15.lee@samsung.com>
     2
     3        [EFL][WK2] ewk_context needs to route InjectedBundle messages correctly.
     4        https://bugs.webkit.org/show_bug.cgi?id=90772
     5
     6        Reviewed by Gyuyoung Kim.
     7
     8        Add APIs to post message to injected bundle and register callback to
     9        get message from injected bundle. When callback is registered,
     10        WKContextInjectedBundleClient is set to get messages from injected bundle.
     11
     12        * UIProcess/API/efl/ewk_context.cpp:
     13        (EwkContext::EwkContext):
     14        (toEwkContext):
     15        (EwkContext::didReceiveMessageFromInjectedBundle):
     16        (EwkContext::didReceiveSynchronousMessageFromInjectedBundle):
     17        (EwkContext::setMessageFromInjectedBundleCallback): register callback to get message from injected bundle.
     18        (EwkContext::processReceivedMessageFromInjectedBundle): process message from injected bundle.
     19        (ewk_context_message_post_to_injected_bundle):
     20        (ewk_context_message_from_injected_bundle_callback_set):
     21        * UIProcess/API/efl/ewk_context.h:
     22        * UIProcess/API/efl/ewk_context_private.h:
     23
    1242014-02-04  Jinwoo Song  <jinwoo7.song@samsung.com>
    225
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp

    r163367 r163370  
    9595    TextCheckerClientEfl::instance().ensureSpellCheckingLanguage();
    9696#endif
     97
     98    m_callbackForMessageFromInjectedBundle.callback = nullptr;
     99    m_callbackForMessageFromInjectedBundle.userData = nullptr;
    97100}
    98101
     
    292295}
    293296
     297static inline EwkContext* toEwkContext(const void* clientInfo)
     298{
     299    return static_cast<EwkContext*>(const_cast<void*>(clientInfo));
     300}
     301
     302void EwkContext::didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo)
     303{
     304    toEwkContext(clientInfo)->processReceivedMessageFromInjectedBundle(messageName, messageBody, nullptr);
     305}
     306
     307void EwkContext::didReceiveSynchronousMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void* clientInfo)
     308{
     309    toEwkContext(clientInfo)->processReceivedMessageFromInjectedBundle(messageName, messageBody, returnData);
     310}
     311
     312void EwkContext::setMessageFromInjectedBundleCallback(Ewk_Context_Message_From_Injected_Bundle_Cb callback, void* userData)
     313{
     314    m_callbackForMessageFromInjectedBundle.userData = userData;
     315
     316    if (m_callbackForMessageFromInjectedBundle.callback == callback)
     317        return;
     318
     319    if (!m_callbackForMessageFromInjectedBundle.callback) {
     320        WKContextInjectedBundleClientV1 client;
     321        memset(&client, 0, sizeof(client));
     322
     323        client.base.version = 1;
     324        client.base.clientInfo = this;
     325        client.didReceiveMessageFromInjectedBundle = didReceiveMessageFromInjectedBundle;
     326        client.didReceiveSynchronousMessageFromInjectedBundle = didReceiveSynchronousMessageFromInjectedBundle;
     327
     328        WKContextSetInjectedBundleClient(m_context.get(), &client.base);
     329    } else if (!callback)
     330        WKContextSetInjectedBundleClient(m_context.get(), nullptr);
     331
     332    m_callbackForMessageFromInjectedBundle.callback = callback;
     333}
     334
     335void EwkContext::processReceivedMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData)
     336{
     337    if (!m_callbackForMessageFromInjectedBundle.callback)
     338        return;
     339
     340    CString name = toImpl(messageName)->string().utf8();
     341    CString body;
     342    if (messageBody && WKStringGetTypeID() == WKGetTypeID(messageBody))
     343        body = toImpl(static_cast<WKStringRef>(messageBody))->string().utf8();
     344
     345    if (returnData) {
     346        char* returnString = nullptr;
     347        m_callbackForMessageFromInjectedBundle.callback(name.data(), body.data(), &returnString, m_callbackForMessageFromInjectedBundle.userData);
     348        if (returnString) {
     349            *returnData = WKStringCreateWithUTF8CString(returnString);
     350            free(returnString);
     351        } else
     352            *returnData = WKStringCreateWithUTF8CString("");
     353    } else
     354        m_callbackForMessageFromInjectedBundle.callback(name.data(), body.data(), nullptr, m_callbackForMessageFromInjectedBundle.userData);
     355}
     356
    294357Ewk_Context* ewk_context_default_get()
    295358{
     
    373436}
    374437
     438void ewk_context_message_post_to_injected_bundle(Ewk_Context* ewkContext, const char* name, const char* body)
     439{
     440    EWK_OBJ_GET_IMPL_OR_RETURN(EwkContext, ewkContext, impl);
     441    EINA_SAFETY_ON_NULL_RETURN(name);
     442    EINA_SAFETY_ON_NULL_RETURN(body);
     443
     444    WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString(name));
     445    WKRetainPtr<WKStringRef> messageBody(AdoptWK, WKStringCreateWithUTF8CString(body));
     446    WKContextPostMessageToInjectedBundle(impl->wkContext(), messageName.get(), messageBody.get());
     447}
     448
     449void ewk_context_message_from_injected_bundle_callback_set(Ewk_Context* ewkContext, Ewk_Context_Message_From_Injected_Bundle_Cb callback, void* userData)
     450{
     451    EWK_OBJ_GET_IMPL_OR_RETURN(EwkContext, ewkContext, impl);
     452
     453    impl->setMessageFromInjectedBundleCallback(callback, userData);
     454}
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_context.h

    r138554 r163370  
    111111 */
    112112typedef void (*Ewk_History_Populate_Visited_Links_Cb)(void *user_data);
     113
     114/**
     115 * Callback for didReceiveMessageFromInjectedBundle and didReceiveSynchronousMessageFromInjectedBundle
     116 *
     117 * User should allocate new string for return_data before setting it.
     118 * The return_data string will be freed on WebKit side.
     119 *
     120 * @param name name of message from injected bundle
     121 * @param body body of message from injected bundle
     122 * @param return_data return_data string from application
     123 * @param user_data user_data will be passsed when receiving message from injected bundle
     124 */
     125typedef void (*Ewk_Context_Message_From_Injected_Bundle_Cb)(const char *name, const char *body, char **return_data, void *user_data);
    113126
    114127/**
     
    320333EAPI void ewk_context_resource_cache_clear(Ewk_Context *context);
    321334
     335/**
     336 * Posts message to injected bundle.
     337 *
     338 * @param context context object to post message to injected bundle
     339 * @param name message name
     340 * @param body message body
     341 */
     342EAPI void ewk_context_message_post_to_injected_bundle(Ewk_Context *context, const char *name, const char *body);
     343
     344/**
     345 * Sets callback for received injected bundle message.
     346 *
     347 * Client can pass @c NULL for callback to stop listening for messages.
     348 *
     349 * @param context context object
     350 * @param callback callback for received injected bundle message or @c NULL
     351 * @param user_data user data
     352 */
     353EAPI void ewk_context_message_from_injected_bundle_callback_set(Ewk_Context *context, Ewk_Context_Message_From_Injected_Bundle_Cb callback, void *user_data);
     354
    322355#ifdef __cplusplus
    323356}
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_context_private.h

    r161527 r163370  
    8989    JSGlobalContextRef jsGlobalContext();
    9090
     91    static void didReceiveMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo);
     92    static void didReceiveSynchronousMessageFromInjectedBundle(WKContextRef, WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData, const void* clientInfo);
     93    void setMessageFromInjectedBundleCallback(Ewk_Context_Message_From_Injected_Bundle_Cb, void*);
     94    void processReceivedMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody, WKTypeRef* returnData);
     95
    9196private:
    9297    explicit EwkContext(WKContextRef);
     
    112117
    113118    JSGlobalContextRef m_jsGlobalContext;
     119
     120    struct {
     121        Ewk_Context_Message_From_Injected_Bundle_Cb callback;
     122        void* userData;
     123    } m_callbackForMessageFromInjectedBundle;
    114124};
    115125
Note: See TracChangeset for help on using the changeset viewer.