- Revision
- 207292
- Author
- timothy_hor...@apple.com
- Date
- 2016-10-13 10:44:27 -0700 (Thu, 13 Oct 2016)
Log Message
Expose SPI to disable synchronously blocking on painting after parenting a WKWebView
https://bugs.webkit.org/show_bug.cgi?id=163364
<rdar://problem/28012494>
Reviewed by Geoff Garen.
Some clients may not want the default WKWebView behavior where we synchronously
block on the Web process after the first time a WKWebView is re-added to the window,
because they are e.g. parenting re-used WKWebViews while scrolling.
* UIProcess/API/APIPageConfiguration.h:
(API::PageConfiguration::shouldSynchronizeInitialPaintAfterMovingToWindow):
(API::PageConfiguration::setShouldSynchronizeInitialPaintAfterMovingToWindow):
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _initializeWithConfiguration:]):
* UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
(-[WKWebViewConfiguration init]):
(-[WKWebViewConfiguration copyWithZone:]):
(-[WKWebViewConfiguration _shouldSynchronizeInitialPaintAfterMovingToWindow]):
(-[WKWebViewConfiguration _setShouldSynchronizeInitialPaintAfterMovingToWindow:]):
* UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h:
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::WebPageProxy):
Add and plumb a new WKWebView configuration parameter.
(WebKit::WebPageProxy::dispatchViewStateChange):
If the new configuration parameter is set, don't block the main thread when
a view is reparented.
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (207291 => 207292)
--- trunk/Source/WebKit2/ChangeLog 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/ChangeLog 2016-10-13 17:44:27 UTC (rev 207292)
@@ -1,3 +1,35 @@
+2016-10-13 Tim Horton <timothy_hor...@apple.com>
+
+ Expose SPI to disable synchronously blocking on painting after parenting a WKWebView
+ https://bugs.webkit.org/show_bug.cgi?id=163364
+ <rdar://problem/28012494>
+
+ Reviewed by Geoff Garen.
+
+ Some clients may not want the default WKWebView behavior where we synchronously
+ block on the Web process after the first time a WKWebView is re-added to the window,
+ because they are e.g. parenting re-used WKWebViews while scrolling.
+
+ * UIProcess/API/APIPageConfiguration.h:
+ (API::PageConfiguration::shouldSynchronizeInitialPaintAfterMovingToWindow):
+ (API::PageConfiguration::setShouldSynchronizeInitialPaintAfterMovingToWindow):
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _initializeWithConfiguration:]):
+ * UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
+ (-[WKWebViewConfiguration init]):
+ (-[WKWebViewConfiguration copyWithZone:]):
+ (-[WKWebViewConfiguration _shouldSynchronizeInitialPaintAfterMovingToWindow]):
+ (-[WKWebViewConfiguration _setShouldSynchronizeInitialPaintAfterMovingToWindow:]):
+ * UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h:
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::WebPageProxy):
+ Add and plumb a new WKWebView configuration parameter.
+
+ (WebKit::WebPageProxy::dispatchViewStateChange):
+ If the new configuration parameter is set, don't block the main thread when
+ a view is reparented.
+
2016-10-12 Chris Dumez <cdu...@apple.com>
[Web IDL] Drop support for legacy [ConstructorConditional=*]
Modified: trunk/Source/WebKit2/UIProcess/API/APIPageConfiguration.h (207291 => 207292)
--- trunk/Source/WebKit2/UIProcess/API/APIPageConfiguration.h 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/UIProcess/API/APIPageConfiguration.h 2016-10-13 17:44:27 UTC (rev 207292)
@@ -92,6 +92,9 @@
bool initialCapitalizationEnabled() { return m_initialCapitalizationEnabled; }
void setInitialCapitalizationEnabled(bool initialCapitalizationEnabled) { m_initialCapitalizationEnabled = initialCapitalizationEnabled; }
+ bool shouldWaitForPaintAfterViewDidMoveToWindow() const { return m_shouldWaitForPaintAfterViewDidMoveToWindow; }
+ void setShouldWaitForPaintAfterViewDidMoveToWindow(bool shouldSynchronize) { m_shouldWaitForPaintAfterViewDidMoveToWindow = shouldSynchronize; }
+
private:
RefPtr<WebKit::WebProcessPool> m_processPool;
@@ -112,6 +115,7 @@
bool m_alwaysRunsAtForegroundPriority = false;
#endif
bool m_initialCapitalizationEnabled = true;
+ bool m_shouldWaitForPaintAfterViewDidMoveToWindow = true;
};
} // namespace API
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (207291 => 207292)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2016-10-13 17:44:27 UTC (rev 207292)
@@ -438,6 +438,7 @@
pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::httpEquivEnabledKey(), WebKit::WebPreferencesStore::Value(!![_configuration _allowsMetaRefresh]));
pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::allowUniversalAccessFromFileURLsKey(), WebKit::WebPreferencesStore::Value(!![_configuration _allowUniversalAccessFromFileURLs]));
pageConfiguration->setInitialCapitalizationEnabled([_configuration _initialCapitalizationEnabled]);
+ pageConfiguration->setShouldWaitForPaintAfterViewDidMoveToWindow([_configuration _shouldWaitForPaintAfterViewDidMoveToWindow]);
#if PLATFORM(MAC)
pageConfiguration->preferenceValues().set(WebKit::WebPreferencesKey::showsURLsInToolTipsEnabledKey(), WebKit::WebPreferencesStore::Value(!![_configuration _showsURLsInToolTips]));
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewConfiguration.mm (207291 => 207292)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewConfiguration.mm 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewConfiguration.mm 2016-10-13 17:44:27 UTC (rev 207292)
@@ -123,6 +123,7 @@
BOOL _requiresUserActionForEditingControlsManager;
#endif
BOOL _initialCapitalizationEnabled;
+ BOOL _shouldWaitForPaintAfterViewDidMoveToWindow;
#if ENABLE(APPLE_PAY)
BOOL _applePayEnabled;
@@ -174,6 +175,7 @@
_requiresUserActionForEditingControlsManager = NO;
#endif
_initialCapitalizationEnabled = YES;
+ _shouldWaitForPaintAfterViewDidMoveToWindow = YES;
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
_allowsAirPlayForMediaPlayback = YES;
@@ -284,6 +286,7 @@
configuration->_mediaTypesRequiringUserActionForPlayback = self->_mediaTypesRequiringUserActionForPlayback;
configuration->_mainContentUserGestureOverrideEnabled = self->_mainContentUserGestureOverrideEnabled;
configuration->_initialCapitalizationEnabled = self->_initialCapitalizationEnabled;
+ configuration->_shouldWaitForPaintAfterViewDidMoveToWindow = self->_shouldWaitForPaintAfterViewDidMoveToWindow;
#if PLATFORM(IOS)
configuration->_allowsInlineMediaPlayback = self->_allowsInlineMediaPlayback;
@@ -655,6 +658,16 @@
_initialCapitalizationEnabled = initialCapitalizationEnabled;
}
+- (BOOL)_shouldWaitForPaintAfterViewDidMoveToWindow
+{
+ return _shouldWaitForPaintAfterViewDidMoveToWindow;
+}
+
+- (void)_setShouldWaitForPaintAfterViewDidMoveToWindow:(BOOL)shouldSynchronize
+{
+ _shouldWaitForPaintAfterViewDidMoveToWindow = shouldSynchronize;
+}
+
#if PLATFORM(MAC)
- (BOOL)_showsURLsInToolTips
{
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h (207291 => 207292)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h 2016-10-13 17:44:27 UTC (rev 207292)
@@ -55,6 +55,7 @@
@property (nonatomic, setter=_setAttachmentElementEnabled:) BOOL _attachmentElementEnabled WK_API_AVAILABLE(macosx(10.12), ios(10.0));
@property (nonatomic, setter=_setInitialCapitalizationEnabled:) BOOL _initialCapitalizationEnabled WK_API_AVAILABLE(macosx(10.12), ios(10.0));
@property (nonatomic, setter=_setApplePayEnabled:) BOOL _applePayEnabled WK_API_AVAILABLE(macosx(10.12), ios(10.0));
+@property (nonatomic, setter=_setShouldWaitForPaintAfterViewDidMoveToWindow:) BOOL _shouldWaitForPaintAfterViewDidMoveToWindow WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
#if TARGET_OS_IPHONE
@property (nonatomic, setter=_setAlwaysRunsAtForegroundPriority:) BOOL _alwaysRunsAtForegroundPriority WK_API_AVAILABLE(ios(9_0));
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (207291 => 207292)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2016-10-13 17:44:27 UTC (rev 207292)
@@ -357,6 +357,7 @@
, m_initialCapitalizationEnabled(m_configuration->initialCapitalizationEnabled())
, m_backForwardList(WebBackForwardList::create(*this))
, m_maintainsInactiveSelection(false)
+ , m_shouldWaitForPaintAfterViewDidMoveToWindow(m_configuration->shouldWaitForPaintAfterViewDidMoveToWindow())
, m_isEditable(false)
, m_textZoomFactor(1)
, m_pageZoomFactor(1)
@@ -1524,7 +1525,7 @@
bool isNowInWindow = (changed & ViewState::IsInWindow) && isInWindow();
// We always want to wait for the Web process to reply if we've been in-window before and are coming back in-window.
- if (m_viewWasEverInWindow && isNowInWindow && m_drawingArea->hasVisibleContent())
+ if (m_viewWasEverInWindow && isNowInWindow && m_drawingArea->hasVisibleContent() && m_shouldWaitForPaintAfterViewDidMoveToWindow)
m_viewStateChangeWantsSynchronousReply = true;
// Don't wait synchronously if the view state is not visible. (This matters in particular on iOS, where a hidden page may be suspended.)
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (207291 => 207292)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2016-10-13 17:25:24 UTC (rev 207291)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2016-10-13 17:44:27 UTC (rev 207292)
@@ -1653,6 +1653,8 @@
bool m_maintainsInactiveSelection;
+ bool m_shouldWaitForPaintAfterViewDidMoveToWindow;
+
String m_toolTip;
EditorState m_editorState;