Followup to r247439
https://bugs.webkit.org/show_bug.cgi?id=199788
<rdar://problem/52142570>
Reviewed by Tim Horton.
As it turns out, sending modern async completion-handler based IPC messages while processing incoming sync
messages results in a debug assertion. Instead of migrating FontAtSelection to the new async IPC mechanism,
restore the older CallbackID-based async IPC.
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::fontAtSelection):
(WebKit::WebPageProxy::fontAtSelectionCallback):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::fontAtSelection):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@247460 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog
index 770d317..77ed6be 100644
--- a/Source/WebKit/ChangeLog
+++ b/Source/WebKit/ChangeLog
@@ -1,3 +1,25 @@
+2019-07-15 Wenson Hsieh <wenson_hsieh@apple.com>
+
+ Followup to r247439
+ https://bugs.webkit.org/show_bug.cgi?id=199788
+ <rdar://problem/52142570>
+
+ Reviewed by Tim Horton.
+
+ As it turns out, sending modern async completion-handler based IPC messages while processing incoming sync
+ messages results in a debug assertion. Instead of migrating FontAtSelection to the new async IPC mechanism,
+ restore the older CallbackID-based async IPC.
+
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.messages.in:
+ * UIProcess/mac/WebPageProxyMac.mm:
+ (WebKit::WebPageProxy::fontAtSelection):
+ (WebKit::WebPageProxy::fontAtSelectionCallback):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+ * WebProcess/WebPage/mac/WebPageMac.mm:
+ (WebKit::WebPage::fontAtSelection):
+
2019-07-15 Dean Jackson <dino@apple.com>
[WebGL] Remove software rendering and simplify context creation on macOS
diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
index 8410992..c10a049 100644
--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm
@@ -2810,7 +2810,10 @@
if (!fontPanelIsVisible && !m_page->editorState().isContentRichlyEditable)
return;
- m_page->fontAtSelection([](const FontInfo& fontInfo, double fontSize, bool selectionHasMultipleFonts) {
+ m_page->fontAtSelection([](const FontInfo& fontInfo, double fontSize, bool selectionHasMultipleFonts, CallbackBase::Error error) {
+ if (error != CallbackBase::Error::None)
+ return;
+
NSDictionary *attributeDictionary = (__bridge NSDictionary *)fontInfo.fontAttributeDictionary.get();
if (!attributeDictionary)
return;
diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h
index c9ba8c3..ad24dc4 100644
--- a/Source/WebKit/UIProcess/WebPageProxy.h
+++ b/Source/WebKit/UIProcess/WebPageProxy.h
@@ -338,6 +338,7 @@
#if PLATFORM(MAC)
typedef GenericCallback<const AttributedString&, const EditingRange&> AttributedStringForCharacterRangeCallback;
+typedef GenericCallback<const FontInfo&, double, bool> FontAtSelectionCallback;
#endif
#if PLATFORM(IOS_FAMILY)
@@ -788,7 +789,7 @@
#if PLATFORM(MAC)
void insertDictatedTextAsync(const String& text, const EditingRange& replacementRange, const Vector<WebCore::TextAlternativeWithRange>& dictationAlternatives, bool registerUndoGroup);
void attributedSubstringForCharacterRangeAsync(const EditingRange&, WTF::Function<void (const AttributedString&, const EditingRange&, CallbackBase::Error)>&&);
- void fontAtSelection(Function<void(const FontInfo&, double, bool)>&&);
+ void fontAtSelection(Function<void(const FontInfo&, double, bool, CallbackBase::Error)>&&);
void startWindowDrag();
NSWindow *platformWindow();
@@ -1869,6 +1870,7 @@
void rectForCharacterRangeCallback(const WebCore::IntRect&, const EditingRange&, CallbackID);
#if PLATFORM(MAC)
void attributedStringForCharacterRangeCallback(const AttributedString&, const EditingRange&, CallbackID);
+ void fontAtSelectionCallback(const FontInfo&, double, bool, CallbackID);
#endif
#if PLATFORM(IOS_FAMILY)
void gestureCallback(const WebCore::IntPoint&, uint32_t gestureType, uint32_t gestureState, uint32_t flags, CallbackID);
diff --git a/Source/WebKit/UIProcess/WebPageProxy.messages.in b/Source/WebKit/UIProcess/WebPageProxy.messages.in
index ff053df5..dfbd167 100644
--- a/Source/WebKit/UIProcess/WebPageProxy.messages.in
+++ b/Source/WebKit/UIProcess/WebPageProxy.messages.in
@@ -180,6 +180,7 @@
#endif
#if PLATFORM(MAC)
AttributedStringForCharacterRangeCallback(struct WebKit::AttributedString string, struct WebKit::EditingRange actualRange, WebKit::CallbackID callbackID)
+ FontAtSelectionCallback(struct WebKit::FontInfo fontInfo, double fontSize, bool selectionHasMultipleFonts, WebKit::CallbackID callbackID)
#endif
FontAttributesCallback(struct WebCore::FontAttributes attributes, WebKit::CallbackID callbackID)
#if PLATFORM(IOS_FAMILY)
diff --git a/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm b/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
index 311ec34..c325678 100644
--- a/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
+++ b/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
@@ -241,13 +241,26 @@
callback->performCallbackWithReturnValue(string, actualRange);
}
-void WebPageProxy::fontAtSelection(Function<void(const FontInfo&, double, bool)>&& callback)
+void WebPageProxy::fontAtSelection(Function<void(const FontInfo&, double, bool, CallbackBase::Error)>&& callback)
{
if (!hasRunningProcess()) {
- callback({ }, 0, false);
+ callback({ }, 0, false, CallbackBase::Error::Unknown);
return;
}
- m_process->connection()->sendWithAsyncReply(Messages::WebPage::FontAtSelection(), WTFMove(callback), m_pageID);
+
+ auto callbackID = m_callbacks.put(WTFMove(callback), m_process->throttler().backgroundActivityToken());
+ process().send(Messages::WebPage::FontAtSelection(callbackID), m_pageID);
+}
+
+void WebPageProxy::fontAtSelectionCallback(const FontInfo& fontInfo, double fontSize, bool selectionHasMultipleFonts, CallbackID callbackID)
+{
+ auto callback = m_callbacks.take<FontAtSelectionCallback>(callbackID);
+ if (!callback) {
+ // FIXME: Log error or assert.
+ return;
+ }
+
+ callback->performCallbackWithReturnValue(fontInfo, fontSize, selectionHasMultipleFonts);
}
String WebPageProxy::stringSelectionForPasteboard()
diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h
index 164f91c..ba2e5e7 100644
--- a/Source/WebKit/WebProcess/WebPage/WebPage.h
+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h
@@ -811,7 +811,7 @@
#if PLATFORM(MAC)
void insertDictatedTextAsync(const String& text, const EditingRange& replacementRange, const Vector<WebCore::DictationAlternative>& dictationAlternativeLocations, bool registerUndoGroup = false);
void attributedSubstringForCharacterRangeAsync(const EditingRange&, CallbackID);
- void fontAtSelection(CompletionHandler<void(const FontInfo&, double, bool)>&&);
+ void fontAtSelection(CallbackID);
#endif
#if PLATFORM(COCOA) && ENABLE(SERVICE_CONTROLS)
diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
index 06cff4e..8800209 100644
--- a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
+++ b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
@@ -445,7 +445,7 @@
#if PLATFORM(MAC)
InsertDictatedTextAsync(String text, struct WebKit::EditingRange replacementRange, Vector<WebCore::DictationAlternative> dictationAlternatives, bool registerUndoGroup)
AttributedSubstringForCharacterRangeAsync(struct WebKit::EditingRange range, WebKit::CallbackID callbackID);
- FontAtSelection() -> (struct WebKit::FontInfo info, double fontSize, bool hasMultipleFonts) Async
+ FontAtSelection(WebKit::CallbackID callbackID)
#endif
SetAlwaysShowsHorizontalScroller(bool alwaysShowsHorizontalScroller)
diff --git a/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm b/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
index a0a9b3d..431dfa1 100644
--- a/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
+++ b/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
@@ -377,35 +377,35 @@
send(Messages::WebPageProxy::AttributedStringForCharacterRangeCallback(attributedString, rangeToSend, callbackID));
}
-void WebPage::fontAtSelection(CompletionHandler<void(const FontInfo&, double, bool)>&& reply)
+void WebPage::fontAtSelection(CallbackID callbackID)
{
bool selectionHasMultipleFonts = false;
auto& frame = m_page->focusController().focusedOrMainFrame();
if (frame.selection().selection().isNone()) {
- reply({ }, 0, false);
+ send(Messages::WebPageProxy::FontAtSelectionCallback({ }, 0, false, callbackID));
return;
}
auto* font = frame.editor().fontForSelection(selectionHasMultipleFonts);
if (!font) {
- reply({ }, 0, false);
+ send(Messages::WebPageProxy::FontAtSelectionCallback({ }, 0, false, callbackID));
return;
}
auto ctFont = font->getCTFont();
if (!ctFont) {
- reply({ }, 0, false);
+ send(Messages::WebPageProxy::FontAtSelectionCallback({ }, 0, false, callbackID));
return;
}
auto fontDescriptor = adoptCF(CTFontCopyFontDescriptor(ctFont));
if (!fontDescriptor) {
- reply({ }, 0, false);
+ send(Messages::WebPageProxy::FontAtSelectionCallback({ }, 0, false, callbackID));
return;
}
- reply({ adoptCF(CTFontDescriptorCopyAttributes(fontDescriptor.get())) }, CTFontGetSize(ctFont), selectionHasMultipleFonts);
+ send(Messages::WebPageProxy::FontAtSelectionCallback({ adoptCF(CTFontDescriptorCopyAttributes(fontDescriptor.get())) }, CTFontGetSize(ctFont), selectionHasMultipleFonts, callbackID));
}