[WPE] User script messages don't work
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Jun 2017 11:11:22 +0000 (11:11 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Jun 2017 11:11:22 +0000 (11:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173712

Reviewed by Žan Doberšek.

.:

Enable user script messages.

* Source/cmake/OptionsWPE.cmake:

Source/WebKit2:

When a user script message is received we need to create a WebKitJavascriptResult to deserialize the script
value. WebKitJavascriptResult is created with a WebKitWebView for two reasons: to get its JavaScript global
context and to take a reference that ensures the JavaScript context will be alive while the results is
alive. However, we could create the WebKitJavascriptResult with the JavaScript global context and take a
reference of the context itself. This way we don't need to access the WebKitWebView from the
WebScriptMessageHandler client. But we still need access to the JavaScript context, so I've added a
javascriptGlobalContext() method to WebPageProxy for GTK+ and WPE that is implemented from the page client.

Fixes /wpe/WebKitUserContentManager/script-message-received.

* UIProcess/API/glib/WebKitJavascriptResult.cpp:
(_WebKitJavascriptResult::_WebKitJavascriptResult): Create the WebKitJavascriptResult with a JSGlobalContextRef
instead of a WEbKitWebView.
(webkitJavascriptResultCreate): Pass the js context to the constructor.
(webkit_javascript_result_get_global_context): Return the js context.
* UIProcess/API/glib/WebKitJavascriptResultPrivate.h:
* UIProcess/API/glib/WebKitUserContentManager.cpp:
* UIProcess/API/glib/WebKitWebView.cpp:
(_WebKitWebViewPrivate::~_WebKitWebViewPrivate): Use JSRetainPtr
(webkit_web_view_get_javascript_global_context):
(webkitWebViewRunJavaScriptCallback):
* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::javascriptGlobalContext):
* UIProcess/API/gtk/PageClientImpl.h:
* UIProcess/API/wpe/APIViewClient.h:
(API::ViewClient::javascriptGlobalContext):
* UIProcess/API/wpe/PageClientImpl.cpp:
(WebKit::PageClientImpl::javascriptGlobalContext):
* UIProcess/API/wpe/PageClientImpl.h:
* UIProcess/API/wpe/WPEView.cpp:
(WKWPE::View::javascriptGlobalContext):
* UIProcess/API/wpe/WPEView.h:
* UIProcess/PageClient.h:
(WebKit::PageClient::javascriptGlobalContext):
* UIProcess/WebPageProxy.h:
* UIProcess/gtk/WebPageProxyGtk.cpp:
(WebKit::WebPageProxy::javascriptGlobalContext):
* UIProcess/wpe/WebPageProxyWPE.cpp:
(WebKit::WebPageProxy::javascriptGlobalContext):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@218740 268f45cc-cd09-0410-ab3c-d52691b4dbfc

18 files changed:
ChangeLog
Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/API/glib/WebKitJavascriptResult.cpp
Source/WebKit2/UIProcess/API/glib/WebKitJavascriptResultPrivate.h
Source/WebKit2/UIProcess/API/glib/WebKitUserContentManager.cpp
Source/WebKit2/UIProcess/API/glib/WebKitWebView.cpp
Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp
Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h
Source/WebKit2/UIProcess/API/wpe/APIViewClient.h
Source/WebKit2/UIProcess/API/wpe/PageClientImpl.cpp
Source/WebKit2/UIProcess/API/wpe/PageClientImpl.h
Source/WebKit2/UIProcess/API/wpe/WPEView.cpp
Source/WebKit2/UIProcess/API/wpe/WPEView.h
Source/WebKit2/UIProcess/PageClient.h
Source/WebKit2/UIProcess/WebPageProxy.h
Source/WebKit2/UIProcess/gtk/WebPageProxyGtk.cpp
Source/WebKit2/UIProcess/wpe/WebPageProxyWPE.cpp
Source/cmake/OptionsWPE.cmake

index e793836..e58d52f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2017-06-23  Carlos Garcia Campos  <cgarcia@igalia.com>
 
+        [WPE] User script messages don't work
+        https://bugs.webkit.org/show_bug.cgi?id=173712
+
+        Reviewed by Žan Doberšek.
+
+        Enable user script messages.
+
+        * Source/cmake/OptionsWPE.cmake:
+
+2017-06-23  Carlos Garcia Campos  <cgarcia@igalia.com>
+
         [WPE] Enable PUBLIC_SUFFIX_LIST
         https://bugs.webkit.org/show_bug.cgi?id=173758
 
index 5353af0..876ab8b 100644 (file)
@@ -1,3 +1,50 @@
+2017-06-23  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [WPE] User script messages don't work
+        https://bugs.webkit.org/show_bug.cgi?id=173712
+
+        Reviewed by Žan Doberšek.
+
+        When a user script message is received we need to create a WebKitJavascriptResult to deserialize the script
+        value. WebKitJavascriptResult is created with a WebKitWebView for two reasons: to get its JavaScript global
+        context and to take a reference that ensures the JavaScript context will be alive while the results is
+        alive. However, we could create the WebKitJavascriptResult with the JavaScript global context and take a
+        reference of the context itself. This way we don't need to access the WebKitWebView from the
+        WebScriptMessageHandler client. But we still need access to the JavaScript context, so I've added a
+        javascriptGlobalContext() method to WebPageProxy for GTK+ and WPE that is implemented from the page client.
+
+        Fixes /wpe/WebKitUserContentManager/script-message-received.
+
+        * UIProcess/API/glib/WebKitJavascriptResult.cpp:
+        (_WebKitJavascriptResult::_WebKitJavascriptResult): Create the WebKitJavascriptResult with a JSGlobalContextRef
+        instead of a WEbKitWebView.
+        (webkitJavascriptResultCreate): Pass the js context to the constructor.
+        (webkit_javascript_result_get_global_context): Return the js context.
+        * UIProcess/API/glib/WebKitJavascriptResultPrivate.h:
+        * UIProcess/API/glib/WebKitUserContentManager.cpp:
+        * UIProcess/API/glib/WebKitWebView.cpp:
+        (_WebKitWebViewPrivate::~_WebKitWebViewPrivate): Use JSRetainPtr
+        (webkit_web_view_get_javascript_global_context):
+        (webkitWebViewRunJavaScriptCallback):
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::javascriptGlobalContext):
+        * UIProcess/API/gtk/PageClientImpl.h:
+        * UIProcess/API/wpe/APIViewClient.h:
+        (API::ViewClient::javascriptGlobalContext):
+        * UIProcess/API/wpe/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::javascriptGlobalContext):
+        * UIProcess/API/wpe/PageClientImpl.h:
+        * UIProcess/API/wpe/WPEView.cpp:
+        (WKWPE::View::javascriptGlobalContext):
+        * UIProcess/API/wpe/WPEView.h:
+        * UIProcess/PageClient.h:
+        (WebKit::PageClient::javascriptGlobalContext):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/gtk/WebPageProxyGtk.cpp:
+        (WebKit::WebPageProxy::javascriptGlobalContext):
+        * UIProcess/wpe/WebPageProxyWPE.cpp:
+        (WebKit::WebPageProxy::javascriptGlobalContext):
+
 2017-06-22  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         [iOS DnD] [WK2] Enable in-app dragging from WKWebView on the phone
