| Differences between
and this patch
- a/Source/WebCore/ChangeLog +19 lines
Lines 1-3 a/Source/WebCore/ChangeLog_sec1
1
2014-10-28  Adrian Perez de Castro  <aperez@igalia.com>
2
3
        [GTK] Support script message handlers WebKitUserContentManager
4
        https://bugs.webkit.org/show_bug.cgi?id=133730
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Support user script message handlers in WebKitUserContentManager.
9
        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
10
        an option is added to the CMake build files. The option is disabled
11
        globally by default, and the WebKitGTK port enables it. On the API
12
        level, two new methods to register and unregister names are provided
13
        in the "window.webkit" namespace, and on message reception the
14
        "WebKitUserContentManager::script-message-received" signal is
15
        emitted, using the registered names as signal detail.
16
17
        * CMakeLists.txt: Conditionally add the needed files to the build
18
        when the ENABLE_USER_MESSAGE_HANDLERS feature is enabled.
19
1
2014-10-24  Chris Dumez  <cdumez@apple.com>
20
2014-10-24  Chris Dumez  <cdumez@apple.com>
2
21
3
        Move ComputeLength CSS properties to the new StyleBuilder
22
        Move ComputeLength CSS properties to the new StyleBuilder
- a/Source/WebKit2/ChangeLog +36 lines
Lines 1-3 a/Source/WebKit2/ChangeLog_sec1
1
2014-10-28  Adrian Perez de Castro  <aperez@igalia.com>
2
3
        [GTK] Support script message handlers WebKitUserContentManager
4
        https://bugs.webkit.org/show_bug.cgi?id=133730
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Support user script message handlers in WebKitUserContentManager.
9
        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
10
        an option is added to the CMake build files. The option is disabled
11
        globally by default, and the WebKitGTK port enables it. On the API
12
        level, two new methods to register and unregister names are provided
13
        in the "window.webkit" namespace, and on message reception the
14
        "WebKitUserContentManager::script-message-received" signal is
15
        emitted, using the registered names as signal detail.
16
17
        * UIProcess/API/gtk/WebKitJavascriptResult.cpp: Add a new private
18
        function to construct a WebKitJavascriptResult directly from a
19
        WebCore::SerializedScriptValue.
20
        (_WebKitJavascriptResult::_WebKitJavascriptResult): Ditto.
21
        (webkitJavascriptResultCreate): Ditto.
22
        * UIProcess/API/gtk/WebKitJavascriptResultPrivate.h: Ditto.
23
        * UIProcess/API/gtk/WebKitUserContentManager.cpp:
24
        (webkit_user_content_manager_class_init): Install the
25
        "script-message-received" signal.
26
        (webkit_user_content_manager_register_script_message_handler):
27
        Added.
28
        (webkit_user_content_manager_unregister_script_message_handler):
29
        Added.
30
        * UIProcess/API/gtk/WebKitUserContentManager.h: Added the new
31
        public API methods.
32
        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Ditto.
33
        * UIProcess/API/gtk/docs/webkit2gtk.types: Add
34
        webkit_user_content_manager_get_type() to the list in order to make
35
        gtk-doc to generate documentation for signals.
36
1
2014-10-24  Marcos Chavarría Teijeiro  <chavarria1991@gmail.com>
37
2014-10-24  Marcos Chavarría Teijeiro  <chavarria1991@gmail.com>
2
38
3
        [GTK] Implement is_selected method on WebKitHitTestResult
39
        [GTK] Implement is_selected method on WebKitHitTestResult
- a/Source/WebCore/CMakeLists.txt +15 lines
Lines 3107-3112 if (ENABLE_WEB_REPLAY) a/Source/WebCore/CMakeLists.txt_sec1
3107
    )
3107
    )
3108
endif ()
3108
endif ()
3109
3109
3110
if (ENABLE_USER_MESSAGE_HANDLERS)
3111
    list(APPEND WebCore_IDL_FILES
3112
        page/UserMessageHandler.idl
3113
        page/UserMessageHandlersNamespace.idl
3114
        page/WebKitNamespace.idl
3115
    )
3116
    list(APPEND WebCore_SOURCES
3117
        bindings/js/JSUserMessageHandlersNamespaceCustom.cpp
3118
        page/UserMessageHandler.cpp
3119
        page/UserMessageHandlerDescriptor.cpp
3120
        page/UserMessageHandlersNamespace.cpp
3121
        page/WebKitNamespace.cpp
3122
    )
