Title: [275434] trunk/Source
Revision
275434
Author
[email protected]
Date
2021-04-02 12:37:24 -0700 (Fri, 02 Apr 2021)

Log Message

Make sure we are no longer show the previous page when running a JS prompt
https://bugs.webkit.org/show_bug.cgi?id=215782
<rdar://problem/67698601>

Reviewed by Simon Fraser.

Source/WebCore:

Add linked-on-after check for the behavior change to minimize the risk of
breakage.

* platform/cocoa/VersionChecks.h:

Source/WebKit:

Make sure we are no longer show the previous page when running a JS prompt.
If we have not yet done a layer tree commit since the last load commit, then
we are likely still showing the previous page. If we are asked to run a JS
prompt / alert / confirm at this point, it would be confusing to still show
the previous page. In order to address the issue, we now make the view blank
in such scenario (ideally, we'd have painted the new page but this is
currently not a trivial thing to do).

To make the view blank, the approach chosen was to add a blank overlay view
on top of the content. This overlay view gets taken down as soon as we
paint the view again.

* SourcesCocoa.txt:
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _hasBlankOverlay]):
(-[WKWebView _setHasBlankOverlay:]):
* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/Cocoa/PageClientImplCocoa.h:
* UIProcess/Cocoa/PageClientImplCocoa.mm:
(WebKit::PageClientImplCocoa::setHasBlankOverlay):
* UIProcess/Cocoa/WKBlankOverlayView.h: Added.
* UIProcess/Cocoa/WKBlankOverlayView.mm: Added.
(-[WKBlankOverlayView initWithFrame:]):
* UIProcess/PageClient.h:
(WebKit::PageClient::setHasBlankOverlay):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::stopMakingViewBlankDueToLackOfRenderingUpdate):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::didCommitLayerTree):
* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::didUpdateRenderingAfterCommittingLoad):
* WebKit.xcodeproj/project.pbxproj:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didCommitLoad):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::updateRendering):
* WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::didUpdateRendering):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (275433 => 275434)


--- trunk/Source/WebCore/ChangeLog	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebCore/ChangeLog	2021-04-02 19:37:24 UTC (rev 275434)
@@ -1,3 +1,16 @@
+2021-04-02  Chris Dumez  <[email protected]>
+
+        Make sure we are no longer show the previous page when running a JS prompt
+        https://bugs.webkit.org/show_bug.cgi?id=215782
+        <rdar://problem/67698601>
+
+        Reviewed by Simon Fraser.
+
+        Add linked-on-after check for the behavior change to minimize the risk of
+        breakage.
+
+        * platform/cocoa/VersionChecks.h:
+
 2021-04-02  Devin Rousso  <[email protected]>
 
         [iPadOS] unable to reorder tabs on `*.mybinder.org`

Modified: trunk/Source/WebCore/platform/cocoa/VersionChecks.h (275433 => 275434)


--- trunk/Source/WebCore/platform/cocoa/VersionChecks.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebCore/platform/cocoa/VersionChecks.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -71,6 +71,7 @@
     FirstWithoutWeChatScrollingQuirk = DYLD_IOS_VERSION_14_5,
     FirstWithDOMWindowReuseRestriction  = DYLD_IOS_VERSION_14_5,
     FirstWithSharedNetworkProcess = DYLD_IOS_VERSION_14_5,
+    FirstWithBlankViewOnJSPrompt = DYLD_IOS_VERSION_14_5,
 #elif PLATFORM(MAC)
     FirstWithNetworkCache = DYLD_MACOSX_VERSION_10_11,
     FirstWithExceptionsForDuplicateCompletionHandlerCalls = DYLD_MACOSX_VERSION_10_13,
@@ -92,6 +93,7 @@
     FirstWithHTMLDocumentSupportedPropertyNames = DYLD_MACOSX_VERSION_11_3,
     FirstWithNullOriginForNonSpecialSchemedURLs = DYLD_MACOSX_VERSION_12_00,
     FirstWithDOMWindowReuseRestriction = DYLD_MACOSX_VERSION_11_3,
+    FirstWithBlankViewOnJSPrompt = DYLD_MACOSX_VERSION_11_3,
 #endif
 };
 

Modified: trunk/Source/WebKit/ChangeLog (275433 => 275434)