index 065a3b4..010805c 100644 (file)
 
 #include "APISerializedScriptValue.h"
 #include "WebKitJavascriptResultPrivate.h"
+#include <JavaScriptCore/JSRetainPtr.h>
 #include <wtf/glib/GRefPtr.h>
 
 struct _WebKitJavascriptResult {
-    _WebKitJavascriptResult(WebKitWebView* view, WebCore::SerializedScriptValue& serializedScriptValue)
-        : webView(view)
+    _WebKitJavascriptResult(JSGlobalContextRef jsContext, WebCore::SerializedScriptValue& serializedScriptValue)
+        : javascriptGlobalContext(jsContext)
         , referenceCount(1)
     {
-        value = serializedScriptValue.deserialize(webkit_web_view_get_javascript_global_context(view), nullptr);
+        value = serializedScriptValue.deserialize(javascriptGlobalContext.get(), nullptr);
     }
 
-    GRefPtr<WebKitWebView> webView;
+    JSRetainPtr<JSGlobalContextRef> javascriptGlobalContext;
     JSValueRef value;
 
     int referenceCount;
@@ -40,10 +41,10 @@ struct _WebKitJavascriptResult {
 
 G_DEFINE_BOXED_TYPE(WebKitJavascriptResult, webkit_javascript_result, webkit_javascript_result_ref, webkit_javascript_result_unref)
 
-WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WebCore::SerializedScriptValue& serializedScriptValue)
+WebKitJavascriptResult* webkitJavascriptResultCreate(JSGlobalContextRef javascriptGlobalContext, WebCore::SerializedScriptValue& serializedScriptValue)
 {
     WebKitJavascriptResult* result = static_cast<WebKitJavascriptResult*>(fastMalloc(sizeof(WebKitJavascriptResult)));
-    new (result) WebKitJavascriptResult(webView, serializedScriptValue);
+    new (result) WebKitJavascriptResult(javascriptGlobalContext, serializedScriptValue);
     return result;
 }
 
@@ -90,7 +91,7 @@ void webkit_javascript_result_unref(WebKitJavascriptResult* javascriptResult)
  */
 JSGlobalContextRef webkit_javascript_result_get_global_context(WebKitJavascriptResult* javascriptResult)
 {
-    return webkit_web_view_get_javascript_global_context(javascriptResult->webView.get());
+    return javascriptResult->javascriptGlobalContext.get();
 }
 
 /**
index 9a829c7..e753fb2 100644 (file)
@@ -21,6 +21,5 @@
 
 #include <WebCore/SerializedScriptValue.h>
 #include "WebKitJavascriptResult.h"
-#include "WebKitWebView.h"
 
-WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebCore::SerializedScriptValue&);
+WebKitJavascriptResult* webkitJavascriptResultCreate(JSGlobalContextRef, WebCore::SerializedScriptValue&);
index 31d4f84..2283260 100644 (file)
 #include <wtf/glib/GRefPtr.h>
 #include <wtf/glib/WTFGType.h>
 
+#if PLATFORM(WPE)
+#include "WPEView.h"
+#endif
+
 using namespace WebCore;
 using namespace WebKit;
 
@@ -186,13 +190,9 @@ public:
 
     void didPostMessage(WebPageProxy& page, const FrameInfoData&, WebCore::SerializedScriptValue& serializedScriptValue) override
     {
-#if PLATFORM(GTK)
-        WebKitJavascriptResult* jsResult = webkitJavascriptResultCreate(WEBKIT_WEB_VIEW(page.viewWidget()), serializedScriptValue);
+        WebKitJavascriptResult* jsResult = webkitJavascriptResultCreate(page.javascriptGlobalContext(), serializedScriptValue);
         g_signal_emit(m_manager, signals[SCRIPT_MESSAGE_RECEIVED], m_handlerName, jsResult);
         webkit_javascript_result_unref(jsResult);
-#else
-        // FIXME: We need a way to get the WebKitWebView here in WPE.
-#endif
     }
 
     virtual ~ScriptMessageClientGtk() { }
index 29ffb04..31f38f4 100644 (file)
@@ -59,6 +59,7 @@
 #include "WebKitWebsiteDataManagerPrivate.h"
 #include "WebKitWindowPropertiesPrivate.h"
 #include <JavaScriptCore/APICast.h>
+#include <JavaScriptCore/JSRetainPtr.h>
 #include <WebCore/CertificateInfo.h>
 #include <WebCore/GUniquePtrSoup.h>
 #include <WebCore/JSDOMExceptionHandling.h>
@@ -180,9 +181,6 @@ class PageLoadStateObserver;
 struct _WebKitWebViewPrivate {
     ~_WebKitWebViewPrivate()
     {
-        if (javascriptGlobalContext)
-            JSGlobalContextRelease(javascriptGlobalContext);
-
         // For modal dialogs, make sure the main loop is stopped when finalizing the webView.
         if (modalLoop && g_main_loop_is_running(modalLoop.get()))
             g_main_loop_quit(modalLoop.get());
@@ -215,7 +213,7 @@ struct _WebKitWebViewPrivate {
     WebEvent::Modifiers mouseTargetModifiers;
 
     GRefPtr<WebKitFindController> findController;
-    JSGlobalContextRef javascriptGlobalContext;
+    JSRetainPtr<JSGlobalContextRef> javascriptGlobalContext;
 
     GRefPtr<WebKitWebResource> mainResource;
     LoadingResourcesMap loadingResourcesMap;
@@ -350,6 +348,11 @@ private:
         webkitWebViewHandleDownloadRequest(m_webView, &downloadProxy);
     }
 
+    JSGlobalContextRef javascriptGlobalContext() override
+    {
+        return webkit_web_view_get_javascript_global_context(m_webView);
+    }
+
     WebKitWebView* m_webView;
 };
 #endif
@@ -3069,11 +3072,11 @@ WebKitFindController* webkit_web_view_get_find_controller(WebKitWebView* webView
  */
 JSGlobalContextRef webkit_web_view_get_javascript_global_context(WebKitWebView* webView)
 {
-    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
+    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), nullptr);
 
     if (!webView->priv->javascriptGlobalContext)