3123
endif ()
3124
3110
set(WebCoreTestSupport_INCLUDE_DIRECTORIES
3125
set(WebCoreTestSupport_INCLUDE_DIRECTORIES
3111
    "${WEBCORE_DIR}/platform/mock"
3126
    "${WEBCORE_DIR}/platform/mock"
3112
    "${WEBCORE_DIR}/testing"
3127
    "${WEBCORE_DIR}/testing"
- a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp -3 / +3 lines
Lines 27-37 a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp_sec1
27
using namespace WebKit;
27
using namespace WebKit;
28
28
29
struct _WebKitJavascriptResult {
29
struct _WebKitJavascriptResult {
30
    _WebKitJavascriptResult(WebKitWebView* view, WebSerializedScriptValue* serializedScriptValue)
30
    _WebKitJavascriptResult(WebKitWebView* view, WebCore::SerializedScriptValue& serializedScriptValue)
31
        : webView(view)
31
        : webView(view)
32
        , referenceCount(1)
32
        , referenceCount(1)
33
    {
33
    {
34
        value = serializedScriptValue->deserialize(webkit_web_view_get_javascript_global_context(view), 0);
34
        value = serializedScriptValue.deserialize(webkit_web_view_get_javascript_global_context(view), nullptr);
35
    }
35
    }
36
36
37
    GRefPtr<WebKitWebView> webView;
37
    GRefPtr<WebKitWebView> webView;
Lines 42-48 struct _WebKitJavascriptResult { a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp_sec2
42
42
43
G_DEFINE_BOXED_TYPE(WebKitJavascriptResult, webkit_javascript_result, webkit_javascript_result_ref, webkit_javascript_result_unref)
43
G_DEFINE_BOXED_TYPE(WebKitJavascriptResult, webkit_javascript_result, webkit_javascript_result_ref, webkit_javascript_result_unref)
44
44
45
WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WebSerializedScriptValue* serializedScriptValue)
45
WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WebCore::SerializedScriptValue& serializedScriptValue)
46
{
46
{
47
    WebKitJavascriptResult* result = g_slice_new(WebKitJavascriptResult);
47
    WebKitJavascriptResult* result = g_slice_new(WebKitJavascriptResult);
48
    new (result) WebKitJavascriptResult(webView, serializedScriptValue);
48
    new (result) WebKitJavascriptResult(webView, serializedScriptValue);
- a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h -1 / +2 lines
Lines 20-29 a/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h_sec1
20
#ifndef WebKitJavascriptResultPrivate_h
20
#ifndef WebKitJavascriptResultPrivate_h
21
#define WebKitJavascriptResultPrivate_h
21
#define WebKitJavascriptResultPrivate_h
22
22
23
#include <WebCore/SerializedScriptValue.h>
23
#include "WebKitJavascriptResult.h"
24
#include "WebKitJavascriptResult.h"
24
#include "WebKitPrivate.h"
25
#include "WebKitPrivate.h"
25
#include "WebKitWebView.h"
26
#include "WebKitWebView.h"
26
27
27
WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebKit::WebSerializedScriptValue*);
28
WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebCore::SerializedScriptValue&);
28
29
29
#endif // WebKitJavascriptResultPrivate_h
30
#endif // WebKitJavascriptResultPrivate_h
- a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp -1 / +120 lines
Lines 20-28 a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp_sec1
20
#include "config.h"
20
#include "config.h"
21
#include "WebKitUserContentManager.h"
21
#include "WebKitUserContentManager.h"
22
22
23
#include "WebKitJavascriptResultPrivate.h"
23
#include "WebKitPrivate.h"
24
#include "WebKitPrivate.h"
24
#include "WebKitUserContentManagerPrivate.h"
25
#include "WebKitUserContentManagerPrivate.h"
25
#include "WebKitUserContentPrivate.h"
26
#include "WebKitUserContentPrivate.h"
27
#include "WebKitWebContextPrivate.h"
28
#include "WebScriptMessageHandler.h"
29
#include "WebSerializedScriptValue.h"
26
#include <wtf/gobject/GRefPtr.h>
30
#include <wtf/gobject/GRefPtr.h>
27
31
28
using namespace WebCore;
32
using namespace WebCore;
Lines 59-66 struct _WebKitUserContentManagerPrivate { a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp_sec2
59
63
60
WEBKIT_DEFINE_TYPE(WebKitUserContentManager, webkit_user_content_manager, G_TYPE_OBJECT)
64
WEBKIT_DEFINE_TYPE(WebKitUserContentManager, webkit_user_content_manager, G_TYPE_OBJECT)
61
65
62
static void webkit_user_content_manager_class_init(WebKitUserContentManagerClass*)
66
enum {
67
    SCRIPT_MESSAGE_RECEIVED,
68
69
    LAST_SIGNAL
70
};
71
72
static guint signals[LAST_SIGNAL] = { 0, };
73
74
static void webkit_user_content_manager_class_init(WebKitUserContentManagerClass* klass)
63
{
75
{
76
    GObjectClass* gObjectClass = G_OBJECT_CLASS(klass);
77
78
    /**
79
     * WebKitUserContentManager::script-message-received:
80
     * @manager: the #WebKitUserContentManager
81
     * @js_result: the #WebKitJavascriptResult holding the value received from the JavaScript world.
82
     *
83
     * This signal is emitted when JavaScript in a web view calls
84
     * <code>window.webkit.messageHandlers.&lt;name&gt;.postMessage()</code>, after registering
85
     * <code>&lt;name&gt;</code> using
86
     * webkit_user_content_manager_register_script_message_handler()
87
     *
88
     * Since: 2.8
89
     */
90
    signals[SCRIPT_MESSAGE_RECEIVED] =
91
        g_signal_new(
92
            "script-message-received",
93
            G_TYPE_FROM_CLASS(gObjectClass),
94
            static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED),
95
            0, nullptr, nullptr,
96
            g_cclosure_marshal_VOID__BOXED,
97
            G_TYPE_NONE, 1,
98
            WEBKIT_TYPE_JAVASCRIPT_RESULT);
64
}
99
}
65
100
66
/**
101
/**
Lines 141-146 void webkit_user_content_manager_remove_all_scripts(WebKitUserContentManager* ma a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp_sec3
141
    manager->priv->userContentController->removeAllUserScripts();
176
    manager->priv->userContentController->removeAllUserScripts();
142
}
177
}
143
178
179
class ScriptMessageClientGtk final : public WebScriptMessageHandler::Client {
180
public:
181
    ScriptMessageClientGtk(WebKitUserContentManager* manager, const char* handlerName)
182
        : m_handlerName(g_quark_from_string(handlerName))
183
        , m_manager(manager)
184
    {
185
    }
186
187
    virtual void didPostMessage(WebPageProxy& page, WebFrameProxy&, WebCore::SerializedScriptValue& serializedScriptValue)
188
    {
189
        WebKitJavascriptResult* jsResult = webkitJavascriptResultCreate(WEBKIT_WEB_VIEW(page.viewWidget()), serializedScriptValue);
190
        g_signal_emit(m_manager, signals[SCRIPT_MESSAGE_RECEIVED], m_handlerName, jsResult);
191
        webkit_javascript_result_unref(jsResult);
192
    }
193
194
    virtual ~ScriptMessageClientGtk() { }
195
196
private:
197
    GQuark m_handlerName;
198
    WebKitUserContentManager* m_manager;
199
};
200
201
/**
202
 * webkit_user_content_manager_register_script_message_handler:
203
 * @manager: A #WebKitUserContentManager
204
 * @name: Name of the script message channel
205
 *
206
 * Registers a new user script message handler. After it is registered,
207
 * scripts can use `window.webkit.messageHandlers.&lt;name&gt;.postMessage(value)`
208
 * to send messages. Those messages are received by connecting handlers
209
 * to the #WebKitUserContentManager::script-message-received signal. The
210
 * handler name is used as the detail of the signal. To avoid race
211
 * conditions between registering the handler name, and starting to
212
 * receive the signals, it is recommended to connect to the signal
213
 * *before* registering the handler name:
214
 *
215
 * <informalexample><programlisting>
216
 * WebKitWebView *view = webkit_web_view_new ();
217
 * WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager ();
218
 * g_signal_connect (manager, "script-message-received::foobar",
219
 *                   G_CALLBACK (handle_script_message), NULL);
220
 * webkit_user_content_manager_register_script_message_handler (manager, "foobar");
221
 * </programlisting></informalexample>
222
 *
223
 * Registering a script message handler will fail if the requested
224
 * name has been already registered before.
225
 *
226
 * Returns: %TRUE if message handler was registered successfully, or %FALSE otherwise.
227
 *
228
 * Since: 2.8
229
 */
230
gboolean webkit_user_content_manager_register_script_message_handler(WebKitUserContentManager* manager, const char* name)
231
{
232
    g_return_val_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager), FALSE);
233
    g_return_val_if_fail(name, FALSE);
234
235
    RefPtr<WebScriptMessageHandler> handler =
236
        WebScriptMessageHandler::create(std::make_unique<ScriptMessageClientGtk>(manager, name), String::fromUTF8(name));
237
    return manager->priv->userContentController->addUserScriptMessageHandler(handler.get());
238
}
239
240
/**
241
 * webkit_user_content_manager_unregister_script_message_handler:
242
 * @manager: A #WebKitUserContentManager
243
 * @name: Name of the script message channel
244
 *
245
 * Unregisters a previously registered message handler.
246
 *
247
 * Note that this does *not* disconnect handlers for the
248
 * #WebKitUserContentManager::script-message-received signal,
249
 * they will be kept connected, but the signal will not be emitted
250
 * unless the handler name is registered again.
251
 *
252
 * See also webkit_user_content_manager_register_script_message_handler()
253
 *
254
 * Since: 2.8
255
 */
256
void webkit_user_content_manager_unregister_script_message_handler(WebKitUserContentManager* manager, const char* name)
257
{
258
    g_return_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager));
259
    g_return_if_fail(name);
260
    manager->priv->userContentController->removeUserMessageHandlerForName(String::fromUTF8(name));
261
}
262
144
WebUserContentControllerProxy* webkitUserContentManagerGetUserContentControllerProxy(WebKitUserContentManager* manager)
263
WebUserContentControllerProxy* webkitUserContentManagerGetUserContentControllerProxy(WebKitUserContentManager* manager)
145
{
264
{
146
    return manager->priv->userContentController.get();
265
    return manager->priv->userContentController.get();
- a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h -5 / +12 lines
Lines 60-75 struct _WebKitUserContentManagerClass { a/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h_sec1
60
60
61
61
62
WEBKIT_API GType
62
WEBKIT_API GType
63
webkit_user_content_manager_get_type                (void);
63
webkit_user_content_manager_get_type                          (void);
64
64
65
WEBKIT_API WebKitUserContentManager *
65
WEBKIT_API WebKitUserContentManager *
66
webkit_user_content_manager_new                     (void);
66
webkit_user_content_manager_new                               (void);
67
67
68
WEBKIT_API void
68
WEBKIT_API void
69
webkit_user_content_manager_add_style_sheet         (WebKitUserContentManager *manager,
69
webkit_user_content_manager_add_style_sheet                   (WebKitUserContentManager *manager,
70
                                                     WebKitUserStyleSheet     *stylesheet);
70
                                                               WebKitUserStyleSheet     *stylesheet);
71
WEBKIT_API void
71
WEBKIT_API void
72
webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager);
72
webkit_user_content_manager_remove_all_style_sheets           (WebKitUserContentManager *manager);
73
74
WEBKIT_API gboolean
75
webkit_user_content_manager_register_script_message_handler   (WebKitUserContentManager *manager,
76
                                                               const gchar              *name);
77
WEBKIT_API void
78
webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager,
79
                                                               const gchar              *name);
73
80
74
WEBKIT_API void
81
WEBKIT_API void
75
webkit_user_content_manager_add_script              (WebKitUserContentManager *manager,
82
webkit_user_content_manager_add_script              (WebKitUserContentManager *manager,
- a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp -1 / +3 lines
Lines 57-62 a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp_sec1
57
#include "WebKitWebViewBasePrivate.h"
57
#include "WebKitWebViewBasePrivate.h"
58
#include "WebKitWebViewPrivate.h"
58
#include "WebKitWebViewPrivate.h"
59
#include "WebKitWindowPropertiesPrivate.h"
59
#include "WebKitWindowPropertiesPrivate.h"
60
#include "WebSerializedScriptValue.h"
60
#include <JavaScriptCore/APICast.h>
61
#include <JavaScriptCore/APICast.h>
61
#include <WebCore/CertificateInfo.h>
62
#include <WebCore/CertificateInfo.h>
62
#include <WebCore/DragIcon.h>
63
#include <WebCore/DragIcon.h>
Lines 2778-2784 static void webkitWebViewRunJavaScriptCallback(WebSerializedScriptValue* wkSeria a/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp_sec2
2778
    }
2779
    }
2779
2780
2780
    WebKitWebView* webView = WEBKIT_WEB_VIEW(g_task_get_source_object(task));
2781
    WebKitWebView* webView = WEBKIT_WEB_VIEW(g_task_get_source_object(task));
2781
    g_task_return_pointer(task, webkitJavascriptResultCreate(webView, wkSerializedScriptValue),
2782
    g_task_return_pointer(task, webkitJavascriptResultCreate(webView,
2783
        *static_cast<WebCore::SerializedScriptValue*>(wkSerializedScriptValue->internalRepresentation())),
2782
        reinterpret_cast<GDestroyNotify>(webkit_javascript_result_unref));
2784
        reinterpret_cast<GDestroyNotify>(webkit_javascript_result_unref));
2783
}
2785
}
2784
2786
- a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt +2 lines
Lines 106-111 webkit_user_content_manager_add_style_sheet a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt_sec1
106
webkit_user_content_manager_remove_all_style_sheets
106
webkit_user_content_manager_remove_all_style_sheets
107
webkit_user_content_manager_add_script
107
webkit_user_content_manager_add_script
108
webkit_user_content_manager_remove_all_scripts
108
webkit_user_content_manager_remove_all_scripts
109
webkit_user_content_manager_register_script_message_handler
110
webkit_user_content_manager_unregister_script_message_handler
109
111
110
<SUBSECTION Standard>
112
<SUBSECTION Standard>
111
WEBKIT_IS_USER_CONTENT_MANAGER
113
WEBKIT_IS_USER_CONTENT_MANAGER
- a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types +1 lines
Lines 27-29 webkit_authentication_request_get_type a/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types_sec1
27
webkit_credential_get_type
27
webkit_credential_get_type
28
webkit_frame_get_type
28
webkit_frame_get_type
29
webkit_certificate_info_get_type
29
webkit_certificate_info_get_type
30
webkit_user_content_manager_get_type
- a/Source/cmake/OptionsGTK.cmake +1 lines
Lines 145-150 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SUBTLE_CRYPTO OFF) a/Source/cmake/OptionsGTK.cmake_sec1
145
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TEMPLATE_ELEMENT ON)
145
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TEMPLATE_ELEMENT ON)
146
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS ON)
146
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS ON)
147
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USERSELECT_ALL ON)
147
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USERSELECT_ALL ON)
148
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USER_MESSAGE_HANDLERS ON)
148
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIBRATION OFF)
149
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIBRATION OFF)
149
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO ON)
150
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO ON)
150
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO_TRACK ON)
151
WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO_TRACK ON)
- a/Source/cmake/WebKitFeatures.cmake +1 lines
Lines 132-137 macro(WEBKIT_OPTION_BEGIN) a/Source/cmake/WebKitFeatures.cmake_sec1
132
    WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_SLIDER "Toggle Touch Slider support" OFF)
