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/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 =