Title: [129099] trunk/Source/WebKit2
Revision
129099
Author
[email protected]
Date
2012-09-20 00:16:09 -0700 (Thu, 20 Sep 2012)

Log Message

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

Patch by Christophe Dumez <[email protected]> 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.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (129098 => 129099)


--- trunk/Source/WebKit2/ChangeLog	2012-09-20 06:56:08 UTC (rev 129098)
+++ trunk/Source/WebKit2/ChangeLog	2012-09-20 07:16:09 UTC (rev 129099)
@@ -1,3 +1,48 @@
+2012-09-20  Christophe Dumez  <[email protected]>
+
+        [EFL][WK2] Same page navigation does not update view URI
+        https://bugs.webkit.org/show_bug.cgi?id=97094
+
+        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.
+
 2012-09-19  Dan Bernstein  <[email protected]>
 
         WebKit2 part of adding a setting and API for disabling screen font substitution

Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_loader_client.cpp (129098 => 129099)


--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_loader_client.cpp	2012-09-20 06:56:08 UTC (rev 129098)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_loader_client.cpp	2012-09-20 07:16:09 UTC (rev 129099)
@@ -133,6 +133,15 @@
     ewk_back_forward_list_changed(ewk_view_back_forward_list_get(ewkView), addedItem, removedItems);
 }
 
+static void didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType, WKTypeRef, const void* clientInfo)
+{
+    if (!WKFrameIsMainFrame(frame))
+        return;
+
+    Evas_Object* ewkView = static_cast<Evas_Object*>(const_cast<void*>(clientInfo));
+    ewk_view_uri_update(ewkView);
+}
+
 void ewk_view_loader_client_attach(WKPageRef pageRef, Evas_Object* ewkView)
 {
     WKPageLoaderClient loadClient;
@@ -155,5 +164,6 @@
     loadClient.didReceiveServerRedirectForProvisionalLoadForFrame = didReceiveServerRedirectForProvisionalLoadForFrame;
     loadClient.didFailProvisionalLoadWithErrorForFrame = didFailProvisionalLoadWithErrorForFrame;
     loadClient.didChangeBackForwardList = didChangeBackForwardList;
+    loadClient.didSameDocumentNavigationForFrame = didSameDocumentNavigationForFrame;
     WKPageSetPageLoaderClient(pageRef, &loadClient);
 }

Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h (129098 => 129099)


--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h	2012-09-20 06:56:08 UTC (rev 129098)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h	2012-09-20 07:16:09 UTC (rev 129099)
@@ -82,6 +82,7 @@
 void ewk_view_resource_load_response(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Response* response);
 void ewk_view_resource_request_sent(Evas_Object* ewkView, uint64_t resourceIdentifier, Ewk_Url_Request* request, Ewk_Url_Response* redirectResponse);
 void ewk_view_text_found(Evas_Object* ewkView, unsigned int matchCount);
+void ewk_view_uri_update(Evas_Object* ewkView);
 void ewk_view_contents_size_changed(const Evas_Object* ewkView, const WebCore::IntSize&);
 
 Evas_Object* ewk_view_base_add(Evas* canvas, WKContextRef, WKPageGroupRef);

Modified: trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp (129098 => 129099)


--- trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp	2012-09-20 06:56:08 UTC (rev 129098)
+++ trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp	2012-09-20 07:16:09 UTC (rev 129099)
@@ -80,135 +80,155 @@
     waitUntilLoadFinished();
 }
 