--- trunk/Source/WebKit/ChangeLog	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/ChangeLog	2021-04-02 19:37:24 UTC (rev 275434)
@@ -1,3 +1,54 @@
+2021-04-02  Chris Dumez  <[email protected]>
+
+        Make sure we are no longer show the previous page when running a JS prompt
+        https://bugs.webkit.org/show_bug.cgi?id=215782
+        <rdar://problem/67698601>
+
+        Reviewed by Simon Fraser.
+
+        Make sure we are no longer show the previous page when running a JS prompt.
+        If we have not yet done a layer tree commit since the last load commit, then
+        we are likely still showing the previous page. If we are asked to run a JS
+        prompt / alert / confirm at this point, it would be confusing to still show
+        the previous page. In order to address the issue, we now make the view blank
+        in such scenario (ideally, we'd have painted the new page but this is
+        currently not a trivial thing to do).
+
+        To make the view blank, the approach chosen was to add a blank overlay view
+        on top of the content. This overlay view gets taken down as soon as we
+        paint the view again.
+
+        * SourcesCocoa.txt:
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _hasBlankOverlay]):
+        (-[WKWebView _setHasBlankOverlay:]):
+        * UIProcess/API/Cocoa/WKWebViewInternal.h:
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/Cocoa/PageClientImplCocoa.h:
+        * UIProcess/Cocoa/PageClientImplCocoa.mm:
+        (WebKit::PageClientImplCocoa::setHasBlankOverlay):
+        * UIProcess/Cocoa/WKBlankOverlayView.h: Added.
+        * UIProcess/Cocoa/WKBlankOverlayView.mm: Added.
+        (-[WKBlankOverlayView initWithFrame:]):
+        * UIProcess/PageClient.h:
+        (WebKit::PageClient::setHasBlankOverlay):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::stopMakingViewBlankDueToLackOfRenderingUpdate):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::didCommitLayerTree):
+        * UIProcess/mac/WebPageProxyMac.mm:
+        (WebKit::WebPageProxy::didUpdateRenderingAfterCommittingLoad):
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::didCommitLoad):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::updateRendering):
+        * WebProcess/WebPage/mac/WebPageMac.mm:
+        (WebKit::WebPage::didUpdateRendering):
+
 2021-04-02  Per Arne  <[email protected]>
 
         Add IOKit method filter telemetry

Modified: trunk/Source/WebKit/SourcesCocoa.txt (275433 => 275434)


--- trunk/Source/WebKit/SourcesCocoa.txt	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/SourcesCocoa.txt	2021-04-02 19:37:24 UTC (rev 275434)
@@ -413,6 +413,7 @@
 UIProcess/Cocoa/WebProcessProxyCocoa.mm
 UIProcess/Cocoa/WebURLSchemeHandlerCocoa.mm
 UIProcess/Cocoa/WebViewImpl.mm
+UIProcess/Cocoa/WKBlankOverlayView.mm
 UIProcess/Cocoa/WKContactPicker.mm
 UIProcess/Cocoa/WKEditCommand.mm
 UIProcess/Cocoa/WKFullKeyboardAccessWatcher.mm

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -1455,6 +1455,26 @@
 
 #endif // ENABLE(ATTACHMENT_ELEMENT)
 
