Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp (262481 => 262482)
--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp 2020-06-03 07:31:29 UTC (rev 262481)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitEmojiChooser.cpp 2020-06-03 09:12:00 UTC (rev 262482)
@@ -194,6 +194,8 @@
static void emojiActivated(GtkFlowBox* box, GtkFlowBoxChild* child, WebKitEmojiChooser* chooser)
{
+ gtk_popover_popdown(GTK_POPOVER(chooser));
+
GtkWidget* label = gtk_bin_get_child(GTK_BIN(gtk_bin_get_child(GTK_BIN(child))));
GUniquePtr<char> text(g_strdup(gtk_label_get_label(GTK_LABEL(label))));
@@ -201,8 +203,6 @@
auto modifier = static_cast<gunichar>(GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(child), "modifier")));
webkitEmojiChooserAddRecentItem(chooser, item, modifier);
g_signal_emit(chooser, signals[EMOJI_PICKED], 0, text.get());
-
- gtk_popover_popdown(GTK_POPOVER(chooser));
}
static bool emojiDataHasVariations(GVariant* emojiData)
Modified: trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp (262481 => 262482)
--- trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp 2020-06-03 07:31:29 UTC (rev 262481)
+++ trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp 2020-06-03 09:12:00 UTC (rev 262482)
@@ -225,11 +225,11 @@
struct _WebKitWebViewBasePrivate {
_WebKitWebViewBasePrivate()
: updateActivityStateTimer(RunLoop::main(), this, &_WebKitWebViewBasePrivate::updateActivityStateTimerFired)
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
, releaseEmojiChooserTimer(RunLoop::main(), this, &_WebKitWebViewBasePrivate::releaseEmojiChooserTimerFired)
#endif
{
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
releaseEmojiChooserTimer.setPriority(RunLoopSourcePriority::ReleaseUnusedResourcesTimer);
#endif
}
@@ -242,13 +242,17 @@
activityStateFlagsToUpdate = { };
}
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
void releaseEmojiChooserTimerFired()
{
+#if USE(GTK4)
+ g_clear_pointer(&emojiChooser, gtk_widget_unparent);
+#else
if (emojiChooser) {
gtk_widget_destroy(emojiChooser);
emojiChooser = nullptr;
}
+#endif
}
#endif
@@ -314,7 +318,7 @@
bool isBackForwardNavigationGestureEnabled { false };
#endif
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
GtkWidget* emojiChooser;
CompletionHandler<void(String)> emojiChooserCompletionHandler;
RunLoop::Timer<WebKitWebViewBasePrivate> releaseEmojiChooserTimer;
@@ -686,7 +690,7 @@
#endif
}
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
static void webkitWebViewBaseCompleteEmojiChooserRequest(WebKitWebViewBase* webView, const String& text)
{
if (auto completionHandler = std::exchange(webView->priv->emojiChooserCompletionHandler, nullptr))
@@ -702,6 +706,7 @@
webkitWebViewBaseRemoveWebInspector(webView, webView->priv->inspectorView);
if (auto* widget = webView->priv->keyBindingTranslator.widget())
gtk_widget_unparent(widget);
+ g_clear_pointer(&webView->priv->emojiChooser, gtk_widget_unparent);
#else
g_clear_pointer(&webView->priv->dialog, gtk_widget_destroy);
webkitWebViewBaseSetToplevelOnScreenWindow(webView, nullptr);
@@ -708,7 +713,7 @@
#endif
if (webView->priv->accessible)
webkitWebViewAccessibleSetWebView(WEBKIT_WEB_VIEW_ACCESSIBLE(webView->priv->accessible.get()), nullptr);
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
webkitWebViewBaseCompleteEmojiChooserRequest(webView, emptyString());
#endif
if (webView->priv->pointerLockManager) {
@@ -2377,7 +2382,7 @@
#endif
}
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
static void emojiChooserEmojiPicked(WebKitWebViewBase* webkitWebViewBase, const char* text)
{
webkitWebViewBaseCompleteEmojiChooserRequest(webkitWebViewBase, String::fromUTF8(text));
@@ -2385,7 +2390,11 @@
static void emojiChooserClosed(WebKitWebViewBase* webkitWebViewBase)
{
- webkitWebViewBaseCompleteEmojiChooserRequest(webkitWebViewBase, emptyString());
+ // The emoji chooser first closes the popover and then emits emoji-picked signal, so complete
+ // the request if the emoji isn't picked before the next run loop iteration.
+ RunLoop::main().dispatch([webViewBase = GRefPtr<WebKitWebViewBase>(webkitWebViewBase)] {
+ webkitWebViewBaseCompleteEmojiChooserRequest(webViewBase.get(), emptyString());
+ });
webkitWebViewBase->priv->releaseEmojiChooserTimer.startOneShot(2_min);
}
#endif
@@ -2392,15 +2401,20 @@
void webkitWebViewBaseShowEmojiChooser(WebKitWebViewBase* webkitWebViewBase, const IntRect& caretRect, CompletionHandler<void(String)>&& completionHandler)
{
-#if GTK_CHECK_VERSION(3, 24, 0) && !USE(GTK4)
+#if GTK_CHECK_VERSION(3, 24, 0)
WebKitWebViewBasePrivate* priv = webkitWebViewBase->priv;
priv->releaseEmojiChooserTimer.stop();
if (!priv->emojiChooser) {
+#if USE(GTK4)
+ priv->emojiChooser = gtk_emoji_chooser_new();
+ gtk_widget_set_parent(priv->emojiChooser, GTK_WIDGET(webkitWebViewBase));
+#else
priv->emojiChooser = webkitEmojiChooserNew();
+ gtk_popover_set_relative_to(GTK_POPOVER(priv->emojiChooser), GTK_WIDGET(webkitWebViewBase));
+#endif
g_signal_connect_swapped(priv->emojiChooser, "emoji-picked", G_CALLBACK(emojiChooserEmojiPicked), webkitWebViewBase);
g_signal_connect_swapped(priv->emojiChooser, "closed", G_CALLBACK(emojiChooserClosed), webkitWebViewBase);
- gtk_popover_set_relative_to(GTK_POPOVER(priv->emojiChooser), GTK_WIDGET(webkitWebViewBase));
}
priv->emojiChooserCompletionHandler = WTFMove(completionHandler);