-struct LoadFinishedData {
-    LoadFinishedData(double timeoutSeconds, Ecore_Task_Cb callback)
-        : loadFinished(false)
-        , timer(0)
-        , didTimeOut(false)
+class CallbackDataTimer {
+public:
+    CallbackDataTimer(double timeoutSeconds, Ecore_Task_Cb callback)
+        : m_done(false)
+        , m_timer(timeoutSeconds >= 0 ? ecore_timer_add(timeoutSeconds, callback, this) : 0)
+        , m_didTimeOut(false)
     {
-        if (timeoutSeconds >= 0)
-            timer = ecore_timer_add(timeoutSeconds, callback, this);
     }
 
-    ~LoadFinishedData()
+    virtual ~CallbackDataTimer()
     {
-        if (timer)
-            ecore_timer_del(timer);
+        if (m_timer)
+            ecore_timer_del(m_timer);
     }
 
-    bool loadFinished;
-    Ecore_Timer* timer;
-    bool didTimeOut;
+    bool isDone() const { return m_done; }
+
+    bool setDone()
+    {
+        if (m_timer) {
+            ecore_timer_del(m_timer);
+            m_timer = 0;
+        }
+        m_done = true;
+    }
+
+    bool didTimeOut() const { return m_didTimeOut; }
+
+    void setTimedOut()
+    {
+        m_done = true;
+        m_timer = 0;
+        m_didTimeOut = true;
+    }
+
+protected:
+    bool m_done;
+    Ecore_Timer* m_timer;
+    bool m_didTimeOut;
 };
 
+template <class T>
+class CallbackDataExpectedValue : public CallbackDataTimer {
+public:
+    CallbackDataExpectedValue(const T& expectedValue, double timeoutSeconds, Ecore_Task_Cb callback)
+        : CallbackDataTimer(timeoutSeconds, callback)
+        , m_expectedValue(expectedValue)
+    {
+    }
+
+    const T& expectedValue() const { return m_expectedValue; }
+
+private:
+    T m_expectedValue;
+};
+
 static void onLoadFinished(void* userData, Evas_Object* webView, void* eventInfo)
 {
     UNUSED_PARAM(webView);
     UNUSED_PARAM(eventInfo);
 
-    LoadFinishedData* data = ""
-    data->loadFinished = true;
-
-    if (data->timer) {
-        ecore_timer_del(data->timer);
-        data->timer = 0;
-    }
+    CallbackDataTimer* data = ""
+    data->setDone();
 }
 
 static bool timeOutWhileWaitingUntilLoadFinished(void* userData)
 {
-    LoadFinishedData* data = ""
+    CallbackDataTimer* data = ""
+    data->setTimedOut();
 
-    data->timer = 0;
-
-    if (data->loadFinished)
-        return ECORE_CALLBACK_CANCEL;
-
-    data->loadFinished = true;
-    data->didTimeOut = true;
-
     return ECORE_CALLBACK_CANCEL;
 }
 
 bool EWK2UnitTestBase::waitUntilLoadFinished(double timeoutSeconds)
 {
-    LoadFinishedData data(timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilLoadFinished));
+    CallbackDataTimer data(timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilLoadFinished));
 
     evas_object_smart_callback_add(m_webView, "load,finished", onLoadFinished, &data);
 
-    while (!data.loadFinished)
+    while (!data.isDone())
         ecore_main_loop_iterate();
 
     evas_object_smart_callback_del(m_webView, "load,finished", onLoadFinished);
 
-    return !data.didTimeOut;
+    return !data.didTimeOut();
 }
 
-struct TitleChangedData {
-    TitleChangedData(const char* title, double timeoutSeconds, Ecore_Task_Cb callback)
-        : expectedTitle(title)
-        , done(false)
-        , timer(0)
-        , didTimeOut(false)
-    {
-        if (timeoutSeconds >= 0)
-            timer = ecore_timer_add(timeoutSeconds, callback, this);
-    }
+static void onTitleChanged(void* userData, Evas_Object* webView, void*)
+{
+    CallbackDataExpectedValue<CString>* data = ""
 
-    ~TitleChangedData()
-    {
-        if (timer)
-            ecore_timer_del(timer);
-    }
+    if (strcmp(ewk_view_title_get(webView), data->expectedValue().data()))
+        return;
 
-    CString expectedTitle;
-    bool done;
-    Ecore_Timer* timer;
-    bool didTimeOut;
-};
+    data->setDone();
+}
 
-static void onTitleChanged(void* userData, Evas_Object* webView, void* eventInfo)
+static bool timeOutWhileWaitingUntilTitleChangedTo(void* userData)
 {
-    TitleChangedData* data = ""
+    CallbackDataExpectedValue<CString>* data = ""
+    data->setTimedOut();
 
-    if (strcmp(ewk_view_title_get(webView), data->expectedTitle.data()))
-        return;
+    return ECORE_CALLBACK_CANCEL;
+}
 
-    if (data->timer) {
-        ecore_timer_del(data->timer);
-        data->timer = 0;
-    }
+bool EWK2UnitTestBase::waitUntilTitleChangedTo(const char* expectedTitle, double timeoutSeconds)
+{
+    CallbackDataExpectedValue<CString> data(expectedTitle, timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilTitleChangedTo));
 
-    data->done = true;
+    evas_object_smart_callback_add(m_webView, "title,changed", onTitleChanged, &data);
+
+    while (!data.isDone())
+        ecore_main_loop_iterate();
+
+    evas_object_smart_callback_del(m_webView, "title,changed", onTitleChanged);
+
+    return !data.didTimeOut();
 }
 
