Changeset 129099 in webkit


Ignore:
Timestamp:
Sep 20, 2012 12:16:09 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[EFL][WK2] Same page navigation does not update view URI
https://bugs.webkit.org/show_bug.cgi?id=97094

Patch by Christophe Dumez <Christophe Dumez> on 2012-09-20
Reviewed by Kenneth Rohde Christiansen.

Handle didSameDocumentNavigationForFrame callback in
WKPageLoaderClient in order to update the view URI.
This fixes issues with the view URI not being updated
in case of a same page navigation.

  • UIProcess/API/efl/ewk_view_loader_client.cpp:

(didSameDocumentNavigationForFrame):
(ewk_view_loader_client_attach):

  • UIProcess/API/efl/ewk_view_private.h:
  • UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp:

(CallbackDataTimer):
(EWK2UnitTest::CallbackDataTimer::CallbackDataTimer):
(EWK2UnitTest::CallbackDataTimer::~CallbackDataTimer):
(EWK2UnitTest::CallbackDataTimer::isDone):
(EWK2UnitTest::CallbackDataTimer::setDone):
(EWK2UnitTest::CallbackDataTimer::didTimeOut):
(EWK2UnitTest::CallbackDataTimer::setTimedOut):
(EWK2UnitTest):
(CallbackDataExpectedValue):
(EWK2UnitTest::CallbackDataExpectedValue::CallbackDataExpectedValue):
(EWK2UnitTest::CallbackDataExpectedValue::expectedValue):
(EWK2UnitTest::onLoadFinished):
(EWK2UnitTest::timeOutWhileWaitingUntilLoadFinished):
(EWK2UnitTest::EWK2UnitTestBase::waitUntilLoadFinished):
(EWK2UnitTest::onTitleChanged):
(EWK2UnitTest::timeOutWhileWaitingUntilTitleChangedTo):
(EWK2UnitTest::EWK2UnitTestBase::waitUntilTitleChangedTo):
(EWK2UnitTest::onURIChanged):
(EWK2UnitTest::timeOutWhileWaitingUntilURIChangedTo):
(EWK2UnitTest::EWK2UnitTestBase::waitUntilURIChangedTo): Add convenience function to test
framework in order to wait until the view URI changes to a given value.

  • UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.h:

(EWK2UnitTestBase):

  • UIProcess/API/efl/tests/resources/same_page_navigation.html: Added.
  • UIProcess/API/efl/tests/test_ewk2_view.cpp:

(TEST_F): Add corresponding unit test to verify fix and prevent regressions
in the future.

