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-20141027161043.patch (text/plain), 25.11 KB, created by
Adrian Perez
on 2014-10-27 07:10:36 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Adrian Perez
Created:
2014-10-27 07:10:36 PDT
Size:
25.11 KB
patch
obsolete
>Subversion Revision: 175169 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 3a6d5a66634d9a98bbecf4cbc283f3c1b00f77f1..960cf08658b143381703470b177a3d2a213c583e 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-24 Chris Dumez <cdumez@apple.com> > > Move ComputeLength CSS properties to the new StyleBuilder >diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog >index aa5aa595217c0446d61058f5b5df20f0712ea26d..eb1f898e4e34f5a02873d8a1cc2cdc95041a3047 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-24 Marcos ChavarrÃa Teijeiro <chavarria1991@gmail.com> > > [GTK] Implement is_selected method on WebKitHitTestResult >diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt >index d87eb0032884a8e8d7323b5546b6b97900db8df2..d9fa8a13a25a264e9ad50371c6e2ee9556063968 100644 >--- a/Source/WebCore/CMakeLists.txt >+++ b/Source/WebCore/CMakeLists.txt >@@ -3107,6 +3107,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..0d3e64d9974e3bf0699331a6641b46f8166a41a1 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.8 >+ */ >+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.8 >+ */ >+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 50265e48b165c51cd0877fa05626471d79255dac..6be703910b24ada412caf8e137583217c53c986f 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 6d099f8e88a9970baedf8a0bb2042b4e1d0852f3..9c86a6c7a03b099dc58eb577735508e64443c6a3 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-24 Dan Bernstein <mitz@apple.com> > > build.webkit.org/dashboard immediately retries a request to buildbot when the response is 404 >diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp >index 6bc7e67d3bcce8d4f99f0ba384d657b548218f16..8d2decad913e1a623e7139f4b34d732c87d8545c 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 >@@ -25,6 +25,7 @@ > #include <gtk/gtk.h> > #include <webkit2/webkit2.h> > #include <wtf/gobject/GRefPtr.h> >+#include <wtf/gobject/GUniquePtr.h> > > class UserContentManagerTest : public WebViewTest { > public: >@@ -43,6 +44,46 @@ public: > GRefPtr<WebKitUserContentManager> m_userContentManager; > }; > >+class UserScriptMessageTest : public UserContentManagerTest { >+public: >+ 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) >+ { >+ GUniquePtr<gchar> signalName(g_strdup_printf("script-message-received::%s", handlerName)); >+ if (!g_signal_connect(m_userContentManager.get(), signalName.get(), G_CALLBACK(scriptMessageReceived), this)) >+ return false; >+ webkit_user_content_manager_register_script_message_handler(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) >+ { >+ GUniquePtr<gchar> signalName(g_strdup_printf("script-message-received::%s", handlerName)); >+ g_signal_connect(m_userContentManager.get(), signalName.get(), 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 +253,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.get())); >+ 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 +302,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 61c8db7924f8037940b628ac06aac086b2b7ba25..363970b12997a7a2892fedb1af5d67a75f6180d9 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 Ryuan Choi <ryuan.choi@gmail.com> > > [EFL] Remove unnecessary ENABLE_3D_RENDERING definition from OptionsEfl.cmake
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