-static bool timeOutWhileWaitingUntilTitleChangedTo(void* userData)
+static void onURIChanged(void* userData, Evas_Object* webView, void*)
 {
-    TitleChangedData* data = ""
+    CallbackDataExpectedValue<CString>* data = ""
 
-    data->timer = 0;
+    if (strcmp(ewk_view_uri_get(webView), data->expectedValue().data()))
+        return;
 
-    if (data->done)
-        return ECORE_CALLBACK_CANCEL;
+    data->setDone();
+}
 
-    data->done = true;
-    data->didTimeOut = true;
+static bool timeOutWhileWaitingUntilURIChangedTo(void* userData)
+{
+    CallbackDataExpectedValue<CString>* data = ""
+    data->setTimedOut();
 
     return ECORE_CALLBACK_CANCEL;
 }
 
-bool EWK2UnitTestBase::waitUntilTitleChangedTo(const char* expectedTitle, double timeoutSeconds)
+bool EWK2UnitTestBase::waitUntilURIChangedTo(const char* expectedURI, double timeoutSeconds)
 {
-    TitleChangedData data(expectedTitle, timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilTitleChangedTo));
+    CallbackDataExpectedValue<CString> data(expectedURI, timeoutSeconds, reinterpret_cast<Ecore_Task_Cb>(timeOutWhileWaitingUntilURIChangedTo));
 
-    evas_object_smart_callback_add(m_webView, "title,changed", onTitleChanged, &data);
+    evas_object_smart_callback_add(m_webView, "uri,changed", onURIChanged, &data);
 
-    while (!data.done)
+    while (!data.isDone())
         ecore_main_loop_iterate();
 
-    evas_object_smart_callback_del(m_webView, "title,changed", onTitleChanged);
+    evas_object_smart_callback_del(m_webView, "uri,changed", onURIChanged);
 
-    return !data.didTimeOut;
+    return !data.didTimeOut();
 }
 
 void EWK2UnitTestBase::mouseClick(int x, int y)

Modified: trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.h (129098 => 129099)


--- trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.h	2012-09-20 06:56:08 UTC (rev 129098)
+++ trunk/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.h	2012-09-20 07:16:09 UTC (rev 129099)
@@ -43,6 +43,7 @@
     void loadUrlSync(const char* url);
     bool waitUntilLoadFinished(double timeoutSeconds = -1);
     bool waitUntilTitleChangedTo(const char* expectedTitle, double timeoutSeconds = -1);
+    bool waitUntilURIChangedTo(const char* expectedURI, double timeoutSeconds = -1);
     void mouseClick(int x, int y);
 
 private:

Added: trunk/Source/WebKit2/UIProcess/API/efl/tests/resources/same_page_navigation.html (0 => 129099)


--- trunk/Source/WebKit2/UIProcess/API/efl/tests/resources/same_page_navigation.html	                        (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/efl/tests/resources/same_page_navigation.html	2012-09-20 07:16:09 UTC (rev 129099)
@@ -0,0 +1,5 @@
+<html>
+<body>
+<a id="myLink" href="" style="position: absolute; top: 0; left: 0; width: 100px; height: 100px;"></div></a>
+</body>
+</html>

Modified: trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp (129098 => 129099)


--- trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp	2012-09-20 06:56:08 UTC (rev 129098)
+++ trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp	2012-09-20 07:16:09 UTC (rev 129099)
@@ -30,6 +30,7 @@
 #include <wtf/PassOwnPtr.h>
 #include <wtf/UnusedParam.h>
 #include <wtf/text/CString.h>
+#include <wtf/text/WTFString.h>
 
 using namespace EWK2UnitTest;
 
@@ -361,6 +362,17 @@
     checkFullScreenProperty(webView(), false);
 }
 
+TEST_F(EWK2UnitTestBase, ewk_view_same_page_navigation)
+{
+    // Tests that same page navigation updates the page URI.
+    String testUrl = environment->urlForResource("same_page_navigation.html").data();
+    loadUrlSync(testUrl.utf8().data());
+    ASSERT_STREQ(testUrl.utf8().data(), ewk_view_uri_get(webView()));
+    mouseClick(50, 50);
+    testUrl = testUrl + '#';
+    ASSERT_TRUE(waitUntilURIChangedTo(testUrl.utf8().data(), 10));
+}
+
 TEST_F(EWK2UnitTestBase, ewk_view_title_changed)
 {
     const char* titleChangedHTML =
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to