From 39ef87e48b9977f686d3af08573b8370cc76d9f1 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Fri, 19 Aug 2022 01:05:48 +0200 Subject: [PATCH] browser(webkit): add forcedColors media query override (#16653) --- browser_patches/webkit/BUILD_NUMBER | 4 +- browser_patches/webkit/patches/bootstrap.diff | 126 +++++++++++++----- 2 files changed, 96 insertions(+), 34 deletions(-) diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index 97ddd81da3..9ea3724b2a 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1,2 +1,2 @@ -1705 -Changed: aslushnikov@gmail.com Thu Aug 18 20:47:20 MSK 2022 +1706 +Changed: max@schmitt.mx Thu Aug 18 23:03:06 UTC 2022 diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index 7d8e8ce828..2822f4ea91 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -983,7 +983,7 @@ index 96af27ece2ac200e11c4311b3ca0d9d3b5a048da..3168f7806fcbdabec07acc5e304bae1e ], "events": [ diff --git a/Source/JavaScriptCore/inspector/protocol/Page.json b/Source/JavaScriptCore/inspector/protocol/Page.json -index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61ed836918 100644 +index 1c97ad011c5ec183a5866bb98319badd5ec9442f..7a40d1c730b870a58f810cf3118b5004c8021017 100644 --- a/Source/JavaScriptCore/inspector/protocol/Page.json +++ b/Source/JavaScriptCore/inspector/protocol/Page.json @@ -21,7 +21,14 @@ @@ -1002,7 +1002,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 ] }, { -@@ -49,6 +56,12 @@ +@@ -49,6 +56,18 @@ "enum": ["Light", "Dark"], "description": "Page appearance name." }, @@ -1011,11 +1011,17 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 + "type": "string", + "enum": ["Reduce", "NoPreference"], + "description": "Page reduced-motion media query override." ++ }, ++ { ++ "id": "ForcedColors", ++ "type": "string", ++ "enum": ["Active", "None"], ++ "description": "Page forced-colors media query override." + }, { "id": "Frame", "type": "object", -@@ -112,6 +125,51 @@ +@@ -112,6 +131,51 @@ { "name": "secure", "type": "boolean", "description": "True if cookie is secure." }, { "name": "sameSite", "$ref": "CookieSameSitePolicy", "description": "Cookie Same-Site policy." } ] @@ -1067,7 +1073,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 } ], "commands": [ -@@ -131,6 +189,14 @@ +@@ -131,6 +195,14 @@ { "name": "revalidateAllResources", "type": "boolean", "optional": true, "description": "If true, all cached subresources will be revalidated when the main resource loads. Otherwise, only expired cached subresources will be revalidated (the default behavior for most WebKit clients)." } ] }, @@ -1082,7 +1088,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 { "name": "navigate", "description": "Navigates current page to the given URL.", -@@ -147,6 +213,14 @@ +@@ -147,6 +219,14 @@ { "name": "value", "type": "string", "optional": true, "description": "Value to override the user agent with. If this value is not provided, the override is removed. Overrides are removed when Web Inspector closes/disconnects." } ] }, @@ -1097,7 +1103,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 { "name": "overrideSetting", "description": "Allows the frontend to override the inspected page's settings.", -@@ -204,7 +278,8 @@ +@@ -204,7 +284,8 @@ "name": "setBootstrapScript", "targetTypes": ["page"], "parameters": [ @@ -1107,7 +1113,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 ] }, { -@@ -270,6 +345,28 @@ +@@ -270,6 +351,36 @@ { "name": "appearance", "$ref": "Appearance", "optional": true } ] }, @@ -1120,6 +1126,14 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 + ] + }, + { ++ "name": "setForcedColors", ++ "description": "Forces the forced-colors media query for the page.", ++ "targetTypes": ["page"], ++ "parameters": [ ++ { "name": "forcedColors", "$ref": "ForcedColors", "optional": true } ++ ] ++ }, ++ { + "name": "setTimeZone", + "description": "Enables time zone emulation.", + "parameters": [ @@ -1136,7 +1150,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 { "name": "snapshotNode", "description": "Capture a snapshot of the specified node that does not include unrelated layers.", -@@ -290,7 +387,8 @@ +@@ -290,7 +401,8 @@ { "name": "y", "type": "integer", "description": "Y coordinate" }, { "name": "width", "type": "integer", "description": "Rectangle width" }, { "name": "height", "type": "integer", "description": "Rectangle height" }, @@ -1146,7 +1160,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 ], "returns": [ { "name": "dataURL", "type": "string", "description": "Base64-encoded image data (PNG)." } -@@ -308,12 +406,92 @@ +@@ -308,12 +420,92 @@ { "name": "setScreenSizeOverride", "description": "Overrides screen size exposed to DOM and used in media queries for testing with provided values.", @@ -1240,7 +1254,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 } ], "events": [ -@@ -321,14 +499,16 @@ +@@ -321,14 +513,16 @@ "name": "domContentEventFired", "targetTypes": ["page"], "parameters": [ @@ -1259,7 +1273,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 ] }, { -@@ -338,6 +518,14 @@ +@@ -338,6 +532,14 @@ { "name": "frame", "$ref": "Frame", "description": "Frame object." } ] }, @@ -1274,7 +1288,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 { "name": "frameDetached", "description": "Fired when frame has been detached from its parent.", -@@ -377,6 +565,22 @@ +@@ -377,6 +579,22 @@ { "name": "frameId", "$ref": "Network.FrameId", "description": "Id of the frame that has cleared its scheduled navigation." } ] }, @@ -1297,7 +1311,7 @@ index 1c97ad011c5ec183a5866bb98319badd5ec9442f..658937fdc58425b9a164d9bc368a9e61 { "name": "defaultAppearanceDidChange", "description": "Fired when page's default appearance changes, even if there is a forced appearance.", -@@ -385,6 +589,42 @@ +@@ -385,6 +603,42 @@ "parameters": [ { "name": "appearance", "$ref": "Appearance", "description": "Name of the appearance that is active (not considering any forced appearance.)" } ] @@ -2595,10 +2609,24 @@ index 66d16a6e4075540d291204fc6e10fdd41aba0d42..e11edda46dca31abbd9498b0eaeca48a macro(DynamicsCompressorNode) \ macro(ExtendableEvent) \ diff --git a/Source/WebCore/css/MediaQueryEvaluator.cpp b/Source/WebCore/css/MediaQueryEvaluator.cpp -index 871eb7cc9333921c4848b909786de27d4b2827b5..6b51751a07b547d13aa4f0c75423e48168bb6a66 100644 +index 871eb7cc9333921c4848b909786de27d4b2827b5..937637c8eed766ceedb0a698376c8c92ebf93d13 100644 --- a/Source/WebCore/css/MediaQueryEvaluator.cpp +++ b/Source/WebCore/css/MediaQueryEvaluator.cpp -@@ -874,7 +874,11 @@ static bool prefersContrastEvaluate(CSSValue* value, const CSSToLengthConversion +@@ -489,8 +489,12 @@ static bool scanEvaluate(CSSValue* value, const CSSToLengthConversionData&, Fram + return primitiveValue->valueID() == CSSValueProgressive; + } + +-static bool forcedColorsEvaluate(CSSValue* value, const CSSToLengthConversionData&, Frame&, MediaFeaturePrefix) ++static bool forcedColorsEvaluate(CSSValue* value, const CSSToLengthConversionData&, Frame& frame, MediaFeaturePrefix) + { ++ std::optional forcedColorsOverride = frame.page()->useForcedColorsOverride(); ++ if (forcedColorsOverride) ++ return downcast(*value).valueID() == (forcedColorsOverride.value() ? CSSValueActive : CSSValueNone); ++ + auto* primitiveValue = dynamicDowncast(value); + if (!primitiveValue) + return false; +@@ -874,7 +878,11 @@ static bool prefersContrastEvaluate(CSSValue* value, const CSSToLengthConversion static bool prefersReducedMotionEvaluate(CSSValue* value, const CSSToLengthConversionData&, Frame& frame, MediaFeaturePrefix) { bool userPrefersReducedMotion = false; @@ -2611,7 +2639,7 @@ index 871eb7cc9333921c4848b909786de27d4b2827b5..6b51751a07b547d13aa4f0c75423e481 switch (frame.settings().forcedPrefersReducedMotionAccessibilityValue()) { case ForcedAccessibilityValue::On: userPrefersReducedMotion = true; -@@ -887,6 +891,7 @@ static bool prefersReducedMotionEvaluate(CSSValue* value, const CSSToLengthConve +@@ -887,6 +895,7 @@ static bool prefersReducedMotionEvaluate(CSSValue* value, const CSSToLengthConve #endif break; } @@ -3888,7 +3916,7 @@ index c6ebcc9d7e399a35f71350c9374df0f2107c518b..3bfa03ae7f27d9128fe207c1de1bfea9 // InspectorInstrumentation void willRecalculateStyle(); diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp -index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..2dbdbdee399a1f31b1d71024c916834be24f1729 100644 +index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..47811cd1eeaa9f2ef224abfd3962cf1b5b8f107c 100644 --- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp @@ -32,20 +32,28 @@ @@ -4320,7 +4348,7 @@ index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..2dbdbdee399a1f31b1d71024c916834b IntRect rectangle(x, y, width, height); auto snapshot = snapshotFrameRect(m_inspectedPage.mainFrame(), rectangle, WTFMove(options)); -@@ -1100,6 +1273,47 @@ Protocol::ErrorStringOr InspectorPageAgent::snapshotRect(int x, int y, i +@@ -1100,6 +1273,67 @@ Protocol::ErrorStringOr InspectorPageAgent::snapshotRect(int x, int y, i return snapshot->toDataURL("image/png"_s, std::nullopt, PreserveResolution::Yes); } @@ -4344,6 +4372,26 @@ index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..2dbdbdee399a1f31b1d71024c916834b + return { }; +} + ++Protocol::ErrorStringOr InspectorPageAgent::setForcedColors(std::optional&& forcedColors) ++{ ++ if (!forcedColors) { ++ m_inspectedPage.setUseForcedColorsOverride(std::nullopt); ++ return { }; ++ } ++ ++ switch (*forcedColors) { ++ case Protocol::Page::ForcedColors::Active: ++ m_inspectedPage.setUseForcedColorsOverride(true); ++ return { }; ++ case Protocol::Page::ForcedColors::None: ++ m_inspectedPage.setUseForcedColorsOverride(false); ++ return { }; ++ } ++ ++ ASSERT_NOT_REACHED(); ++ return { }; ++} ++ +Protocol::ErrorStringOr InspectorPageAgent::setTimeZone(const String& timeZone) +{ + bool success = WTF::setTimeZoneOverride(timeZone); @@ -4368,7 +4416,7 @@ index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..2dbdbdee399a1f31b1d71024c916834b #if ENABLE(WEB_ARCHIVE) && USE(CF) Protocol::ErrorStringOr InspectorPageAgent::archive() { -@@ -1112,7 +1326,6 @@ Protocol::ErrorStringOr InspectorPageAgent::archive() +@@ -1112,7 +1346,6 @@ Protocol::ErrorStringOr InspectorPageAgent::archive() } #endif @@ -4376,7 +4424,7 @@ index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..2dbdbdee399a1f31b1d71024c916834b Protocol::ErrorStringOr InspectorPageAgent::setScreenSizeOverride(std::optional&& width, std::optional&& height) { if (width.has_value() != height.has_value()) -@@ -1127,6 +1340,632 @@ Protocol::ErrorStringOr InspectorPageAgent::setScreenSizeOverride(std::opt +@@ -1127,6 +1360,632 @@ Protocol::ErrorStringOr InspectorPageAgent::setScreenSizeOverride(std::opt m_inspectedPage.mainFrame().setOverrideScreenSize(FloatSize(width.value_or(0), height.value_or(0))); return { }; } @@ -5010,7 +5058,7 @@ index a6e415a9bf47e0f4c98b9f375b3195df287fe67b..2dbdbdee399a1f31b1d71024c916834b } // namespace WebCore diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.h b/Source/WebCore/inspector/agents/InspectorPageAgent.h -index 6d94ad131257d8d7cdb05898fd3f42e0c72766bf..6a85dba5cac19bf0adc93e0015ad223a2c60b5ad 100644 +index 6d94ad131257d8d7cdb05898fd3f42e0c72766bf..06d6cc40ad9bd914fa77197b1910aa60e61c19f0 100644 --- a/Source/WebCore/inspector/agents/InspectorPageAgent.h +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.h @@ -32,19 +32,26 @@ @@ -5068,11 +5116,12 @@ index 6d94ad131257d8d7cdb05898fd3f42e0c72766bf..6a85dba5cac19bf0adc93e0015ad223a Inspector::Protocol::ErrorStringOr>> searchInResource(const Inspector::Protocol::Network::FrameId&, const String& url, const String& query, std::optional&& caseSensitive, std::optional&& isRegex, const Inspector::Protocol::Network::RequestId&); Inspector::Protocol::ErrorStringOr>> searchInResources(const String&, std::optional&& caseSensitive, std::optional&& isRegex); #if !PLATFORM(IOS_FAMILY) -@@ -115,35 +126,55 @@ public: +@@ -115,35 +126,56 @@ public: #if ENABLE(DARK_MODE_CSS) || HAVE(OS_DARK_MODE_SUPPORT) Inspector::Protocol::ErrorStringOr setForcedAppearance(std::optional&&); #endif + Inspector::Protocol::ErrorStringOr setForcedReducedMotion(std::optional&&); ++ Inspector::Protocol::ErrorStringOr setForcedColors(std::optional&&); + Inspector::Protocol::ErrorStringOr setTimeZone(const String&); + Inspector::Protocol::ErrorStringOr setTouchEmulationEnabled(bool); Inspector::Protocol::ErrorStringOr snapshotNode(Inspector::Protocol::DOM::NodeId); @@ -5130,7 +5179,7 @@ index 6d94ad131257d8d7cdb05898fd3f42e0c72766bf..6a85dba5cac19bf0adc93e0015ad223a Frame* frameForId(const Inspector::Protocol::Network::FrameId&); WEBCORE_EXPORT String frameId(Frame*); -@@ -152,6 +183,7 @@ public: +@@ -152,6 +184,7 @@ public: private: double timestamp(); @@ -5138,7 +5187,7 @@ index 6d94ad131257d8d7cdb05898fd3f42e0c72766bf..6a85dba5cac19bf0adc93e0015ad223a static bool mainResourceContent(Frame*, bool withBase64Encode, String* result); static bool dataContent(const uint8_t* data, unsigned size, const String& textEncodingName, bool withBase64Encode, String* result); -@@ -163,18 +195,20 @@ private: +@@ -163,18 +196,20 @@ private: RefPtr m_backendDispatcher; Page& m_inspectedPage; @@ -6363,7 +6412,7 @@ index a782c3be51ca113a52482c5a10583c8fa64724ef..1d82dff81be5c5492efb3bfe77d2f259 if (stateObjectType == StateObjectType::Push) { frame->loader().history().pushState(WTFMove(data), title, fullURL.string()); diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp -index d633760e91b4074533a1a33109cb470ae654f66a..d4a00fbfd76c0301ceb3b02ac3378d90e7e2d1ae 100644 +index d633760e91b4074533a1a33109cb470ae654f66a..9cb7150d8a9af8105da6fb7360044ad9658d44e7 100644 --- a/Source/WebCore/page/Page.cpp +++ b/Source/WebCore/page/Page.cpp @@ -484,6 +484,37 @@ void Page::setOverrideViewportArguments(const std::optional& @@ -6415,7 +6464,7 @@ index d633760e91b4074533a1a33109cb470ae654f66a..d4a00fbfd76c0301ceb3b02ac3378d90 resetSeenPlugins(); resetSeenMediaEngines(); -@@ -3430,6 +3457,16 @@ void Page::setUseDarkAppearanceOverride(std::optional valueOverride) +@@ -3430,6 +3457,26 @@ void Page::setUseDarkAppearanceOverride(std::optional valueOverride) #endif } @@ -6428,12 +6477,22 @@ index d633760e91b4074533a1a33109cb470ae654f66a..d4a00fbfd76c0301ceb3b02ac3378d90 + + appearanceDidChange(); +} ++ ++void Page::setUseForcedColorsOverride(std::optional valueOverride) ++{ ++ if (valueOverride == m_useForcedColorsOverride) ++ return; ++ ++ m_useForcedColorsOverride = valueOverride; ++ ++ appearanceDidChange(); ++} + void Page::setFullscreenInsets(const FloatBoxExtent& insets) { if (insets == m_fullscreenInsets) diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h -index fcb1b65103388ab6ed15b38e1bb4a91472f37d57..67232845466df8d819f4dea296ae5dd712083fb1 100644 +index fcb1b65103388ab6ed15b38e1bb4a91472f37d57..8dd537ef148e7aa0adb94ad8811c0ae5406dfe68 100644 --- a/Source/WebCore/page/Page.h +++ b/Source/WebCore/page/Page.h @@ -285,6 +285,9 @@ public: @@ -6457,16 +6516,18 @@ index fcb1b65103388ab6ed15b38e1bb4a91472f37d57..67232845466df8d819f4dea296ae5dd7 #endif FocusController& focusController() const { return *m_focusController; } #if ENABLE(CONTEXT_MENUS) -@@ -506,6 +513,8 @@ public: +@@ -506,6 +513,10 @@ public: WEBCORE_EXPORT void effectiveAppearanceDidChange(bool useDarkAppearance, bool useElevatedUserInterfaceLevel); bool defaultUseDarkAppearance() const { return m_useDarkAppearance; } void setUseDarkAppearanceOverride(std::optional); + std::optional useReducedMotionOverride() const { return m_useReducedMotionOverride; } + void setUseReducedMotionOverride(std::optional); ++ std::optional useForcedColorsOverride() const { return m_useForcedColorsOverride; } ++ void setUseForcedColorsOverride(std::optional); #if ENABLE(TEXT_AUTOSIZING) float textAutosizingWidth() const { return m_textAutosizingWidth; } -@@ -916,6 +925,11 @@ public: +@@ -916,6 +927,11 @@ public: WEBCORE_EXPORT void setInteractionRegionsEnabled(bool); #endif @@ -6478,7 +6539,7 @@ index fcb1b65103388ab6ed15b38e1bb4a91472f37d57..67232845466df8d819f4dea296ae5dd7 #if ENABLE(DEVICE_ORIENTATION) && PLATFORM(IOS_FAMILY) DeviceOrientationUpdateProvider* deviceOrientationUpdateProvider() const { return m_deviceOrientationUpdateProvider.get(); } #endif -@@ -1037,6 +1051,9 @@ private: +@@ -1037,6 +1053,9 @@ private: #if ENABLE(DRAG_SUPPORT) const std::unique_ptr m_dragController; @@ -6488,15 +6549,16 @@ index fcb1b65103388ab6ed15b38e1bb4a91472f37d57..67232845466df8d819f4dea296ae5dd7 #endif const std::unique_ptr m_focusController; #if ENABLE(CONTEXT_MENUS) -@@ -1116,6 +1133,7 @@ private: +@@ -1116,6 +1135,8 @@ private: bool m_useElevatedUserInterfaceLevel { false }; bool m_useDarkAppearance { false }; std::optional m_useDarkAppearanceOverride; + std::optional m_useReducedMotionOverride; ++ std::optional m_useForcedColorsOverride; #if ENABLE(TEXT_AUTOSIZING) float m_textAutosizingWidth { 0 }; -@@ -1293,6 +1311,11 @@ private: +@@ -1293,6 +1314,11 @@ private: #endif std::optional m_overrideViewportArguments;