Diff
Modified: trunk/Source/WebKit2/ChangeLog (128966 => 128967)
--- trunk/Source/WebKit2/ChangeLog 2012-09-19 05:41:20 UTC (rev 128966)
+++ trunk/Source/WebKit2/ChangeLog 2012-09-19 05:57:40 UTC (rev 128967)
@@ -1,3 +1,30 @@
+2012-09-18 Byungwoo Lee <[email protected]>
+
+ [EFL][WK2] Add _javascript_ popup API.
+ https://bugs.webkit.org/show_bug.cgi?id=95672
+
+ Reviewed by Gyuyoung Kim.
+
+ Add smart class member function for _javascript_ alert(), confirm() and prompt().
+
+ * UIProcess/API/efl/ewk_view.cpp:
+ (ewk_view_run_javascript_alert):
+ (ewk_view_run_javascript_confirm):
+ (ewk_view_run_javascript_prompt):
+ * UIProcess/API/efl/ewk_view.h:
+ * UIProcess/API/efl/ewk_view_private.h:
+ * UIProcess/API/efl/ewk_view_ui_client.cpp:
+ (runJavaScriptAlert):
+ (runJavaScriptConfirm):
+ (runJavaScriptPrompt):
+ (ewk_view_ui_client_attach):
+ * UIProcess/API/efl/tests/test_ewk2_view.cpp:
+ Added unit test for _javascript_ popup smart class member function.
+ (checkAlert):
+ (TEST_F):
+ (checkConfirm):
+ (checkPrompt):
+
2012-09-18 Sailesh Agrawal <[email protected]>
Chromium: Scrollbar with tickmarks doesn't respond to clicks
Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp (128966 => 128967)
--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp 2012-09-19 05:41:20 UTC (rev 128966)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp 2012-09-19 05:57:40 UTC (rev 128967)
@@ -1649,3 +1649,48 @@
ewk_view_html_string_load(ewkView, "The web process has crashed.", 0, url.data());
}
}
+
+/**
+ * @internal
+ * Calls a smart member function for _javascript_ alert().
+ */
+void ewk_view_run_javascript_alert(Evas_Object* ewkView, const WKEinaSharedString& message)
+{
+ EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData);
+ EINA_SAFETY_ON_NULL_RETURN(smartData->api);
+
+ if (!smartData->api->run_javascript_alert)
+ return;
+
+ smartData->api->run_javascript_alert(smartData, message);
+}
+
+/**
+ * @internal
+ * Calls a smart member function for _javascript_ confirm() and returns a value from the function. Returns false by default.
+ */
+bool ewk_view_run_javascript_confirm(Evas_Object* ewkView, const WKEinaSharedString& message)
+{
+ EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(smartData->api, false);
+
+ if (!smartData->api->run_javascript_confirm)
+ return false;
+
+ return smartData->api->run_javascript_confirm(smartData, message);
+}
+
+/**
+ * @internal
+ * Calls a smart member function for _javascript_ prompt() and returns a value from the function. Returns null string by default.
+ */
+WKEinaSharedString ewk_view_run_javascript_prompt(Evas_Object* ewkView, const WKEinaSharedString& message, const WKEinaSharedString& defaultValue)
+{
+ EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, WKEinaSharedString());
+ EINA_SAFETY_ON_NULL_RETURN_VAL(smartData->api, WKEinaSharedString());
+
+ if (!smartData->api->run_javascript_prompt)
+ return WKEinaSharedString();
+
+ return WKEinaSharedString::adopt(smartData->api->run_javascript_prompt(smartData, message, defaultValue));
+}
Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.h (128966 => 128967)
--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.h 2012-09-19 05:41:20 UTC (rev 128966)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_view.h 2012-09-19 05:57:40 UTC (rev 128967)
@@ -115,13 +115,19 @@
Eina_Bool (*mouse_move)(Ewk_View_Smart_Data *sd, const Evas_Event_Mouse_Move *ev);
Eina_Bool (*key_down)(Ewk_View_Smart_Data *sd, const Evas_Event_Key_Down *ev);
Eina_Bool (*key_up)(Ewk_View_Smart_Data *sd, const Evas_Event_Key_Up *ev);
+
+ // _javascript_ popup:
+ // - All strings should be guaranteed to be stringshared.
+ void (*run_javascript_alert)(Ewk_View_Smart_Data *sd, const char *message);
+ Eina_Bool (*run_javascript_confirm)(Ewk_View_Smart_Data *sd, const char *message);
+ const char *(*run_javascript_prompt)(Ewk_View_Smart_Data *sd, const char *message, const char *default_value); /**< return string should be stringshared. */
};
/**
* The version you have to put into the version field
* in the @a Ewk_View_Smart_Class structure.
*/
-#define EWK_VIEW_SMART_CLASS_VERSION 3UL
+#define EWK_VIEW_SMART_CLASS_VERSION 4UL
/**
* Initializer for whole Ewk_View_Smart_Class structure.
@@ -133,7 +139,7 @@
* @see EWK_VIEW_SMART_CLASS_INIT_VERSION
* @see EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION
*/
-#define EWK_VIEW_SMART_CLASS_INIT(smart_class_init) {smart_class_init, EWK_VIEW_SMART_CLASS_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+#define EWK_VIEW_SMART_CLASS_INIT(smart_class_init) {smart_class_init, EWK_VIEW_SMART_CLASS_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
/**
* Initializer to zero a whole Ewk_View_Smart_Class structure.
Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h (128966 => 128967)
--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h 2012-09-19 05:41:20 UTC (rev 128966)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_private.h 2012-09-19 05:57:40 UTC (rev 128967)
@@ -23,6 +23,7 @@
#include "WebPageProxy.h"
#include <Evas.h>
+#include <WKEinaSharedString.h>
#include <WebCore/TextDirection.h>
#include <WebKit2/WKBase.h>
#include <wtf/Vector.h>
@@ -103,4 +104,8 @@
void ewk_view_popup_menu_request(Evas_Object* ewkView, WebKit::WebPopupMenuProxyEfl* popupMenu, const WebCore::IntRect&, WebCore::TextDirection, double pageScaleFactor, const Vector<WebKit::WebPopupItem>& items, int32_t selectedIndex);
void ewk_view_webprocess_crashed(Evas_Object* ewkView);
+void ewk_view_run_javascript_alert(Evas_Object* ewkView, const WKEinaSharedString& message);
+bool ewk_view_run_javascript_confirm(Evas_Object* ewkView, const WKEinaSharedString& message);
+WKEinaSharedString ewk_view_run_javascript_prompt(Evas_Object* ewkView, const WKEinaSharedString& message, const WKEinaSharedString& defaultValue);
+
#endif // ewk_view_private_h
Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_ui_client.cpp (128966 => 128967)
--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_ui_client.cpp 2012-09-19 05:41:20 UTC (rev 128966)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_view_ui_client.cpp 2012-09-19 05:57:40 UTC (rev 128967)
@@ -25,6 +25,7 @@
#include "config.h"
+#include "WKString.h"
#include "ewk_view_private.h"
#include "ewk_view_ui_client_private.h"
@@ -43,6 +44,22 @@
return ewk_view_page_create(toEwkView(clientInfo));
}
+static void runJavaScriptAlert(WKPageRef, WKStringRef alertText, WKFrameRef, const void* clientInfo)
+{
+ ewk_view_run_javascript_alert(toEwkView(clientInfo), WKEinaSharedString(alertText));
+}
+
+static bool runJavaScriptConfirm(WKPageRef, WKStringRef message, WKFrameRef, const void* clientInfo)
+{
+ return ewk_view_run_javascript_confirm(toEwkView(clientInfo), WKEinaSharedString(message));
+}
+
+static WKStringRef runJavaScriptPrompt(WKPageRef, WKStringRef message, WKStringRef defaultValue, WKFrameRef, const void* clientInfo)
+{
+ WKEinaSharedString value = ewk_view_run_javascript_prompt(toEwkView(clientInfo), WKEinaSharedString(message), WKEinaSharedString(defaultValue));
+ return value ? WKStringCreateWithUTF8CString(value) : 0;
+}
+
void ewk_view_ui_client_attach(WKPageRef pageRef, Evas_Object* ewkView)
{
WKPageUIClient uiClient;
@@ -51,5 +68,8 @@
uiClient.clientInfo = ewkView;
uiClient.close = closePage;
uiClient.createNewPage = createNewPage;
+ uiClient.runJavaScriptAlert = runJavaScriptAlert;
+ uiClient.runJavaScriptConfirm = runJavaScriptConfirm;
+ uiClient.runJavaScriptPrompt = runJavaScriptPrompt;
WKPageSetPageUIClient(pageRef, &uiClient);
}
Modified: trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp (128966 => 128967)
--- trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp 2012-09-19 05:41:20 UTC (rev 128966)
+++ trunk/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_view.cpp 2012-09-19 05:57:40 UTC (rev 128967)
@@ -384,3 +384,231 @@
waitUntilTitleChangedTo("");
EXPECT_STREQ(ewk_view_title_get(webView()), "");
}
+
+static struct {
+ const char* expectedMessage;
+ bool called;
+} alertCallbackData;
+
+static struct {
+ const char* expectedMessage;
+ bool result;
+ bool called;
+} confirmCallbackData;
+
+static struct {
+ const char* expectedMessage;
+ const char* expectedDefaultValue;
+ const char* result;
+ bool called;
+} promptCallbackData;
+
+static void checkAlert(Ewk_View_Smart_Data*, const char* message)
+{
+ alertCallbackData.called = true;
+ EXPECT_STREQ(message, alertCallbackData.expectedMessage);
+}
+
+TEST_F(EWK2UnitTestBase, ewk_view_run_javascript_alert)
+{
+ ewkViewClass()->run_javascript_alert = checkAlert;
+
+ const char* alertHTML = "<!doctype html><body _onload_=\"alert('Alert message');\"></body>";
+ alertCallbackData.expectedMessage = "Alert message";
+ alertCallbackData.called = false;
+ ewk_view_html_string_load(webView(), alertHTML, 0, 0);
+ waitUntilLoadFinished();
+ EXPECT_EQ(alertCallbackData.called, true);
+
+ alertHTML = "<!doctype html><body _onload_=\"alert('');\"></body>";
+ alertCallbackData.expectedMessage = "";
+ alertCallbackData.called = false;
+ ewk_view_html_string_load(webView(), alertHTML, 0, 0);
+ waitUntilLoadFinished();
+ EXPECT_EQ(alertCallbackData.called, true);
+
+ alertHTML = "<!doctype html><body _onload_=\"alert(null);\"></body>";
+ alertCallbackData.expectedMessage = "null";
+ alertCallbackData.called = false;
+ ewk_view_html_string_load(webView(), alertHTML, 0, 0);
+ waitUntilLoadFinished();
+ EXPECT_EQ(alertCallbackData.called, true);
+
+ alertHTML = "<!doctype html><body _onload_=\"alert();\"></body>";
+ alertCallbackData.expectedMessage = "undefined";
+ alertCallbackData.called = false;
+ ewk_view_html_string_load(webView(), alertHTML, 0, 0);
+ waitUntilLoadFinished();
+ EXPECT_EQ(alertCallbackData.called, true);
+
+ ewkViewClass()->run_javascript_alert = 0;
+
+ alertCallbackData.called = false;
+ ewk_view_html_string_load(webView(), alertHTML, 0, 0);
+ waitUntilLoadFinished();
+ EXPECT_EQ(alertCallbackData.called, false);
+}
+
+static Eina_Bool checkConfirm(Ewk_View_Smart_Data*, const char* message)
+{
+ confirmCallbackData.called = true;
+ EXPECT_STREQ(message, confirmCallbackData.expectedMessage);
+ return confirmCallbackData.result;
+}
+
+TEST_F(EWK2UnitTestBase, ewk_view_run_javascript_confirm)
+{
+ ewkViewClass()->run_javascript_confirm = checkConfirm;
+
+ const char* confirmHTML = "<!doctype html><body _onload_=\"document.title = confirm('Confirm message');\"></body>";
+ confirmCallbackData.expectedMessage = "Confirm message";
+ confirmCallbackData.result = true;
+ confirmCallbackData.called = false;
+ ewk_view_html_string_load(webView(), confirmHTML, 0, 0);
+ waitUntilTitleChangedTo("true");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "true");
+ EXPECT_EQ(confirmCallbackData.called, true);
+
+ confirmCallbackData.expectedMessage = "Confirm message";
+ confirmCallbackData.result = false;
+ confirmCallbackData.called = false;
+ ewk_view_html_string_load(webView(), confirmHTML, 0, 0);
+ waitUntilTitleChangedTo("false");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "false");
+ EXPECT_EQ(confirmCallbackData.called, true);
+
+ confirmHTML = "<!doctype html><body _onload_=\"document.title = confirm('');\"></body>";
+ confirmCallbackData.expectedMessage = "";
+ confirmCallbackData.result = true;
+ confirmCallbackData.called = false;
+ ewk_view_html_string_load(webView(), confirmHTML, 0, 0);
+ waitUntilTitleChangedTo("true");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "true");
+ EXPECT_EQ(confirmCallbackData.called, true);
+
+ confirmHTML = "<!doctype html><body _onload_=\"document.title = confirm(null);\"></body>";
+ confirmCallbackData.expectedMessage = "null";
+ confirmCallbackData.result = true;
+ confirmCallbackData.called = false;
+ ewk_view_html_string_load(webView(), confirmHTML, 0, 0);
+ waitUntilTitleChangedTo("true");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "true");
+ EXPECT_EQ(confirmCallbackData.called, true);
+
+ confirmHTML = "<!doctype html><body _onload_=\"document.title = confirm();\"></body>";
+ confirmCallbackData.expectedMessage = "undefined";
+ confirmCallbackData.result = true;
+ confirmCallbackData.called = false;
+ ewk_view_html_string_load(webView(), confirmHTML, 0, 0);
+ waitUntilTitleChangedTo("true");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "true");
+ EXPECT_EQ(confirmCallbackData.called, true);
+
+ ewkViewClass()->run_javascript_confirm = 0;
+
+ confirmCallbackData.called = false;
+ ewk_view_html_string_load(webView(), confirmHTML, 0, 0);
+ waitUntilTitleChangedTo("false");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "false");
+ EXPECT_EQ(confirmCallbackData.called, false);
+}
+
+static const char* checkPrompt(Ewk_View_Smart_Data*, const char* message, const char* defaultValue)
+{
+ promptCallbackData.called = true;
+ EXPECT_STREQ(message, promptCallbackData.expectedMessage);
+ EXPECT_STREQ(defaultValue, promptCallbackData.expectedDefaultValue);
+
+ if (!promptCallbackData.result)
+ return 0;
+
+ return eina_stringshare_add(promptCallbackData.result);
+}
+
+TEST_F(EWK2UnitTestBase, ewk_view_run_javascript_prompt)
+{
+ static const char promptMessage[] = "Prompt message";
+ static const char promptResult[] = "Prompt result";
+
+ ewkViewClass()->run_javascript_prompt = checkPrompt;
+
+ const char* promptHTML = "<!doctype html><body _onload_=\"document.title = prompt('Prompt message', 'Prompt default value');\"></body>";
+ promptCallbackData.expectedMessage = promptMessage;
+ promptCallbackData.expectedDefaultValue = "Prompt default value";
+ promptCallbackData.result = promptResult;
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo(promptResult);
+ EXPECT_STREQ(ewk_view_title_get(webView()), promptResult);
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ promptHTML = "<!doctype html><body _onload_=\"document.title = prompt('Prompt message', '');\"></body>";
+ promptCallbackData.expectedMessage = promptMessage;
+ promptCallbackData.expectedDefaultValue = "";
+ promptCallbackData.result = promptResult;
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo(promptResult);
+ EXPECT_STREQ(ewk_view_title_get(webView()), promptResult);
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ promptHTML = "<!doctype html><body _onload_=\"document.title = prompt('Prompt message');\"></body>";
+ promptCallbackData.expectedMessage = promptMessage;
+ promptCallbackData.expectedDefaultValue = "";
+ promptCallbackData.result = promptResult;
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo(promptResult);
+ EXPECT_STREQ(ewk_view_title_get(webView()), promptResult);
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ promptHTML = "<!doctype html><body _onload_=\"document.title = prompt('');\"></body>";
+ promptCallbackData.expectedMessage = "";
+ promptCallbackData.expectedDefaultValue = "";
+ promptCallbackData.result = promptResult;
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo(promptResult);
+ EXPECT_STREQ(ewk_view_title_get(webView()), promptResult);
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ promptHTML = "<!doctype html><body _onload_=\"document.title = prompt();\"></body>";
+ promptCallbackData.expectedMessage = "undefined";
+ promptCallbackData.expectedDefaultValue = "";
+ promptCallbackData.result = promptResult;
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo(promptResult);
+ EXPECT_STREQ(ewk_view_title_get(webView()), promptResult);
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ promptHTML = "<html><head><title>Default title</title></head>"
+ "<body _onload_=\"var promptResult = prompt('Prompt message');"
+ "if (promptResult == null) document.title='null';"
+ "else document.title = promptResult;\"></body></html>";
+ promptCallbackData.expectedMessage = promptMessage;
+ promptCallbackData.expectedDefaultValue = "";
+ promptCallbackData.result = "";
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo("");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "");
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ promptCallbackData.expectedMessage = promptMessage;
+ promptCallbackData.expectedDefaultValue = "";
+ promptCallbackData.result = 0;
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo("null");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "null");
+ EXPECT_EQ(promptCallbackData.called, true);
+
+ ewkViewClass()->run_javascript_prompt = 0;
+
+ promptCallbackData.called = false;
+ ewk_view_html_string_load(webView(), promptHTML, 0, 0);
+ waitUntilTitleChangedTo("null");
+ EXPECT_STREQ(ewk_view_title_get(webView()), "null");
+ EXPECT_EQ(promptCallbackData.called, false);
+}