+- (BOOL)_hasBlankOverlay
+{
+    return !!_blankOverlayView;
+}
+
+- (void)_setHasBlankOverlay:(BOOL)hasBlankOverlay
+{
+    if (!!_blankOverlayView == hasBlankOverlay)
+        return;
+
+    if (hasBlankOverlay) {
+        auto backgroundColor = _page->backgroundColor().valueOr(WebCore::Color::white);
+        _blankOverlayView = adoptNS([[WKBlankOverlayView alloc] initWithFrame:[self bounds] color:platformColor(backgroundColor)]);
+        [self addSubview:_blankOverlayView.get()];
+    } else {
+        [_blankOverlayView removeFromSuperview];
+        _blankOverlayView = nullptr;
+    }
+}
+
 - (id <_WKAppHighlightDelegate>)_appHighlightDelegate
 {
 #if ENABLE(APP_HIGHLIGHTS)

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -25,6 +25,7 @@
 
 #import "PDFPluginIdentifier.h"
 #import "SameDocumentNavigationType.h"
+#import "WKBlankOverlayView.h"
 #import "WKShareSheet.h"
 #import "WKWebViewConfiguration.h"
 #import "WKWebViewPrivate.h"
@@ -132,6 +133,8 @@
     _WKRenderingProgressEvents _observedRenderingProgressEvents;
     BOOL _usePlatformFindUI;
 
+    RetainPtr<WKBlankOverlayView> _blankOverlayView;
+
 #if PLATFORM(MAC)
     std::unique_ptr<WebKit::WebViewImpl> _impl;
     RetainPtr<WKTextFinderClient> _textFinderClient;

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -366,6 +366,8 @@
 - (void)_didEnableBrowserExtensions:(NSDictionary<NSString *, NSString *> *)extensionIDToNameMap WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (void)_didDisableBrowserExtensions:(NSSet<NSString *> *)extensionIDs WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
+@property (nonatomic, setter=_setHasBlankOverlay:) BOOL _hasBlankOverlay WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
+
 @property (nonatomic, weak, setter=_setAppHighlightDelegate:) id <_WKAppHighlightDelegate> _appHighlightDelegate WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (void)_restoreAppHighlights:(NSArray<NSData *> *)data WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (void)_addAppHighlight WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -60,6 +60,8 @@
 
     bool scrollingUpdatesDisabledForTesting() final;
 
+    void setHasBlankOverlay(bool) final;
+
 #if ENABLE(ATTACHMENT_ELEMENT)
     void didInsertAttachment(API::Attachment&, const String& source) final;
     void didRemoveAttachment(API::Attachment&) final;

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -28,6 +28,7 @@
 
 #import "WKWebViewConfigurationPrivate.h"
 #import "WKWebViewInternal.h"
+#import "WKWebViewPrivate.h"
 #import "WKWebViewPrivateForTesting.h"
 #import <WebCore/AlternativeTextUIController.h>
 #import <wtf/Vector.h>
@@ -79,6 +80,11 @@
     return [m_webView _scrollingUpdatesDisabledForTesting];
 }
 
+void PageClientImplCocoa::setHasBlankOverlay(bool hasBlankOverlay)
+{
+    [m_webView _setHasBlankOverlay:hasBlankOverlay];
+}
+
 #if ENABLE(ATTACHMENT_ELEMENT)
 
 void PageClientImplCocoa::didInsertAttachment(API::Attachment& attachment, const String& source)

Added: trunk/Source/WebKit/UIProcess/Cocoa/WKBlankOverlayView.h (0 => 275434)


--- trunk/Source/WebKit/UIProcess/Cocoa/WKBlankOverlayView.h	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WKBlankOverlayView.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if PLATFORM(MAC)
+#import <AppKit/AppKit.h>
+
+using ColorType = NSColor;
+using ViewType = NSView;
+using RectType = NSRect;
+#else
+#import <UIKit/UIKit.h>
+
+using ColorType = UIColor;
+using ViewType = UIView;
+using RectType = CGRect;
+#endif
+
+@interface WKBlankOverlayView : ViewType
+
+- (instancetype)initWithFrame:(RectType)frame color:(ColorType*)color;
+
+@end

Added: trunk/Source/WebKit/UIProcess/Cocoa/WKBlankOverlayView.mm (0 => 275434)


