Title: [207292] trunk/Source/WebKit2
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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to