132
    WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_SLIDER "Toggle Touch Slider support" OFF)
133
    WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_ICON_LOADING "Toggle Touch Icon Loading Support" OFF)
133
    WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_ICON_LOADING "Toggle Touch Icon Loading Support" OFF)
134
    WEBKIT_OPTION_DEFINE(ENABLE_USERSELECT_ALL "Toggle user-select:all support" OFF)
134
    WEBKIT_OPTION_DEFINE(ENABLE_USERSELECT_ALL "Toggle user-select:all support" OFF)
135
    WEBKIT_OPTION_DEFINE(ENABLE_USER_MESSAGE_HANDLERS "Toggle user script message handler support" OFF)
135
    WEBKIT_OPTION_DEFINE(ENABLE_USER_TIMING "Toggle User Timing support" OFF)
136
    WEBKIT_OPTION_DEFINE(ENABLE_USER_TIMING "Toggle User Timing support" OFF)
136
    WEBKIT_OPTION_DEFINE(ENABLE_VIBRATION "Toggle Vibration API support" OFF)
137
    WEBKIT_OPTION_DEFINE(ENABLE_VIBRATION "Toggle Vibration API support" OFF)
137
    WEBKIT_OPTION_DEFINE(ENABLE_VIDEO "Toggle Video support" OFF)