-        webView->priv->javascriptGlobalContext = JSGlobalContextCreate(0);
-    return webView->priv->javascriptGlobalContext;
+        webView->priv->javascriptGlobalContext = adopt(JSGlobalContextCreate(nullptr));
+    return webView->priv->javascriptGlobalContext.get();
 }
 
 static void webkitWebViewRunJavaScriptCallback(API::SerializedScriptValue* wkSerializedScriptValue, const WebCore::ExceptionDetails& exceptionDetails, GTask* task)
@@ -3101,8 +3104,8 @@ static void webkitWebViewRunJavaScriptCallback(API::SerializedScriptValue* wkSer
         return;
     }
 
-    WebKitWebView* webView = WEBKIT_WEB_VIEW(g_task_get_source_object(task));
-    g_task_return_pointer(task, webkitJavascriptResultCreate(webView,
+    auto* jsContext = webkit_web_view_get_javascript_global_context(WEBKIT_WEB_VIEW(g_task_get_source_object(task)));
+    g_task_return_pointer(task, webkitJavascriptResultCreate(jsContext,
         *wkSerializedScriptValue->internalRepresentation()),
         reinterpret_cast<GDestroyNotify>(webkit_javascript_result_unref));
 }
index 83b39a6..2293cb2 100644 (file)
@@ -468,4 +468,12 @@ bool PageClientImpl::decidePolicyForInstallMissingMediaPluginsPermissionRequest(
 }
 #endif
 
+JSGlobalContextRef PageClientImpl::javascriptGlobalContext()
+{
+    if (!WEBKIT_IS_WEB_VIEW(m_viewWidget))
+        return nullptr;
+
+    return webkit_web_view_get_javascript_global_context(WEBKIT_WEB_VIEW(m_viewWidget));
+}
+
 } // namespace WebKit