--- trunk/Source/WebKit/UIProcess/Cocoa/WKBlankOverlayView.mm	                        (rev 0)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WKBlankOverlayView.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "WKBlankOverlayView.h"
+
+@implementation WKBlankOverlayView {
+}
+
+- (instancetype)initWithFrame:(RectType)frame color:(ColorType*)color
+{
+    if (!(self = [super initWithFrame:frame]))
+        return nil;
+
+#if PLATFORM(MAC)
+    [self setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
+    [self setWantsLayer:YES];
+#else
+    [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
+#endif
+    [[self layer] setBackgroundColor:[color CGColor]];
+    [[self layer] setName:@"WKBlankOverlayView layer"];
+
+    return self;
+}
+
+@end

Modified: trunk/Source/WebKit/UIProcess/PageClient.h (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/PageClient.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/PageClient.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -519,6 +519,8 @@
 
     virtual void setMouseEventPolicy(WebCore::MouseEventPolicy) { }
 
+    virtual void setHasBlankOverlay(bool) { }
+
 #if HAVE(PASTEBOARD_DATA_OWNER)
     virtual WebCore::DataOwnerType dataOwnerForPasteboard(PasteboardAccessIntent) const { return WebCore::DataOwnerType::Undefined; }
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-04-02 19:37:24 UTC (rev 275434)
@@ -2470,6 +2470,33 @@
 }
 #endif
 
+void WebPageProxy::stopMakingViewBlankDueToLackOfRenderingUpdate()
+{
+#if PLATFORM(COCOA)
+    ASSERT(m_hasUpdatedRenderingAfterDidCommitLoad);
+    RELEASE_LOG_IF_ALLOWED(Process, "stopMakingViewBlankDueToLackOfRenderingUpdate:");
+    pageClient().setHasBlankOverlay(false);
+#endif
+}
+
+// If we have not painted yet since the last load commit, then we are likely still displaying the previous page.
+// Displaying a JS prompt for the new page with the old page behind would be confusing so we add a blank overlay
+// on top of the view in this case.
+void WebPageProxy::makeViewBlankIfUnpaintedSinceLastLoadCommit()
+{
+#if PLATFORM(COCOA)
+    if (!m_hasUpdatedRenderingAfterDidCommitLoad) {
+        static bool shouldMakeViewBlank = linkedOnOrAfter(WebCore::SDKVersion::FirstWithBlankViewOnJSPrompt);
+        // Add a blank overlay view to make the view blank. This overlay will be taken down once
+        // when we've painted for the first time after committing a load.
+        if (shouldMakeViewBlank) {
+            RELEASE_LOG_IF_ALLOWED(Process, "makeViewBlankIfUnpaintedSinceLastLoadCommit: Making the view blank because of a JS prompt before the first paint for its page");
+            pageClient().setHasBlankOverlay(true);
+        }
+    }
+#endif
+}
+
 void WebPageProxy::discardQueuedMouseEvents()
 {
     while (m_mouseEventQueue.size() > 1)
@@ -4647,10 +4674,12 @@
     m_hasCommittedAnyProvisionalLoads = true;
     m_process->didCommitProvisionalLoad();
 
+#if PLATFORM(COCOA)
+    if (frame->isMainFrame()) {
+        m_hasUpdatedRenderingAfterDidCommitLoad = false;
 #if PLATFORM(IOS_FAMILY)
-    if (frame->isMainFrame()) {
-        m_hasReceivedLayerTreeTransactionAfterDidCommitLoad = false;
         m_firstLayerTreeTransactionIdAfterDidCommitLoad = downcast<RemoteLayerTreeDrawingAreaProxy>(*drawingArea()).nextLayerTreeTransactionID();
+#endif
     }
 #endif
 
@@ -5639,6 +5668,9 @@
         if (auto* automationSession = process().processPool().automationSession())
             automationSession->willShowJavaScriptDialog(*this);
     }
+
+    makeViewBlankIfUnpaintedSinceLastLoadCommit();
+
     m_uiClient->runJavaScriptAlert(*this, message, frame, WTFMove(frameInfo), WTFMove(reply));
 }
 
@@ -5657,6 +5689,8 @@
             automationSession->willShowJavaScriptDialog(*this);
     }
 
+    makeViewBlankIfUnpaintedSinceLastLoadCommit();
+
     m_uiClient->runJavaScriptConfirm(*this, message, frame, WTFMove(frameInfo), WTFMove(reply));
 }
 
@@ -5675,6 +5709,8 @@
             automationSession->willShowJavaScriptDialog(*this);
     }
 
+    makeViewBlankIfUnpaintedSinceLastLoadCommit();
+
     m_uiClient->runJavaScriptPrompt(*this, message, defaultValue, frame, WTFMove(frameInfo), WTFMove(reply));
 }
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -2194,6 +2194,9 @@
     void didPerformDictionaryLookup(const WebCore::DictionaryPopupInfo&);
 #endif
 
+    void stopMakingViewBlankDueToLackOfRenderingUpdate();
+    void makeViewBlankIfUnpaintedSinceLastLoadCommit();
+
     // Spelling and grammar.
     void checkSpellingOfString(const String& text, CompletionHandler<void(int32_t misspellingLocation, int32_t misspellingLength)>&&);
     void checkGrammarOfString(const String& text, CompletionHandler<void(Vector<WebCore::GrammarDetail>&&, int32_t badGrammarLocation, int32_t badGrammarLength)>&&);
@@ -2213,6 +2216,7 @@
 
     void didReceiveEvent(uint32_t opaqueType, bool handled);
 #if PLATFORM(MAC)
+    void didUpdateRenderingAfterCommittingLoad();
     void fontAtSelectionCallback(const FontInfo&, double, bool, CallbackID);
 #endif
 #if PLATFORM(IOS_FAMILY)
@@ -2515,7 +2519,6 @@
     Optional<WebCore::InputMode> m_pendingInputModeChange;
     TransactionID m_firstLayerTreeTransactionIdAfterDidCommitLoad;
     int32_t m_deviceOrientation { 0 };
-    bool m_hasReceivedLayerTreeTransactionAfterDidCommitLoad { true };
     bool m_hasNetworkRequestsOnSuspended { false };
     bool m_isKeyboardAnimatingIn { false };
     bool m_isScrollingOrZooming { false };
@@ -2642,6 +2645,10 @@
     bool m_isInPrintingMode { false };
     bool m_isPerformingDOMPrintOperation { false };
 
+#if PLATFORM(COCOA)
+    bool m_hasUpdatedRenderingAfterDidCommitLoad { true };
+#endif
+
     WebCore::ResourceRequest m_decidePolicyForResponseRequest;
     bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false };
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2021-04-02 19:37:24 UTC (rev 275434)
@@ -371,6 +371,7 @@
     RecordAutocorrectionResponse(int32_t response, String replacedString, String replacementString);
 
     SetEditableElementIsFocused(bool editableElementIsFocused)
+    DidUpdateRenderingAfterCommittingLoad()
 #endif
 
 #if USE(DICTATION_ALTERNATIVES)

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -340,9 +340,10 @@
     themeColorChanged(layerTreeTransaction.themeColor());
     pageExtendedBackgroundColorDidChange(layerTreeTransaction.pageExtendedBackgroundColor());
 
-    if (!m_hasReceivedLayerTreeTransactionAfterDidCommitLoad) {
+    if (!m_hasUpdatedRenderingAfterDidCommitLoad) {
         if (layerTreeTransaction.transactionID() >= m_firstLayerTreeTransactionIdAfterDidCommitLoad) {
-            m_hasReceivedLayerTreeTransactionAfterDidCommitLoad = true;
+            m_hasUpdatedRenderingAfterDidCommitLoad = true;
+            stopMakingViewBlankDueToLackOfRenderingUpdate();
             m_lastVisibleContentRectUpdate = VisibleContentRectUpdateInfo();
         }
     }

Modified: trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm (275433 => 275434)


--- trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -660,6 +660,15 @@
     return m_preferences->store().getBoolValueForKey(WebPreferencesKey::useiTunesAVOutputContextKey());
 }
 
+void WebPageProxy::didUpdateRenderingAfterCommittingLoad()
+{
+    if (m_hasUpdatedRenderingAfterDidCommitLoad)
+        return;
+
+    m_hasUpdatedRenderingAfterDidCommitLoad = true;
+    stopMakingViewBlankDueToLackOfRenderingUpdate();
+}
+
 #if ENABLE(UI_PROCESS_PDF_HUD)
 
 void WebPageProxy::createPDFHUD(PDFPluginIdentifier identifier, const WebCore::IntRect& rect)

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (275433 => 275434)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2021-04-02 19:37:24 UTC (rev 275434)
@@ -948,6 +948,7 @@
 		44EC3EA9247F5C090059489C /* _WKDragActionsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 44EC3EA8247F5C080059489C /* _WKDragActionsInternal.h */; };
 		460F488F1F996F7100CF4B87 /* WebSWContextManagerConnectionMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 460F488D1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessageReceiver.cpp */; };
 		460F48901F996F7100CF4B87 /* WebSWContextManagerConnectionMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 460F488E1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessages.h */; };
+		4613A74425D32CCF00A5033A /* WKBlankOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4613A74225D32CB800A5033A /* WKBlankOverlayView.h */; };
 		4614F13225DED875007006E7 /* GPUProcessConnectionParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 46AC532425DED81E003B57EC /* GPUProcessConnectionParameters.h */; };
 		461CCCA5231485A700B659B9 /* UIRemoteObjectRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 463236852314833F00A48FA7 /* UIRemoteObjectRegistry.h */; };
 		461CCCA6231485AA00B659B9 /* WebRemoteObjectRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 46323683231481EF00A48FA7 /* WebRemoteObjectRegistry.h */; };
@@ -3843,6 +3844,8 @@
 		4603011B234BE31E009C8217 /* WebBackForwardCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebBackForwardCache.h; sourceTree = "<group>"; };
 		460F488D1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebSWContextManagerConnectionMessageReceiver.cpp; path = DerivedSources/WebKit2/WebSWContextManagerConnectionMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
 		460F488E1F996F6C00CF4B87 /* WebSWContextManagerConnectionMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebSWContextManagerConnectionMessages.h; path = DerivedSources/WebKit2/WebSWContextManagerConnectionMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
+		4613A74225D32CB800A5033A /* WKBlankOverlayView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKBlankOverlayView.h; sourceTree = "<group>"; };
+		4613A74325D32CB900A5033A /* WKBlankOverlayView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WKBlankOverlayView.mm; sourceTree = "<group>"; };
 		462107D71F38DBD300DD7810 /* PingLoad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PingLoad.cpp; sourceTree = "<group>"; };
 		46323683231481EF00A48FA7 /* WebRemoteObjectRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebRemoteObjectRegistry.h; sourceTree = "<group>"; };
 		463236842314825C00A48FA7 /* WebRemoteObjectRegistry.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WebRemoteObjectRegistry.cpp; sourceTree = "<group>"; };
@@ -6981,6 +6984,8 @@
 				51D124321E6DE521002B2820 /* WebURLSchemeHandlerCocoa.mm */,
 				2DFC7DB91BCCC19500C1548C /* WebViewImpl.h */,
 				2DFC7DBA1BCCC19500C1548C /* WebViewImpl.mm */,
+				4613A74225D32CB800A5033A /* WKBlankOverlayView.h */,
+				4613A74325D32CB900A5033A /* WKBlankOverlayView.mm */,
 				E596DD68251E71D300C275A7 /* WKContactPicker.h */,
 				E596DD69251E71D400C275A7 /* WKContactPicker.mm */,
 				2ECF66CC21D6B77E009E5C3F /* WKEditCommand.h */,
@@ -12497,6 +12502,7 @@
 				BC646C1B11DD399F006455B0 /* WKBackForwardListRef.h in Headers */,
 				BCDDB317124EBD130048D13C /* WKBase.h in Headers */,
 				7CD5EBBB1746A83E000C1C45 /* WKBaseMac.h in Headers */,
+				4613A74425D32CCF00A5033A /* WKBlankOverlayView.h in Headers */,
 				BCBAAC73144E619E0053F82F /* WKBrowsingContextController.h in Headers */,
 				BCBAAC74144E61A50053F82F /* WKBrowsingContextControllerInternal.h in Headers */,
 				3788A05C14743C90006319E5 /* WKBrowsingContextControllerPrivate.h in Headers */,

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (275433 => 275434)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-04-02 19:37:24 UTC (rev 275434)
@@ -6194,6 +6194,9 @@
             scalePage(1, IntPoint());
     }
 
+#if PLATFORM(MAC)
+    m_didUpdateRenderingAfterCommittingLoad = false;
+#endif
 #if PLATFORM(IOS_FAMILY)
     m_hasReceivedVisibleContentRectsAfterDidCommitLoad = false;
     m_hasRestoredExposedContentRectAfterDidCommitLoad = false;

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (275433 => 275434)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-04-02 19:37:24 UTC (rev 275434)
@@ -630,6 +630,8 @@
 #if PLATFORM(MAC)
     void setTopOverhangImage(WebImage*);
     void setBottomOverhangImage(WebImage*);
+
+    void didUpdateRendering();
     
     void setUseSystemAppearance(bool);
 
@@ -2250,6 +2252,10 @@
 
     bool m_canUseCredentialStorage { true };
 
+#if PLATFORM(MAC)
+    bool m_didUpdateRenderingAfterCommittingLoad { false };
+#endif
+
     Vector<String> m_corsDisablingPatterns;
 
 #if ENABLE(IPC_TESTING_API)

Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (275433 => 275434)


--- trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -486,6 +486,7 @@
         }
 
         sendDidFirstLayerFlushIfNeeded();
+        m_webPage.didUpdateRendering();
         handleActivityStateChangeCallbacksIfNeeded();
         invalidateRenderingUpdateRunLoopObserver();
     }

Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm (275433 => 275434)


--- trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm	2021-04-02 19:33:16 UTC (rev 275433)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm	2021-04-02 19:37:24 UTC (rev 275434)
@@ -1032,6 +1032,15 @@
 {
 }
 
+void WebPage::didUpdateRendering()
+{
+    if (m_didUpdateRenderingAfterCommittingLoad)
+        return;
+
+    m_didUpdateRenderingAfterCommittingLoad = true;
+    send(Messages::WebPageProxy::DidUpdateRenderingAfterCommittingLoad());
+}
+
 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS_FAMILY)
 void WebPage::playbackTargetSelected(PlaybackTargetClientContextIdentifier contextId, const WebCore::MediaPlaybackTargetContext& targetContext) const
 {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to