Location:
trunk/Source/WebKit2
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r129097 r129099  
     12012-09-20  Christophe Dumez  <christophe.dumez@intel.com>
     2
     3        [EFL][WK2] Same page navigation does not update view URI
     4        https://bugs.webkit.org/show_bug.cgi?id=97094
     5
     6        Reviewed by Kenneth Rohde Christiansen.
     7
     8        Handle didSameDocumentNavigationForFrame callback in
     9        WKPageLoaderClient in order to update the view URI.
     10        This fixes issues with the view URI not being updated
     11        in case of a same page navigation.
     12
     13        * UIProcess/API/efl/ewk_view_loader_client.cpp:
     14        (didSameDocumentNavigationForFrame):
     15        (ewk_view_loader_client_attach):
     16        * UIProcess/API/efl/ewk_view_private.h:
     17        * UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp:
     18        (CallbackDataTimer):
     19        (EWK2UnitTest::CallbackDataTimer::CallbackDataTimer):
     20        (EWK2UnitTest::CallbackDataTimer::~CallbackDataTimer):
     21        (EWK2UnitTest::CallbackDataTimer::isDone):
     22        (EWK2UnitTest::CallbackDataTimer::setDone):
     23        (EWK2UnitTest::CallbackDataTimer::didTimeOut):
     24        (EWK2UnitTest::CallbackDataTimer::setTimedOut):
     25        (EWK2UnitTest):
     26        (CallbackDataExpectedValue):
     27        (EWK2UnitTest::CallbackDataExpectedValue::CallbackDataExpectedValue):
     28        (EWK2UnitTest::CallbackDataExpectedValue::expectedValue):
     29        (EWK2UnitTest::onLoadFinished):
     30        (EWK2UnitTest::timeOutWhileWaitingUntilLoadFinished):
     31        (EWK2UnitTest::EWK2UnitTestBase::waitUntilLoadFinished):
     32        (EWK2UnitTest::onTitleChanged):
     33        (EWK2UnitTest::timeOutWhileWaitingUntilTitleChangedTo):
     34        (EWK2UnitTest::EWK2UnitTestBase::waitUntilTitleChangedTo):
     35        (EWK2UnitTest::onURIChanged):
     36        (EWK2UnitTest::timeOutWhileWaitingUntilURIChangedTo):
     37        (EWK2UnitTest::EWK2UnitTestBase::waitUntilURIChangedTo): Add convenience function to test
     38        framework in order to wait until the view URI changes to a given value.
     39        * UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.h:
     40        (EWK2UnitTestBase):
     41        * UIProcess/API/efl/tests/resources/same_page_navigation.html: Added.
     42        * UIProcess/API/efl/tests/test_ewk2_view.cpp:
     43        (TEST_F): Add corresponding unit test to verify fix and prevent regressions
     44        in the future.
     45
    1462012-09-19  Dan Bernstein  <mitz@apple.com>
    247
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_loader_client.cpp

    r129096 r129099  
    134134}
    135135
     136static void didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType, WKTypeRef, const void* clientInfo)
     137{
     138    if (!WKFrameIsMainFrame(frame))
     139        return;
     140
     141    Evas_Object* ewkView = static_cast<Evas_Object*>(const_cast<void*>(clientInfo));
     142    ewk_view_uri_update(ewkView);
     143}
     144
    136145void ewk_view_loader_client_attach(WKPageRef pageRef, Evas_Object* ewkView)
    137146{
     
    156165    loadClient.didFailProvisionalLoadWithErrorForFrame = didFailProvisionalLoadWithErrorForFrame;
    157166    loadClient.didChangeBackForwardList = didChangeBackForwardList;
     167    loadClient.didSameDocumentNavigationForFrame = didSameDocumentNavigationForFrame;
    158168    WKPageSetPageLoaderClient(pageRef, &loadClient);
    159169}
  • trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h

    r128967 r129099  
    8383void ewk_view_resource_request_sent(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Request* request, Ewk_Url_Response* redirectResponse);
    8484void ewk_view_text_found(Evas_Object* ewkView, unsigned int matchCount);
     85void ewk_view_uri_update(Evas_Object* ewkView);
    8586void ewk_view_contents_size_changed(const Evas_Object* ewkView, const WebCore::IntSize&);
    8687
  • trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp

    r128975 r129099  
    8181}
    8282
    83 struct LoadFinishedData {
    84     LoadFinishedData(double timeoutSeconds, Ecore_Task_Cb callback)
    85         : loadFinished(false)
    86         , timer(0)
    87         , didTimeOut(false)
    88     {
    89         if (timeoutSeconds >= 0)
    90             timer = ecore_timer_add(timeoutSeconds, callback, this);
    91     }
    92 
    93     ~LoadFinishedData()
    94     {
    95         if (timer)
    96             ecore_timer_del(timer);
    97     }
    98 
    99     bool loadFinished;
    100     Ecore_Timer* timer;
    101     bool didTimeOut;
     83class CallbackDataTimer {
     84public:
     85    CallbackDataTimer(double timeoutSeconds, Ecore_Task_Cb callback)
     86        : m_done(false)
     87        , m_timer(timeoutSeconds >= 0 ? ecore_timer_add(timeoutSeconds, callback, this) : 0)
     88        , m_didTimeOut(false)
     89    {
     90    }
     91
     92    virtual ~CallbackDataTimer()
     93    {
     94        if (m_timer)
     95            ecore_timer_del(m_timer);
     96    }
     97
     98    bool isDone() const { return m_done; }
     99
     100    bool setDone()
     101    {
     102        if (m_timer) {
     103            ecore_timer_del(m_timer);
     104            m_timer = 0;
     105        }
     106        m_done = true;
     107    }
     108
     109    bool didTimeOut() const { return m_didTimeOut; }
     110
     111    void setTimedOut()
     112    {
     113        m_done = true;
     114        m_timer = 0;
     115        m_didTimeOut = true;
     116    }
     117
     118protected:
     119    bool m_done;
     120    Ecore_Timer* m_timer;
     121    bool m_didTimeOut;
     122};
     123
     124template <class T>
     125class CallbackDataExpectedValue : public CallbackDataTimer {
     126public:
     127    CallbackDataExpectedValue(const T& expectedValue, double timeoutSeconds, Ecore_Task_Cb callback)
     128        : CallbackDataTimer(timeoutSeconds, callback)
     129        , m_expectedValue(expectedValue)
     130    {
     131    }
     132
     133    const T& expectedValue() const { return m_expectedValue; }
     134
     135private:
     136    T m_expectedValue;
    102137};
    103138
     
    107142    UNUSED_PARAM(eventInfo);
    108143
    109     LoadFinishedData* data = static_cast<LoadFinishedData*>(userData);
    110     data->loadFinished = true;
    111 
    112     if (data->timer) {
    113         ecore_timer_del(data->timer);
    114         data->timer = 0;
    115     }
     144    CallbackDataTimer* data = static_cast<CallbackDataTimer*>(userData);
     145    data->setDone();
    116146}
    117147
    118148static bool timeOutWhileWaitingUntilLoadFinished(void* userData)
    119149{
    120     LoadFinishedData* data = static_cast<LoadFinishedData*>(userData);
    121 
    122     data->timer = 0;
    123 
    124     if (data->loadFinished)
    125         return ECORE_CALLBACK_CANCEL;
    126 
    127     data->loadFinished = true;
    128     data->didTimeOut = true;
     150    CallbackDataTimer* data = static_cast<CallbackDataTimer*>(userData);
     151    data->setTimedOut();
    129152
    130153    return ECORE_CALLBACK_CANCEL;
     
    133156bool EWK2UnitTestBase::waitUntilLoadFinished(double timeoutSeconds)
    134157{
    135     LoadFinishedData data(timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilLoadFinished));
     158    CallbackDataTimer data(timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilLoadFinished));
    136159
    137160    evas_object_smart_callback_add(m_webView, "load,finished", onLoadFinished, &data);
    138161
    139     while (!data.loadFinished)
     162    while (!data.isDone())
    140163        ecore_main_loop_iterate();
    141164
    142165    evas_object_smart_callback_del(m_webView, "load,finished", onLoadFinished);
    143166
    144     return !data.didTimeOut;
    145 }
    146 
    147 struct TitleChangedData {
    148     TitleChangedData(const char* title, double timeoutSeconds, Ecore_Task_Cb callback)
    149         : expectedTitle(title)
    150         , done(false)
    151         , timer(0)
    152         , didTimeOut(false)
    153     {
    154         if (timeoutSeconds >= 0)
    155             timer = ecore_timer_add(timeoutSeconds, callback, this);
    156     }
    157 
    158     ~TitleChangedData()
    159     {
    160         if (timer)
    161             ecore_timer_del(timer);
    162     }
    163 
    164     CString expectedTitle;
    165     bool done;
    166     Ecore_Timer* timer;
    167     bool didTimeOut;
    168 };
    169 
    170 static void onTitleChanged(void* userData, Evas_Object* webView, void* eventInfo)
    171 {
    172     TitleChangedData* data = static_cast<TitleChangedData*>(userData);
    173 
    174     if (strcmp(ewk_view_title_get(webView), data->expectedTitle.data()))
     167    return !data.didTimeOut();
     168}
     169
     170static void onTitleChanged(void* userData, Evas_Object* webView, void*)
     171{
     172    CallbackDataExpectedValue<CString>* data = static_cast<CallbackDataExpectedValue<CString>*>(userData);
     173
     174    if (strcmp(ewk_view_title_get(webView), data->expectedValue().data()))
    175175        return;
    176176
    177     if (data->timer) {
    178         ecore_timer_del(data->timer);
    179         data->timer = 0;
    180     }
    181 
    182     data->done = true;
     177    data->setDone();
    183178}
    184179
    185180static bool timeOutWhileWaitingUntilTitleChangedTo(void* userData)
    186181{
    187     TitleChangedData* data = static_cast<TitleChangedData*>(userData);
    188 
    189     data->timer = 0;
    190 
    191     if (data->done)
    192         return ECORE_CALLBACK_CANCEL;
    193 
    194     data->done = true;
    195     data->didTimeOut = true;
     182    CallbackDataExpectedValue<CString>* data = static_cast<CallbackDataExpectedValue<CString>*>(userData);
     183    data->setTimedOut();
    196184
    197185    return ECORE_CALLBACK_CANCEL;
     
    200188bool EWK2UnitTestBase::waitUntilTitleChangedTo(const char* expectedTitle, double timeoutSeconds)
    201189{
    202     TitleChangedData data(expectedTitle, timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilTitleChangedTo));
     190    CallbackDataExpectedValue<CString> data(expectedTitle, timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilTitleChangedTo));
    203191
    204192    evas_object_smart_callback_add(m_webView, "title,changed", onTitleChanged, &data);
    205193
    206     while (!data.done)
     194    while (!data.isDone())
    207195        ecore_main_loop_iterate();
    208196
    209197    evas_object_smart_callback_del(m_webView, "title,changed", onTitleChanged);
    210198
    211     return !data.didTimeOut;
     199    return !data.didTimeOut();
     200}
     201
     202static void onURIChanged(void* userData, Evas_Object* webView, void*)
     203{
     204    CallbackDataExpectedValue<CString>* data = static_cast<CallbackDataExpectedValue<CString>*>(userData);
     205
     206    if (strcmp(ewk_view_uri_get(webView), data->expectedValue().data()))
     207        return;
     208
     209    data->setDone();
     210}
     211
     212static bool timeOutWhileWaitingUntilURIChangedTo(void* userData)
     213{
     214    CallbackDataExpectedValue<CString>* data = static_cast<CallbackDataExpectedValue<CString>*>(userData);
     215    data->setTimedOut();
     216
     217    return ECORE_CALLBACK_CANCEL;
     218}
     219
     220bool EWK2UnitTestBase::waitUntilURIChangedTo(const char* expectedURI, double timeoutSeconds)
     221{
     222    CallbackDataExpectedValue<CString> data(expectedURI, timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilURIChangedTo));
     223
     224    evas_object_smart_callback_add(m_webView, "uri,changed", onURIChanged, &data);
     225
     226    while (!data.isDone())
     227        ecore_main_loop_iterate();
     228
     229    evas_object_smart_callback_del(m_webView, "uri,changed", onURIChanged);
     230
     231    return !data.didTimeOut();
    212232}
    213233
  • trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.h

    r128975 r129099  
    4444    bool waitUntilLoadFinished(double timeoutSeconds = -1);
    4545    bool waitUntilTitleChangedTo(const char* expectedTitle, double timeoutSeconds = -1);
     46    bool waitUntilURIChangedTo(const char* expectedURI, double timeoutSeconds = -1);
    4647    void mouseClick(int x, int y);
    4748
  • trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp

    r128967 r129099  
    3131#include <wtf/UnusedParam.h>
    3232#include <wtf/text/CString.h>
     33#include <wtf/text/WTFString.h>
    3334
    3435using namespace EWK2UnitTest;
     
    362363}
    363364
     365TEST_F(EWK2UnitTestBase, ewk_view_same_page_navigation)
     366{
     367    // Tests that same page navigation updates the page URI.
     368    String testUrl = environment->urlForResource("same_page_navigation.html").data();
     369    loadUrlSync(testUrl.utf8().data());
     370    ASSERT_STREQ(testUrl.utf8().data(), ewk_view_uri_get(webView()));
     371    mouseClick(50, 50);
     372    testUrl = testUrl + '#';
     373    ASSERT_TRUE(waitUntilURIChangedTo(testUrl.utf8().data(), 10));
     374}
     375
    364376TEST_F(EWK2UnitTestBase, ewk_view_title_changed)
    365377{
Note: See TracChangeset for help on using the changeset viewer.