138
    WEBKIT_OPTION_DEFINE(ENABLE_VIDEO "Toggle Video support" OFF)
- a/Source/cmakeconfig.h.cmake +1 lines
Lines 120-125 a/Source/cmakeconfig.h.cmake_sec1
120
#cmakedefine01 ENABLE_TOUCH_SLIDER
120
#cmakedefine01 ENABLE_TOUCH_SLIDER
121
#cmakedefine01 ENABLE_TOUCH_ICON_LOADING
121
#cmakedefine01 ENABLE_TOUCH_ICON_LOADING
122
#cmakedefine01 ENABLE_USERSELECT_ALL
122
#cmakedefine01 ENABLE_USERSELECT_ALL
123
#cmakedefine01 ENABLE_USER_MESSAGE_HANDLERS
123
#cmakedefine01 ENABLE_USER_TIMING
124
#cmakedefine01 ENABLE_USER_TIMING
124
#cmakedefine01 ENABLE_VIBRATION
125
#cmakedefine01 ENABLE_VIBRATION
125
#cmakedefine01 ENABLE_VIDEO
126
#cmakedefine01 ENABLE_VIDEO
- a/Tools/ChangeLog +22 lines
Lines 1-3 a/Tools/ChangeLog_sec1
1
2014-10-28  Adrian Perez de Castro  <aperez@igalia.com>
2
3
        [GTK] Support script message handlers WebKitUserContentManager
4
        https://bugs.webkit.org/show_bug.cgi?id=133730
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Support user script message handlers in WebKitUserContentManager.
9
        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
10
        an option is added to the CMake build files. The option is disabled
11
        globally by default, and the WebKitGTK port enables it. On the API
12
        level, two new methods to register and unregister names are provided
13
        in the "window.webkit" namespace, and on message reception the
14
        "WebKitUserContentManager::script-message-received" signal is
15
        emitted, using the registered names as signal detail.
16
17
        * TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp:
18
        Add test case for user script message handlers.
19
        (scriptMessageReceived):
20
        (testUserContentManagerScriptMessageReceived):
21
        (beforeAll):
22
1
2014-10-24  Dan Bernstein  <mitz@apple.com>
23
2014-10-24  Dan Bernstein  <mitz@apple.com>
2
24
3
        build.webkit.org/dashboard immediately retries a request to buildbot when the response is 404
25
        build.webkit.org/dashboard immediately retries a request to buildbot when the response is 404
- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp -1 / +134 lines
Lines 1-5 a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp_sec1
1
/*
1
/*
2
 * Copyright (C) 2013 Igalia S.L.
2
 * Copyright (C) 2013-2014 Igalia S.L.
3
 *
3
 *
4
 * This library is free software; you can redistribute it and/or
4
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
5
 * modify it under the terms of the GNU Lesser General Public
Lines 25-30 a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp_sec2
25
#include <gtk/gtk.h>
25
#include <gtk/gtk.h>
26
#include <webkit2/webkit2.h>
26
#include <webkit2/webkit2.h>
27
#include <wtf/gobject/GRefPtr.h>
27
#include <wtf/gobject/GRefPtr.h>
28
#include <wtf/gobject/GUniquePtr.h>
28
29
29
class UserContentManagerTest : public WebViewTest {
30
class UserContentManagerTest : public WebViewTest {
30
public:
31
public:
Lines 212-217 static void testUserContentManagerInjectedScript(UserContentManagerTest* test, g a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp_sec3
212
    removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist);
213
    removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist);
213
}
214
}
214
215
216
class UserScriptMessageTest : public UserContentManagerTest {
217
public:
218
    MAKE_GLIB_TEST_FIXTURE(UserScriptMessageTest);
219
220
    UserScriptMessageTest()
221
        : UserContentManagerTest()
222
        , m_userScriptMessage(nullptr)
223
    {
224
    }
225
226
    ~UserScriptMessageTest()
227
    {
228
    }
229
230
    bool registerHandler(const char* handlerName)
231
    {
232
        return webkit_user_content_manager_register_script_message_handler(m_userContentManager.get(), handlerName);
233
    }
234
235
    void unregisterHandler(const char* handlerName)
236
    {
237
        webkit_user_content_manager_unregister_script_message_handler(m_userContentManager.get(), handlerName);
238
    }
239
240
    static void scriptMessageReceived(WebKitUserContentManager* userContentManager, WebKitJavascriptResult* jsResult, UserScriptMessageTest* test)
241
    {
242
        g_signal_handlers_disconnect_by_func(userContentManager, reinterpret_cast<gpointer>(scriptMessageReceived), test);
243
        g_main_loop_quit(test->m_mainLoop);
244
245
        g_assert(!test->m_userScriptMessage);
246
        test->m_userScriptMessage = webkit_javascript_result_ref(jsResult);
247
    }
248
249
    WebKitJavascriptResult* postMessageAndWaitUntilReceived(const char* handlerName, const char* javascriptValueAsText)
250
    {
251
        if (m_userScriptMessage) {
252
            webkit_javascript_result_unref(m_userScriptMessage);
253
            m_userScriptMessage = nullptr;
254
        }
255
256
        GUniquePtr<char> signalName(g_strdup_printf("script-message-received::%s", handlerName));
257
        g_signal_connect(m_userContentManager.get(), signalName.get(), G_CALLBACK(scriptMessageReceived), this);
258
259
        GUniquePtr<char> javascriptSnippet(g_strdup_printf("window.webkit.messageHandlers.%s.postMessage(%s);", handlerName, javascriptValueAsText));
260
        webkit_web_view_run_javascript(m_webView, javascriptSnippet.get(), nullptr, nullptr, nullptr);
261
        g_main_loop_run(m_mainLoop);
262
263
        g_assert(m_userScriptMessage);
264
        WebKitJavascriptResult* result = m_userScriptMessage;
265
        m_userScriptMessage = nullptr;
266
        return result;
267
    }
268
269
private:
270
    WebKitJavascriptResult* m_userScriptMessage;
271
};
272
273
static void testUserContentManagerScriptMessageReceived(UserScriptMessageTest* test, gconstpointer)
274
{
275
    g_assert(test->registerHandler("msg"));
276
277
    // Trying to register the same handler a second time must fail
278
    g_assert(!test->registerHandler("msg"));
279
280
    test->loadHtml("<html></html>", nullptr);
281
    test->waitUntilLoadFinished();
282
283
    // Check that the "window.webkit.messageHandlers" namespace exists
284
    GUniqueOutPtr<GError> error;
285
    WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.messageHandlers ? 'y' : 'n';", &error.outPtr());
286
    g_assert(javascriptResult);
287
    g_assert(!error.get());
288
    GUniquePtr<char> valueString(WebViewTest::javascriptResultToCString(javascriptResult));
289
    g_assert_cmpstr(valueString.get(), ==, "y");
290
291
    // Check that the "document.webkit.messageHandlers.msg" namespace exists
292
    javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.messageHandlers.msg ? 'y' : 'n';", &error.outPtr());
293
    g_assert(javascriptResult);
294
    g_assert(!error.get());
295
    valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult));
296
    g_assert_cmpstr(valueString.get(), ==, "y");
297
298
    WebKitJavascriptResult* message = test->postMessageAndWaitUntilReceived("msg", "'user message'");
299
    valueString.reset(WebViewTest::javascriptResultToCString(message));
300
    webkit_javascript_result_unref(message);
301
    g_assert_cmpstr(valueString.get(), ==, "user message");
302
303
    // Messages should arrive despite of other handlers being registered
304
    g_assert(test->registerHandler("anotherHandler"));
305
306
    // Check that the "document.webkit.messageHandlers.msg" namespace still exists
307
    javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.messageHandlers.msg ? 'y' : 'n';", &error.outPtr());
308
    g_assert(javascriptResult);
309
    g_assert(!error.get());
310
    valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult));
311
    g_assert_cmpstr(valueString.get(), ==, "y");
312
313
    // Check that the "document.webkit.messageHandlers.anotherHandler" namespace exists
314
    javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.messageHandlers.anotherHandler ? 'y' : 'n';", &error.outPtr());
315
    g_assert(javascriptResult);
316
    g_assert(!error.get());
317
    valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult));
318
    g_assert_cmpstr(valueString.get(), ==, "y");
319
320
    message = test->postMessageAndWaitUntilReceived("msg", "'handler: msg'");
321
    valueString.reset(WebViewTest::javascriptResultToCString(message));
322
    webkit_javascript_result_unref(message);
323
    g_assert_cmpstr(valueString.get(), ==, "handler: msg");
324
325
    message = test->postMessageAndWaitUntilReceived("anotherHandler", "'handler: anotherHandler'");
326
    valueString.reset(WebViewTest::javascriptResultToCString(message));
327
    webkit_javascript_result_unref(message);
328
    g_assert_cmpstr(valueString.get(), ==, "handler: anotherHandler");
329
330
    // Unregistering a handler and re-registering again under the same name should work.
331
    // TODO Enable after https://bugs.webkit.org/show_bug.cgi?id=138142 gets fixed.
332
#if 0
333
    test->unregisterHandler("msg");
334
    javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.messageHandlers.msg.postMessage('42');", &error.outPtr());
335
    g_assert(!javascriptResult);
336
    g_assert(error.get());
337
338
    // Re-registering a handler that has been unregistered must work
339
    g_assert(test->registerHandler("msg"));
340
    message = test->postMessageAndWaitUntilReceived("msg", "'handler: msg'");
341
    valueString.reset(WebViewTest::javascriptResultToCString(message));
342
    webkit_javascript_result_unref(message);
343
    g_assert_cmpstr(valueString.get(), ==, "handler: msg");
344
#endif
345
}
346
215
static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
347
static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
216
{
348
{
217
    soup_message_set_status(message, SOUP_STATUS_OK);
349
    soup_message_set_status(message, SOUP_STATUS_OK);
Lines 227-232 void beforeAll() a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp_sec4
227
    Test::add("WebKitWebView", "new-with-user-content-manager", testWebViewNewWithUserContentManager);
359
    Test::add("WebKitWebView", "new-with-user-content-manager", testWebViewNewWithUserContentManager);
228
    UserContentManagerTest::add("WebKitUserContentManager", "injected-style-sheet", testUserContentManagerInjectedStyleSheet);
360
    UserContentManagerTest::add("WebKitUserContentManager", "injected-style-sheet", testUserContentManagerInjectedStyleSheet);
229
    UserContentManagerTest::add("WebKitUserContentManager", "injected-script", testUserContentManagerInjectedScript);
361
    UserContentManagerTest::add("WebKitUserContentManager", "injected-script", testUserContentManagerInjectedScript);
362
    UserScriptMessageTest::add("WebKitUserContentManager", "script-message-received", testUserContentManagerScriptMessageReceived);
230
}
363
}
231
364
232
void afterAll()
365
void afterAll()
- a/ChangeLog +21 lines
Lines 1-3 a/ChangeLog_sec1
1
2014-10-28  Adrian Perez de Castro  <aperez@igalia.com>
2
3
        [GTK] Support script message handlers WebKitUserContentManager
4
        https://bugs.webkit.org/show_bug.cgi?id=133730
5
6
        Reviewed by NOBODY (OOPS!).
7
8
        Support user script message handlers in WebKitUserContentManager.
9
        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
10
        an option is added to the CMake build files. The option is disabled
11
        globally by default, and the WebKitGTK port enables it. On the API
12
        level, two new methods to register and unregister names are provided
13
        in the "window.webkit" namespace, and on message reception the
14
        "WebKitUserContentManager::script-message-received" signal is
15
        emitted, using the registered names as signal detail.
16
17
        * Source/cmake/OptionsGTK.cmake: For the GTK port, enable the
18
        ENABLE_USER_MESSAGE_HANDLERS feature by default.
19
        * Source/cmake/WebKitFeatures.cmake: Add feature description for
20
        ENABLE_USER_MESSAGE_HANDLERS, disabled by default.
21
1
2014-10-21  Ryuan Choi  <ryuan.choi@gmail.com>
22
2014-10-21  Ryuan Choi  <ryuan.choi@gmail.com>
2
23
3
        [EFL] Remove unnecessary ENABLE_3D_RENDERING definition from OptionsEfl.cmake
24
        [EFL] Remove unnecessary ENABLE_3D_RENDERING definition from OptionsEfl.cmake

Return to Bug 133730