index 88ee6e0..979979e 100644 (file)
@@ -148,6 +148,8 @@ private:
 
     void didChangeAvoidsUnsafeArea(bool) override { }
 
+    JSGlobalContextRef javascriptGlobalContext() override;
+
     // Members of PageClientImpl class
     GtkWidget* m_viewWidget;
     DefaultUndoController m_undoController;
index 09af969..ed5a9e3 100644 (file)
@@ -25,6 +25,8 @@
 
 #pragma once
 
+typedef struct OpaqueJSContext* JSGlobalContextRef;
+
 namespace WebKit {
 class DownloadProxy;
 }
@@ -41,6 +43,7 @@ public:
 
     virtual void frameDisplayed(WKWPE::View&) { }
     virtual void handleDownloadRequest(WKWPE::View&, WebKit::DownloadProxy&) { }
+    virtual JSGlobalContextRef javascriptGlobalContext() { return nullptr; }
 };
 
 } // namespace API
index 0eaee89..e9b6b47 100644 (file)
@@ -320,4 +320,9 @@ WebCore::UserInterfaceLayoutDirection PageClientImpl::userInterfaceLayoutDirecti
     return WebCore::UserInterfaceLayoutDirection::LTR;
 }
 
+JSGlobalContextRef PageClientImpl::javascriptGlobalContext()
+{
+    return m_view.javascriptGlobalContext();
+}
+
 } // namespace WebKit
index e07d29a..1f9e961 100644 (file)
@@ -119,6 +119,8 @@ private:
 
     void didChangeAvoidsUnsafeArea(bool) override { }
 
+    JSGlobalContextRef javascriptGlobalContext() override;
+
     WKWPE::View& m_view;
 
     std::unique_ptr<ScrollGestureController> m_scrollGestureController;
index 94bb5ca..608c369 100644 (file)
@@ -35,6 +35,7 @@
 #include "NativeWebWheelEvent.h"
 #include "WebPageGroup.h"
 #include "WebProcessPool.h"
