Modified: trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_context.cpp (125892 => 125893)
--- trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_context.cpp 2012-08-17 13:48:19 UTC (rev 125892)
+++ trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_context.cpp 2012-08-17 14:04:09 UTC (rev 125893)
@@ -28,6 +28,7 @@
#include "UnitTestUtils/EWK2UnitTestBase.h"
#include "UnitTestUtils/EWK2UnitTestEnvironment.h"
#include <EWebKit2.h>
+#include <Ecore.h>
#include <gtest/gtest.h>
using namespace EWK2UnitTest;
@@ -67,3 +68,83 @@
loadUrlSync("fooscheme:MyPath");
ASSERT_STREQ(ewk_view_title_get(webView()), "Foo");
}
+
+struct VibrationCbData {
+ bool didReceiveVibrateCallback; // Whether the vibration event received.
+ bool didReceiveCancelVibrationCallback; // Whether the cancel vibration event received.
+ unsigned vibrateCalledCount; // Vibrate callbacks count.
+ uint64_t expectedVibrationTime; // Expected vibration time.
+};
+
+static void vibrateCallback(uint64_t vibrationTime, void* userData)
+{
+ VibrationCbData* data = ""
+ if (vibrationTime == data->expectedVibrationTime)
+ data->didReceiveVibrateCallback = true;
+ data->vibrateCalledCount++;
+}
+
+static void cancelVibrationCallback(void* userData)
+{
+ VibrationCbData* data = ""
+ data->didReceiveCancelVibrationCallback = true;
+}
+
+static void loadVibrationHTMLString(Evas_Object* webView, const char* vibrationPattern, bool waitForVibrationEvent, VibrationCbData* data)
+{
+ const char* content =
+ "<html><head><script type='text/_javascript_'>function vibrate() { navigator.vibrate(%s);"
+ " document.title = \"Loaded\"; }</script></head><body _onload_='vibrate()'></body></html>";
+
+ data->didReceiveVibrateCallback = false;
+ data->didReceiveCancelVibrationCallback = false;
+ data->vibrateCalledCount = 0;
+ Eina_Strbuf* buffer = eina_strbuf_new();
+ eina_strbuf_append_printf(buffer, content, vibrationPattern);
+ ewk_view_html_string_load(webView, eina_strbuf_string_get(buffer), 0, 0);
+ eina_strbuf_free(buffer);
+
+ if (!waitForVibrationEvent)
+ return;
+
+ while (!data->didReceiveVibrateCallback && !data->didReceiveCancelVibrationCallback)
+ ecore_main_loop_iterate();
+}
+
+TEST_F(EWK2UnitTestBase, ewk_context_vibration_client_callbacks_set)
+{
+ VibrationCbData data = { false, false, 0, 5000 };
+ ewk_context_vibration_client_callbacks_set(ewk_context_default_get(), vibrateCallback, cancelVibrationCallback, &data);
+
+ // Vibrate for 5 seconds.
+ loadVibrationHTMLString(webView(), "5000", true, &data);
+ ASSERT_TRUE(data.didReceiveVibrateCallback);
+
+ // Cancel any existing vibrations.
+ loadVibrationHTMLString(webView(), "0", true, &data);
+ ASSERT_TRUE(data.didReceiveCancelVibrationCallback);
+
+ // This case the pattern will cause the device to vibrate for 200 ms, be still for 100 ms, and then vibrate for 5000 ms.
+ loadVibrationHTMLString(webView(), "[200, 100, 5000]", true, &data);
+ ASSERT_EQ(data.vibrateCalledCount, 2);
+ ASSERT_TRUE(data.didReceiveVibrateCallback);
+
+ // Cancel outstanding vibration pattern.
+ loadVibrationHTMLString(webView(), "[0]", true, &data);
+ ASSERT_TRUE(data.didReceiveCancelVibrationCallback);
+
+ // Stop listening for vibration events, by calling the function with null for the callbacks.
+ ewk_context_vibration_client_callbacks_set(ewk_context_default_get(), 0, 0, &data);
+
+ // Make sure we don't receive vibration event.
+ loadVibrationHTMLString(webView(), "[5000]", false, &data);
+ waitUntilTitleChangedTo("Loaded");
+ ASSERT_STREQ(ewk_view_title_get(webView()), "Loaded");
+ ASSERT_FALSE(data.didReceiveVibrateCallback);
+
+ // Make sure we don't receive cancel vibration event.
+ loadVibrationHTMLString(webView(), "0", false, &data);
+ waitUntilTitleChangedTo("Loaded");
+ ASSERT_STREQ(ewk_view_title_get(webView()), "Loaded");
+ ASSERT_FALSE(data.didReceiveCancelVibrationCallback);
+}