Changeset 122411 in webkit


Ignore:
Timestamp:
Jul 11, 2012 8:22:03 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[WK2][EFL] Ewk_View should provide more resource loading notifications
https://bugs.webkit.org/show_bug.cgi?id=90601

Patch by Christophe Dumez <Christophe Dumez> on 2012-07-11
Reviewed by Antonio Gomes.

Add new "resource,request,sent", "resource,request,response",
"resource,request,failed" and "resource,request,finished" to
Ewk_View in order to notify the clients of the main resource
load state changes.

Introduce new Ewk_Url_Response type that is used to provide
information to the clients regarding the resource load
responses that are received.

  • PlatformEfl.cmake:
  • UIProcess/API/efl/EWebKit2.h:
  • UIProcess/API/efl/ewk_url_response.cpp: Added.

(_Ewk_Url_Response):
(ewk_url_response_ref):
(ewk_url_response_unref):
(ewk_url_response_url_get):
(ewk_url_response_status_code_get):
(ewk_url_response_mime_type_get):
(ewk_url_response_new):

  • UIProcess/API/efl/ewk_url_response.h: Added.
  • UIProcess/API/efl/ewk_url_response_private.h: Added.
  • UIProcess/API/efl/ewk_view.cpp:

(_Ewk_View_Private_Data):
(ewk_view_resource_load_initiated):
(ewk_view_resource_load_response):
(ewk_view_resource_load_failed):
(ewk_view_resource_load_finished):
(ewk_view_resource_request_sent):
(ewk_view_load_provisional_started):

  • UIProcess/API/efl/ewk_view.h:
  • UIProcess/API/efl/ewk_view_private.h:
  • UIProcess/API/efl/ewk_view_resource_load_client.cpp:

(toEwkView):
(didInitiateLoadForResource):
(didSendRequestForResource):
(didReceiveResponseForResource):
(didFinishLoadForResource):
(didFailLoadForResource):
(ewk_view_resource_load_client_attach):

