Changeset 248352 in webkit
- Timestamp:
- Aug 6, 2019, 11:52:44 PM (7 years ago)
- Location:
- branches/safari-608.1-branch
- Files:
-
- 17 edited
- 2 moved
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt (moved) (moved from branches/safari-608.1-branch/LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply-expected.txt ) (1 diff)
-
LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html (moved) (moved from branches/safari-608.1-branch/LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply.html ) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/Platform/IPC/Connection.cpp (modified) (10 diffs)
-
Source/WebKit/Platform/IPC/Connection.h (modified) (3 diffs)
-
Source/WebKit/Platform/IPC/Decoder.cpp (modified) (1 diff)
-
Source/WebKit/Platform/IPC/Decoder.h (modified) (2 diffs)
-
Source/WebKit/Platform/IPC/Encoder.cpp (modified) (3 diffs)
-
Source/WebKit/Platform/IPC/Encoder.h (modified) (2 diffs)
-
Source/WebKit/Platform/IPC/MessageFlags.h (modified) (1 diff)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (modified) (1 diff)
-
Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp (modified) (4 diffs)
-
Source/WebKit/WebProcess/WebPage/WebPage.cpp (modified) (10 diffs)
-
Source/WebKit/WebProcess/WebPage/WebPage.h (modified) (1 diff)
-
Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-608.1-branch/LayoutTests/ChangeLog
r248350 r248352 1 2019-08-06 Kocsen Chung <kocsen_chung@apple.com> 2 3 Cherry-pick r247868. rdar://problem/54017876 4 5 [iOS] WebPage::TouchEventSync() & WebPage::GetPositionInformation() sync IPC causes UIProcess hangs 6 https://bugs.webkit.org/show_bug.cgi?id=200138 7 <rdar://problem/52698157> 8 9 Reviewed by Geoffrey Garen. 10 11 Source/WebKit: 12 13 Revert most of r247822 and use an alternative approach to address hangs. In this patch, the proposal 14 is to add a SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply flag on the 15 WebPage::TouchEventSync() & WebPage::GetPositionInformation() sendSync() calls in the UIProcess. 16 Those will cause this IPCs to get dispatched right away in the WebContent process, even if the 17 WebContent process is itself currently stuck on unbounded (i.e. potentially slow) synchronous IPC 18 (JS alerts / prompts & sync XHR). Because re-entering WebCore on sync IPC is generally unsafe, this 19 patch also updates the WebPage::getPositionInformation() & WebPage::touchEventSync() to return early 20 (i.e. cancelled) if they get called while the WebContent process is stuck on a slow sendSync. 21 22 This approach should address the UIProcess hangs caused by the WebPage::TouchEventSync() and 23 WebPage::GetPositionInformation() sync IPC messages when the WebContent process is busy on a slow XHR 24 or a JS prompt / alert. It should be safe because we do not re-enter WebCore. The only drawback is that 25 those IPCs will be cancelled (early return with default value) when the WebContent process is busy. 26 However, I am being told that this is likely acceptable in practice. 27 28 * Platform/IPC/Connection.cpp: 29 (IPC::Connection::SyncMessageState::processIncomingMessage): 30 (IPC::Connection::sendMessage): 31 (IPC::Connection::sendSyncMessage): 32 (IPC::Connection::dispatchMessage): 33 * Platform/IPC/Connection.h: 34 (IPC::UnboundedSynchronousIPCScope::UnboundedSynchronousIPCScope): 35 (IPC::UnboundedSynchronousIPCScope::~UnboundedSynchronousIPCScope): 36 (IPC::UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC): 37 * Platform/IPC/Decoder.cpp: 38 (IPC::Decoder::shouldDispatchMessageWhenWaitingForSyncReply const): 39 * Platform/IPC/Decoder.h: 40 * Platform/IPC/Encoder.cpp: 41 (IPC::Encoder::shouldDispatchMessageWhenWaitingForSyncReply const): 42 (IPC::Encoder::setShouldDispatchMessageWhenWaitingForSyncReply): 43 (IPC::Encoder::wrapForTesting): 44 * Platform/IPC/Encoder.h: 45 * Platform/IPC/MessageFlags.h: 46 * UIProcess/Network/NetworkProcessProxy.cpp: 47 (WebKit::NetworkProcessProxy::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 48 * UIProcess/WebPageProxy.cpp: 49 (WebKit::WebPageProxy::handleTouchEventSynchronously): 50 * UIProcess/ios/WKContentViewInteraction.mm: 51 (-[WKContentView ensurePositionInformationIsUpToDate:]): 52 * WebProcess/Network/WebLoaderStrategy.cpp: 53 (WebKit::WebLoaderStrategy::loadResourceSynchronously): 54 * WebProcess/WebCoreSupport/WebChromeClient.cpp: 55 (WebKit::WebChromeClient::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 56 (WebKit::WebChromeClient::runJavaScriptAlert): 57 (WebKit::WebChromeClient::runJavaScriptConfirm): 58 (WebKit::WebChromeClient::runJavaScriptPrompt): 59 * WebProcess/WebPage/WebPage.cpp: 60 (WebKit::WebPage::layerVolatilityTimerFired): 61 (WebKit::WebPage::markLayersVolatile): 62 (WebKit::WebPage::cancelMarkLayersVolatile): 63 (WebKit::WebPage::touchEventSync): 64 (WebKit::WebPage::didCompletePageTransition): 65 (WebKit::WebPage::updatePreferences): 66 (WebKit::WebPage::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 67 * WebProcess/WebPage/WebPage.h: 68 (WebKit::WebPage::sendSyncWithDelayedReply): 69 * WebProcess/WebPage/ios/WebPageIOS.mm: 70 (WebKit::WebPage::getPositionInformation): 71 72 LayoutTests: 73 74 Update existing layout test accordingly. 75 76 * fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt: Renamed from LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply-expected.txt. 77 * fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html: Renamed from LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply.html. 78 79 80 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247868 268f45cc-cd09-0410-ab3c-d52691b4dbfc 81 82 2019-07-26 Chris Dumez <cdumez@apple.com> 83 84 [iOS] WebPage::TouchEventSync() & WebPage::GetPositionInformation() sync IPC causes UIProcess hangs 85 https://bugs.webkit.org/show_bug.cgi?id=200138 86 <rdar://problem/52698157> 87 88 Reviewed by Geoffrey Garen. 89 90 Update existing layout test accordingly. 91 92 * fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt: Renamed from LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply-expected.txt. 93 * fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html: Renamed from LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply.html. 94 1 95 2019-08-06 Kocsen Chung <kocsen_chung@apple.com> 2 96 -
branches/safari-608.1-branch/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt
r248351 r248352 1 Test for the SendSyncOption:: ProcessIncomingSyncMessagesWhenWaitingForSyncReply sendSync flag1 Test for the SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply sendSync flag 2 2 3 3 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -
branches/safari-608.1-branch/LayoutTests/fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html
r248351 r248352 4 4 <script src="../../resources/js-test.js"></script> 5 5 <script> 6 description("Test for the SendSyncOption:: ProcessIncomingSyncMessagesWhenWaitingForSyncReply sendSync flag");6 description("Test for the SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply sendSync flag"); 7 7 8 8 shouldBeTrue("internals.testProcessIncomingSyncMessagesWhenWaitingForSyncReply()"); -
branches/safari-608.1-branch/Source/WebKit/ChangeLog
r248349 r248352 1 2019-08-06 Kocsen Chung <kocsen_chung@apple.com> 2 3 Cherry-pick r247868. rdar://problem/54017876 4 5 [iOS] WebPage::TouchEventSync() & WebPage::GetPositionInformation() sync IPC causes UIProcess hangs 6 https://bugs.webkit.org/show_bug.cgi?id=200138 7 <rdar://problem/52698157> 8 9 Reviewed by Geoffrey Garen. 10 11 Source/WebKit: 12 13 Revert most of r247822 and use an alternative approach to address hangs. In this patch, the proposal 14 is to add a SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply flag on the 15 WebPage::TouchEventSync() & WebPage::GetPositionInformation() sendSync() calls in the UIProcess. 16 Those will cause this IPCs to get dispatched right away in the WebContent process, even if the 17 WebContent process is itself currently stuck on unbounded (i.e. potentially slow) synchronous IPC 18 (JS alerts / prompts & sync XHR). Because re-entering WebCore on sync IPC is generally unsafe, this 19 patch also updates the WebPage::getPositionInformation() & WebPage::touchEventSync() to return early 20 (i.e. cancelled) if they get called while the WebContent process is stuck on a slow sendSync. 21 22 This approach should address the UIProcess hangs caused by the WebPage::TouchEventSync() and 23 WebPage::GetPositionInformation() sync IPC messages when the WebContent process is busy on a slow XHR 24 or a JS prompt / alert. It should be safe because we do not re-enter WebCore. The only drawback is that 25 those IPCs will be cancelled (early return with default value) when the WebContent process is busy. 26 However, I am being told that this is likely acceptable in practice. 27 28 * Platform/IPC/Connection.cpp: 29 (IPC::Connection::SyncMessageState::processIncomingMessage): 30 (IPC::Connection::sendMessage): 31 (IPC::Connection::sendSyncMessage): 32 (IPC::Connection::dispatchMessage): 33 * Platform/IPC/Connection.h: 34 (IPC::UnboundedSynchronousIPCScope::UnboundedSynchronousIPCScope): 35 (IPC::UnboundedSynchronousIPCScope::~UnboundedSynchronousIPCScope): 36 (IPC::UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC): 37 * Platform/IPC/Decoder.cpp: 38 (IPC::Decoder::shouldDispatchMessageWhenWaitingForSyncReply const): 39 * Platform/IPC/Decoder.h: 40 * Platform/IPC/Encoder.cpp: 41 (IPC::Encoder::shouldDispatchMessageWhenWaitingForSyncReply const): 42 (IPC::Encoder::setShouldDispatchMessageWhenWaitingForSyncReply): 43 (IPC::Encoder::wrapForTesting): 44 * Platform/IPC/Encoder.h: 45 * Platform/IPC/MessageFlags.h: 46 * UIProcess/Network/NetworkProcessProxy.cpp: 47 (WebKit::NetworkProcessProxy::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 48 * UIProcess/WebPageProxy.cpp: 49 (WebKit::WebPageProxy::handleTouchEventSynchronously): 50 * UIProcess/ios/WKContentViewInteraction.mm: 51 (-[WKContentView ensurePositionInformationIsUpToDate:]): 52 * WebProcess/Network/WebLoaderStrategy.cpp: 53 (WebKit::WebLoaderStrategy::loadResourceSynchronously): 54 * WebProcess/WebCoreSupport/WebChromeClient.cpp: 55 (WebKit::WebChromeClient::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 56 (WebKit::WebChromeClient::runJavaScriptAlert): 57 (WebKit::WebChromeClient::runJavaScriptConfirm): 58 (WebKit::WebChromeClient::runJavaScriptPrompt): 59 * WebProcess/WebPage/WebPage.cpp: 60 (WebKit::WebPage::layerVolatilityTimerFired): 61 (WebKit::WebPage::markLayersVolatile): 62 (WebKit::WebPage::cancelMarkLayersVolatile): 63 (WebKit::WebPage::touchEventSync): 64 (WebKit::WebPage::didCompletePageTransition): 65 (WebKit::WebPage::updatePreferences): 66 (WebKit::WebPage::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 67 * WebProcess/WebPage/WebPage.h: 68 (WebKit::WebPage::sendSyncWithDelayedReply): 69 * WebProcess/WebPage/ios/WebPageIOS.mm: 70 (WebKit::WebPage::getPositionInformation): 71 72 LayoutTests: 73 74 Update existing layout test accordingly. 75 76 * fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply-expected.txt: Renamed from LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply-expected.txt. 77 * fast/misc/{testProcessIncomingSyncMessagesWhenWaitingForUnboundedReply.html: Renamed from LayoutTests/fast/misc/testProcessIncomingSyncMessagesWhenWaitingForSyncReply.html. 78 79 80 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@247868 268f45cc-cd09-0410-ab3c-d52691b4dbfc 81 82 2019-07-26 Chris Dumez <cdumez@apple.com> 83 84 [iOS] WebPage::TouchEventSync() & WebPage::GetPositionInformation() sync IPC causes UIProcess hangs 85 https://bugs.webkit.org/show_bug.cgi?id=200138 86 <rdar://problem/52698157> 87 88 Reviewed by Geoffrey Garen. 89 90 Revert most of r247822 and use an alternative approach to address hangs. In this patch, the proposal 91 is to add a SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply flag on the 92 WebPage::TouchEventSync() & WebPage::GetPositionInformation() sendSync() calls in the UIProcess. 93 Those will cause this IPCs to get dispatched right away in the WebContent process, even if the 94 WebContent process is itself currently stuck on unbounded (i.e. potentially slow) synchronous IPC 95 (JS alerts / prompts & sync XHR). Because re-entering WebCore on sync IPC is generally unsafe, this 96 patch also updates the WebPage::getPositionInformation() & WebPage::touchEventSync() to return early 97 (i.e. cancelled) if they get called while the WebContent process is stuck on a slow sendSync. 98 99 This approach should address the UIProcess hangs caused by the WebPage::TouchEventSync() and 100 WebPage::GetPositionInformation() sync IPC messages when the WebContent process is busy on a slow XHR 101 or a JS prompt / alert. It should be safe because we do not re-enter WebCore. The only drawback is that 102 those IPCs will be cancelled (early return with default value) when the WebContent process is busy. 103 However, I am being told that this is likely acceptable in practice. 104 105 * Platform/IPC/Connection.cpp: 106 (IPC::Connection::SyncMessageState::processIncomingMessage): 107 (IPC::Connection::sendMessage): 108 (IPC::Connection::sendSyncMessage): 109 (IPC::Connection::dispatchMessage): 110 * Platform/IPC/Connection.h: 111 (IPC::UnboundedSynchronousIPCScope::UnboundedSynchronousIPCScope): 112 (IPC::UnboundedSynchronousIPCScope::~UnboundedSynchronousIPCScope): 113 (IPC::UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC): 114 * Platform/IPC/Decoder.cpp: 115 (IPC::Decoder::shouldDispatchMessageWhenWaitingForSyncReply const): 116 * Platform/IPC/Decoder.h: 117 * Platform/IPC/Encoder.cpp: 118 (IPC::Encoder::shouldDispatchMessageWhenWaitingForSyncReply const): 119 (IPC::Encoder::setShouldDispatchMessageWhenWaitingForSyncReply): 120 (IPC::Encoder::wrapForTesting): 121 * Platform/IPC/Encoder.h: 122 * Platform/IPC/MessageFlags.h: 123 * UIProcess/Network/NetworkProcessProxy.cpp: 124 (WebKit::NetworkProcessProxy::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 125 * UIProcess/WebPageProxy.cpp: 126 (WebKit::WebPageProxy::handleTouchEventSynchronously): 127 * UIProcess/ios/WKContentViewInteraction.mm: 128 (-[WKContentView ensurePositionInformationIsUpToDate:]): 129 * WebProcess/Network/WebLoaderStrategy.cpp: 130 (WebKit::WebLoaderStrategy::loadResourceSynchronously): 131 * WebProcess/WebCoreSupport/WebChromeClient.cpp: 132 (WebKit::WebChromeClient::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 133 (WebKit::WebChromeClient::runJavaScriptAlert): 134 (WebKit::WebChromeClient::runJavaScriptConfirm): 135 (WebKit::WebChromeClient::runJavaScriptPrompt): 136 * WebProcess/WebPage/WebPage.cpp: 137 (WebKit::WebPage::layerVolatilityTimerFired): 138 (WebKit::WebPage::markLayersVolatile): 139 (WebKit::WebPage::cancelMarkLayersVolatile): 140 (WebKit::WebPage::touchEventSync): 141 (WebKit::WebPage::didCompletePageTransition): 142 (WebKit::WebPage::updatePreferences): 143 (WebKit::WebPage::testProcessIncomingSyncMessagesWhenWaitingForSyncReply): 144 * WebProcess/WebPage/WebPage.h: 145 (WebKit::WebPage::sendSyncWithDelayedReply): 146 * WebProcess/WebPage/ios/WebPageIOS.mm: 147 (WebKit::WebPage::getPositionInformation): 148 1 149 2019-08-06 Kocsen Chung <kocsen_chung@apple.com> 2 150 -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/Connection.cpp
r248349 r248352 28 28 29 29 #include "Logging.h" 30 #include "MessageFlags.h" 30 31 #include <memory> 31 32 #include <wtf/HashSet.h> … … 50 51 #endif 51 52 53 std::atomic<unsigned> UnboundedSynchronousIPCScope::unboundedSynchronousIPCCount = 0; 54 52 55 struct Connection::ReplyHandler { 53 56 RefPtr<FunctionDispatcher> dispatcher; … … 99 102 void dispatchMessages(Connection* allowedConnection); 100 103 101 void incrementProcessIncomingSyncMessagesWhenWaitingForSyncReplyCount() { ++m_processIncomingSyncMessagesWhenWaitingForSyncReplyCount; }102 void decrementProcessIncomingSyncMessagesWhenWaitingForSyncReplyCount() { --m_processIncomingSyncMessagesWhenWaitingForSyncReplyCount; }103 104 104 private: 105 105 void dispatchMessageAndResetDidScheduleDispatchMessagesForConnection(Connection&); … … 118 118 }; 119 119 Vector<ConnectionAndIncomingMessage> m_messagesToDispatchWhileWaitingForSyncReply; 120 121 std::atomic<unsigned> m_processIncomingSyncMessagesWhenWaitingForSyncReplyCount { 0 };122 120 }; 123 121 … … 140 138 bool Connection::SyncMessageState::processIncomingMessage(Connection& connection, std::unique_ptr<Decoder>& message) 141 139 { 142 bool shouldDispatchMessageWhenWaitingForSyncReply = message->shouldDispatchMessageWhenWaitingForSyncReply(); 143 144 // We dispatch synchronous messages even if shouldDispatchMessageWhenWaitingForSyncReply returns false if the 145 // sendSync() used SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply. This is used for some messages 146 // in the WebContent process (which normally does not dispatch messages when waiting for a sync reply), to avoid 147 // hangs. 148 if (!shouldDispatchMessageWhenWaitingForSyncReply && message->isSyncMessage() && m_processIncomingSyncMessagesWhenWaitingForSyncReplyCount.load()) 149 shouldDispatchMessageWhenWaitingForSyncReply = true; 150 151 if (!shouldDispatchMessageWhenWaitingForSyncReply) 140 switch (message->shouldDispatchMessageWhenWaitingForSyncReply()) { 141 case ShouldDispatchWhenWaitingForSyncReply::No: 152 142 return false; 143 case ShouldDispatchWhenWaitingForSyncReply::YesDuringUnboundedIPC: 144 if (!UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC()) 145 return false; 146 break; 147 case ShouldDispatchWhenWaitingForSyncReply::Yes: 148 break; 149 } 153 150 154 151 ConnectionAndIncomingMessage connectionAndIncomingMessage { connection, WTFMove(message) }; … … 434 431 && (!m_onlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage 435 432 || m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount)) 436 encoder->setShouldDispatchMessageWhenWaitingForSyncReply(true); 433 encoder->setShouldDispatchMessageWhenWaitingForSyncReply(ShouldDispatchWhenWaitingForSyncReply::Yes); 434 else if (sendOptions.contains(SendOption::DispatchMessageEvenWhenWaitingForUnboundedSyncReply)) 435 encoder->setShouldDispatchMessageWhenWaitingForSyncReply(ShouldDispatchWhenWaitingForSyncReply::YesDuringUnboundedIPC); 437 436 438 437 { … … 578 577 579 578 // First send the message. 580 sendMessage(WTFMove(encoder), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); 581 582 if (sendSyncOptions.contains(SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply)) 583 SyncMessageState::singleton().incrementProcessIncomingSyncMessagesWhenWaitingForSyncReplyCount(); 579 OptionSet<SendOption> sendOptions = IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply; 580 if (sendSyncOptions.contains(SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply)) 581 sendOptions = sendOptions | IPC::SendOption::DispatchMessageEvenWhenWaitingForUnboundedSyncReply; 582 583 sendMessage(WTFMove(encoder), sendOptions); 584 584 585 585 // Then wait for a reply. Waiting for a reply could involve dispatching incoming sync messages, so … … 587 587 Ref<Connection> protect(*this); 588 588 std::unique_ptr<Decoder> reply = waitForSyncReply(syncRequestID, timeout, sendSyncOptions); 589 590 if (sendSyncOptions.contains(SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply))591 SyncMessageState::singleton().decrementProcessIncomingSyncMessagesWhenWaitingForSyncReplyCount();592 589 593 590 --m_inSendSyncCount; … … 1041 1038 1042 1039 m_inDispatchMessageCount++; 1043 1044 if (message->shouldDispatchMessageWhenWaitingForSyncReply()) 1040 1041 bool isDispatchingMessageWhileWaitingForSyncReply = (message->shouldDispatchMessageWhenWaitingForSyncReply() == ShouldDispatchWhenWaitingForSyncReply::Yes) 1042 || (message->shouldDispatchMessageWhenWaitingForSyncReply() == ShouldDispatchWhenWaitingForSyncReply::YesDuringUnboundedIPC && UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC()); 1043 1044 if (isDispatchingMessageWhileWaitingForSyncReply) 1045 1045 m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount++; 1046 1046 … … 1058 1058 // FIXME: For synchronous messages, we should not decrement the counter until we send a response. 1059 1059 // Otherwise, we would deadlock if processing the message results in a sync message back after we exit this function. 1060 if ( message->shouldDispatchMessageWhenWaitingForSyncReply())1060 if (isDispatchingMessageWhileWaitingForSyncReply) 1061 1061 m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount--; 1062 1062 -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/Connection.h
r248349 r248352 62 62 // This is the default for synchronous messages. 63 63 DispatchMessageEvenWhenWaitingForSyncReply = 1 << 0, 64 IgnoreFullySynchronousMode = 1 << 1, 64 DispatchMessageEvenWhenWaitingForUnboundedSyncReply = 1 << 1, 65 IgnoreFullySynchronousMode = 1 << 2, 65 66 }; 66 67 … … 69 70 InformPlatformProcessWillSuspend = 1 << 0, 70 71 UseFullySynchronousModeForTesting = 1 << 1, 71 ProcessIncomingSyncMessagesWhenWaitingForSyncReply = 1 << 2,72 ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply = 1 << 2, 72 73 }; 73 74 … … 555 556 } 556 557 558 class UnboundedSynchronousIPCScope { 559 public: 560 UnboundedSynchronousIPCScope() 561 { 562 ASSERT(RunLoop::isMain()); 563 ++unboundedSynchronousIPCCount; 564 } 565 566 ~UnboundedSynchronousIPCScope() 567 { 568 ASSERT(RunLoop::isMain()); 569 ASSERT(unboundedSynchronousIPCCount); 570 --unboundedSynchronousIPCCount; 571 } 572 573 static bool hasOngoingUnboundedSyncIPC() 574 { 575 return unboundedSynchronousIPCCount.load() > 0; 576 } 577 578 private: 579 static std::atomic<unsigned> unboundedSynchronousIPCCount; 580 }; 581 557 582 } // namespace IPC -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/Decoder.cpp
r239427 r248352 89 89 } 90 90 91 bool Decoder::shouldDispatchMessageWhenWaitingForSyncReply() const 92 { 93 return m_messageFlags & DispatchMessageWhenWaitingForSyncReply; 91 ShouldDispatchWhenWaitingForSyncReply Decoder::shouldDispatchMessageWhenWaitingForSyncReply() const 92 { 93 if (m_messageFlags & DispatchMessageWhenWaitingForSyncReply) 94 return ShouldDispatchWhenWaitingForSyncReply::Yes; 95 if (m_messageFlags & DispatchMessageWhenWaitingForUnboundedSyncReply) 96 return ShouldDispatchWhenWaitingForSyncReply::YesDuringUnboundedIPC; 97 return ShouldDispatchWhenWaitingForSyncReply::No; 94 98 } 95 99 -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/Decoder.h
r243460 r248352 40 40 class DataReference; 41 41 class ImportanceAssertion; 42 enum class ShouldDispatchWhenWaitingForSyncReply; 42 43 43 44 class Decoder { … … 55 56 56 57 bool isSyncMessage() const; 57 boolshouldDispatchMessageWhenWaitingForSyncReply() const;58 ShouldDispatchWhenWaitingForSyncReply shouldDispatchMessageWhenWaitingForSyncReply() const; 58 59 bool shouldUseFullySynchronousModeForTesting() const; 59 60 -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/Encoder.cpp
r238798 r248352 86 86 } 87 87 88 bool Encoder::shouldDispatchMessageWhenWaitingForSyncReply() const 89 { 90 return *buffer() & DispatchMessageWhenWaitingForSyncReply; 88 ShouldDispatchWhenWaitingForSyncReply Encoder::shouldDispatchMessageWhenWaitingForSyncReply() const 89 { 90 if (*buffer() & DispatchMessageWhenWaitingForSyncReply) 91 return ShouldDispatchWhenWaitingForSyncReply::Yes; 92 if (*buffer() & DispatchMessageWhenWaitingForUnboundedSyncReply) 93 return ShouldDispatchWhenWaitingForSyncReply::YesDuringUnboundedIPC; 94 return ShouldDispatchWhenWaitingForSyncReply::No; 91 95 } 92 96 … … 99 103 } 100 104 101 void Encoder::setShouldDispatchMessageWhenWaitingForSyncReply(bool shouldDispatchMessageWhenWaitingForSyncReply) 102 { 103 if (shouldDispatchMessageWhenWaitingForSyncReply) 105 void Encoder::setShouldDispatchMessageWhenWaitingForSyncReply(ShouldDispatchWhenWaitingForSyncReply shouldDispatchWhenWaitingForSyncReply) 106 { 107 switch (shouldDispatchWhenWaitingForSyncReply) { 108 case ShouldDispatchWhenWaitingForSyncReply::No: 109 *buffer() &= ~(DispatchMessageWhenWaitingForSyncReply | DispatchMessageWhenWaitingForUnboundedSyncReply); 110 break; 111 case ShouldDispatchWhenWaitingForSyncReply::Yes: 104 112 *buffer() |= DispatchMessageWhenWaitingForSyncReply; 105 else 113 *buffer() &= ~DispatchMessageWhenWaitingForUnboundedSyncReply; 114 break; 115 case ShouldDispatchWhenWaitingForSyncReply::YesDuringUnboundedIPC: 116 *buffer() |= DispatchMessageWhenWaitingForUnboundedSyncReply; 106 117 *buffer() &= ~DispatchMessageWhenWaitingForSyncReply; 118 break; 119 } 107 120 } 108 121 … … 117 130 ASSERT(!original->isSyncMessage()); 118 131 119 original->setShouldDispatchMessageWhenWaitingForSyncReply( true);132 original->setShouldDispatchMessageWhenWaitingForSyncReply(ShouldDispatchWhenWaitingForSyncReply::Yes); 120 133 121 134 encodeVariableLengthByteArray(DataReference(original->buffer(), original->bufferSize())); -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/Encoder.h
r237294 r248352 35 35 36 36 class DataReference; 37 enum class ShouldDispatchWhenWaitingForSyncReply; 37 38 38 39 class Encoder final { … … 49 50 bool isSyncMessage() const; 50 51 51 void setShouldDispatchMessageWhenWaitingForSyncReply( bool);52 boolshouldDispatchMessageWhenWaitingForSyncReply() const;52 void setShouldDispatchMessageWhenWaitingForSyncReply(ShouldDispatchWhenWaitingForSyncReply); 53 ShouldDispatchWhenWaitingForSyncReply shouldDispatchMessageWhenWaitingForSyncReply() const; 53 54 54 55 void setFullySynchronousModeForTesting(); -
branches/safari-608.1-branch/Source/WebKit/Platform/IPC/MessageFlags.h
r188793 r248352 32 32 SyncMessage = 1 << 0, 33 33 DispatchMessageWhenWaitingForSyncReply = 1 << 1, 34 UseFullySynchronousModeForTesting = 1 << 2, 34 DispatchMessageWhenWaitingForUnboundedSyncReply = 1 << 2, 35 UseFullySynchronousModeForTesting = 1 << 3, 35 36 }; 37 38 enum class ShouldDispatchWhenWaitingForSyncReply { No, Yes, YesDuringUnboundedIPC }; 36 39 37 40 } // namespace IPC -
branches/safari-608.1-branch/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r248349 r248352 1212 1212 1213 1213 bool handled = false; 1214 if (!page->sendSync(Messages::WebPage::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(), Messages::WebPage::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply::Reply(handled) ))1214 if (!page->sendSync(Messages::WebPage::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(), Messages::WebPage::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply::Reply(handled), Seconds::infinity(), IPC::SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply)) 1215 1215 return reply(false); 1216 1216 reply(handled); -
branches/safari-608.1-branch/Source/WebKit/UIProcess/WebPageProxy.cpp
r248348 r248352 2663 2663 m_process->responsivenessTimer().start(); 2664 2664 bool handled = false; 2665 bool replyReceived = m_process->sendSync(Messages::WebPage::TouchEventSync(event), Messages::WebPage::TouchEventSync::Reply(handled), m_pageID, 1_s );2665 bool replyReceived = m_process->sendSync(Messages::WebPage::TouchEventSync(event), Messages::WebPage::TouchEventSync::Reply(handled), m_pageID, 1_s, IPC::SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply); 2666 2666 // If the sync request has timed out, we should consider the event handled. The Web Process is too busy to answer any questions, so the default action is also likely to have issues. 2667 2667 if (!replyReceived) -
branches/safari-608.1-branch/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
r248343 r248352 1999 1999 return connection->waitForAndDispatchImmediately<Messages::WebPageProxy::DidReceivePositionInformation>(_page->pageID(), 1_s, IPC::WaitForOption::InterruptWaitingIfSyncMessageArrives); 2000 2000 2001 bool receivedResponse = _page->process().sendSync(Messages::WebPage::GetPositionInformation(request), Messages::WebPage::GetPositionInformation::Reply(_positionInformation), _page->pageID(), 1_s );2001 bool receivedResponse = _page->process().sendSync(Messages::WebPage::GetPositionInformation(request), Messages::WebPage::GetPositionInformation::Reply(_positionInformation), _page->pageID(), 1_s, IPC::SendSyncOption::ForceDispatchWhenDestinationIsWaitingForUnboundedSyncReply); 2002 2002 _hasValidPositionInformation = receivedResponse && _positionInformation.canBeValid; 2003 2003 -
branches/safari-608.1-branch/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
r246452 r248352 565 565 566 566 HangDetectionDisabler hangDetectionDisabler; 567 IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; 567 568 568 569 bool shouldNotifyOfUpload = request.hasUpload() && m_loadersWithUploads.isEmpty(); -
branches/safari-608.1-branch/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp
r248349 r248352 308 308 bool WebChromeClient::testProcessIncomingSyncMessagesWhenWaitingForSyncReply() 309 309 { 310 IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; 310 311 bool handled = false; 311 if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(m_page.pageID()), Messages::NetworkConnectionToWebProcess::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply::Reply(handled), 0 , Seconds::infinity(), IPC::SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply))312 if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply(m_page.pageID()), Messages::NetworkConnectionToWebProcess::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply::Reply(handled), 0)) 312 313 return false; 313 314 return handled; … … 468 469 469 470 HangDetectionDisabler hangDetectionDisabler; 470 471 m_page.sendSyncWithDelayedReply(Messages::WebPageProxy::RunJavaScriptAlert(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), alertText), Messages::WebPageProxy::RunJavaScriptAlert::Reply(), IPC::SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply); 471 IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; 472 473 m_page.sendSyncWithDelayedReply(Messages::WebPageProxy::RunJavaScriptAlert(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), alertText), Messages::WebPageProxy::RunJavaScriptAlert::Reply()); 472 474 } 473 475 … … 484 486 485 487 HangDetectionDisabler hangDetectionDisabler; 488 IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; 486 489 487 490 bool result = false; 488 if (!m_page.sendSyncWithDelayedReply(Messages::WebPageProxy::RunJavaScriptConfirm(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), message), Messages::WebPageProxy::RunJavaScriptConfirm::Reply(result) , IPC::SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply))491 if (!m_page.sendSyncWithDelayedReply(Messages::WebPageProxy::RunJavaScriptConfirm(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), message), Messages::WebPageProxy::RunJavaScriptConfirm::Reply(result))) 489 492 return false; 490 493 … … 504 507 505 508 HangDetectionDisabler hangDetectionDisabler; 506 507 if (!m_page.sendSyncWithDelayedReply(Messages::WebPageProxy::RunJavaScriptPrompt(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), message, defaultValue), Messages::WebPageProxy::RunJavaScriptPrompt::Reply(result), IPC::SendSyncOption::ProcessIncomingSyncMessagesWhenWaitingForSyncReply)) 509 IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; 510 511 if (!m_page.sendSyncWithDelayedReply(Messages::WebPageProxy::RunJavaScriptPrompt(webFrame->frameID(), SecurityOriginData::fromFrame(&frame), message, defaultValue), Messages::WebPageProxy::RunJavaScriptPrompt::Reply(result))) 508 512 return false; 509 513 -
branches/safari-608.1-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r248349 r248352 317 317 static const Seconds maximumLayerVolatilityTimerInterval { 2_s }; 318 318 319 #define RELEASE_LOG_IF_ALLOWED( ...) RELEASE_LOG_IF(isAlwaysOnLoggingAllowed(), Layers,__VA_ARGS__)320 #define RELEASE_LOG_ERROR_IF_ALLOWED( ...) RELEASE_LOG_ERROR_IF(isAlwaysOnLoggingAllowed(), Layers,__VA_ARGS__)319 #define RELEASE_LOG_IF_ALLOWED(channel, fmt, ...) RELEASE_LOG_IF(isAlwaysOnLoggingAllowed(), channel, "%p - WebPage::" fmt, this, ##__VA_ARGS__) 320 #define RELEASE_LOG_ERROR_IF_ALLOWED(channel, fmt, ...) RELEASE_LOG_ERROR_IF(isAlwaysOnLoggingAllowed(), channel, "%p - WebPage::" fmt, this, ##__VA_ARGS__) 321 321 322 322 class SendStopResponsivenessTimer { … … 2552 2552 m_layerVolatilityTimer.stop(); 2553 2553 if (didSucceed) 2554 RELEASE_LOG_IF_ALLOWED( "%p - WebPage - Succeeded in marking layers as volatile", this);2554 RELEASE_LOG_IF_ALLOWED(Layers, "layerVolatilityTimerFired: Succeeded in marking layers as volatile"); 2555 2555 else 2556 RELEASE_LOG_IF_ALLOWED( "%p - WebPage - Failed to mark layers as volatile within %gms", this, maximumLayerVolatilityTimerInterval.milliseconds());2556 RELEASE_LOG_IF_ALLOWED(Layers, "layerVolatilityTimerFired: Failed to mark layers as volatile within %gms", maximumLayerVolatilityTimerInterval.milliseconds()); 2557 2557 callVolatilityCompletionHandlers(didSucceed); 2558 2558 return; 2559 2559 } 2560 2560 2561 RELEASE_LOG_ERROR_IF_ALLOWED( "%p - WebPage - Failed to mark all layers as volatile, will retry in %g ms", this, newInterval.milliseconds());2561 RELEASE_LOG_ERROR_IF_ALLOWED(Layers, "layerVolatilityTimerFired: Failed to mark all layers as volatile, will retry in %g ms", newInterval.milliseconds()); 2562 2562 m_layerVolatilityTimer.startRepeating(newInterval); 2563 2563 } … … 2570 2570 void WebPage::markLayersVolatile(WTF::Function<void (bool)>&& completionHandler) 2571 2571 { 2572 RELEASE_LOG_IF_ALLOWED( "%p - WebPage::markLayersVolatile()", this);2572 RELEASE_LOG_IF_ALLOWED(Layers, "markLayersVolatile"); 2573 2573 2574 2574 if (m_layerVolatilityTimer.isActive()) … … 2581 2581 if (didSucceed || m_isSuspendedUnderLock) { 2582 2582 if (didSucceed) 2583 RELEASE_LOG_IF_ALLOWED( "%p - WebPage - Successfully marked layers as volatile", this);2583 RELEASE_LOG_IF_ALLOWED(Layers, "markLayersVolatile: Successfully marked layers as volatile"); 2584 2584 else { 2585 2585 // If we get suspended when locking the screen, it is expected that some IOSurfaces cannot be marked as purgeable so we do not keep retrying. 2586 RELEASE_LOG_IF_ALLOWED( "%p - WebPage - Did what we could to mark IOSurfaces as purgeable after locking the screen", this);2586 RELEASE_LOG_IF_ALLOWED(Layers, "markLayersVolatile: Did what we could to mark IOSurfaces as purgeable after locking the screen"); 2587 2587 } 2588 2588 callVolatilityCompletionHandlers(didSucceed); … … 2590 2590 } 2591 2591 2592 RELEASE_LOG_IF_ALLOWED( "%p - Failed to mark all layers as volatile, will retry in %g ms", this, initialLayerVolatilityTimerInterval.milliseconds());2592 RELEASE_LOG_IF_ALLOWED(Layers, "markLayersVolatile: Failed to mark all layers as volatile, will retry in %g ms", initialLayerVolatilityTimerInterval.milliseconds()); 2593 2593 m_layerVolatilityTimer.startRepeating(initialLayerVolatilityTimerInterval); 2594 2594 } … … 2596 2596 void WebPage::cancelMarkLayersVolatile() 2597 2597 { 2598 RELEASE_LOG_IF_ALLOWED( "%p - WebPage::cancelMarkLayersVolatile()", this);2598 RELEASE_LOG_IF_ALLOWED(Layers, "cancelMarkLayersVolatile"); 2599 2599 m_layerVolatilityTimer.stop(); 2600 2600 m_markLayersAsVolatileCompletionHandlers.clear(); … … 2906 2906 void WebPage::touchEventSync(const WebTouchEvent& touchEvent, CompletionHandler<void(bool)>&& reply) 2907 2907 { 2908 // Avoid UIProcess hangs when the WebContent process is stuck on a sync IPC. 2909 if (IPC::UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC()) { 2910 RELEASE_LOG_ERROR_IF_ALLOWED(Process, "touchEventSync - Not processing because the process is stuck on unbounded sync IPC"); 2911 return reply(true); 2912 } 2913 2908 2914 m_pendingSynchronousTouchEventReply = WTFMove(reply); 2909 2915 … … 3275 3281 unfreezeLayerTree(LayerTreeFreezeReason::PageTransition); 3276 3282 3277 RELEASE_LOG_IF_ALLOWED( "%p - WebPage - Did complete page transition", this);3283 RELEASE_LOG_IF_ALLOWED(Layers, "didCompletePageTransition: Did complete page transition"); 3278 3284 3279 3285 bool isInitialEmptyDocument = !m_mainFrame; … … 3540 3546 #if !PLATFORM(GTK) && !PLATFORM(WIN) 3541 3547 if (!settings.acceleratedCompositingEnabled()) { 3542 RELEASE_LOG_IF_ALLOWED( "%p - WebPage - acceleratedCompositingEnabled setting was false. WebKit cannot function in this mode; changing setting to true", this);3548 RELEASE_LOG_IF_ALLOWED(Layers, "updatePreferences: acceleratedCompositingEnabled setting was false. WebKit cannot function in this mode; changing setting to true"); 3543 3549 settings.setAcceleratedCompositingEnabled(true); 3544 3550 } … … 5877 5883 void WebPage::testProcessIncomingSyncMessagesWhenWaitingForSyncReply(Messages::WebPage::TestProcessIncomingSyncMessagesWhenWaitingForSyncReply::DelayedReply&& reply) 5878 5884 { 5885 RELEASE_ASSERT(IPC::UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC()); 5879 5886 reply(true); 5880 5887 } -
branches/safari-608.1-branch/Source/WebKit/WebProcess/WebPage/WebPage.h
r248349 r248352 1168 1168 1169 1169 template<typename T> 1170 bool sendSyncWithDelayedReply(T&& message, typename T::Reply&& reply , OptionSet<IPC::SendSyncOption> sendSyncOptions = { })1170 bool sendSyncWithDelayedReply(T&& message, typename T::Reply&& reply) 1171 1171 { 1172 1172 cancelGesturesBlockedOnSynchronousReplies(); 1173 return sendSync(WTFMove(message), WTFMove(reply), Seconds::infinity(), sendSyncOptions |IPC::SendSyncOption::InformPlatformProcessWillSuspend);1173 return sendSync(WTFMove(message), WTFMove(reply), Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend); 1174 1174 } 1175 1175 -
branches/safari-608.1-branch/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
r248343 r248352 133 133 #import <wtf/text/TextStream.h> 134 134 135 #define RELEASE_LOG_IF_ALLOWED(channel, fmt, ...) RELEASE_LOG_IF(isAlwaysOnLoggingAllowed(), channel, "%p - WebPage::" fmt, this, ##__VA_ARGS__) 136 #define RELEASE_LOG_ERROR_IF_ALLOWED(channel, fmt, ...) RELEASE_LOG_ERROR_IF(isAlwaysOnLoggingAllowed(), channel, "%p - WebPage::" fmt, this, ##__VA_ARGS__) 137 135 138 namespace WebKit { 136 139 using namespace WebCore; … … 2543 2546 void WebPage::getPositionInformation(const InteractionInformationRequest& request, CompletionHandler<void(InteractionInformationAtPosition&&)>&& reply) 2544 2547 { 2548 // Avoid UIProcess hangs when the WebContent process is stuck on a sync IPC. 2549 if (IPC::UnboundedSynchronousIPCScope::hasOngoingUnboundedSyncIPC()) { 2550 RELEASE_LOG_ERROR_IF_ALLOWED(Process, "getPositionInformation - Not processing because the process is stuck on unbounded sync IPC"); 2551 return reply({ }); 2552 } 2553 2545 2554 m_pendingSynchronousPositionInformationReply = WTFMove(reply); 2546 2555 … … 4016 4025 } // namespace WebKit 4017 4026 4027 #undef RELEASE_LOG_IF_ALLOWED 4028 #undef RELEASE_LOG_ERROR_IF_ALLOWED 4029 4018 4030 #endif // PLATFORM(IOS_FAMILY)
Note:
See TracChangeset
for help on using the changeset viewer.