WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-133730-20141021232229.patch (text/plain), 24.81 KB, created by
Adrian Perez
on 2014-10-21 13:22:25 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Adrian Perez
Created:
2014-10-21 13:22:25 PDT
Size:
24.81 KB
patch
obsolete
>Subversion Revision: 174992 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index f20ba5a6a1190bd174f78667bd08d746ed1cdd29..ba7f85e983a32ebe3750d508b3474cd08d736cb5 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2014-10-17 Adrian Perez de Castro <aperez@igalia.com> >+ >+ [GTK] Support script message handlers WebKitUserContentManager >+ https://bugs.webkit.org/show_bug.cgi?id=133730 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Support user script message handlers in WebKitUserContentManager. >+ This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which >+ an option is added to the CMake build files. The option is disabled >+ globally by default, and the WebKitGTK port enables it. On the API >+ level, two new methods to register and unregister names are provided >+ in the "window.webkit" namespace, and on message reception the >+ "WebKitUserContentManager::script-message-received" signal is >+ emitted, using the registered names as signal detail. >+ >+ * CMakeLists.txt: Conditionally add the needed files to the build >+ when the ENABLE_USER_MESSAGE_HANDLERS feature is enabled. >+ > 2014-10-21 Joanmarie Diggs <jdiggs@igalia.com> > > AX: [ATK] CSS-generated text content not exposed to assistive technologies >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index 75915d476c89800e7b6fc3b876aeed47295fcab0..2946da2d09778e8ceb93d328a9cdbaf87211a70c 100644 >--- a/Source/WebKit2/ChangeLog >+++ b/Source/WebKit2/ChangeLog >@@ -1,3 +1,39 @@ >+2014-10-17 Adrian Perez de Castro <aperez@igalia.com> >+ >+ [GTK] Support script message handlers WebKitUserContentManager >+ https://bugs.webkit.org/show_bug.cgi?id=133730 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Support user script message handlers in WebKitUserContentManager. >+ This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which >+ an option is added to the CMake build files. The option is disabled >+ globally by default, and the WebKitGTK port enables it. On the API >+ level, two new methods to register and unregister names are provided >+ in the "window.webkit" namespace, and on message reception the >+ "WebKitUserContentManager::script-message-received" signal is >+ emitted, using the registered names as signal detail. >+ >+ * UIProcess/API/gtk/WebKitJavascriptResult.cpp: Add a new private >+ function to construct a WebKitJavascriptResult directly from a >+ WebCore::SerializedScriptValue. >+ (_WebKitJavascriptResult::_WebKitJavascriptResult): Ditto. >+ (webkitJavascriptResultCreate): Ditto. >+ * UIProcess/API/gtk/WebKitJavascriptResultPrivate.h: Ditto. >+ * UIProcess/API/gtk/WebKitUserContentManager.cpp: >+ (webkit_user_content_manager_class_init): Install the >+ "script-message-received" signal. >+ (webkit_user_content_manager_register_script_message_handler): >+ Added. >+ (webkit_user_content_manager_unregister_script_message_handler): >+ Added. >+ * UIProcess/API/gtk/WebKitUserContentManager.h: Added the new >+ public API methods. >+ * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Ditto. >+ * UIProcess/API/gtk/docs/webkit2gtk.types: Add >+ webkit_user_content_manager_get_type() to the list in order to make >+ gtk-doc to generate documentation for signals. >+ > 2014-10-21 Anders Carlsson <andersca@apple.com> > > WKRemoteObjectCoder should handle floats >diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt >index 822a604762e7d653cc21648bcdfa9283c72056b4..3b2b09d001b8614ec063d83ec0fea1081c00d852 100644 >--- a/Source/WebCore/CMakeLists.txt >+++ b/Source/WebCore/CMakeLists.txt >@@ -3105,6 +3105,21 @@ if (ENABLE_WEB_REPLAY) > ) > endif () > >+if (ENABLE_USER_MESSAGE_HANDLERS) >+ list(APPEND WebCore_IDL_FILES >+ page/UserMessageHandler.idl >+ page/UserMessageHandlersNamespace.idl >+ page/WebKitNamespace.idl >+ ) >+ list(APPEND WebCore_SOURCES >+ bindings/js/JSUserMessageHandlersNamespaceCustom.cpp >+ page/UserMessageHandler.cpp >+ page/UserMessageHandlerDescriptor.cpp >+ page/UserMessageHandlersNamespace.cpp >+ page/WebKitNamespace.cpp >+ ) >+endif () >+ > set(WebCoreTestSupport_INCLUDE_DIRECTORIES > "${WEBCORE_DIR}/platform/mock" > "${WEBCORE_DIR}/testing" >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp >index 9bbd3f4ed076875de84bb98505233015d87b48a0..e1a96a687ab423a4685d317672e18f50cd1b6b9b 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp >@@ -34,6 +34,13 @@ struct _WebKitJavascriptResult { > value = serializedScriptValue->deserialize(webkit_web_view_get_javascript_global_context(view), 0); > } > >+ _WebKitJavascriptResult(WebKitWebView* view, WebCore::SerializedScriptValue& serializedScriptValue) >+ : webView(view) >+ , referenceCount(1) >+ { >+ value = serializedScriptValue.deserialize(webkit_web_view_get_javascript_global_context(view), nullptr); >+ } >+ > GRefPtr<WebKitWebView> webView; > JSValueRef value; > >@@ -49,6 +56,13 @@ WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, Web > return result; > } > >+WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WebCore::SerializedScriptValue& serializedScriptValue) >+{ >+ WebKitJavascriptResult* result = g_slice_new(WebKitJavascriptResult); >+ new (result) WebKitJavascriptResult(webView, serializedScriptValue); >+ return result; >+} >+ > /** > * webkit_javascript_result_ref: > * @js_result: a #WebKitJavascriptResult >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h b/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h >index e47e94c1b02548ff4f5ca248bcf05cd6f97f2956..2a1ba4194014fd54c46c648024a9be3d3850bd48 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h >@@ -20,10 +20,12 @@ > #ifndef WebKitJavascriptResultPrivate_h > #define WebKitJavascriptResultPrivate_h > >+#include <WebCore/SerializedScriptValue.h> > #include "WebKitJavascriptResult.h" > #include "WebKitPrivate.h" > #include "WebKitWebView.h" > > WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebKit::WebSerializedScriptValue*); >+WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebCore::SerializedScriptValue&); > > #endif // WebKitJavascriptResultPrivate_h >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp >index 5ed79997a923825673ab7ca5f34377088d920036..2bdba0b58822170060d2506d38d661ac49fa3854 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp >@@ -20,9 +20,13 @@ > #include "config.h" > #include "WebKitUserContentManager.h" > >+#include "WebKitJavascriptResultPrivate.h" > #include "WebKitPrivate.h" > #include "WebKitUserContentManagerPrivate.h" > #include "WebKitUserContentPrivate.h" >+#include "WebKitWebContextPrivate.h" >+#include "WebScriptMessageHandler.h" >+#include "WebSerializedScriptValue.h" > #include <wtf/gobject/GRefPtr.h> > > using namespace WebCore; >@@ -59,8 +63,40 @@ struct _WebKitUserContentManagerPrivate { > > WEBKIT_DEFINE_TYPE(WebKitUserContentManager, webkit_user_content_manager, G_TYPE_OBJECT) > >-static void webkit_user_content_manager_class_init(WebKitUserContentManagerClass*) >+enum { >+ SCRIPT_MESSAGE_RECEIVED, >+ >+ LAST_SIGNAL >+}; >+ >+static guint signals[LAST_SIGNAL] = { 0, }; >+ >+static void webkit_user_content_manager_class_init(WebKitUserContentManagerClass* klass) > { >+ GObjectClass* gObjectClass = G_OBJECT_CLASS(klass); >+ >+ /** >+ * WebKitUserContentManager::script-message-received: >+ * @manager: the #WebKitUserContentManager >+ * @js_result: the #WebKitJavascriptResult holding the value received >+ * from the JavaScript world. >+ * >+ * This signal is emitted when JavaScript in a web view calls >+ * <code>window.webkit.<name>.postMessage()</code>, after registering >+ * <code><name></code> using >+ * webkit_user_content_manager_register_script_message_handler() >+ * >+ * Since: 2.6 >+ */ >+ signals[SCRIPT_MESSAGE_RECEIVED] = >+ g_signal_new( >+ "script-message-received", >+ G_TYPE_FROM_CLASS(gObjectClass), >+ static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED), >+ 0, nullptr, nullptr, >+ g_cclosure_marshal_VOID__BOXED, >+ G_TYPE_NONE, 1, >+ WEBKIT_TYPE_JAVASCRIPT_RESULT); > } > > /** >@@ -141,6 +177,88 @@ void webkit_user_content_manager_remove_all_scripts(WebKitUserContentManager* ma > manager->priv->userContentController->removeAllUserScripts(); > } > >+class ScriptMessageClientGtk final : public WebScriptMessageHandler::Client { >+public: >+ ScriptMessageClientGtk(WebKitUserContentManager* manager, const gchar* handlerName) >+ : m_handlerName(g_quark_from_string(handlerName)) >+ , m_manager(manager) >+ { >+ } >+ >+ virtual void didPostMessage(WebPageProxy& page, WebFrameProxy&, WebCore::SerializedScriptValue& serializedScriptValue) >+ { >+ auto jsResult = adoptGRef(webkitJavascriptResultCreate(WEBKIT_WEB_VIEW(page.viewWidget()), serializedScriptValue)); >+ g_signal_emit(m_manager.get(), signals[SCRIPT_MESSAGE_RECEIVED], m_handlerName, jsResult.get()); >+ } >+ >+ virtual ~ScriptMessageClientGtk() { } >+ >+private: >+ GQuark m_handlerName; >+ GRefPtr<WebKitUserContentManager> m_manager; >+}; >+ >+/** >+ * webkit_user_content_manager_register_script_message_handler: >+ * @manager: A #WebKitUserContentManager >+ * @name: Name of the script message channel >+ * >+ * Registers a new user script message handler. After it is >+ * registered, scripts can use `window.webkit.<name>.postMessage(value)` >+ * to send messages. Those messages are received by connecting handlers >+ * to the #WebKitUserContentManager::script-message-received signal. The >+ * handler name is used as the detail of the signal. To avoid race >+ * conditions between registering the handler name, and starting to >+ * receive the signals, it is recommended to connect to the signal >+ * *before* registering the handler name: >+ * >+ * <informalexample><programlisting> >+ * WebKitWebView *view = webkit_web_view_new (); >+ * WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager (); >+ * g_signal_connect (manager, "script-message-received::foobar", >+ * G_CALLBACK (handle_script_message), NULL); >+ * webkit_user_content_manager_register_script_message_handler (manager, "foobar"); >+ * </programlisting></informalexample> >+ * >+ * Registering a script message handler will fail if the requested >+ * name has been already registered before. >+ * >+ * Returns: Whether the message channel was registered successfully. >+ * >+ * Since: 2.6.2 >+ */ >+gboolean webkit_user_content_manager_register_script_message_handler(WebKitUserContentManager* manager, const gchar* name) >+{ >+ g_return_val_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager), FALSE); >+ g_return_val_if_fail(name, FALSE); >+ >+ RefPtr<WebScriptMessageHandler> handler = >+ WebScriptMessageHandler::create(std::make_unique<ScriptMessageClientGtk>(manager, name), String::fromUTF8(name)); >+ return manager->priv->userContentController->addUserScriptMessageHandler(handler.get()); >+} >+ >+/** >+ * webkit_user_content_manager_unregister_script_message_handler: >+ * @manager: A #WebKitUserContentManager >+ * @name: Name of the script message channel >+ * >+ * Unregisters a previously registered message handler. >+ * >+ * Note that this does *not* disconnect handlers for the >+ * #WebKitUserContentManager::script-message-received signal, >+ * they will be kept connected, but the signal will not be emitted >+ * unless the handler name is registered again. >+ * >+ * See also webkit_user_content_manager_register_script_message_handler() >+ * >+ * Since: 2.6.2 >+ */ >+void webkit_user_content_manager_unregister_script_message_handler(WebKitUserContentManager* manager, const gchar* name) >+{ >+ g_return_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager)); >+ manager->priv->userContentController->removeUserMessageHandlerForName(String::fromUTF8(name)); >+} >+ > WebUserContentControllerProxy* webkitUserContentManagerGetUserContentControllerProxy(WebKitUserContentManager* manager) > { > return manager->priv->userContentController.get(); >diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h b/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h >index b605f7fa5e173951eb69890f733a9c8456211a58..86d24a1135269612aabd69cdc79ccea2d29403a7 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h >+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h >@@ -60,16 +60,23 @@ struct _WebKitUserContentManagerClass { > > > WEBKIT_API GType >-webkit_user_content_manager_get_type (void); >+webkit_user_content_manager_get_type (void); > > WEBKIT_API WebKitUserContentManager * >-webkit_user_content_manager_new (void); >+webkit_user_content_manager_new (void); > > WEBKIT_API void >-webkit_user_content_manager_add_style_sheet (WebKitUserContentManager *manager, >- WebKitUserStyleSheet *stylesheet); >+webkit_user_content_manager_add_style_sheet (WebKitUserContentManager *manager, >+ WebKitUserStyleSheet *stylesheet); > WEBKIT_API void >-webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager); >+webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager); >+ >+WEBKIT_API gboolean >+webkit_user_content_manager_register_script_message_handler (WebKitUserContentManager *manager, >+ const gchar *name); >+WEBKIT_API void >+webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager, >+ const gchar *name); > > WEBKIT_API void > webkit_user_content_manager_add_script (WebKitUserContentManager *manager, >diff --git a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt >index 1ed43aef07258c6ece6849f49e8502d4e97d3634..966d75f6c4d38ea71da2de13584737afed19cf73 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt >+++ b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt >@@ -106,6 +106,8 @@ webkit_user_content_manager_add_style_sheet > webkit_user_content_manager_remove_all_style_sheets > webkit_user_content_manager_add_script > webkit_user_content_manager_remove_all_scripts >+webkit_user_content_manager_register_script_message_handler >+webkit_user_content_manager_unregister_script_message_handler > > <SUBSECTION Standard> > WEBKIT_IS_USER_CONTENT_MANAGER >diff --git a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types >index 2446dc21e808aaa05dca3182b16c9592a886873d..375d15b96f49bbf4db8acd329f7b5ad08773997b 100644 >--- a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types >+++ b/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types >@@ -27,3 +27,4 @@ webkit_authentication_request_get_type > webkit_credential_get_type > webkit_frame_get_type > webkit_certificate_info_get_type >+webkit_user_content_manager_get_type >diff --git a/Source/cmake/OptionsGTK.cmake b/Source/cmake/OptionsGTK.cmake >index 8ec94a48ee51910d81c773f5b5ae6fd2635e56ba..4b7ba5447bf9bf7866adb0c7d49d4eb3c5e78b89 100644 >--- a/Source/cmake/OptionsGTK.cmake >+++ b/Source/cmake/OptionsGTK.cmake >@@ -145,6 +145,7 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SUBTLE_CRYPTO OFF) > WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TEMPLATE_ELEMENT ON) > WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS ON) > WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USERSELECT_ALL ON) >+WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USER_MESSAGE_HANDLERS ON) > WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIBRATION OFF) > WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO ON) > WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO_TRACK ON) >diff --git a/Source/cmake/WebKitFeatures.cmake b/Source/cmake/WebKitFeatures.cmake >index 19a09870933dd909aa6389ca006a6f29b3c6ff89..21d59e2c4b891a1b034b85c0032ed0bfd72d4936 100644 >--- a/Source/cmake/WebKitFeatures.cmake >+++ b/Source/cmake/WebKitFeatures.cmake >@@ -132,6 +132,7 @@ macro(WEBKIT_OPTION_BEGIN) > WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_SLIDER "Toggle Touch Slider support" OFF) > WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_ICON_LOADING "Toggle Touch Icon Loading Support" OFF) > WEBKIT_OPTION_DEFINE(ENABLE_USERSELECT_ALL "Toggle user-select:all support" OFF) >+ WEBKIT_OPTION_DEFINE(ENABLE_USER_MESSAGE_HANDLERS "Toggle user script message handler support" OFF) > WEBKIT_OPTION_DEFINE(ENABLE_USER_TIMING "Toggle User Timing support" OFF) > WEBKIT_OPTION_DEFINE(ENABLE_VIBRATION "Toggle Vibration API support" OFF) > WEBKIT_OPTION_DEFINE(ENABLE_VIDEO "Toggle Video support" OFF) >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index c4bfb4f5bafb9076833c2eef7f46332611fd23a0..d9418a1229fae7983949928f96a933ad5ccd0048 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,25 @@ >+2014-10-17 Adrian Perez de Castro <aperez@igalia.com> >+ >+ [GTK] Support script message handlers WebKitUserContentManager >+ https://bugs.webkit.org/show_bug.cgi?id=133730 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Support user script message handlers in WebKitUserContentManager. >+ This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which >+ an option is added to the CMake build files. The option is disabled >+ globally by default, and the WebKitGTK port enables it. On the API >+ level, two new methods to register and unregister names are provided >+ in the "window.webkit" namespace, and on message reception the >+ "WebKitUserContentManager::script-message-received" signal is >+ emitted, using the registered names as signal detail. >+ >+ * TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp: >+ Add test case for user script message handlers. >+ (scriptMessageReceived): >+ (testUserContentManagerScriptMessageReceived): >+ (beforeAll): >+ > 2014-10-21 Dániel Bátyai <dbatyai.u-szeged@partner.samsung.com> > > Fix FTL Native Inlining for EFL >diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp >index 6bc7e67d3bcce8d4f99f0ba384d657b548218f16..94dc0154d4c0c107f17dec04f334eb7975db9572 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp >+++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp >@@ -1,5 +1,5 @@ > /* >- * Copyright (C) 2013 Igalia S.L. >+ * Copyright (C) 2014 Igalia S.L. > * > * This library is free software; you can redistribute it and/or > * modify it under the terms of the GNU Lesser General Public >@@ -43,6 +43,45 @@ public: > GRefPtr<WebKitUserContentManager> m_userContentManager; > }; > >+class UserScriptMessageTest : public UserContentManagerTest { >+ MAKE_GLIB_TEST_FIXTURE(UserScriptMessageTest); >+ >+ UserScriptMessageTest() >+ : UserContentManagerTest() >+ , m_userScriptMessage(nullptr) >+ { >+ } >+ >+ static void scriptMessageReceived(WebKitUserContentManager*, WebKitJavascriptResult* jsResult, UserScriptMessageTest* test) >+ { >+ test->m_userScriptMessage = jsResult; >+ } >+ >+ bool registerHandler(const gchar* handlerName) >+ { >+ GOwnPtr<gchar> signalName(g_sprintf("script-message-received::%s", handlerName)); >+ if (!g_signal_connect(test->m_userContentManager.get(), signalName, G_CALLBACK(scriptMessageReceived), this)) >+ return false; >+ webkit_user_content_manager_register_message_handler(test->m_userContentManager.get(), handlerName); >+ return true; >+ } >+ >+ static void scriptMessageReceivedStopMainLoop(WebKitUserContentManager* userContentManager, WebKitJavascriptResult*, UserScriptMessageTest* test) >+ { >+ g_signal_handlers_disconnect_by_func(userContentManager, reinterpret_cast<gpointer>(scriptMessageReceivedStopMainLoop), test); >+ g_main_loop_quit(test->m_mainLoop); >+ } >+ >+ void waitUntilMessageReceived(const gchar* handlerName) >+ { >+ GOwnPtr<gchar> signalName(g_sprintf("script-message-received::%s", handlerName)); >+ g_signal_connect(test->m_userContentManager.get(), signalName, G_CALLBACK(scriptMessageReceivedStopMainLoop), this); >+ g_main_loop_run(m_mainLoop); >+ } >+ >+ GRefPtr<WebKitJavascriptResult> m_userScriptMessage; >+}; >+ > static WebKitTestServer* kServer; > > // These are all here so that they can be changed easily, if necessary. >@@ -212,6 +251,40 @@ static void testUserContentManagerInjectedScript(UserContentManagerTest* test, g > removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist); > } > >+static void testUserContentManagerScriptMessageReceived(UserScriptMessageTest* test, gconstpointer) >+{ >+ GRefPtr<WebKitJavascriptResult> message; >+ >+ g_assert(test->registerHandler("msg")); >+ test->loadHtml("<html></html>", nullptr); >+ test->waitUntilLoadFinished(); >+ >+ // Check that the "document.webkit" namespace exists >+ GUniqueOutPtr<GError> error; >+ WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit ? 'y' : 'n';", &error.outPtr()); >+ g_assert(javascriptResult); >+ g_assert(!error.get()); >+ GUniquePtr<char> valueString(WebViewTest::javascriptResultToCString(javascriptResult)); >+ g_assert_cmpstr(valueString.get(), ==, "y"); >+ >+ // Check that the "document.webkit.msg" namespace exists >+ javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.msg ? 'y' : 'n';", &error.outPtr()); >+ g_assert(javascriptResult); >+ g_assert(!error.get()); >+ valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult)); >+ g_assert_cmpstr(valueString.get(), ==, "y"); >+ >+ // Call "window.webkit.msg.postMessage()" and check that the flag was flipped. >+ javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.msg.postMessage('user message');", &error.outPtr()); >+ g_assert(javascriptResult); >+ g_assert(!error.get()); >+ >+ test->waitUntilMessageReceived("msg"); >+ g_assert(test->m_userScriptMessage.get()); >+ valueString.reset(WebViewTest::javascriptResultToCString(test->m_userScriptMessage)); >+ g_assert_cmpstr(valueString.get(), ==, "user message"); >+} >+ > static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer) > { > soup_message_set_status(message, SOUP_STATUS_OK); >@@ -227,6 +300,7 @@ void beforeAll() > Test::add("WebKitWebView", "new-with-user-content-manager", testWebViewNewWithUserContentManager); > UserContentManagerTest::add("WebKitUserContentManager", "injected-style-sheet", testUserContentManagerInjectedStyleSheet); > UserContentManagerTest::add("WebKitUserContentManager", "injected-script", testUserContentManagerInjectedScript); >+ UserScriptMessageTest::add("WebKitUserContentManager", "script-message-received", testUserContentManagerScriptMessageReceived); > } > > void afterAll() >diff --git a/ChangeLog b/ChangeLog >index bd87df11a65fadc2d791b915f260ffac1fc040ad..5d1ce303e19454ce0be9816895f5590e7a76be0b 100644 >--- a/ChangeLog >+++ b/ChangeLog >@@ -1,3 +1,24 @@ >+2014-10-17 Adrian Perez de Castro <aperez@igalia.com> >+ >+ [GTK] Support script message handlers WebKitUserContentManager >+ https://bugs.webkit.org/show_bug.cgi?id=133730 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Support user script message handlers in WebKitUserContentManager. >+ This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which >+ an option is added to the CMake build files. The option is disabled >+ globally by default, and the WebKitGTK port enables it. On the API >+ level, two new methods to register and unregister names are provided >+ in the "window.webkit" namespace, and on message reception the >+ "WebKitUserContentManager::script-message-received" signal is >+ emitted, using the registered names as signal detail. >+ >+ * Source/cmake/OptionsGTK.cmake: For the GTK port, enable the >+ ENABLE_USER_MESSAGE_HANDLERS feature by default. >+ * Source/cmake/WebKitFeatures.cmake: Add feature description for >+ ENABLE_USER_MESSAGE_HANDLERS, disabled by default. >+ > 2014-10-21 Dániel Bátyai <dbatyai.u-szeged@partner.samsung.com> > > Fix FTL Native Inlining for EFL
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 133730
:
232952
|
233651
|
234981
|
234982
|
234986
|
240219
|
240479
|
240561
|
240666