+#include <JavaScriptCore/JSBase.h>
 #include <wpe/view-backend.h>
 
 using namespace WebKit;
@@ -150,6 +151,11 @@ void View::handleDownloadRequest(DownloadProxy& download)
     m_client->handleDownloadRequest(*this, download);
 }
 
+JSGlobalContextRef View::javascriptGlobalContext()
+{
+    return m_client->javascriptGlobalContext();
+}
+
 void View::setSize(const WebCore::IntSize& size)
 {
     m_size = size;
index 9305b26..ff82fbe 100644 (file)
@@ -33,6 +33,7 @@
 #include <memory>
 #include <wtf/RefPtr.h>
 
+typedef struct OpaqueJSContext* JSGlobalContextRef;
 struct wpe_view_backend;
 
 namespace API {
@@ -59,6 +60,7 @@ public:
     void setClient(std::unique_ptr<API::ViewClient>&&);
     void frameDisplayed();
     void handleDownloadRequest(WebKit::DownloadProxy&);
+    JSGlobalContextRef javascriptGlobalContext();
 
     WebKit::WebPageProxy& page() { return *m_pageProxy; }
 
index eddbb16..1c9b046 100644 (file)
@@ -379,6 +379,10 @@ public:
 #endif
 
     virtual void didChangeAvoidsUnsafeArea(bool avoidsUnsafeArea) = 0;
+
+#if PLATFORM(GTK) || PLATFORM(WPE)
+    virtual JSGlobalContextRef javascriptGlobalContext() { return nullptr; }
+#endif
 };
 
 } // namespace WebKit
index c253cc4..e015192 100644 (file)
@@ -177,6 +177,10 @@ using FloatBoxExtent = BoxExtent<float>;
 typedef GtkWidget* PlatformWidget;
 #endif
 
+#if PLATFORM(GTK) || PLATFORM(WPE)
+typedef struct OpaqueJSContext* JSGlobalContextRef;
+#endif
+
 namespace WebKit {
 class CertificateInfo;
 class DrawingAreaProxy;
@@ -630,6 +634,10 @@ public:
     void setBackgroundColor(const WebCore::Color& color) { m_backgroundColor = color; }
 #endif
 
+#if PLATFORM(GTK) || PLATFORM(WPE)
+    JSGlobalContextRef javascriptGlobalContext();
+#endif
+
     void handleMouseEvent(const NativeWebMouseEvent&);
     void handleWheelEvent(const NativeWebWheelEvent&);
     void handleKeyboardEvent(const NativeWebKeyboardEvent&);
index 618109d..cc1db54 100644 (file)
@@ -50,6 +50,11 @@ GtkWidget* WebPageProxy::viewWidget()
     return static_cast<PageClientImpl&>(m_pageClient).viewWidget();
 }
 
+JSGlobalContextRef WebPageProxy::javascriptGlobalContext()
+{
+    return m_pageClient.javascriptGlobalContext();
+}
+
 String WebPageProxy::standardUserAgent(const String& applicationNameForUserAgent)
 {
     return WebCore::standardUserAgent(applicationNameForUserAgent);
index 4a202ab..3d2765b 100644 (file)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "WebPageProxy.h"
 
+#include "PageClientImpl.h"
 #include "WebsiteDataStore.h"
 #include <WebCore/NotImplemented.h>
 
@@ -36,6 +37,11 @@ void WebPageProxy::platformInitialize()
     notImplemented();
 }
 
+JSGlobalContextRef WebPageProxy::javascriptGlobalContext()
+{
+    return m_pageClient.javascriptGlobalContext();
+}
+
 String WebPageProxy::standardUserAgent(const String&)
 {
     return "Mozilla/5.0 (Linux; x86_64 GNU/Linux) AppleWebKit/601.1 (KHTML, like Gecko) Version/8.0 Safari/601.1";
index 8afc664..d363046 100644 (file)
@@ -29,6 +29,7 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETSCAPE_PLUGIN_API PRIVATE OFF)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_PUBLIC_SUFFIX_LIST PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_REMOTE_INSPECTOR PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS PUBLIC ON)
+WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USER_MESSAGE_HANDLERS PRIVATE ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO PUBLIC ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO_TRACK PUBLIC ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIEW_MODE_CSS_MEDIA PUBLIC ON)