Location:
trunk/Source/WebKit2
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r122407 r122411  
     12012-07-11  Christophe Dumez  <christophe.dumez@intel.com>
     2
     3        [WK2][EFL] Ewk_View should provide more resource loading notifications
     4        https://bugs.webkit.org/show_bug.cgi?id=90601
     5
     6        Reviewed by Antonio Gomes.
     7
     8        Add new "resource,request,sent", "resource,request,response",
     9        "resource,request,failed" and "resource,request,finished" to
     10        Ewk_View in order to notify the clients of the main resource
     11        load state changes.
     12
     13        Introduce new Ewk_Url_Response type that is used to provide
     14        information to the clients regarding the resource load
     15        responses that are received.
     16
     17        * PlatformEfl.cmake:
     18        * UIProcess/API/efl/EWebKit2.h:
     19        * UIProcess/API/efl/ewk_url_response.cpp: Added.
     20        (_Ewk_Url_Response):
     21        (ewk_url_response_ref):
     22        (ewk_url_response_unref):
     23        (ewk_url_response_url_get):
     24        (ewk_url_response_status_code_get):
     25        (ewk_url_response_mime_type_get):
     26        (ewk_url_response_new):
     27        * UIProcess/API/efl/ewk_url_response.h: Added.
     28        * UIProcess/API/efl/ewk_url_response_private.h: Added.
     29        * UIProcess/API/efl/ewk_view.cpp:
     30        (_Ewk_View_Private_Data):
     31        (ewk_view_resource_load_initiated):
     32        (ewk_view_resource_load_response):
     33        (ewk_view_resource_load_failed):
     34        (ewk_view_resource_load_finished):
     35        (ewk_view_resource_request_sent):
     36        (ewk_view_load_provisional_started):
     37        * UIProcess/API/efl/ewk_view.h:
     38        * UIProcess/API/efl/ewk_view_private.h:
     39        * UIProcess/API/efl/ewk_view_resource_load_client.cpp:
     40        (toEwkView):
     41        (didInitiateLoadForResource):
     42        (didSendRequestForResource):
     43        (didReceiveResponseForResource):
     44        (didFinishLoadForResource):
     45        (didFailLoadForResource):
     46        (ewk_view_resource_load_client_attach):
     47
    1482012-07-11  Mark Rowe  <mrowe@apple.com>
    249
  • trunk/Source/WebKit2/PlatformEfl.cmake

    r122299 r122411  
    3939    UIProcess/API/efl/ewk_intent_service.cpp
    4040    UIProcess/API/efl/ewk_url_request.cpp
     41    UIProcess/API/efl/ewk_url_response.cpp
    4142    UIProcess/API/efl/ewk_view.cpp
    4243    UIProcess/API/efl/ewk_view_loader_client.cpp
  • trunk/Source/WebKit2/UIProcess/API/efl/EWebKit2.h

    r121889 r122411  
    3232#include "ewk_intent_service.h"
    3333#include "ewk_url_request.h"
     34#include "ewk_url_response.h"
    3435#include "ewk_view.h"
    3536#include "ewk_web_error.h"
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp

    r121944 r122411  
    3535#include "ewk_view_private.h"
    3636#include "ewk_view_resource_load_client_private.h"
     37#include "ewk_web_resource.h"
    3738#include <wtf/text/CString.h>
    3839
     
    4142
    4243static const char EWK_VIEW_TYPE_STR[] = "EWK2_View";
     44
     45typedef HashMap<uint64_t, Ewk_Web_Resource*> LoadingResourcesMap;
    4346
    4447struct _Ewk_View_Private_Data {
     
    4649    const char* uri;
    4750    const char* title;
     51    LoadingResourcesMap loadingResourcesMap;
    4852};
    4953
     
    568572void ewk_view_resource_load_initiated(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Web_Resource* resource, Ewk_Url_Request* request)
    569573{
    570     Ewk_Web_Resource_Request resourceRequest = {resource, request};
    571     // FIXME: We will need to store the resource and its identifier at some point
    572     // to get the resource back from the identifier on resource load finish.
     574    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
     575    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
     576
     577    Ewk_Web_Resource_Request resourceRequest = {resource, request, 0};
     578
     579    // Keep the resource internally to reuse it later.
     580    ewk_web_resource_ref(resource);
     581    priv->loadingResourcesMap.add(resourceIdentifier, resource);
     582
    573583    evas_object_smart_callback_call(ewkView, "resource,request,new", &resourceRequest);
     584}
     585
     586/**
     587 * @internal
     588 * Received a response to a resource load request in the view.
     589 *
     590 * Emits signal: "resource,request,response" with pointer to resource response.
     591 */
     592void ewk_view_resource_load_response(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Response* response)
     593{
     594    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
     595    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
     596
     597    if (!priv->loadingResourcesMap.contains(resourceIdentifier))
     598        return;
     599
     600    Ewk_Web_Resource* resource = priv->loadingResourcesMap.get(resourceIdentifier);
     601    Ewk_Web_Resource_Load_Response resourceLoadResponse = {resource, response};
     602    evas_object_smart_callback_call(ewkView, "resource,request,response", &resourceLoadResponse);
     603}
     604
     605/**
     606 * @internal
     607 * Failed loading a resource in the view.
     608 *
     609 * Emits signal: "resource,request,finished" with pointer to the resource load error.
     610 */
     611void ewk_view_resource_load_failed(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Web_Error* error)
     612{
     613    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
     614    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
     615
     616    if (!priv->loadingResourcesMap.contains(resourceIdentifier))
     617        return;
     618
     619    Ewk_Web_Resource* resource = priv->loadingResourcesMap.get(resourceIdentifier);
     620    Ewk_Web_Resource_Load_Error resourceLoadError = {resource, error};
     621    evas_object_smart_callback_call(ewkView, "resource,request,failed", &resourceLoadError);
     622}
     623
     624/**
     625 * @internal
     626 * Finished loading a resource in the view.
     627 *
     628 * Emits signal: "resource,request,finished" with pointer to the resource.
     629 */
     630void ewk_view_resource_load_finished(Evas_Object* ewkView, uint64_t resourceIdentifier)
     631{
     632    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
     633    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
     634
     635    if (!priv->loadingResourcesMap.contains(resourceIdentifier))
     636        return;
     637
     638    Ewk_Web_Resource* resource = priv->loadingResourcesMap.take(resourceIdentifier);
     639    evas_object_smart_callback_call(ewkView, "resource,request,finished", resource);
     640
     641    ewk_web_resource_unref(resource);
     642}
     643
     644/**
     645 * @internal
     646 * Request was sent for a resource in the view.
     647 *
     648 * Emits signal: "resource,request,sent" with pointer to resource request and possible redirect response.
     649 */
     650void ewk_view_resource_request_sent(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Request* request, Ewk_Url_Response* redirectResponse)
     651{
     652    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
     653    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
     654
     655    if (!priv->loadingResourcesMap.contains(resourceIdentifier))
     656        return;
     657
     658    Ewk_Web_Resource* resource = priv->loadingResourcesMap.get(resourceIdentifier);
     659    Ewk_Web_Resource_Request resourceRequest = {resource, request, redirectResponse};
     660
     661    evas_object_smart_callback_call(ewkView, "resource,request,sent", &resourceRequest);
    574662}
    575663
     
    774862void ewk_view_load_provisional_started(Evas_Object* ewkView)
    775863{
     864    EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
     865    EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv);
     866
     867    // The main frame started provisional load, we should clear
     868    // the loadingResources HashMap to start clean.
     869    LoadingResourcesMap::iterator it = priv->loadingResourcesMap.begin();
     870    LoadingResourcesMap::iterator end = priv->loadingResourcesMap.end();
     871    for ( ; it != end; ++it)
     872        ewk_web_resource_unref(it->second);
     873    priv->loadingResourcesMap.clear();
     874
    776875    evas_object_smart_callback_call(ewkView, "load,provisional,started", 0);
    777876}
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.h

    r121969 r122411  
    3535 * - "load,provisional,redirect", void: view received redirect for provisional load.
    3636 * - "load,provisional,started", void: view started provisional load.
     37 * - "resource,request,failed", const Ewk_Web_Resource_Load_Error*: a resource failed loading.
     38 * - "resource,request,finished", const Ewk_Web_Resource*: a resource finished loading.
    3739 * - "resource,request,new", const Ewk_Web_Resource_Request*: a resource request was initiated.
     40 * - "resource,request,response", Ewk_Web_Resource_Load_Response*: a response to a resource request was received.
     41 * - "resource,request,sent", const Ewk_Web_Resource_Request*: a resource request was sent.
    3842 * - "title,changed", const char*: title of the main frame was changed.
    3943 */
     
    4549#include "ewk_intent.h"
    4650#include "ewk_url_request.h"
     51#include "ewk_url_response.h"
     52#include "ewk_web_error.h"
    4753#include "ewk_web_resource.h"
    4854#include <Evas.h>
     
    146152/**
    147153 * @brief Structure containing details about a resource request.
    148  *
    149  * Details given about a resource is loaded.
    150154 */
    151155struct _Ewk_Web_Resource_Request {
    152156    Ewk_Web_Resource *resource; /**< resource being requested */
    153157    Ewk_Url_Request *request; /**< URL request for the resource */
     158    Ewk_Url_Response *redirect_response; /**< Possible redirect response for the resource */
     159};
     160
     161/// Creates a type name for _Ewk_Web_Resource_Load_Response.
     162typedef struct _Ewk_Web_Resource_Load_Response Ewk_Web_Resource_Load_Response;
     163
     164/**
     165 * @brief Structure containing details about a response to a resource request.
     166 */
     167struct _Ewk_Web_Resource_Load_Response {
     168     Ewk_Web_Resource *resource; /**< resource requested */
     169     Ewk_Url_Response *response; /**< resource load response */
     170};
     171
     172/// Creates a type name for _Ewk_Web_Resource_Load_Error.
     173typedef struct _Ewk_Web_Resource_Load_Error Ewk_Web_Resource_Load_Error;
     174
     175/**
     176 * @brief Structure containing details about a resource load error.
     177 *
     178 * Details given about a resource load failure.
     179 */
     180struct _Ewk_Web_Resource_Load_Error {
     181    Ewk_Web_Resource *resource; /**< resource that failed loading */
     182    Ewk_Web_Error *error; /**< load error */
    154183};
    155184
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h

    r121944 r122411  
    3232
    3333typedef struct _Ewk_Url_Request Ewk_Url_Request;
     34typedef struct _Ewk_Url_Response Ewk_Url_Response;
    3435typedef struct _Ewk_Web_Error Ewk_Web_Error;
    3536typedef struct _Ewk_Web_Resource Ewk_Web_Resource;
     
    5051void ewk_view_load_provisional_started(Evas_Object* ewkView);
    5152void ewk_view_title_changed(Evas_Object* ewkView, const char* title);
     53void ewk_view_resource_load_failed(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Web_Error* error);
     54void ewk_view_resource_load_finished(Evas_Object* ewkView, uint64_t resourceIdentifier);
    5255void ewk_view_resource_load_initiated(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Web_Resource* resource, Ewk_Url_Request* request);
     56void ewk_view_resource_load_response(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Response* response);
     57void ewk_view_resource_request_sent(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Request* request, Ewk_Url_Response* redirectResponse);
    5358
    5459Evas_Object* ewk_view_base_add(Evas* canvas, WKContextRef, WKPageGroupRef);
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_resource_load_client.cpp

    r121889 r122411  
    3232#include "WKURL.h"
    3333#include "WKURLRequest.h"
     34#include "WKURLResponse.h"
    3435#include "ewk_url_request.h"
    3536#include "ewk_url_request_private.h"
     37#include "ewk_url_response.h"
     38#include "ewk_url_response_private.h"
    3639#include "ewk_view_private.h"
    3740#include "ewk_view_resource_load_client_private.h"
     41#include "ewk_web_error.h"
     42#include "ewk_web_error_private.h"
    3843#include "ewk_web_resource.h"
    3944#include "ewk_web_resource_private.h"
     
    4247using namespace WebKit;
    4348
     49static inline Evas_Object* toEwkView(const void* clientInfo)
     50{
     51    return static_cast<Evas_Object*>(const_cast<void*>(clientInfo));
     52}
     53
    4454static void didInitiateLoadForResource(WKPageRef, WKFrameRef wkFrame, uint64_t resourceIdentifier, WKURLRequestRef wkRequest, bool pageIsProvisionallyLoading, const void* clientInfo)
    4555{
    46     Evas_Object* ewkView = static_cast<Evas_Object*>(const_cast<void*>(clientInfo));
    4756    bool isMainResource = (WKFrameIsMainFrame(wkFrame) && pageIsProvisionallyLoading);
    4857    WKRetainPtr<WKURLRef> wkUrl(AdoptWK, WKURLRequestCopyURL(wkRequest));
     
    5059    Ewk_Web_Resource* resource = ewk_web_resource_new(toImpl(wkUrl.get())->string().utf8().data(), isMainResource);
    5160    Ewk_Url_Request* request = ewk_url_request_new(wkRequest);
    52     ewk_view_resource_load_initiated(ewkView, resourceIdentifier, resource, request);
     61    ewk_view_resource_load_initiated(toEwkView(clientInfo), resourceIdentifier, resource, request);
    5362    ewk_web_resource_unref(resource);
    5463    ewk_url_request_unref(request);
     64}
     65
     66static void didSendRequestForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, WKURLRequestRef wkRequest, WKURLResponseRef wkRedirectResponse, const void* clientInfo)
     67{
     68    Ewk_Url_Request* request = ewk_url_request_new(wkRequest);
     69    Ewk_Url_Response* redirectResponse = ewk_url_response_new(toImpl(wkRedirectResponse)->resourceResponse());
     70    ewk_view_resource_request_sent(toEwkView(clientInfo), resourceIdentifier, request, redirectResponse);
     71    ewk_url_request_unref(request);
     72    ewk_url_response_unref(redirectResponse);
     73}
     74
     75static void didReceiveResponseForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, WKURLResponseRef wkResponse, const void* clientInfo)
     76{
     77    Ewk_Url_Response* response = ewk_url_response_new(toImpl(wkResponse)->resourceResponse());
     78    ewk_view_resource_load_response(toEwkView(clientInfo), resourceIdentifier, response);
     79    ewk_url_response_unref(response);
     80}
     81
     82static void didFinishLoadForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, const void* clientInfo)
     83{
     84    ewk_view_resource_load_finished(toEwkView(clientInfo), resourceIdentifier);
     85}
     86
     87static void didFailLoadForResource(WKPageRef, WKFrameRef, uint64_t resourceIdentifier, WKErrorRef wkError, const void* clientInfo)
     88{
     89    Ewk_Web_Error* ewkError = ewk_web_error_new(wkError);
     90    ewk_view_resource_load_failed(toEwkView(clientInfo), resourceIdentifier, ewkError);
     91    ewk_view_resource_load_finished(toEwkView(clientInfo), resourceIdentifier);
     92    ewk_web_error_free(ewkError);
    5593}
    5694
     
    62100    wkResourceLoadClient.clientInfo = ewkView;
    63101    wkResourceLoadClient.didInitiateLoadForResource = didInitiateLoadForResource;
     102    wkResourceLoadClient.didSendRequestForResource = didSendRequestForResource;
     103    wkResourceLoadClient.didReceiveResponseForResource = didReceiveResponseForResource;
     104    wkResourceLoadClient.didFinishLoadForResource = didFinishLoadForResource;
     105    wkResourceLoadClient.didFailLoadForResource = didFailLoadForResource;
    64106
    65107    WKPageSetPageResourceLoadClient(pageRef, &wkResourceLoadClient);
Note: See TracChangeset for help on using the changeset viewer.