Title: [239417] trunk
- Revision
- 239417
- Author
- benja...@webkit.org
- Date
- 2018-12-19 17:41:35 -0800 (Wed, 19 Dec 2018)
Log Message
<rdar://problem/46194315> macOS: WebKit1 does not handle occlusion changes
https://bugs.webkit.org/show_bug.cgi?id=192821
Reviewed by Chris Dumez.
Source/WebKitLegacy/mac:
When a window becomes occluded, the window server informs the application.
This should be used to suspend any work that is not visible by the user.
WebKit2 handles it just fine, but WebKit1 did not handle the notification.
In some cases, that lead to performance impact (see radar).
This patch adds an observer for the occlusion notification. I tried to stick
with the same names used by WebKit2.
* WebView/WebView.mm:
(-[WebView _isViewVisible]):
(-[WebView addWindowObserversForWindow:]):
(-[WebView removeWindowObservers]):
(-[WebView _windowDidChangeOcclusionState:]):
Tools:
* DumpRenderTree/mac/DumpRenderTree.mm:
(createWebViewAndOffscreenWindow):
Modified Paths
Diff
Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (239416 => 239417)
--- trunk/Source/WebKitLegacy/mac/ChangeLog 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog 2018-12-20 01:41:35 UTC (rev 239417)
@@ -1,3 +1,25 @@
+2018-12-19 Benjamin Poulain <benja...@webkit.org>
+
+ <rdar://problem/46194315> macOS: WebKit1 does not handle occlusion changes
+ https://bugs.webkit.org/show_bug.cgi?id=192821
+
+ Reviewed by Chris Dumez.
+
+ When a window becomes occluded, the window server informs the application.
+ This should be used to suspend any work that is not visible by the user.
+
+ WebKit2 handles it just fine, but WebKit1 did not handle the notification.
+ In some cases, that lead to performance impact (see radar).
+
+ This patch adds an observer for the occlusion notification. I tried to stick
+ with the same names used by WebKit2.
+
+ * WebView/WebView.mm:
+ (-[WebView _isViewVisible]):
+ (-[WebView addWindowObserversForWindow:]):
+ (-[WebView removeWindowObservers]):
+ (-[WebView _windowDidChangeOcclusionState:]):
+
2018-12-19 Megan Gardner <megan_gard...@apple.com>
Allow clients to set the navigator platform
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebView.mm (239416 => 239417)
--- trunk/Source/WebKitLegacy/mac/WebView/WebView.mm 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebView.mm 2018-12-20 01:41:35 UTC (rev 239417)
@@ -4668,15 +4668,21 @@
- (BOOL)_isViewVisible
{
- if (![self window])
+ NSWindow *window = [self window];
+ if (!window)
return false;
- if (![[self window] isVisible])
+ if (![window isVisible])
return false;
if ([self isHiddenOrHasHiddenAncestor])
return false;
+#if !PLATFORM(IOS_FAMILY)
+ if (_private->windowOcclusionDetectionEnabled && (window.occlusionState & NSWindowOcclusionStateVisible) != NSWindowOcclusionStateVisible)
+ return false;
+#endif
+
return true;
}
@@ -5065,6 +5071,18 @@
}
}
+#if !PLATFORM(IOS_FAMILY)
+- (BOOL)windowOcclusionDetectionEnabled
+{
+ return _private->windowOcclusionDetectionEnabled;
+}
+
+- (void)setWindowOcclusionDetectionEnabled:(BOOL)flag
+{
+ _private->windowOcclusionDetectionEnabled = flag;
+}
+#endif
+
- (void)_setPaginationBehavesLikeColumns:(BOOL)behavesLikeColumns
{
Page* page = core(self);
@@ -6000,22 +6018,26 @@
- (void)addWindowObserversForWindow:(NSWindow *)window
{
if (window) {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowKeyStateChanged:)
+ NSNotificationCenter *defaultNotificationCenter = [NSNotificationCenter defaultCenter];
+
+ [defaultNotificationCenter addObserver:self selector:@selector(windowKeyStateChanged:)
name:NSWindowDidBecomeKeyNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowKeyStateChanged:)
+ [defaultNotificationCenter addObserver:self selector:@selector(windowKeyStateChanged:)
name:NSWindowDidResignKeyNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowWillOrderOnScreen:)
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowWillOrderOnScreen:)
name:NSWindowWillOrderOnScreenNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowWillOrderOffScreen:)
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowWillOrderOffScreen:)
name:NSWindowWillOrderOffScreenNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidChangeBackingProperties:)
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowDidChangeBackingProperties:)
name:windowDidChangeBackingPropertiesNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidChangeScreen:)
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowDidChangeScreen:)
name:NSWindowDidChangeScreenNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowVisibilityChanged:)
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowVisibilityChanged:)
name:NSWindowDidMiniaturizeNotification object:window];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowVisibilityChanged:)
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowVisibilityChanged:)
name:NSWindowDidDeminiaturizeNotification object:window];
+ [defaultNotificationCenter addObserver:self selector:@selector(_windowDidChangeOcclusionState:)
+ name:NSWindowDidChangeOcclusionStateNotification object:window];
[_private->windowVisibilityObserver startObserving:window];
}
}
@@ -6024,22 +6046,26 @@
{
NSWindow *window = [self window];
if (window) {
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ NSNotificationCenter *defaultNotificationCenter = [NSNotificationCenter defaultCenter];
+
+ [defaultNotificationCenter removeObserver:self
name:NSWindowDidBecomeKeyNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:NSWindowDidResignKeyNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:NSWindowWillOrderOnScreenNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:NSWindowWillOrderOffScreenNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:windowDidChangeBackingPropertiesNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:NSWindowDidChangeScreenNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:NSWindowDidMiniaturizeNotification object:window];
- [[NSNotificationCenter defaultCenter] removeObserver:self
+ [defaultNotificationCenter removeObserver:self
name:NSWindowDidDeminiaturizeNotification object:window];
+ [defaultNotificationCenter removeObserver:self
+ name:NSWindowDidChangeOcclusionStateNotification object:window];
[_private->windowVisibilityObserver stopObserving:window];
}
}
@@ -6190,6 +6216,12 @@
_private->page->setDeviceScaleFactor(newBackingScaleFactor);
}
+
+- (void)_windowDidChangeOcclusionState:(NSNotification *)notification
+{
+ [self _updateVisibilityState];
+}
+
#else
- (void)_wakWindowScreenScaleChanged:(NSNotification *)notification
{
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebViewData.h (239416 => 239417)
--- trunk/Source/WebKitLegacy/mac/WebView/WebViewData.h 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebViewData.h 2018-12-20 01:41:35 UTC (rev 239417)
@@ -211,6 +211,7 @@
std::unique_ptr<WebCore::TextIndicatorWindow> textIndicatorWindow;
BOOL hasInitializedLookupObserver;
RetainPtr<WebWindowVisibilityObserver> windowVisibilityObserver;
+ BOOL windowOcclusionDetectionEnabled;
RetainPtr<NSEvent> pressureEvent;
#endif // PLATFORM(MAC)
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebViewData.mm (239416 => 239417)
--- trunk/Source/WebKitLegacy/mac/WebView/WebViewData.mm 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebViewData.mm 2018-12-20 01:41:35 UTC (rev 239417)
@@ -183,6 +183,10 @@
usesPageCache = YES;
shouldUpdateWhileOffscreen = YES;
+#if !PLATFORM(IOS_FAMILY)
+ windowOcclusionDetectionEnabled = YES;
+#endif
+
zoomMultiplier = 1;
zoomsTextOnly = NO;
Modified: trunk/Source/WebKitLegacy/mac/WebView/WebViewPrivate.h (239416 => 239417)
--- trunk/Source/WebKitLegacy/mac/WebView/WebViewPrivate.h 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Source/WebKitLegacy/mac/WebView/WebViewPrivate.h 2018-12-20 01:41:35 UTC (rev 239417)
@@ -852,6 +852,11 @@
- (WebPageVisibilityState)_visibilityState;
- (void)_setVisibilityState:(WebPageVisibilityState)visibilityState isInitialState:(BOOL)isInitialState;
+#if !TARGET_OS_IPHONE
+- (BOOL)windowOcclusionDetectionEnabled;
+- (void)setWindowOcclusionDetectionEnabled:(BOOL)flag;
+#endif
+
// Whether the column-break-{before,after} properties are respected instead of the
// page-break-{before,after} properties.
- (void)_setPaginationBehavesLikeColumns:(BOOL)behavesLikeColumns;
Modified: trunk/Tools/ChangeLog (239416 => 239417)
--- trunk/Tools/ChangeLog 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Tools/ChangeLog 2018-12-20 01:41:35 UTC (rev 239417)
@@ -1,3 +1,13 @@
+2018-12-19 Benjamin Poulain <benja...@webkit.org>
+
+ <rdar://problem/46194315> macOS: WebKit1 does not handle occlusion changes
+ https://bugs.webkit.org/show_bug.cgi?id=192821
+
+ Reviewed by Chris Dumez.
+
+ * DumpRenderTree/mac/DumpRenderTree.mm:
+ (createWebViewAndOffscreenWindow):
+
2018-12-19 Alex Christensen <achristen...@webkit.org>
Navigations away from the SafeBrowsing interstitial show a flash of old content
Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (239416 => 239417)
--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm 2018-12-20 01:40:11 UTC (rev 239416)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm 2018-12-20 01:41:35 UTC (rev 239417)
@@ -724,6 +724,7 @@
[WebView registerURLSchemeAsLocal:@"feedsearch"];
#if PLATFORM(MAC)
+ [webView setWindowOcclusionDetectionEnabled:NO];
[WebView _setFontWhitelist:fontWhitelist()];
#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes