Title: [277505] trunk
Revision
277505
Author
drou...@apple.com
Date
2021-05-14 14:34:46 -0700 (Fri, 14 May 2021)

Log Message

Promote `-[WKWebView _pageExtendedBackgroundColor]` SPI to `-[WKWebView underPageBackgroundColor]` API
https://bugs.webkit.org/show_bug.cgi?id=225615
<rdar://problem/76568094>

Reviewed by Wenson Hsieh.

Source/WebCore:

`underPageBackgroundColor` is a `null_resettable` property that will return (in order of validity)
 - the most recent non-null value provided
 - the CSS `background-color` of the `<body>` and/or `<html>` (this is the current value of `_pageExtendedBackgroundColor`)
 - the underlying platform view's background color
Modifications to this property will not have any effect until control is returned to the runloop.

Tests: WKWebViewUnderPageBackgroundColor.OnLoad
       WKWebViewUnderPageBackgroundColor.SingleSolidColor
       WKWebViewUnderPageBackgroundColor.SingleBlendedColor
       WKWebViewUnderPageBackgroundColor.MultipleSolidColors
       WKWebViewUnderPageBackgroundColor.MultipleBlendedColors
       WKWebViewUnderPageBackgroundColor.KVO
       WKWebViewUnderPageBackgroundColor.MatchesScrollView

* page/Page.h:
(WebCore::Page::underPageBackgroundColorOverride const): Added.
* page/Page.cpp:
(WebCore::Page::setUnderPageBackgroundColorOverride): Added.
Hold the client-overriden value for `underPageBackgroundColor` so that it can be used when
drawing the overscroll layer.

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateLayerForOverhangAreasBackgroundColor):
Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor` and
`UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.

* dom/Document.cpp:
(WebCore::Document::themeColorChanged):
It's no longer necessary to force the overscroll area to redraw since that'll be handled by
a client calling `-[WKWebView setUnderPageBackgroundColor:]` (possibly in response to a
`-[WKWebView themeColor]` KVO notification).

Source/WebKit:

`underPageBackgroundColor` is a `null_resettable` property that will return (in order of validity)
 - the most recent non-null value provided
 - the CSS `background-color` of the `<body>` and/or `<html>` (this is the current value of `_pageExtendedBackgroundColor`)
 - the underlying platform view's background color
Modifications to this property will not have any effect until control is returned to the runloop.

* UIProcess/API/Cocoa/WKWebView.h:
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView underPageBackgroundColor]): Added.
(-[WKWebView setUnderPageBackgroundColor:]): Added.
(+[WKWebView automaticallyNotifiesObserversOfUnderPageBackgroundColor]): Added.

* UIProcess/API/ios/WKWebViewIOS.mm:
(baseScrollViewBackgroundColor):
(scrollViewBackgroundColor):
Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor` and
`UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.

* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::underPageBackgroundColor const): Added.
(WebKit::WebPageProxy::setUnderPageBackgroundColorOverride): Added.
(WebKit::WebPageProxy::pageExtendedBackgroundColorDidChange):
(WebKit::WebPageProxy::platformUnderPageBackgroundColor const): Added.
(WebKit::WebPageProxy::scrollAreaBackgroundColor const): Deleted.
* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::platformUnderPageBackgroundColor const): Added.
* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::platformUnderPageBackgroundColor const): Added.
Store the client-overriden value for `underPageBackgroundColor` and manage state changes.

* UIProcess/PageClient.h:
(WebKit::PageClient::underPageBackgroundColorWillChange): Added.
(WebKit::PageClient::underPageBackgroundColorDidChange): Added.
* UIProcess/Cocoa/PageClientImplCocoa.h:
* UIProcess/Cocoa/PageClientImplCocoa.mm:
(WebKit::PageClientImplCocoa::underPageBackgroundColorWillChange): Added.
(WebKit::PageClientImplCocoa::underPageBackgroundColorDidChange): Added.
Add ObjC KVO support for `-[WKWebView underPageBackgroundColor]`.

* UIProcess/ios/PageClientImplIOS.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::contentViewBackgroundColor): Added.
Provide a way to get the `backgroundColor` of the `WKContentView`. This is needed on iOS
because `scrollViewBackgroundColor` (now `WebPageProxy::platformUnderPageBackgroundColor`)
would use this value before falling back to the underlying platform view's background color.

* WebProcess/WebPage/WebPage.messages.in:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::setUnderPageBackgroundColorOverride): Added.
Pass the client-overriden value for `underPageBackgroundColor` to the WebProcess so that it
can be used when drawing the overscroll layer.

* UIProcess/ViewSnapshotStore.cpp:
(WebKit::ViewSnapshotStore::recordSnapshot):
Go back to using the `pageExtendedBackgroundColor` (before r273083).

Source/WTF:

`underPageBackgroundColor` is a `null_resettable` property that will return (in order of validity)
 - the most recent non-null value provided
 - the CSS `background-color` of the `<body>` and/or `<html>` (this is the current value of `_pageExtendedBackgroundColor`)
 - the underlying platform view's background color
Modifications to this property will not have any effect until control is returned to the runloop.

* Scripts/Preferences/WebPreferencesInternal.yaml:
Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor`and
`UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/WKWebViewUnderPageBackgroundColor.mm: Renamed from PageExtendedBackgroundColor.mm.
(defaultBackgroundColor): Added.
(TEST.WKWebViewUnderPageBackgroundColor.OnLoad):
(TEST.WKWebViewUnderPageBackgroundColor.SingleSolidColor): Added.
(TEST.WKWebViewUnderPageBackgroundColor.SingleBlendedColor): Added.
(TEST.WKWebViewUnderPageBackgroundColor.MultipleSolidColors): Added.
(TEST.WKWebViewUnderPageBackgroundColor.MultipleBlendedColors): Added.
(-[WKWebViewUnderPageBackgroundColorObserver initWithWebView:]): Added.
(-[WKWebViewUnderPageBackgroundColorObserver observeValueForKeyPath:ofObject:change:context:]): Added.
(TEST.WKWebViewUnderPageBackgroundColor.KVO):
(TEST.WKWebViewUnderPageBackgroundColor.MatchesScrollView): Added.
(TEST.WKWebViewUnderPageBackgroundColor.MultipleStyles): Deleted.
(-[WKWebViewPageExtendedBackgroundColorObserver initWithWebView:]): Deleted.
(-[WKWebViewPageExtendedBackgroundColorObserver observeValueForKeyPath:ofObject:change:context:]): Deleted.

* TestWebKitAPI/Tests/WebKitCocoa/SampledPageTopColor.mm:
(createWebViewWithSampledPageTopColorMaxDifference):
(TEST.SampledPageTopColor.ExperimentalUseSampledPageTopColorForScrollAreaBackgroundColor): Deleted.
* TestWebKitAPI/Tests/WebKitCocoa/WKWebViewThemeColor.mm:
(createWebView): Deleted.
(TEST.WKWebView.ExperimentalUseThemeColorForScrollAreaBackgroundColor): Deleted.
Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor` and
`UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (277504 => 277505)


--- trunk/Source/WTF/ChangeLog	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WTF/ChangeLog	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1,3 +1,22 @@
+2021-05-14  Devin Rousso  <drou...@apple.com>
+
+        Promote `-[WKWebView _pageExtendedBackgroundColor]` SPI to `-[WKWebView underPageBackgroundColor]` API
+        https://bugs.webkit.org/show_bug.cgi?id=225615
+        <rdar://problem/76568094>
+
+        Reviewed by Wenson Hsieh.
+
+        `underPageBackgroundColor` is a `null_resettable` property that will return (in order of validity)
+         - the most recent non-null value provided
+         - the CSS `background-color` of the `<body>` and/or `<html>` (this is the current value of `_pageExtendedBackgroundColor`)
+         - the underlying platform view's background color
+        Modifications to this property will not have any effect until control is returned to the runloop.
+
+        * Scripts/Preferences/WebPreferencesInternal.yaml:
+        Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor`and
+        `UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
+        overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.
+
 2021-05-14  Chris Dumez  <cdu...@apple.com>
 
         Introduce FileSystem::updateFileModificationTime()

Modified: trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml (277504 => 277505)


--- trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2021-05-14 21:34:46 UTC (rev 277505)
@@ -760,30 +760,6 @@
     WebKit:
       default: defaultUseGPUProcessForDOMRenderingEnabled()
 
-UseSampledPageTopColorForScrollAreaBackgroundColor:
-  type: bool
-  humanReadableName: "Use sampled page top color for scroll area background color"
-  humanReadableDescription: "Use sampled page top color for scroll area background color"
-  defaultValue:
-    WebKitLegacy:
-      default: false
-    WebKit:
-      default: false
-    WebCore:
-      default: false
-
-UseThemeColorForScrollAreaBackgroundColor:
-  type: bool
-  humanReadableName: "Use theme-color for scroll area background color"
-  humanReadableDescription: "Use theme-color for scroll area background color"
-  defaultValue:
-    WebKitLegacy:
-      default: false
-    WebKit:
-      default: false
-    WebCore:
-      default: false
-
 # FIXME: Remove once <rdar://73830961> has been fixed
 UseiTunesAVOutputContext:
   type: bool

Modified: trunk/Source/WebCore/ChangeLog (277504 => 277505)


--- trunk/Source/WebCore/ChangeLog	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebCore/ChangeLog	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1,3 +1,44 @@
+2021-05-14  Devin Rousso  <drou...@apple.com>
+
+        Promote `-[WKWebView _pageExtendedBackgroundColor]` SPI to `-[WKWebView underPageBackgroundColor]` API
+        https://bugs.webkit.org/show_bug.cgi?id=225615
+        <rdar://problem/76568094>
+
+        Reviewed by Wenson Hsieh.
+
+        `underPageBackgroundColor` is a `null_resettable` property that will return (in order of validity)
+         - the most recent non-null value provided
+         - the CSS `background-color` of the `<body>` and/or `<html>` (this is the current value of `_pageExtendedBackgroundColor`)
+         - the underlying platform view's background color
+        Modifications to this property will not have any effect until control is returned to the runloop.
+
+        Tests: WKWebViewUnderPageBackgroundColor.OnLoad
+               WKWebViewUnderPageBackgroundColor.SingleSolidColor
+               WKWebViewUnderPageBackgroundColor.SingleBlendedColor
+               WKWebViewUnderPageBackgroundColor.MultipleSolidColors
+               WKWebViewUnderPageBackgroundColor.MultipleBlendedColors
+               WKWebViewUnderPageBackgroundColor.KVO
+               WKWebViewUnderPageBackgroundColor.MatchesScrollView
+
+        * page/Page.h:
+        (WebCore::Page::underPageBackgroundColorOverride const): Added.
+        * page/Page.cpp:
+        (WebCore::Page::setUnderPageBackgroundColorOverride): Added.
+        Hold the client-overriden value for `underPageBackgroundColor` so that it can be used when
+        drawing the overscroll layer.
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateLayerForOverhangAreasBackgroundColor):
+        Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor` and
+        `UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
+        overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.
+
+        * dom/Document.cpp:
+        (WebCore::Document::themeColorChanged):
+        It's no longer necessary to force the overscroll area to redraw since that'll be handled by
+        a client calling `-[WKWebView setUnderPageBackgroundColor:]` (possibly in response to a
+        `-[WKWebView themeColor]` KVO notification).
+
 2021-05-14  Alex Christensen  <achristen...@webkit.org>
 
         Fix a build after r277493

Modified: trunk/Source/WebCore/dom/Document.cpp (277504 => 277505)


--- trunk/Source/WebCore/dom/Document.cpp	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebCore/dom/Document.cpp	2021-05-14 21:34:46 UTC (rev 277505)
@@ -3901,13 +3901,6 @@
 
     if (auto* page = this->page())
         page->chrome().client().themeColorChanged();
-
-#if ENABLE(RUBBER_BANDING)
-    if (auto* view = renderView()) {
-        if (view->usesCompositing())
-            view->compositor().updateLayerForOverhangAreasBackgroundColor();
-    }
-#endif // ENABLE(RUBBER_BANDING)
 }
 
 static bool isValidPageSampleLocation(Document& document, const IntPoint& location)

Modified: trunk/Source/WebCore/page/Page.cpp (277504 => 277505)


--- trunk/Source/WebCore/page/Page.cpp	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebCore/page/Page.cpp	2021-05-14 21:34:46 UTC (rev 277505)
@@ -2563,6 +2563,25 @@
     return document->sampledPageTopColor();
 }
 
+void Page::setUnderPageBackgroundColorOverride(Color&& underPageBackgroundColorOverride)
+{
+    if (underPageBackgroundColorOverride == m_underPageBackgroundColorOverride)
+        return;
+
+    m_underPageBackgroundColorOverride = WTFMove(underPageBackgroundColorOverride);
+
+    scheduleRenderingUpdate({ });
+
+#if ENABLE(RUBBER_BANDING)
+    if (auto frameView = makeRefPtr(mainFrame().view())) {
+        if (auto* renderView = frameView->renderView()) {
+            if (renderView->usesCompositing())
+                renderView->compositor().updateLayerForOverhangAreasBackgroundColor();
+        }
+    }
+#endif // ENABLE(RUBBER_BANDING)
+}
+
 // These are magical constants that might be tweaked over time.
 static const double gMinimumPaintedAreaRatio = 0.1;
 static const double gMaximumUnpaintedAreaRatio = 0.04;

Modified: trunk/Source/WebCore/page/Page.h (277504 => 277505)


--- trunk/Source/WebCore/page/Page.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebCore/page/Page.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -623,6 +623,9 @@
     WEBCORE_EXPORT Color pageExtendedBackgroundColor() const;
     WEBCORE_EXPORT Color sampledPageTopColor() const;
 
+    Color underPageBackgroundColorOverride() const { return m_underPageBackgroundColorOverride; }
+    WEBCORE_EXPORT void setUnderPageBackgroundColorOverride(Color&&);
+
     bool isCountingRelevantRepaintedObjects() const;
     void setIsCountingRelevantRepaintedObjects(bool isCounting) { m_isCountingRelevantRepaintedObjects = isCounting; }
     void startCountingRelevantRepaintedObjects();
@@ -1152,6 +1155,8 @@
 
     MonotonicTime m_lastRenderingUpdateTimestamp;
 
+    Color m_underPageBackgroundColorOverride;
+
     const bool m_httpsUpgradeEnabled { true };
     mutable MediaSessionGroupIdentifier m_mediaSessionGroupIdentifier;
 };

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (277504 => 277505)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2021-05-14 21:34:46 UTC (rev 277505)
@@ -3882,16 +3882,9 @@
 
     if (m_renderView.settings().backgroundShouldExtendBeyondPage()) {
         backgroundColor = ([&] {
-            if (page().settings().useThemeColorForScrollAreaBackgroundColor()) {
-                if (auto themeColor = page().themeColor(); themeColor.isValid())
-                    return themeColor;
-            }
+            if (auto underPageBackgroundColorOverride = page().underPageBackgroundColorOverride(); underPageBackgroundColorOverride.isValid())
+                return underPageBackgroundColorOverride;
 
-            if (page().settings().useSampledPageTopColorForScrollAreaBackgroundColor()) {
-                if (auto sampledPageTopColor = page().sampledPageTopColor(); sampledPageTopColor.isValid())
-                    return sampledPageTopColor;
-            }
-
             return m_rootExtendedBackgroundColor;
         })();
         m_layerForOverhangAreas->setBackgroundColor(backgroundColor);

Modified: trunk/Source/WebKit/ChangeLog (277504 => 277505)


--- trunk/Source/WebKit/ChangeLog	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/ChangeLog	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1,5 +1,73 @@
 2021-05-14  Devin Rousso  <drou...@apple.com>
 
+        Promote `-[WKWebView _pageExtendedBackgroundColor]` SPI to `-[WKWebView underPageBackgroundColor]` API
+        https://bugs.webkit.org/show_bug.cgi?id=225615
+        <rdar://problem/76568094>
+
+        Reviewed by Wenson Hsieh.
+
+        `underPageBackgroundColor` is a `null_resettable` property that will return (in order of validity)
+         - the most recent non-null value provided
+         - the CSS `background-color` of the `<body>` and/or `<html>` (this is the current value of `_pageExtendedBackgroundColor`)
+         - the underlying platform view's background color
+        Modifications to this property will not have any effect until control is returned to the runloop.
+
+        * UIProcess/API/Cocoa/WKWebView.h:
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView underPageBackgroundColor]): Added.
+        (-[WKWebView setUnderPageBackgroundColor:]): Added.
+        (+[WKWebView automaticallyNotifiesObserversOfUnderPageBackgroundColor]): Added.
+
+        * UIProcess/API/ios/WKWebViewIOS.mm:
+        (baseScrollViewBackgroundColor):
+        (scrollViewBackgroundColor):
+        Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor` and
+        `UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
+        overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.
+
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::underPageBackgroundColor const): Added.
+        (WebKit::WebPageProxy::setUnderPageBackgroundColorOverride): Added.
+        (WebKit::WebPageProxy::pageExtendedBackgroundColorDidChange):
+        (WebKit::WebPageProxy::platformUnderPageBackgroundColor const): Added.
+        (WebKit::WebPageProxy::scrollAreaBackgroundColor const): Deleted.
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::platformUnderPageBackgroundColor const): Added.
+        * UIProcess/mac/WebPageProxyMac.mm:
+        (WebKit::WebPageProxy::platformUnderPageBackgroundColor const): Added.
+        Store the client-overriden value for `underPageBackgroundColor` and manage state changes.
+
+        * UIProcess/PageClient.h:
+        (WebKit::PageClient::underPageBackgroundColorWillChange): Added.
+        (WebKit::PageClient::underPageBackgroundColorDidChange): Added.
+        * UIProcess/Cocoa/PageClientImplCocoa.h:
+        * UIProcess/Cocoa/PageClientImplCocoa.mm:
+        (WebKit::PageClientImplCocoa::underPageBackgroundColorWillChange): Added.
+        (WebKit::PageClientImplCocoa::underPageBackgroundColorDidChange): Added.
+        Add ObjC KVO support for `-[WKWebView underPageBackgroundColor]`.
+
+        * UIProcess/ios/PageClientImplIOS.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        (WebKit::PageClientImpl::contentViewBackgroundColor): Added.
+        Provide a way to get the `backgroundColor` of the `WKContentView`. This is needed on iOS
+        because `scrollViewBackgroundColor` (now `WebPageProxy::platformUnderPageBackgroundColor`)
+        would use this value before falling back to the underlying platform view's background color.
+
+        * WebProcess/WebPage/WebPage.messages.in:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::setUnderPageBackgroundColorOverride): Added.
+        Pass the client-overriden value for `underPageBackgroundColor` to the WebProcess so that it
+        can be used when drawing the overscroll layer.
+
+        * UIProcess/ViewSnapshotStore.cpp:
+        (WebKit::ViewSnapshotStore::recordSnapshot):
+        Go back to using the `pageExtendedBackgroundColor` (before r273083).
+
+2021-05-14  Devin Rousso  <drou...@apple.com>
+
         [iOS] contextmenu hints can be clipped by the WKWebView
         https://bugs.webkit.org/show_bug.cgi?id=224204
         <rdar://problem/77089174>

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.h (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -580,6 +580,20 @@
 @property (nonatomic, readonly, nullable) NSColor *themeColor WK_API_AVAILABLE(macos(WK_MAC_TBA));
 #endif
 
+/*! @abstract The color drawn behind the active page.
+ @discussion A color derived from the content of the active page, such as by blending the background color of
+ the <html> and <body> elements with the @link backgroundColor @/link of this @link WKWebView @/link. Used as
+ the background color under the page's content, such as for scroll bouncing areas. Can be overridden by the
+ owner application for custom styling without having to modify the page's style.
+ the background of scroll bouncing areas.
+ @link WKWebView @/link is key-value observing (KVO) compliant for this property.
+ */
+#if TARGET_OS_IPHONE
+@property (nonatomic, null_resettable, copy) UIColor *underPageBackgroundColor WK_API_AVAILABLE(ios(WK_IOS_TBA));
+#else
+@property (nonatomic, null_resettable, copy) NSColor *underPageBackgroundColor WK_API_AVAILABLE(macos(WK_MAC_TBA));
+#endif
+
 @end
 
 #if !TARGET_OS_IPHONE

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1721,6 +1721,21 @@
     return WebCore::platformColor(themeColor);
 }
 
+- (CocoaColor *)underPageBackgroundColor
+{
+    return WebCore::platformColor(_page->underPageBackgroundColor());
+}
+
+- (void)setUnderPageBackgroundColor:(CocoaColor *)underPageBackgroundColorOverride
+{
+    _page->setUnderPageBackgroundColorOverride(underPageBackgroundColorOverride.CGColor);
+}
+
++ (BOOL)automaticallyNotifiesObserversOfUnderPageBackgroundColor
+{
+    return NO;
+}
+
 @end
 
 #pragma mark -
@@ -3188,11 +3203,13 @@
     _page->setCanUseCredentialStorage(canUseCredentialStorage);
 }
 
+// FIXME: Remove old `-[WKWebView _themeColor]` SPI <rdar://76662644>
 - (CocoaColor *)_themeColor
 {
     return [self themeColor];
 }
 
+// FIXME: Remove old `-[WKWebView _pageExtendedBackgroundColor]` SPI <rdar://77789732>
 - (CocoaColor *)_pageExtendedBackgroundColor
 {
     auto pageExtendedBackgroundColor = _page->pageExtendedBackgroundColor();

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -380,10 +380,11 @@
 @property (nonatomic, readonly) NSColor *_themeColor WK_API_DEPRECATED_WITH_REPLACEMENT("themeColor", macos(WK_MAC_TBA, WK_MAC_TBA));
 #endif
 
+// FIXME: Remove old `-[WKWebView _pageExtendedBackgroundColor]` SPI <rdar://77789732>
 #if TARGET_OS_IPHONE
-@property (nonatomic, readonly) UIColor *_pageExtendedBackgroundColor WK_API_AVAILABLE(ios(WK_IOS_TBA));
+@property (nonatomic, readonly) UIColor *_pageExtendedBackgroundColor WK_API_DEPRECATED_WITH_REPLACEMENT("underPageBackgroundColor", ios(WK_IOS_TBA, WK_IOS_TBA));
 #else
-@property (nonatomic, readonly) NSColor *_pageExtendedBackgroundColor;
+@property (nonatomic, readonly) NSColor *_pageExtendedBackgroundColor WK_API_DEPRECATED_WITH_REPLACEMENT("underPageBackgroundColor", macos(10.10, WK_MAC_TBA));
 #endif
 
 // Only set if `-[WKWebViewConfiguration _sampledPageTopColorMaxDifference]` is a positive number.

Modified: trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -493,7 +493,7 @@
     if (!webView->_page)
         return { };
 
-    return webView->_page->scrollAreaBackgroundColor();
+    return webView->_page->underPageBackgroundColor();
 }
 
 static WebCore::Color scrollViewBackgroundColor(WKWebView *webView)

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -38,6 +38,7 @@
 
 namespace WebCore {
 class AlternativeTextUIController;
+class Color;
 
 struct AppHighlight;
 }
@@ -53,6 +54,8 @@
 
     void themeColorWillChange() final;
     void themeColorDidChange() final;
+    void underPageBackgroundColorWillChange() final;
+    void underPageBackgroundColorDidChange() final;
     void pageExtendedBackgroundColorWillChange() final;
     void pageExtendedBackgroundColorDidChange() final;
     void sampledPageTopColorWillChange() final;

Modified: trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/Cocoa/PageClientImplCocoa.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -47,6 +47,8 @@
 void PageClientImplCocoa::themeColorWillChange()
 {
     [m_webView willChangeValueForKey:@"themeColor"];
+
+    // FIXME: Remove old `-[WKWebView _themeColor]` SPI <rdar://76662644>
     [m_webView willChangeValueForKey:@"_themeColor"];
 }
 
@@ -53,16 +55,30 @@
 void PageClientImplCocoa::themeColorDidChange()
 {
     [m_webView didChangeValueForKey:@"themeColor"];
+
+    // FIXME: Remove old `-[WKWebView _themeColor]` SPI <rdar://76662644>
     [m_webView didChangeValueForKey:@"_themeColor"];
 }
 
+void PageClientImplCocoa::underPageBackgroundColorWillChange()
+{
+    [m_webView willChangeValueForKey:@"underPageBackgroundColor"];
+}
+
+void PageClientImplCocoa::underPageBackgroundColorDidChange()
+{
+    [m_webView didChangeValueForKey:@"underPageBackgroundColor"];
+}
+
 void PageClientImplCocoa::pageExtendedBackgroundColorWillChange()
 {
+    // FIXME: Remove old `-[WKWebView _pageExtendedBackgroundColor]` SPI <rdar://77789732>
     [m_webView willChangeValueForKey:@"_pageExtendedBackgroundColor"];
 }
 
 void PageClientImplCocoa::pageExtendedBackgroundColorDidChange()
 {
+    // FIXME: Remove old `-[WKWebView _pageExtendedBackgroundColor]` SPI <rdar://77789732>
     [m_webView didChangeValueForKey:@"_pageExtendedBackgroundColor"];
 }
 

Modified: trunk/Source/WebKit/UIProcess/PageClient.h (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/PageClient.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/PageClient.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -490,6 +490,8 @@
 #if HAVE(UISCROLLVIEW_ASYNCHRONOUS_SCROLL_EVENT_HANDLING)
     virtual void handleAsynchronousCancelableScrollEvent(UIScrollView *, UIScrollEvent *, void (^completion)(BOOL handled)) = 0;
 #endif
+
+    virtual WebCore::Color contentViewBackgroundColor() = 0;
 #endif
 
     // Auxiliary Client Creation
@@ -514,6 +516,8 @@
 
     virtual void themeColorWillChange() { }
     virtual void themeColorDidChange() { }
+    virtual void underPageBackgroundColorWillChange() { }
+    virtual void underPageBackgroundColorDidChange() { }
     virtual void pageExtendedBackgroundColorWillChange() { }
     virtual void pageExtendedBackgroundColorDidChange() { }
     virtual void sampledPageTopColorWillChange() { }

Modified: trunk/Source/WebKit/UIProcess/ViewSnapshotStore.cpp (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/ViewSnapshotStore.cpp	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/ViewSnapshotStore.cpp	2021-05-14 21:34:46 UTC (rev 277505)
@@ -95,7 +95,7 @@
 
     snapshot->setRenderTreeSize(webPageProxy.renderTreeSize());
     snapshot->setDeviceScaleFactor(webPageProxy.deviceScaleFactor());
-    snapshot->setBackgroundColor(webPageProxy.scrollAreaBackgroundColor());
+    snapshot->setBackgroundColor(webPageProxy.pageExtendedBackgroundColor());
     snapshot->setViewScrollPosition(WebCore::roundedIntPoint(webPageProxy.viewScrollPosition()));
 
     item.setSnapshot(WTFMove(snapshot));

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1911,17 +1911,56 @@
         send(Messages::WebPage::SetUnderlayColor(color));
 }
 
-Color WebPageProxy::scrollAreaBackgroundColor() const
+Color WebPageProxy::underPageBackgroundColor() const
 {
-    if (m_preferences->useThemeColorForScrollAreaBackgroundColor() && m_themeColor.isValid())
-        return m_themeColor;
+    if (m_underPageBackgroundColorOverride.isValid())
+        return m_underPageBackgroundColorOverride;
 
-    if (m_preferences->useSampledPageTopColorForScrollAreaBackgroundColor() && m_sampledPageTopColor.isValid())
-        return m_sampledPageTopColor;
+    if (m_pageExtendedBackgroundColor.isValid())
+        return m_pageExtendedBackgroundColor;
 
-    return m_pageExtendedBackgroundColor;
+    return platformUnderPageBackgroundColor();
 }
 
+void WebPageProxy::setUnderPageBackgroundColorOverride(Color&& newUnderPageBackgroundColorOverride)
+{
+    if (newUnderPageBackgroundColorOverride == m_underPageBackgroundColorOverride)
+        return;
+
+    auto oldUnderPageBackgroundColor = underPageBackgroundColor();
+    auto oldUnderPageBackgroundColorOverride = std::exchange(m_underPageBackgroundColorOverride, newUnderPageBackgroundColorOverride);
+    bool changesUnderPageBackgroundColor = !equalIgnoringSemanticColor(oldUnderPageBackgroundColor, underPageBackgroundColor());
+    m_underPageBackgroundColorOverride = WTFMove(oldUnderPageBackgroundColorOverride);
+
+    if (changesUnderPageBackgroundColor)
+        pageClient().underPageBackgroundColorWillChange();
+
+    m_underPageBackgroundColorOverride = WTFMove(newUnderPageBackgroundColorOverride);
+
+    if (changesUnderPageBackgroundColor)
+        pageClient().underPageBackgroundColorDidChange();
+
+    if (m_hasPendingUnderPageBackgroundColorOverrideToDispatch)
+        return;
+
+    m_hasPendingUnderPageBackgroundColorOverrideToDispatch = true;
+
+    RunLoop::main().dispatch([this, weakThis = makeWeakPtr(*this)] {
+        if (!weakThis)
+            return;
+
+        if (!m_hasPendingUnderPageBackgroundColorOverrideToDispatch)
+            return;
+
+        m_hasPendingUnderPageBackgroundColorOverrideToDispatch = false;
+
+        didChangeBackgroundColor();
+
+        if (hasRunningProcess())
+            send(Messages::WebPage::SetUnderPageBackgroundColorOverride(m_underPageBackgroundColorOverride));
+    });
+}
+
 void WebPageProxy::viewWillStartLiveResize()
 {
     if (!hasRunningProcess())
@@ -8558,13 +8597,24 @@
     pageClient().themeColorDidChange();
 }
 
-void WebPageProxy::pageExtendedBackgroundColorDidChange(const Color& pageExtendedBackgroundColor)
+void WebPageProxy::pageExtendedBackgroundColorDidChange(const Color& newPageExtendedBackgroundColor)
 {
-    if (m_pageExtendedBackgroundColor == pageExtendedBackgroundColor)
+    if (m_pageExtendedBackgroundColor == newPageExtendedBackgroundColor)
         return;
 
+    auto oldUnderPageBackgroundColor = underPageBackgroundColor();
+    auto oldPageExtendedBackgroundColor = std::exchange(m_pageExtendedBackgroundColor, newPageExtendedBackgroundColor);
+    bool changesUnderPageBackgroundColor = !equalIgnoringSemanticColor(oldUnderPageBackgroundColor, underPageBackgroundColor());
+    m_pageExtendedBackgroundColor = WTFMove(oldPageExtendedBackgroundColor);
+
+    if (changesUnderPageBackgroundColor)
+        pageClient().underPageBackgroundColorWillChange();
     pageClient().pageExtendedBackgroundColorWillChange();
-    m_pageExtendedBackgroundColor = pageExtendedBackgroundColor;
+
+    m_pageExtendedBackgroundColor = newPageExtendedBackgroundColor;
+
+    if (changesUnderPageBackgroundColor)
+        pageClient().underPageBackgroundColorDidChange();
     pageClient().pageExtendedBackgroundColorDidChange();
 }
 
@@ -8578,6 +8628,15 @@
     pageClient().sampledPageTopColorDidChange();
 }
 
+#if !PLATFORM(COCOA)
+
+Color WebPageProxy::platformUnderPageBackgroundColor() const
+{
+    return Color::transparentBlack;
+}
+
+#endif // !PLATFORM(COCOA)
+
 #if ENABLE(NETSCAPE_PLUGIN_API)
 void WebPageProxy::didFailToInitializePlugin(const String& mimeType, const String& frameURLString, const String& pageURLString)
 {

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -672,7 +672,9 @@
 
     WebCore::Color sampledPageTopColor() const { return m_sampledPageTopColor; }
 
-    WebCore::Color scrollAreaBackgroundColor() const;
+    WebCore::Color underPageBackgroundColor() const;
+    WebCore::Color underPageBackgroundColorOverride() const { return m_underPageBackgroundColorOverride; }
+    void setUnderPageBackgroundColorOverride(WebCore::Color&&);
 
     void viewWillStartLiveResize();
     void viewWillEndLiveResize();
@@ -2108,6 +2110,7 @@
     void themeColorChanged(const WebCore::Color&);
     void pageExtendedBackgroundColorDidChange(const WebCore::Color&);
     void sampledPageTopColorChanged(const WebCore::Color&);
+    WebCore::Color platformUnderPageBackgroundColor() const;
 #if ENABLE(NETSCAPE_PLUGIN_API)
     void didFailToInitializePlugin(const String& mimeType, const String& frameURLString, const String& pageURLString);
     void didBlockInsecurePluginVersion(const String& mimeType, const String& pluginURLString, const String& frameURLString, const String& pageURLString, bool replacementObscured);
@@ -2652,10 +2655,13 @@
     LayerHostingMode m_layerHostingMode { LayerHostingMode::InProcess };
 
     WebCore::Color m_themeColor;
+    WebCore::Color m_underPageBackgroundColorOverride;
     WebCore::Color m_underlayColor;
     WebCore::Color m_pageExtendedBackgroundColor;
     WebCore::Color m_sampledPageTopColor;
 
+    bool m_hasPendingUnderPageBackgroundColorOverrideToDispatch { false };
+
     bool m_useFixedLayout { false };
     WebCore::IntSize m_fixedLayoutSize;
     Optional<WebCore::FloatRect> m_viewExposedRect;

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -293,6 +293,8 @@
     void handleAsynchronousCancelableScrollEvent(UIScrollView *, UIScrollEvent *, void (^completion)(BOOL handled)) final;
 #endif
 
+    WebCore::Color contentViewBackgroundColor() final;
+
     WeakObjCPtr<WKContentView> m_contentView;
     RetainPtr<WKEditorUndoTarget> m_undoTarget;
 };

Modified: trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1008,6 +1008,11 @@
     [m_contentView runModalJavaScriptDialog:WTFMove(callback)];
 }
 
+WebCore::Color PageClientImpl::contentViewBackgroundColor()
+{
+    return [m_contentView backgroundColor].CGColor;
+}
+
 } // namespace WebKit
 
 #endif // PLATFORM(IOS_FAMILY)

Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1564,7 +1564,18 @@
     pageClient().showDataDetectorsUIForPositionInformation(positionInfo);
 }
 
+Color WebPageProxy::platformUnderPageBackgroundColor() const
+{
+    if (auto contentViewBackgroundColor = pageClient().contentViewBackgroundColor(); contentViewBackgroundColor.isValid())
+        return contentViewBackgroundColor;
 
+#if HAVE(OS_DARK_MODE_SUPPORT)
+    return UIColor.systemBackgroundColor.CGColor;
+#else
+    return UIColor.whiteColor.CGColor;
+#endif
+}
+
 } // namespace WebKit
 
 #undef RELEASE_LOG_IF_ALLOWED

Modified: trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm (277504 => 277505)


--- trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -710,6 +710,15 @@
 }
 #endif
 
+Color WebPageProxy::platformUnderPageBackgroundColor() const
+{
+#if ENABLE(DARK_MODE_CSS)
+    return NSColor.controlBackgroundColor.CGColor;
+#else
+    return NSColor.whiteColor.CGColor;
+#endif
+}
+
 } // namespace WebKit
 
 #endif // PLATFORM(MAC)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (277504 => 277505)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-05-14 21:34:46 UTC (rev 277505)
@@ -2448,6 +2448,11 @@
     injectedBundle->didReceiveMessageToPage(this, messageName, webProcess.transformHandlesToObjects(userData.object()).get());
 }
 
+void WebPage::setUnderPageBackgroundColorOverride(WebCore::Color&& underPageBackgroundColorOverride)
+{
+    m_page->setUnderPageBackgroundColorOverride(WTFMove(underPageBackgroundColorOverride));
+}
+
 #if !PLATFORM(IOS_FAMILY)
 
 void WebPage::setHeaderPageBanner(PageBanner* pageBanner)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (277504 => 277505)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-05-14 21:34:46 UTC (rev 277505)
@@ -608,6 +608,8 @@
     
     void postInjectedBundleMessage(const String& messageName, const UserData&);
 
+    void setUnderPageBackgroundColorOverride(WebCore::Color&&);
+
     void setUnderlayColor(const WebCore::Color& color) { m_underlayColor = color; }
     WebCore::Color underlayColor() const { return m_underlayColor; }
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (277504 => 277505)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2021-05-14 21:34:46 UTC (rev 277505)
@@ -39,6 +39,7 @@
     SetTopContentInset(float contentInset)
 
     SetUnderlayColor(WebCore::Color color)
+    SetUnderPageBackgroundColorOverride(WebCore::Color underPageBackgroundColorOverride)
 
     ViewWillStartLiveResize()
     ViewWillEndLiveResize()

Modified: trunk/Tools/ChangeLog (277504 => 277505)


--- trunk/Tools/ChangeLog	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Tools/ChangeLog	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1,5 +1,40 @@
 2021-05-14  Devin Rousso  <drou...@apple.com>
 
+        Promote `-[WKWebView _pageExtendedBackgroundColor]` SPI to `-[WKWebView underPageBackgroundColor]` API
+        https://bugs.webkit.org/show_bug.cgi?id=225615
+        <rdar://problem/76568094>
+
+        Reviewed by Wenson Hsieh.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WKWebViewUnderPageBackgroundColor.mm: Renamed from PageExtendedBackgroundColor.mm.
+        (defaultBackgroundColor): Added.
+        (TEST.WKWebViewUnderPageBackgroundColor.OnLoad):
+        (TEST.WKWebViewUnderPageBackgroundColor.SingleSolidColor): Added.
+        (TEST.WKWebViewUnderPageBackgroundColor.SingleBlendedColor): Added.
+        (TEST.WKWebViewUnderPageBackgroundColor.MultipleSolidColors): Added.
+        (TEST.WKWebViewUnderPageBackgroundColor.MultipleBlendedColors): Added.
+        (-[WKWebViewUnderPageBackgroundColorObserver initWithWebView:]): Added.
+        (-[WKWebViewUnderPageBackgroundColorObserver observeValueForKeyPath:ofObject:change:context:]): Added.
+        (TEST.WKWebViewUnderPageBackgroundColor.KVO):
+        (TEST.WKWebViewUnderPageBackgroundColor.MatchesScrollView): Added.
+        (TEST.WKWebViewUnderPageBackgroundColor.MultipleStyles): Deleted.
+        (-[WKWebViewPageExtendedBackgroundColorObserver initWithWebView:]): Deleted.
+        (-[WKWebViewPageExtendedBackgroundColorObserver observeValueForKeyPath:ofObject:change:context:]): Deleted.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/SampledPageTopColor.mm:
+        (createWebViewWithSampledPageTopColorMaxDifference):
+        (TEST.SampledPageTopColor.ExperimentalUseSampledPageTopColorForScrollAreaBackgroundColor): Deleted.
+        * TestWebKitAPI/Tests/WebKitCocoa/WKWebViewThemeColor.mm:
+        (createWebView): Deleted.
+        (TEST.WKWebView.ExperimentalUseThemeColorForScrollAreaBackgroundColor): Deleted.
+        Remove the experimental settings `UseSampledPageTopColorForScrollAreaBackgroundColor` and
+        `UseThemeColorForScrollAreaBackgroundColor` now that clients can override the default
+        overscroll area background color using `-[WKWebView setUnderPageBackgroundColor:]`.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+
+2021-05-14  Devin Rousso  <drou...@apple.com>
+
         [iOS] contextmenu hints can be clipped by the WKWebView
         https://bugs.webkit.org/show_bug.cgi?id=224204
         <rdar://problem/77089174>

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (277504 => 277505)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2021-05-14 21:34:46 UTC (rev 277505)
@@ -874,7 +874,7 @@
 		93FCDB34263631560046DD7D /* SortedArrayMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93FCDB33263631560046DD7D /* SortedArrayMap.cpp */; };
 		95095F20262FFFA50000D920 /* SampledPageTopColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95095F1F262FFFA50000D920 /* SampledPageTopColor.mm */; };
 		950E4CC1252E75240071659F /* iOSStylusSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 950E4CC0252E75230071659F /* iOSStylusSupport.mm */; };
-		953ABB3525C0D682004C8B73 /* PageExtendedBackgroundColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 953ABB3425C0D681004C8B73 /* PageExtendedBackgroundColor.mm */; };
+		953ABB3525C0D682004C8B73 /* WKWebViewUnderPageBackgroundColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */; };
 		95A524952581A10D00461FE9 /* WKWebViewThemeColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */; };
 		95B6B3B7251EBF2F00FC4382 /* MediaDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95B6B3B6251EBF2F00FC4382 /* MediaDocument.mm */; };
 		9984FACC1CFFAF60008D198C /* WKWebViewTextInput.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9984FACA1CFFAEEE008D198C /* WKWebViewTextInput.mm */; };
@@ -2576,7 +2576,7 @@
 		93FCDB33263631560046DD7D /* SortedArrayMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SortedArrayMap.cpp; sourceTree = "<group>"; };
 		95095F1F262FFFA50000D920 /* SampledPageTopColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SampledPageTopColor.mm; sourceTree = "<group>"; };
 		950E4CC0252E75230071659F /* iOSStylusSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = iOSStylusSupport.mm; sourceTree = "<group>"; };
-		953ABB3425C0D681004C8B73 /* PageExtendedBackgroundColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PageExtendedBackgroundColor.mm; sourceTree = "<group>"; };
+		953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewUnderPageBackgroundColor.mm; sourceTree = "<group>"; };
 		95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewThemeColor.mm; sourceTree = "<group>"; };
 		95B6B3B6251EBF2F00FC4382 /* MediaDocument.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaDocument.mm; sourceTree = "<group>"; };
 		9984FACA1CFFAEEE008D198C /* WKWebViewTextInput.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewTextInput.mm; sourceTree = "<group>"; };
@@ -3483,8 +3483,8 @@
 				6351992722275C6A00890AD3 /* NavigationAction.mm */,
 				5C8BC798218CF3E900813886 /* NetworkProcess.mm */,
 				5CAE4637201937CD0051610F /* NetworkProcessCrashNonPersistentDataStore.mm */,
+				CDCFFEC022E268D500DF4223 /* NoPauseWhenSwitchingTabs.mm */,
 				46A80F25264C29D400EEF20D /* NotificationAPI.mm */,
-				CDCFFEC022E268D500DF4223 /* NoPauseWhenSwitchingTabs.mm */,
 				CD2D0D19213465560018C784 /* NowPlaying.mm */,
 				2ECFF5541D9B12F800B55394 /* NowPlayingControlsTests.mm */,
 				A10F047C1E3AD29C00C95E19 /* NSFileManagerExtras.mm */,
@@ -3493,7 +3493,6 @@
 				37A22AA51DCAA27200AFBFC4 /* ObservedRenderingProgressEventsAfterCrash.mm */,
 				CEA6CF2219CCF5BD0064F5A7 /* OpenAndCloseWindow.mm */,
 				2DA2586E225C67DC00B45C1C /* OverrideViewportArguments.mm */,
-				953ABB3425C0D681004C8B73 /* PageExtendedBackgroundColor.mm */,
 				2D3CA3A4221DF2390088E803 /* PageOverlayPlugin.mm */,
 				51242CDA237B791E00EED9C1 /* PageZoom.mm */,
 				F44C79FB20F9E50C0014478C /* ParserYieldTokenPlugIn.mm */,
@@ -3637,6 +3636,7 @@
 				CD7F89DB22A86CDA00D683AE /* WKWebViewSuspendAllMediaPlayback.mm */,
 				9984FACA1CFFAEEE008D198C /* WKWebViewTextInput.mm */,
 				95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */,
+				953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */,
 			);
 			name = "WebKit Cocoa";
 			path = WebKitCocoa;
@@ -5452,7 +5452,6 @@
 				CDB213BD24EF522800FDE301 /* FullscreenFocus.mm in Sources */,
 				CDE77D2525A6591C00D4115E /* FullscreenPointerLeave.mm in Sources */,
 				CDDC7C6925FFF6D000224278 /* FullscreenRemoveNodeBeforeEnter.mm in Sources */,
-				46A80F26264C29D400EEF20D /* NotificationAPI.mm in Sources */,
 				CDBFCC451A9FF45300A7B691 /* FullscreenZoomInitialFrame.mm in Sources */,
 				83DB79691EF63B3C00BFA5E5 /* Function.cpp in Sources */,
 				7CCE7EF81A411AE600447C4C /* Geolocation.cpp in Sources */,
@@ -5583,6 +5582,7 @@
 				7CCE7F051A411AE600447C4C /* NewFirstVisuallyNonEmptyLayoutFrames.cpp in Sources */,
 				0F5651F71FCE4DDC00310FBC /* NoHistoryItemScrollToFragment.mm in Sources */,
 				83F22C6420B355F80034277E /* NoPolicyDelegateResponse.mm in Sources */,
+				46A80F26264C29D400EEF20D /* NotificationAPI.mm in Sources */,
 				CD2D0D1A213465560018C784 /* NowPlaying.mm in Sources */,
 				2ECFF5551D9B12F800B55394 /* NowPlayingControlsTests.mm in Sources */,
 				5159F267260D43E300B2DA3C /* NowPlayingInfoTests.cpp in Sources */,
@@ -5596,7 +5596,6 @@
 				0F34077623037FDC0060A1A0 /* OverflowScrollViewTests.mm in Sources */,
 				C104BC1F2547237100C078C9 /* OverrideAppleLanguagesPreference.mm in Sources */,
 				2DA2586F225C67DC00B45C1C /* OverrideViewportArguments.mm in Sources */,
-				953ABB3525C0D682004C8B73 /* PageExtendedBackgroundColor.mm in Sources */,
 				7CCB4DA91C83AE7300CC6918 /* PageGroup.cpp in Sources */,
 				7CCE7F071A411AE600447C4C /* PageLoadBasic.cpp in Sources */,
 				7CCE7F081A411AE600447C4C /* PageLoadDidChangeLocationWithinPageForFrame.cpp in Sources */,
@@ -5878,6 +5877,7 @@
 				CD7F89DC22A86CDA00D683AE /* WKWebViewSuspendAllMediaPlayback.mm in Sources */,
 				9984FACC1CFFAF60008D198C /* WKWebViewTextInput.mm in Sources */,
 				95A524952581A10D00461FE9 /* WKWebViewThemeColor.mm in Sources */,
+				953ABB3525C0D682004C8B73 /* WKWebViewUnderPageBackgroundColor.mm in Sources */,
 				7C74C8FA22DFBA9600DA2DAB /* WTFStringUtilities.cpp in Sources */,
 				C14D304624B4C3BA00480387 /* XPCEndpoint.mm in Sources */,
 				9C64DC321D76198A004B598E /* YouTubePluginReplacement.cpp in Sources */,

Deleted: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PageExtendedBackgroundColor.mm (277504 => 277505)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PageExtendedBackgroundColor.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PageExtendedBackgroundColor.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -1,163 +0,0 @@
-/*
- * 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 "CocoaColor.h"
-#import "TestCocoa.h"
-#import "TestWKWebView.h"
-#import <WebKit/WKWebViewPrivate.h>
-#import <wtf/RetainPtr.h>
-
-#define EXPECT_NSSTRING_EQ(expected, actual) \
-    EXPECT_TRUE([actual isKindOfClass:[NSString class]]); \
-    EXPECT_WK_STREQ(expected, (NSString *)actual);
-
-constexpr CGFloat whiteColorComponents[4] = { 1, 1, 1, 1 };
-constexpr CGFloat redColorComponents[4] = { 1, 0, 0, 1 };
-constexpr CGFloat blueColorComponents[4] = { 0, 0, 1, 1 };
-
-TEST(PageExtendedBackgroundColor, OnLoad)
-{
-    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
-    auto whiteColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), whiteColorComponents));
-    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
-
-    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
-    EXPECT_TRUE(![webView _pageExtendedBackgroundColor]);
-
-    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body { background-color: red; } </style>"];
-
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, redColor.get()));
-
-    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body { not-background-color: red; } </style>"];
-
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, whiteColor.get()));
-}
-
-TEST(PageExtendedBackgroundColor, MultipleStyles)
-{
-    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
-    auto blueColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), blueColorComponents));
-
-    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
-    EXPECT_TRUE(![webView _pageExtendedBackgroundColor]);
-
-    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body { background-color: red; } body { background-color: blue; } </style>"];
-
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, blueColor.get()));
-}
-
-@interface WKWebViewPageExtendedBackgroundColorObserver : NSObject
-
-- (instancetype)initWithWebView:(WKWebView *)webView;
-
-@property (nonatomic, readonly) WKWebView *webView;
-@property (nonatomic, copy) NSString *state;
-
-@end
-
-@implementation WKWebViewPageExtendedBackgroundColorObserver
-
-- (instancetype)initWithWebView:(WKWebView *)webView
-{
-    if (!(self = [super init]))
-        return nil;
-
-    _state = @"before-init";
-
-    _webView = webView;
-    [_webView addObserver:self forKeyPath:@"_pageExtendedBackgroundColor" options:NSKeyValueObservingOptionInitial context:nil];
-
-    return self;
-}
-
-- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
-{
-    if ([_state isEqualToString:@"before-init"]) {
-        _state = @"after-init";
-        return;
-    }
-
-    if ([_state isEqualToString:@"before-load"]) {
-        _state = @"after-load";
-        return;
-    }
-
-    if ([_state isEqualToString:@"before-css-class-added"]) {
-        _state = @"after-css-class-added";
-        return;
-    }
-
-    if ([_state isEqualToString:@"before-css-class-changed"]) {
-        _state = @"after-css-class-changed";
-        return;
-    }
-
-    if ([_state isEqualToString:@"before-css-class-removed"]) {
-        _state = @"after-css-class-removed";
-        return;
-    }
-
-    RELEASE_ASSERT_NOT_REACHED();
-}
-
-@end
-
-TEST(PageExtendedBackgroundColor, KVO)
-{
-    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
-    auto whiteColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), whiteColorComponents));
-    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
-    auto blueColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), blueColorComponents));
-
-    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
-    auto themeColorObserver = adoptNS([[WKWebViewPageExtendedBackgroundColorObserver alloc] initWithWebView:webView.get()]);
-    EXPECT_NSSTRING_EQ("after-init", [themeColorObserver state]);
-    EXPECT_TRUE(![webView _pageExtendedBackgroundColor]);
-
-    [themeColorObserver setState:@"before-load"];
-    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body.red { background-color: red; } body.blue { background-color: blue; } </style>"];
-    EXPECT_NSSTRING_EQ("after-load", [themeColorObserver state]);
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, whiteColor.get()));
-
-    [themeColorObserver setState:@"before-css-class-added"];
-    [webView objectByEvaluatingJavaScript:@"document.body.className = 'red'"];
-    [webView waitForNextPresentationUpdate];
-    EXPECT_NSSTRING_EQ("after-css-class-added", [themeColorObserver state]);
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, redColor.get()));
-
-    [themeColorObserver setState:@"before-css-class-changed"];
-    [webView objectByEvaluatingJavaScript:@"document.body.className = 'blue'"];
-    [webView waitForNextPresentationUpdate];
-    EXPECT_NSSTRING_EQ("after-css-class-changed", [themeColorObserver state]);
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, blueColor.get()));
-
-    [themeColorObserver setState:@"before-css-class-removed"];
-    [webView objectByEvaluatingJavaScript:@"document.body.className = ''"];
-    [webView waitForNextPresentationUpdate];
-    EXPECT_NSSTRING_EQ("after-css-class-removed", [themeColorObserver state]);
-    EXPECT_TRUE(CGColorEqualToColor([webView _pageExtendedBackgroundColor].CGColor, whiteColor.get()));
-}

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SampledPageTopColor.mm (277504 => 277505)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SampledPageTopColor.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SampledPageTopColor.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -81,20 +81,12 @@
 
 @end
 
-enum class UseSampledPageTopColorForScrollAreaBackgroundColor : bool { Yes, No };
-static RetainPtr<TestWKWebView> createWebViewWithSampledPageTopColorMaxDifference(double sampledPageTopColorMaxDifference, double sampledPageTopColorMinHeight = 0, UseSampledPageTopColorForScrollAreaBackgroundColor useSampledPageTopColorForScrollAreaBackgroundColor = UseSampledPageTopColorForScrollAreaBackgroundColor::No)
+static RetainPtr<TestWKWebView> createWebViewWithSampledPageTopColorMaxDifference(double sampledPageTopColorMaxDifference, double sampledPageTopColorMinHeight = 0)
 {
     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     [configuration _setSampledPageTopColorMaxDifference:sampledPageTopColorMaxDifference];
     [configuration _setSampledPageTopColorMinHeight:sampledPageTopColorMinHeight];
 
-    for (_WKInternalDebugFeature *feature in [WKPreferences _internalDebugFeatures]) {
-        if ([feature.key isEqualToString:@"UseSampledPageTopColorForScrollAreaBackgroundColor"]) {
-            [[configuration preferences] _setEnabled:(useSampledPageTopColorForScrollAreaBackgroundColor == UseSampledPageTopColorForScrollAreaBackgroundColor::Yes) forInternalDebugFeature:feature];
-            break;
-        }
-    }
-
     return adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]);
 }
 
@@ -358,34 +350,3 @@
     EXPECT_IN_RANGE(components[2], 1.00, 1.01);
     EXPECT_EQ(components[3], 1);
 }
-
-#if PLATFORM(IOS_FAMILY)
-
-// There's no API/SPI to get the background color of the scroll area on macOS.
-
-TEST(SampledPageTopColor, ExperimentalUseSampledPageTopColorForScrollAreaBackgroundColor)
-{
-    auto webViewWithoutThemeColorForScrollAreaBackgroundColor = createWebViewWithSampledPageTopColorMaxDifference(5, 0, UseSampledPageTopColorForScrollAreaBackgroundColor::No);
-    EXPECT_NULL([webViewWithoutThemeColorForScrollAreaBackgroundColor _sampledPageTopColor]);
-
-    [webViewWithoutThemeColorForScrollAreaBackgroundColor synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:createHTMLGradientWithColorStops("right"_s, { "red"_s, "blue"_s })];
-    EXPECT_NULL([webViewWithoutThemeColorForScrollAreaBackgroundColor _sampledPageTopColor]);
-    EXPECT_EQ(WebCore::Color([webViewWithoutThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor), WebCore::Color::white);
-
-    waitForSampledPageTopColorToChangeForHTML(webViewWithoutThemeColorForScrollAreaBackgroundColor.get(), createHTMLGradientWithColorStops("right"_s, { "red"_s, "red"_s }));
-    EXPECT_EQ(WebCore::Color([webViewWithoutThemeColorForScrollAreaBackgroundColor _sampledPageTopColor].CGColor), WebCore::Color::red);
-    EXPECT_EQ(WebCore::Color([webViewWithoutThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor), WebCore::Color::white);
-
-    auto webViewWithThemeColorForScrollAreaBackgroundColor = createWebViewWithSampledPageTopColorMaxDifference(5, 0, UseSampledPageTopColorForScrollAreaBackgroundColor::Yes);
-    EXPECT_NULL([webViewWithThemeColorForScrollAreaBackgroundColor _sampledPageTopColor]);
-
-    [webViewWithThemeColorForScrollAreaBackgroundColor synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:createHTMLGradientWithColorStops("right"_s, { "red"_s, "blue"_s })];
-    EXPECT_NULL([webViewWithThemeColorForScrollAreaBackgroundColor _sampledPageTopColor]);
-    EXPECT_EQ(WebCore::Color([webViewWithThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor), WebCore::Color::white);
-
-    waitForSampledPageTopColorToChangeForHTML(webViewWithThemeColorForScrollAreaBackgroundColor.get(), createHTMLGradientWithColorStops("right"_s, { "red"_s, "red"_s }));
-    EXPECT_EQ(WebCore::Color([webViewWithThemeColorForScrollAreaBackgroundColor _sampledPageTopColor].CGColor), WebCore::Color::red);
-    EXPECT_EQ(WebCore::Color([webViewWithThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor), WebCore::Color::red);
-}
-
-#endif // PLATFORM(IOS_FAMILY)

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewThemeColor.mm (277504 => 277505)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewThemeColor.mm	2021-05-14 21:26:59 UTC (rev 277504)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewThemeColor.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -321,52 +321,3 @@
 }
 
 #endif // ENABLE(APPLICATION_MANIFEST)
-
-#if PLATFORM(IOS_FAMILY)
-
-// There's no API/SPI to get the background color of the scroll area on macOS.
-
-enum class UseThemeColorForScrollAreaBackgroundColor : bool { Yes, No };
-static RetainPtr<TestWKWebView> createWebView(UseThemeColorForScrollAreaBackgroundColor useThemeColorForScrollAreaBackgroundColor)
-{
-    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
-    for (_WKInternalDebugFeature *feature in [WKPreferences _internalDebugFeatures]) {
-        if ([feature.key isEqualToString:@"UseThemeColorForScrollAreaBackgroundColor"]) {
-            [[configuration preferences] _setEnabled:(useThemeColorForScrollAreaBackgroundColor == UseThemeColorForScrollAreaBackgroundColor::Yes) forInternalDebugFeature:feature];
-            break;
-        }
-    }
-
-    return adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]);
-}
-
-TEST(WKWebViewThemeColor, ExperimentalUseThemeColorForScrollAreaBackgroundColor)
-{
-    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
-    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
-    auto blueColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), blueColorComponents));
-
-    auto webViewWithoutThemeColorForScrollAreaBackgroundColor = createWebView(UseThemeColorForScrollAreaBackgroundColor::No);
-    EXPECT_TRUE(![webViewWithoutThemeColorForScrollAreaBackgroundColor themeColor]);
-
-    [webViewWithoutThemeColorForScrollAreaBackgroundColor synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<body style='background-color: blue'>"];
-    EXPECT_TRUE(![webViewWithoutThemeColorForScrollAreaBackgroundColor themeColor]);
-    EXPECT_TRUE(CGColorEqualToColor([webViewWithoutThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor, blueColor.get()));
-
-    [webViewWithoutThemeColorForScrollAreaBackgroundColor synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<meta name='theme-color' content='red'><body style='background-color: blue'>"];
-    EXPECT_TRUE(CGColorEqualToColor([webViewWithoutThemeColorForScrollAreaBackgroundColor themeColor].CGColor, redColor.get()));
-    EXPECT_TRUE(CGColorEqualToColor([webViewWithoutThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor, blueColor.get()));
-
-    auto webViewWithThemeColorForScrollAreaBackgroundColor = createWebView(UseThemeColorForScrollAreaBackgroundColor::Yes);
-    EXPECT_TRUE(![webViewWithThemeColorForScrollAreaBackgroundColor themeColor]);
-
-    [webViewWithThemeColorForScrollAreaBackgroundColor synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<body style='background-color: blue'>"];
-    EXPECT_TRUE(![webViewWithThemeColorForScrollAreaBackgroundColor themeColor]);
-    EXPECT_TRUE(CGColorEqualToColor([webViewWithThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor, blueColor.get()));
-
-    [webViewWithThemeColorForScrollAreaBackgroundColor synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<meta name='theme-color' content='red'><body style='background-color: blue'>"];
-    EXPECT_TRUE(CGColorEqualToColor([webViewWithThemeColorForScrollAreaBackgroundColor themeColor].CGColor, redColor.get()));
-    EXPECT_TRUE(CGColorEqualToColor([webViewWithThemeColorForScrollAreaBackgroundColor scrollView].backgroundColor.CGColor, redColor.get()));
-}
-
-#endif // PLATFORM(IOS_FAMILY)

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewUnderPageBackgroundColor.mm (0 => 277505)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewUnderPageBackgroundColor.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewUnderPageBackgroundColor.mm	2021-05-14 21:34:46 UTC (rev 277505)
@@ -0,0 +1,302 @@
+/*
+ * 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 "CocoaColor.h"
+#import "TestCocoa.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKWebViewPrivate.h>
+#import <wtf/RetainPtr.h>
+
+#define EXPECT_IN_RANGE(actual, min, max) \
+    EXPECT_GE(actual, min); \
+    EXPECT_LE(actual, max);
+
+#define EXPECT_NSSTRING_EQ(expected, actual) \
+    EXPECT_TRUE([actual isKindOfClass:[NSString class]]); \
+    EXPECT_WK_STREQ(expected, (NSString *)actual);
+
+constexpr CGFloat redColorComponents[4] = { 1, 0, 0, 1 };
+constexpr CGFloat blueColorComponents[4] = { 0, 0, 1, 1 };
+
+static RetainPtr<CGColor> defaultBackgroundColor()
+{
+#if HAVE(OS_DARK_MODE_SUPPORT) && PLATFORM(MAC)
+    auto color = retainPtr(NSColor.controlBackgroundColor);
+#elif HAVE(OS_DARK_MODE_SUPPORT) && PLATFORM(IOS_FAMILY)
+    auto color = retainPtr(UIColor.systemBackgroundColor);
+#else
+    auto color = retainPtr([CocoaColor whiteColor]);
+#endif
+
+    // Some of the above can sometimes be a monochrome color, so convert it to sRGB so the comparisons below work.
+    // `WebCore::ColorSpace` doesn't have an equivalent monochrome enum value, but treats `CGColor` with only two components as monochrome and converts them to `SRGB`.
+    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
+    auto sRGBColor = adoptCF(CGColorCreateCopyByMatchingToColorSpace(sRGBColorSpace.get(), kCGRenderingIntentDefault, [color CGColor], NULL));
+    return sRGBColor.get();
+}
+
+TEST(WKWebViewUnderPageBackgroundColor, OnLoad)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+}
+
+TEST(WKWebViewUnderPageBackgroundColor, SingleSolidColor)
+{
+    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
+    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body { background-color: red; } </style>"];
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+}
+
+TEST(WKWebViewUnderPageBackgroundColor, SingleBlendedColor)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body { background-color: rgba(255, 0, 0, 0.5); } </style>"];
+    auto components = CGColorGetComponents([webView underPageBackgroundColor].CGColor);
+    EXPECT_EQ(components[0], 1);
+    EXPECT_IN_RANGE(components[1], 0.45, 0.55);
+    EXPECT_IN_RANGE(components[2], 0.45, 0.55);
+    EXPECT_EQ(components[3], 1);
+}
+
+TEST(WKWebViewUnderPageBackgroundColor, MultipleSolidColors)
+{
+    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
+    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> html { background-color: blue; } body { background-color: red; } </style>"];
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+}
+
+TEST(WKWebViewUnderPageBackgroundColor, MultipleBlendedColors)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> html { background-color: rgba(255, 0, 0, 0.5); } body { background-color: rgba(0, 0, 255, 0.5); } </style>"];
+    auto components = CGColorGetComponents([webView underPageBackgroundColor].CGColor);
+    EXPECT_IN_RANGE(components[0], 0.45, 0.55);
+    EXPECT_IN_RANGE(components[1], 0.2, 0.25);
+    EXPECT_IN_RANGE(components[2], 0.7, 0.75);
+    EXPECT_EQ(components[3], 1);
+}
+
+@interface WKWebViewUnderPageBackgroundColorObserver : NSObject
+
+- (instancetype)initWithWebView:(WKWebView *)webView;
+
+@property (nonatomic, readonly) WKWebView *webView;
+@property (nonatomic, copy) NSString *state;
+
+@end
+
+@implementation WKWebViewUnderPageBackgroundColorObserver
+
+- (instancetype)initWithWebView:(WKWebView *)webView
+{
+    if (!(self = [super init]))
+        return nil;
+
+    _state = @"before-init";
+
+    _webView = webView;
+    [_webView addObserver:self forKeyPath:@"underPageBackgroundColor" options:NSKeyValueObservingOptionInitial context:nil];
+
+    return self;
+}
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+    if ([_state isEqualToString:@"before-init"]) {
+        _state = @"after-init";
+        return;
+    }
+
+    if ([_state isEqualToString:@"before-css-class-added"]) {
+        _state = @"after-css-class-added";
+        return;
+    }
+
+    if ([_state isEqualToString:@"before-css-class-changed"]) {
+        _state = @"after-css-class-changed";
+        return;
+    }
+
+    if ([_state isEqualToString:@"before-css-class-removed"]) {
+        _state = @"after-css-class-removed";
+        return;
+    }
+
+    if ([_state isEqualToString:@"before-nonnull-override"]) {
+        _state = @"after-nonnull-override";
+        return;
+    }
+
+    if ([_state isEqualToString:@"before-null-override"]) {
+        _state = @"after-null-override";
+        return;
+    }
+
+    EXPECT_NSSTRING_EQ("not-reached", _state);
+}
+
+@end
+
+TEST(WKWebViewUnderPageBackgroundColor, KVO)
+{
+    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
+    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
+    auto blueColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), blueColorComponents));
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    auto underPageBackgroundColorObserver = adoptNS([[WKWebViewUnderPageBackgroundColorObserver alloc] initWithWebView:webView.get()]);
+    EXPECT_NSSTRING_EQ("after-init", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body.red { background-color: red; } body.blue { background-color: blue; } </style>"];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [underPageBackgroundColorObserver setState:@"before-css-class-added"];
+    [webView objectByEvaluatingJavaScript:@"document.body.className = 'red'"];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_NSSTRING_EQ("after-css-class-added", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:[CocoaColor colorWithCGColor:redColor.get()]];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:nil];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"before-css-class-changed"];
+    [webView objectByEvaluatingJavaScript:@"document.body.className = 'blue'"];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_NSSTRING_EQ("after-css-class-changed", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, blueColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:[CocoaColor colorWithCGColor:blueColor.get()]];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, blueColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:nil];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, blueColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"before-css-class-removed"];
+    [webView objectByEvaluatingJavaScript:@"document.body.className = ''"];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_NSSTRING_EQ("after-css-class-removed", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:[CocoaColor colorWithCGColor:defaultBackgroundColor().get()]];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:nil];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+
+    [underPageBackgroundColorObserver setState:@"before-nonnull-override"];
+    [webView setUnderPageBackgroundColor:[CocoaColor colorWithCGColor:redColor.get()]];
+    EXPECT_NSSTRING_EQ("after-nonnull-override", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView setUnderPageBackgroundColor:[CocoaColor colorWithCGColor:redColor.get()]];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView objectByEvaluatingJavaScript:@"document.body.className = 'red'"];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView objectByEvaluatingJavaScript:@"document.body.className = 'blue'"];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"should-not-change"];
+    [webView objectByEvaluatingJavaScript:@"document.body.className = ''"];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_NSSTRING_EQ("should-not-change", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+
+    [underPageBackgroundColorObserver setState:@"before-null-override"];
+    [webView setUnderPageBackgroundColor:nil];
+    EXPECT_NSSTRING_EQ("after-null-override", [underPageBackgroundColorObserver state]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+}
+
+#if PLATFORM(IOS_FAMILY)
+
+// There's no API/SPI to get the background color of the scroll area on macOS.
+
+TEST(WKWebViewUnderPageBackgroundColor, MatchesScrollView)
+{
+    auto sRGBColorSpace = adoptCF(CGColorSpaceCreateWithName(kCGColorSpaceSRGB));
+    auto redColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), redColorComponents));
+    auto blueColor = adoptCF(CGColorCreate(sRGBColorSpace.get(), blueColorComponents));
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, defaultBackgroundColor().get()));
+    EXPECT_TRUE(CGColorEqualToColor([webView scrollView].backgroundColor.CGColor, defaultBackgroundColor().get()));
+
+    [webView synchronouslyLoadHTMLStringAndWaitUntilAllImmediateChildFramesPaint:@"<style> body { background-color: red; } </style>"];
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, redColor.get()));
+    EXPECT_TRUE(CGColorEqualToColor([webView scrollView].backgroundColor.CGColor, redColor.get()));
+
+    [webView setUnderPageBackgroundColor:[CocoaColor colorWithCGColor:blueColor.get()]];
+    [webView waitForNextPresentationUpdate];
+    EXPECT_TRUE(CGColorEqualToColor([webView underPageBackgroundColor].CGColor, blueColor.get()));
+    EXPECT_TRUE(CGColorEqualToColor([webView scrollView].backgroundColor.CGColor, blueColor.get()));
+}
+
+#endif // PLATFORM(IOS_FAMILY)
+
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to