Diff
Modified: trunk/Source/WebCore/ChangeLog (284627 => 284628)
--- trunk/Source/WebCore/ChangeLog 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/ChangeLog 2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,3 +1,114 @@
+2021-10-21 Devin Rousso <drou...@apple.com>
+
+ [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+ https://bugs.webkit.org/show_bug.cgi?id=219287
+ <rdar://problem/71857370>
+
+ Reviewed by Simon Fraser.
+
+ Spec: <https://drafts.csswg.org/css-values-4/#viewport-variants>
+
+ Tests: CSSViewportUnits.AllSame
+ CSSViewportUnits.EmptyUnobscuredSizeOverrides
+ CSSViewportUnits.SameUnobscuredSizeOverrides
+ CSSViewportUnits.DifferentUnobscuredSizeOverrides
+
+ * css/CSSUnits.h:
+ * css/CSSUnits.cpp:
+ (WebCore::operator<<):
+ * css/CSSPrimitiveValue.h:
+ (WebCore::CSSPrimitiveValue::isViewportPercentageLength):
+ (WebCore::CSSPrimitiveValue::isViewportPercentageWidth): Deleted.
+ (WebCore::CSSPrimitiveValue::isViewportPercentageHeight): Deleted.
+ (WebCore::CSSPrimitiveValue::isViewportPercentageMax): Deleted.
+ (WebCore::CSSPrimitiveValue::isViewportPercentageMin): Deleted.
+ * css/CSSPrimitiveValue.cpp:
+ (WebCore::isValidCSSUnitTypeForDoubleConversion):
+ (WebCore::isStringType):
+ (WebCore::CSSPrimitiveValue::cleanup):
+ (WebCore::CSSPrimitiveValue::computeUnzoomedNonCalcLengthDouble):
+ (WebCore::CSSPrimitiveValue::computeNonCalcLengthDouble):
+ (WebCore::CSSPrimitiveValue::unitTypeString):
+ (WebCore::CSSPrimitiveValue::formatNumberForCustomCSSText const):
+ (WebCore::CSSPrimitiveValue::equals const):
+ * css/CSSToLengthConversionData.h:
+ * css/CSSToLengthConversionData.cpp:
+ (WebCore::CSSToLengthConversionData::defaultViewportFactor const): Added.
+ (WebCore::CSSToLengthConversionData::smallViewportFactor const): Added.
+ (WebCore::CSSToLengthConversionData::largeViewportFactor const): Added.
+ (WebCore::CSSToLengthConversionData::dynamicViewportFactor const): Added.
+ (WebCore::CSSToLengthConversionData::viewportWidthFactor const): Deleted.
+ (WebCore::CSSToLengthConversionData::viewportHeightFactor const): Deleted.
+ (WebCore::CSSToLengthConversionData::viewportMinFactor const): Deleted.
+ (WebCore::CSSToLengthConversionData::viewportMaxFactor const): Deleted.
+ * css/parser/CSSParserToken.cpp:
+ (WebCore::cssPrimitiveValueUnitFromTrie):
+ * css/parser/CSSPropertyParserHelpers.cpp:
+ (WebCore::CSSPropertyParserHelpers::consumeLengthRawWithKnownTokenTypeDimension):
+ * css/calc/CSSCalcCategoryMapping.cpp:
+ (WebCore::calcUnitCategory):
+ (WebCore::calculationCategoryForCombination):
+ (WebCore::hasDoubleValue):
+ Add support for parsing the following and converting them to their underlying value:
+ - `svw` "small viewport width" is the width of the viewport if all UA interfaces are maximized
+ - `svh` "small viewport height" is the height of the viewport if all UA interfaces are maximized
+ - `svmin` "small viewport small dimension" is `min(svw, svh)`
+ - `svmax` "small viewport large dimension" is `max(svw, svh)`
+ - `lvw` "large viewport width" is the width of the viewport if all UA interfaces are minimized
+ - `lvh` "large viewport height" is the height of the viewport if all UA interfaces are minimized
+ - `lvmin` "large viewport small dimension" is `min(lvw, lvh)`
+ - `lvmax` "large viewport large dimension" is `max(lvw, lvh)`
+ - `dvw` "dynamic viewport width" is the width of the viewport with all UA interfaces being in whatever state they are currently in
+ - `dvh` "dynamic viewport height" is the height of the viewport with all UA interfaces being in whatever state they are currently in
+ - `dvmin` "dynamic viewport small dimension" is `min(dvw, dvh)`
+ - `dvmax` "dynamic viewport large dimension" is `max(dvw, dvh)`
+ The existing `vw`/`vh`/`vmin`/`vmax` correspond to the "UA-default viewport", which WebKit
+ considers equivalent to the "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax`.
+
+ * page/FrameView.h:
+ * page/FrameView.cpp:
+ (WebCore::FrameView::unobscuredContentSizeChanged):
+ (WebCore::FrameView::performSizeToContentAutoSize):
+ (WebCore::FrameView::enableAutoSizeMode):
+ (WebCore::FrameView::clearSizeOverrideForCSSSmallViewportUnits): Added.
+ (WebCore::FrameView::setSizeForCSSSmallViewportUnits): Added.
+ (WebCore::FrameView::overrideWidthForCSSSmallViewportUnits): Added.
+ (WebCore::FrameView::resetOverriddenWidthForCSSSmallViewportUnits): Added.
+ (WebCore::FrameView::overrideSizeForCSSSmallViewportUnits): Added.
+ (WebCore::FrameView::sizeForCSSSmallViewportUnits const): Added.
+ (WebCore::FrameView::clearSizeOverrideForCSSLargeViewportUnits): Renamed from `clearViewportSizeOverrideForCSSViewportUnits`.
+ (WebCore::FrameView::setSizeForCSSLargeViewportUnits): Renamed from `setViewportSizeForCSSViewportUnits`.
+ (WebCore::FrameView::overrideWidthForCSSLargeViewportUnits): Renamed from `overrideViewportWidthForCSSViewportUnits`.
+ (WebCore::FrameView::resetOverriddenWidthForCSSLargeViewportUnits): Renamed from `resetOverriddenViewportWidthForCSSViewportUnits`.
+ (WebCore::FrameView::overrideSizeForCSSLargeViewportUnits): Renamed from `overrideViewportSizeForCSSViewportUnits`.
+ (WebCore::FrameView::sizeForCSSLargeViewportUnits const): Renamed from `viewportSizeForCSSViewportUnits`.
+ (WebCore::FrameView::calculateSizeForCSSViewportUnitsOverride const): Added.
+ (WebCore::FrameView::sizeForCSSDynamicViewportUnits const): Added.
+ (WebCore::FrameView::sizeForCSSDefaultViewportUnits const): Added.
+ * rendering/RenderView.h:
+ * rendering/RenderView.cpp:
+ (WebCore::RenderView::sizeForCSSSmallViewportUnits const): Added.
+ (WebCore::RenderView::sizeForCSSLargeViewportUnits const): Renamed from `viewportSizeForCSSViewportUnits`.
+ (WebCore::RenderView::sizeForCSSDynamicViewportUnits const): Added.
+ (WebCore::RenderView::sizeForCSSDefaultViewportUnits const): Added.
+ For "small viewport" `svw`/`svh`/`svmin`/`svmax`, add support for a new `IntSize` member
+ that is propagated from the UIProcess. If not set, fall back to "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`.
+ For "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax`, use the same value as "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`.
+ For "dynamic viewport" `dvw`/`dvh`/`dvmin`/`dvmax`, use the same value as `window.inner*`.
+ Drive-by: Rename `viewportSizeForCSSViewportUnits` to `sizeForCSSLargeViewportUnits` for clarity.
+
+ * platform/graphics/FloatSize.h:
+ (WebCore::FloatSize::minDimension const): Added.
+ (WebCore::FloatSize::maxDimension const): Added.
+ * platform/graphics/IntSize.h:
+ (WebCore::IntSize::minDimension const): Added.
+ (WebCore::IntSize::maxDimension const): Added.
+ Add utility/helper methods for returning the minimum/maximum of the width vs height.
+
+ * css/DeprecatedCSSOMPrimitiveValue.cpp:
+ (WebCore::DeprecatedCSSOMPrimitiveValue::primitiveType const):
+ Don't `ASSERT_NOT_REACHED` now that there are new unit types.
+
2021-10-21 Aditya Keerthi <akeer...@apple.com>
[macOS] Update appearance of <datalist> indicator
Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -61,6 +61,10 @@
case CSSUnitType::CSS_CM:
case CSSUnitType::CSS_DEG:
case CSSUnitType::CSS_DIMENSION:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMAX:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVW:
case CSSUnitType::CSS_EMS:
case CSSUnitType::CSS_EXS:
case CSSUnitType::CSS_FR:
@@ -77,11 +81,19 @@
case CSSUnitType::CSS_PX:
case CSSUnitType::CSS_Q:
case CSSUnitType::CSS_LHS:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVW:
case CSSUnitType::CSS_RLHS:
case CSSUnitType::CSS_QUIRKY_EMS:
case CSSUnitType::CSS_RAD:
case CSSUnitType::CSS_REMS:
case CSSUnitType::CSS_S:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVW:
case CSSUnitType::CSS_TURN:
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMAX:
@@ -140,6 +152,10 @@
case CSSUnitType::CSS_DPCM:
case CSSUnitType::CSS_DPI:
case CSSUnitType::CSS_DPPX:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMAX:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVW:
case CSSUnitType::CSS_X:
case CSSUnitType::CSS_EMS:
case CSSUnitType::CSS_EXS:
@@ -150,6 +166,10 @@
case CSSUnitType::CSS_IDENT:
case CSSUnitType::CSS_IN:
case CSSUnitType::CSS_KHZ:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVW:
case CSSUnitType::CSS_MM:
case CSSUnitType::CSS_MS:
case CSSUnitType::CSS_NUMBER:
@@ -169,6 +189,10 @@
case CSSUnitType::CSS_REMS:
case CSSUnitType::CSS_RGBCOLOR:
case CSSUnitType::CSS_S:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVW:
case CSSUnitType::CSS_SHAPE:
case CSSUnitType::CSS_TURN:
case CSSUnitType::CSS_UNICODE_RANGE:
@@ -522,6 +546,18 @@
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMIN:
case CSSUnitType::CSS_VMAX:
+ case CSSUnitType::CSS_SVW:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_LVW:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_DVW:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVMAX:
case CSSUnitType::CSS_DPPX:
case CSSUnitType::CSS_X:
case CSSUnitType::CSS_DPI:
@@ -651,21 +687,37 @@
ASSERT_NOT_REACHED();
return -1.0;
case CSSUnitType::CSS_VH:
- return renderView ? renderView->viewportSizeForCSSViewportUnits().height() / 100.0 * value : 0;
+ return renderView ? renderView->sizeForCSSDefaultViewportUnits().height() / 100.0 * value : 0;
case CSSUnitType::CSS_VW:
- return renderView ? renderView->viewportSizeForCSSViewportUnits().width() / 100.0 * value : 0;
+ return renderView ? renderView->sizeForCSSDefaultViewportUnits().width() / 100.0 * value : 0;
case CSSUnitType::CSS_VMAX:
- if (renderView) {
- IntSize viewportSizeForCSSViewportUnits = renderView->viewportSizeForCSSViewportUnits();
- return std::max(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0 * value;
- }
- return value;
+ return renderView ? renderView->sizeForCSSDefaultViewportUnits().maxDimension() / 100.0 * value : value;
case CSSUnitType::CSS_VMIN:
- if (renderView) {
- IntSize viewportSizeForCSSViewportUnits = renderView->viewportSizeForCSSViewportUnits();
- return std::min(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0 * value;
- }
- return value;
+ return renderView ? renderView->sizeForCSSDefaultViewportUnits().minDimension() / 100.0 * value : value;
+ case CSSUnitType::CSS_SVH:
+ return renderView ? renderView->sizeForCSSSmallViewportUnits().height() / 100.0 * value : 0;
+ case CSSUnitType::CSS_SVW:
+ return renderView ? renderView->sizeForCSSSmallViewportUnits().width() / 100.0 * value : 0;
+ case CSSUnitType::CSS_SVMAX:
+ return renderView ? renderView->sizeForCSSSmallViewportUnits().maxDimension() / 100.0 * value : value;
+ case CSSUnitType::CSS_SVMIN:
+ return renderView ? renderView->sizeForCSSSmallViewportUnits().minDimension() / 100.0 * value : value;
+ case CSSUnitType::CSS_LVH:
+ return renderView ? renderView->sizeForCSSLargeViewportUnits().height() / 100.0 * value : 0;
+ case CSSUnitType::CSS_LVW:
+ return renderView ? renderView->sizeForCSSLargeViewportUnits().width() / 100.0 * value : 0;
+ case CSSUnitType::CSS_LVMAX:
+ return renderView ? renderView->sizeForCSSLargeViewportUnits().maxDimension() / 100.0 * value : value;
+ case CSSUnitType::CSS_LVMIN:
+ return renderView ? renderView->sizeForCSSLargeViewportUnits().minDimension() / 100.0 * value : value;
+ case CSSUnitType::CSS_DVH:
+ return renderView ? renderView->sizeForCSSDynamicViewportUnits().height() / 100.0 * value : 0;
+ case CSSUnitType::CSS_DVW:
+ return renderView ? renderView->sizeForCSSDynamicViewportUnits().width() / 100.0 * value : 0;
+ case CSSUnitType::CSS_DVMAX:
+ return renderView ? renderView->sizeForCSSDynamicViewportUnits().maxDimension() / 100.0 * value : value;
+ case CSSUnitType::CSS_DVMIN:
+ return renderView ? renderView->sizeForCSSDynamicViewportUnits().minDimension() / 100.0 * value : value;
default:
ASSERT_NOT_REACHED();
return -1.0;
@@ -712,17 +764,53 @@
break;
case CSSUnitType::CSS_VH:
- return value * conversionData.viewportHeightFactor();
+ return value * conversionData.defaultViewportFactor().height();
case CSSUnitType::CSS_VW:
- return value * conversionData.viewportWidthFactor();
+ return value * conversionData.defaultViewportFactor().width();
case CSSUnitType::CSS_VMAX:
- return value * conversionData.viewportMaxFactor();
+ return value * conversionData.defaultViewportFactor().maxDimension();
case CSSUnitType::CSS_VMIN:
- return value * conversionData.viewportMinFactor();
+ return value * conversionData.defaultViewportFactor().minDimension();
+ case CSSUnitType::CSS_SVH:
+ return value * conversionData.smallViewportFactor().height();
+
+ case CSSUnitType::CSS_SVW:
+ return value * conversionData.smallViewportFactor().width();
+
+ case CSSUnitType::CSS_SVMAX:
+ return value * conversionData.smallViewportFactor().maxDimension();
+
+ case CSSUnitType::CSS_SVMIN:
+ return value * conversionData.smallViewportFactor().minDimension();
+
+ case CSSUnitType::CSS_LVH:
+ return value * conversionData.largeViewportFactor().height();
+
+ case CSSUnitType::CSS_LVW:
+ return value * conversionData.largeViewportFactor().width();
+
+ case CSSUnitType::CSS_LVMAX:
+ return value * conversionData.largeViewportFactor().maxDimension();
+
+ case CSSUnitType::CSS_LVMIN:
+ return value * conversionData.largeViewportFactor().minDimension();
+
+ case CSSUnitType::CSS_DVH:
+ return value * conversionData.dynamicViewportFactor().height();
+
+ case CSSUnitType::CSS_DVW:
+ return value * conversionData.dynamicViewportFactor().width();
+
+ case CSSUnitType::CSS_DVMAX:
+ return value * conversionData.dynamicViewportFactor().maxDimension();
+
+ case CSSUnitType::CSS_DVMIN:
+ return value * conversionData.dynamicViewportFactor().minDimension();
+
case CSSUnitType::CSS_LHS:
ASSERT(conversionData.style());
if (conversionData.computingLineHeight() || conversionData.computingFontSize()) {
@@ -990,6 +1078,18 @@
case CSSUnitType::CSS_VH: return "vh";
case CSSUnitType::CSS_VMIN: return "vmin";
case CSSUnitType::CSS_VMAX: return "vmax";
+ case CSSUnitType::CSS_SVW: return "svw";
+ case CSSUnitType::CSS_SVH: return "svh";
+ case CSSUnitType::CSS_SVMIN: return "svmin";
+ case CSSUnitType::CSS_SVMAX: return "svmax";
+ case CSSUnitType::CSS_LVW: return "lvw";
+ case CSSUnitType::CSS_LVH: return "lvh";
+ case CSSUnitType::CSS_LVMIN: return "lvmin";
+ case CSSUnitType::CSS_LVMAX: return "lvmax";
+ case CSSUnitType::CSS_DVW: return "dvw";
+ case CSSUnitType::CSS_DVH: return "dvh";
+ case CSSUnitType::CSS_DVMIN: return "dvmin";
+ case CSSUnitType::CSS_DVMAX: return "dvmax";
case CSSUnitType::CSS_DPPX: return "dppx";
case CSSUnitType::CSS_X: return "x";
case CSSUnitType::CSS_DPI: return "dpi";
@@ -1152,6 +1252,30 @@
return formatNumberValue("vmin");
case CSSUnitType::CSS_VMAX:
return formatNumberValue("vmax");
+ case CSSUnitType::CSS_SVW:
+ return formatNumberValue("svw");
+ case CSSUnitType::CSS_SVH:
+ return formatNumberValue("svh");
+ case CSSUnitType::CSS_SVMIN:
+ return formatNumberValue("svmin");
+ case CSSUnitType::CSS_SVMAX:
+ return formatNumberValue("svmax");
+ case CSSUnitType::CSS_LVW:
+ return formatNumberValue("lvw");
+ case CSSUnitType::CSS_LVH:
+ return formatNumberValue("lvh");
+ case CSSUnitType::CSS_LVMIN:
+ return formatNumberValue("lvmin");
+ case CSSUnitType::CSS_LVMAX:
+ return formatNumberValue("lvmax");
+ case CSSUnitType::CSS_DVW:
+ return formatNumberValue("dvw");
+ case CSSUnitType::CSS_DVH:
+ return formatNumberValue("dvh");
+ case CSSUnitType::CSS_DVMIN:
+ return formatNumberValue("dvmin");
+ case CSSUnitType::CSS_DVMAX:
+ return formatNumberValue("dvmax");
case CSSUnitType::CSS_IDENT:
case CSSUnitType::CSS_UNICODE_RANGE:
case CSSUnitType::CSS_CALC_PERCENTAGE_WITH_NUMBER:
@@ -1219,6 +1343,18 @@
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMIN:
case CSSUnitType::CSS_VMAX:
+ case CSSUnitType::CSS_SVW:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_LVW:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_DVW:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVMAX:
case CSSUnitType::CSS_FR:
case CSSUnitType::CSS_Q:
case CSSUnitType::CSS_LHS:
Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.h (284627 => 284628)
--- trunk/Source/WebCore/css/CSSPrimitiveValue.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -111,10 +111,6 @@
bool isX() const { return primitiveType() == CSSUnitType::CSS_X; }
bool isResolution() const { return unitCategory(primitiveType()) == CSSUnitCategory::Resolution; }
bool isViewportPercentageLength() const { return isViewportPercentageLength(primitiveUnitType()); }
- bool isViewportPercentageWidth() const { return primitiveUnitType() == CSSUnitType::CSS_VW; }
- bool isViewportPercentageHeight() const { return primitiveUnitType() == CSSUnitType::CSS_VH; }
- bool isViewportPercentageMax() const { return primitiveUnitType() == CSSUnitType::CSS_VMAX; }
- bool isViewportPercentageMin() const { return primitiveUnitType() == CSSUnitType::CSS_VMIN; }
bool isValueID() const { return primitiveUnitType() == CSSUnitType::CSS_VALUE_ID; }
bool isFlex() const { return primitiveType() == CSSUnitType::CSS_FR; }
bool isCustomIdent() const { return primitiveUnitType() == CSSUnitType::CustomIdent; }
@@ -315,10 +311,7 @@
constexpr bool CSSPrimitiveValue::isViewportPercentageLength(CSSUnitType type)
{
- return type == CSSUnitType::CSS_VW
- || type == CSSUnitType::CSS_VH
- || type == CSSUnitType::CSS_VMIN
- || type == CSSUnitType::CSS_VMAX;
+ return type >= CSSUnitType::CSS_VW && type <= CSSUnitType::CSS_DVMAX;
}
template<typename T> inline Ref<CSSPrimitiveValue> CSSPrimitiveValue::create(T&& value)
Modified: trunk/Source/WebCore/css/CSSToLengthConversionData.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/CSSToLengthConversionData.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSToLengthConversionData.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -31,6 +31,7 @@
#include "config.h"
#include "CSSToLengthConversionData.h"
+#include "FloatSize.h"
#include "RenderStyle.h"
#include "RenderView.h"
@@ -43,50 +44,48 @@
return *m_zoom;
}
-double CSSToLengthConversionData::viewportWidthFactor() const
+FloatSize CSSToLengthConversionData::defaultViewportFactor() const
{
if (m_viewportDependencyDetectionStyle)
m_viewportDependencyDetectionStyle->setHasViewportUnits();
if (!m_renderView)
- return 0;
+ return { };
- return m_renderView->viewportSizeForCSSViewportUnits().width() / 100.0;
+ return m_renderView->sizeForCSSDefaultViewportUnits() / 100.0;
}
-double CSSToLengthConversionData::viewportHeightFactor() const
+FloatSize CSSToLengthConversionData::smallViewportFactor() const
{
if (m_viewportDependencyDetectionStyle)
m_viewportDependencyDetectionStyle->setHasViewportUnits();
if (!m_renderView)
- return 0;
+ return { };
- return m_renderView->viewportSizeForCSSViewportUnits().height() / 100.0;
+ return m_renderView->sizeForCSSSmallViewportUnits() / 100.0;
}
-double CSSToLengthConversionData::viewportMinFactor() const
+FloatSize CSSToLengthConversionData::largeViewportFactor() const
{
if (m_viewportDependencyDetectionStyle)
m_viewportDependencyDetectionStyle->setHasViewportUnits();
if (!m_renderView)
- return 0;
+ return { };
- IntSize viewportSizeForCSSViewportUnits = m_renderView->viewportSizeForCSSViewportUnits();
- return std::min(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0;
+ return m_renderView->sizeForCSSLargeViewportUnits() / 100.0;
}
-double CSSToLengthConversionData::viewportMaxFactor() const
+FloatSize CSSToLengthConversionData::dynamicViewportFactor() const
{
if (m_viewportDependencyDetectionStyle)
m_viewportDependencyDetectionStyle->setHasViewportUnits();
if (!m_renderView)
- return 0;
+ return { };
- IntSize viewportSizeForCSSViewportUnits = m_renderView->viewportSizeForCSSViewportUnits();
- return std::max(viewportSizeForCSSViewportUnits.width(), viewportSizeForCSSViewportUnits.height()) / 100.0;
+ return m_renderView->sizeForCSSDynamicViewportUnits() / 100.0;
}
} // namespace WebCore
Modified: trunk/Source/WebCore/css/CSSToLengthConversionData.h (284627 => 284628)
--- trunk/Source/WebCore/css/CSSToLengthConversionData.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSToLengthConversionData.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -36,6 +36,7 @@
namespace WebCore {
+class FloatSize;
class RenderStyle;
class RenderView;
@@ -74,10 +75,10 @@
CSSPropertyID propertyToCompute() const { return m_propertyToCompute.value_or(CSSPropertyInvalid); }
const RenderView* renderView() const { return m_renderView; }
- double viewportWidthFactor() const;
- double viewportHeightFactor() const;
- double viewportMinFactor() const;
- double viewportMaxFactor() const;
+ FloatSize defaultViewportFactor() const;
+ FloatSize smallViewportFactor() const;
+ FloatSize largeViewportFactor() const;
+ FloatSize dynamicViewportFactor() const;
CSSToLengthConversionData copyWithAdjustedZoom(float newZoom) const
{
Modified: trunk/Source/WebCore/css/CSSUnits.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/CSSUnits.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSUnits.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -138,6 +138,18 @@
case CSSUnitType::CSS_VH: ts << "vh"; break;
case CSSUnitType::CSS_VMIN: ts << "vmin"; break;
case CSSUnitType::CSS_VMAX: ts << "vmax"; break;
+ case CSSUnitType::CSS_SVW: ts << "svw"; break;
+ case CSSUnitType::CSS_SVH: ts << "svh"; break;
+ case CSSUnitType::CSS_SVMIN: ts << "svmin"; break;
+ case CSSUnitType::CSS_SVMAX: ts << "svmax"; break;
+ case CSSUnitType::CSS_LVW: ts << "lvw"; break;
+ case CSSUnitType::CSS_LVH: ts << "lvh"; break;
+ case CSSUnitType::CSS_LVMIN: ts << "lvmin"; break;
+ case CSSUnitType::CSS_LVMAX: ts << "lvmax"; break;
+ case CSSUnitType::CSS_DVW: ts << "dvw"; break;
+ case CSSUnitType::CSS_DVH: ts << "dvh"; break;
+ case CSSUnitType::CSS_DVMIN: ts << "dvmin"; break;
+ case CSSUnitType::CSS_DVMAX: ts << "dvmax"; break;
case CSSUnitType::CSS_DPPX: ts << "dppx"; break;
case CSSUnitType::CSS_X: ts << "x"; break;
case CSSUnitType::CSS_DPI: ts << "dpi"; break;
Modified: trunk/Source/WebCore/css/CSSUnits.h (284627 => 284628)
--- trunk/Source/WebCore/css/CSSUnits.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/CSSUnits.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -59,6 +59,18 @@
CSS_VH,
CSS_VMIN,
CSS_VMAX,
+ CSS_SVW,
+ CSS_SVH,
+ CSS_SVMIN,
+ CSS_SVMAX,
+ CSS_LVW,
+ CSS_LVH,
+ CSS_LVMIN,
+ CSS_LVMAX,
+ CSS_DVW,
+ CSS_DVH,
+ CSS_DVMIN,
+ CSS_DVMAX,
CSS_DPPX,
CSS_X,
CSS_DPI,
Modified: trunk/Source/WebCore/css/DeprecatedCSSOMPrimitiveValue.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/DeprecatedCSSOMPrimitiveValue.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/DeprecatedCSSOMPrimitiveValue.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -93,10 +93,9 @@
case CSSUnitType::CSS_VMIN: return CSS_VMIN;
case CSSUnitType::CSS_VW: return CSS_VW;
case CSSUnitType::CSS_X: return 37;
+
+ default: return CSS_UNKNOWN;
}
-
- ASSERT_NOT_REACHED();
- return CSS_UNKNOWN;
}
ExceptionOr<float> DeprecatedCSSOMPrimitiveValue::getFloatValue(unsigned short unitType) const
Modified: trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/calc/CSSCalcCategoryMapping.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -54,6 +54,18 @@
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMIN:
case CSSUnitType::CSS_VMAX:
+ case CSSUnitType::CSS_SVW:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_LVW:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_DVW:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVMAX:
return CalculationCategory::Length;
case CSSUnitType::CSS_PERCENTAGE:
return CalculationCategory::Percent;
@@ -110,6 +122,18 @@
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMIN:
case CSSUnitType::CSS_VMAX:
+ case CSSUnitType::CSS_SVW:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_LVW:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_DVW:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVMAX:
default:
return CalculationCategory::Other;
}
@@ -162,6 +186,18 @@
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMIN:
case CSSUnitType::CSS_VMAX:
+ case CSSUnitType::CSS_SVW:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_LVW:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_DVW:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVMAX:
case CSSUnitType::CSS_DPPX:
case CSSUnitType::CSS_X:
case CSSUnitType::CSS_DPI:
Modified: trunk/Source/WebCore/css/parser/CSSParserToken.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/parser/CSSParserToken.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/parser/CSSParserToken.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -134,8 +134,26 @@
if (toASCIILower(data[2]) == 'i')
return CSSUnitType::CSS_DPI;
break;
+ case 'v':
+ switch (toASCIILower(data[2])) {
+ case 'h':
+ return CSSUnitType::CSS_DVH;
+ case 'w':
+ return CSSUnitType::CSS_DVW;
+ }
+ break;
}
- break;
+ break;
+ case 'l':
+ if (toASCIILower(data[1]) == 'v') {
+ switch (toASCIILower(data[2])) {
+ case 'h':
+ return CSSUnitType::CSS_LVH;
+ case 'w':
+ return CSSUnitType::CSS_LVW;
+ }
+ }
+ break;
case 'k':
if (toASCIILower(data[1]) == 'h' && toASCIILower(data[2]) == 'z')
return CSSUnitType::CSS_KHZ;
@@ -155,9 +173,19 @@
return CSSUnitType::CSS_RLHS;
break;
}
+ break;
+ case 's':
+ if (toASCIILower(data[1]) == 'v') {
+ switch (toASCIILower(data[2])) {
+ case 'h':
+ return CSSUnitType::CSS_SVH;
+ case 'w':
+ return CSSUnitType::CSS_SVW;
+ }
+ }
+ break;
+ }
break;
- }
- break;
case 4:
switch (toASCIILower(data[0])) {
case 'd':
@@ -173,9 +201,9 @@
return CSSUnitType::CSS_DPPX;
break;
}
+ break;
+ }
break;
- }
- break;
case 'g':
if (toASCIILower(data[1]) == 'r' && toASCIILower(data[2]) == 'a' && toASCIILower(data[3]) == 'd')
return CSSUnitType::CSS_GRAD;
@@ -208,6 +236,48 @@
if (toASCIILower(data[1]) == '_' && toASCIILower(data[2]) == 'q' && toASCIILower(data[3]) == 'e' && toASCIILower(data[4]) == 'm')
return CSSUnitType::CSS_QUIRKY_EMS;
break;
+ case 'd':
+ if (toASCIILower(data[1]) == 'v' && toASCIILower(data[2]) == 'm') {
+ switch (toASCIILower(data[3])) {
+ case 'a':
+ if (toASCIILower(data[4]) == 'x')
+ return CSSUnitType::CSS_DVMAX;
+ break;
+ case 'i':
+ if (toASCIILower(data[4]) == 'n')
+ return CSSUnitType::CSS_DVMIN;
+ break;
+ }
+ }
+ break;
+ case 'l':
+ if (toASCIILower(data[1]) == 'v' && toASCIILower(data[2]) == 'm') {
+ switch (toASCIILower(data[3])) {
+ case 'a':
+ if (toASCIILower(data[4]) == 'x')
+ return CSSUnitType::CSS_LVMAX;
+ break;
+ case 'i':
+ if (toASCIILower(data[4]) == 'n')
+ return CSSUnitType::CSS_LVMIN;
+ break;
+ }
+ }
+ break;
+ case 's':
+ if (toASCIILower(data[1]) == 'v' && toASCIILower(data[2]) == 'm') {
+ switch (toASCIILower(data[3])) {
+ case 'a':
+ if (toASCIILower(data[4]) == 'x')
+ return CSSUnitType::CSS_SVMAX;
+ break;
+ case 'i':
+ if (toASCIILower(data[4]) == 'n')
+ return CSSUnitType::CSS_SVMIN;
+ break;
+ }
+ }
+ break;
}
break;
}
Modified: trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp (284627 => 284628)
--- trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParserHelpers.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -492,6 +492,18 @@
case CSSUnitType::CSS_VH:
case CSSUnitType::CSS_VMIN:
case CSSUnitType::CSS_VMAX:
+ case CSSUnitType::CSS_SVW:
+ case CSSUnitType::CSS_SVH:
+ case CSSUnitType::CSS_SVMIN:
+ case CSSUnitType::CSS_SVMAX:
+ case CSSUnitType::CSS_LVW:
+ case CSSUnitType::CSS_LVH:
+ case CSSUnitType::CSS_LVMIN:
+ case CSSUnitType::CSS_LVMAX:
+ case CSSUnitType::CSS_DVW:
+ case CSSUnitType::CSS_DVH:
+ case CSSUnitType::CSS_DVMIN:
+ case CSSUnitType::CSS_DVMAX:
case CSSUnitType::CSS_Q:
break;
default:
Modified: trunk/Source/WebCore/page/FrameView.cpp (284627 => 284628)
--- trunk/Source/WebCore/page/FrameView.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/page/FrameView.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -2892,6 +2892,9 @@
#if PLATFORM(IOS_FAMILY)
updateTiledBackingAdaptiveSizing();
#endif
+
+ if (auto* document = frame().document())
+ document->updateViewportUnitsOnResize();
}
void FrameView::loadProgressingStatusChanged()
@@ -3566,7 +3569,9 @@
document.updateLayout();
};
- resetOverriddenViewportWidthForCSSViewportUnits();
+ resetOverriddenWidthForCSSSmallViewportUnits();
+ resetOverriddenWidthForCSSLargeViewportUnits();
+
// Start from the minimum size and allow it to grow.
auto minAutoSize = IntSize { 1, 1 };
resize(minAutoSize);
@@ -3626,7 +3631,8 @@
resize(newSize.width(), i ? newSize.height() : minAutoSize.height());
// Protect the content from evergrowing layout.
auto preferredViewportWidth = std::min(newSize.width(), m_autoSizeConstraint.width());
- overrideViewportWidthForCSSViewportUnits(preferredViewportWidth);
+ overrideWidthForCSSSmallViewportUnits(preferredViewportWidth);
+ overrideWidthForCSSLargeViewportUnits(preferredViewportWidth);
// Force the scrollbar state to avoid the scrollbar code adding them and causing them to be needed. For example,
// a vertical scrollbar may cause text to wrap and thus increase the height (which is the only reason the scollbar is needed).
setVerticalScrollbarLock(false);
@@ -4706,11 +4712,13 @@
setNeedsLayoutAfterViewConfigurationChange();
layoutContext().scheduleLayout();
if (m_shouldAutoSize) {
- overrideViewportWidthForCSSViewportUnits(m_autoSizeConstraint.width());
+ overrideWidthForCSSSmallViewportUnits(m_autoSizeConstraint.width());
+ overrideWidthForCSSLargeViewportUnits(m_autoSizeConstraint.width());
return;
}
- clearViewportSizeOverrideForCSSViewportUnits();
+ clearSizeOverrideForCSSSmallViewportUnits();
+ clearSizeOverrideForCSSLargeViewportUnits();
// Since autosize mode forces the scrollbar mode, change them to being auto.
setVerticalScrollbarLock(false);
setHorizontalScrollbarLock(false);
@@ -5539,53 +5547,108 @@
}
}
-void FrameView::clearViewportSizeOverrideForCSSViewportUnits()
+void FrameView::clearSizeOverrideForCSSSmallViewportUnits()
{
- if (!m_overrideViewportSize)
+ if (!m_smallViewportSizeOverride)
return;
- m_overrideViewportSize = std::nullopt;
+ m_smallViewportSizeOverride = std::nullopt;
if (auto* document = frame().document())
document->styleScope().didChangeStyleSheetEnvironment();
}
-void FrameView::setViewportSizeForCSSViewportUnits(IntSize size)
+void FrameView::setSizeForCSSSmallViewportUnits(IntSize size)
{
- overrideViewportSizeForCSSViewportUnits({ size.width(), size.height() });
+ overrideSizeForCSSSmallViewportUnits({ size.width(), size.height() });
}
-void FrameView::overrideViewportWidthForCSSViewportUnits(int width)
+void FrameView::overrideWidthForCSSSmallViewportUnits(int width)
{
- overrideViewportSizeForCSSViewportUnits({ width, m_overrideViewportSize ? m_overrideViewportSize->height : std::nullopt });
+ overrideSizeForCSSSmallViewportUnits({ width, m_smallViewportSizeOverride ? m_smallViewportSizeOverride->height : std::nullopt });
}
-void FrameView::resetOverriddenViewportWidthForCSSViewportUnits()
+void FrameView::resetOverriddenWidthForCSSSmallViewportUnits()
{
- overrideViewportSizeForCSSViewportUnits({ { }, m_overrideViewportSize ? m_overrideViewportSize->height : std::nullopt });
+ overrideSizeForCSSSmallViewportUnits({ { }, m_smallViewportSizeOverride ? m_smallViewportSizeOverride->height : std::nullopt });
}
-void FrameView::overrideViewportSizeForCSSViewportUnits(OverrideViewportSize size)
+void FrameView::overrideSizeForCSSSmallViewportUnits(OverrideViewportSize size)
{
- if (m_overrideViewportSize && *m_overrideViewportSize == size)
+ if (m_smallViewportSizeOverride && *m_smallViewportSizeOverride == size)
return;
- m_overrideViewportSize = size;
+ m_smallViewportSizeOverride = size;
if (auto* document = frame().document())
document->styleScope().didChangeStyleSheetEnvironment();
}
-IntSize FrameView::viewportSizeForCSSViewportUnits() const
+IntSize FrameView::sizeForCSSSmallViewportUnits() const
{
+ return calculateSizeForCSSViewportUnitsOverride(m_smallViewportSizeOverride);
+}
+
+void FrameView::clearSizeOverrideForCSSLargeViewportUnits()
+{
+ if (!m_largeViewportSizeOverride)
+ return;
+
+ m_largeViewportSizeOverride = std::nullopt;
+ if (auto* document = frame().document())
+ document->styleScope().didChangeStyleSheetEnvironment();
+}
+
+void FrameView::setSizeForCSSLargeViewportUnits(IntSize size)
+{
+ overrideSizeForCSSLargeViewportUnits({ size.width(), size.height() });
+}
+
+void FrameView::overrideWidthForCSSLargeViewportUnits(int width)
+{
+ overrideSizeForCSSLargeViewportUnits({ width, m_largeViewportSizeOverride ? m_largeViewportSizeOverride->height : std::nullopt });
+}
+
+void FrameView::resetOverriddenWidthForCSSLargeViewportUnits()
+{
+ overrideSizeForCSSLargeViewportUnits({ { }, m_largeViewportSizeOverride ? m_largeViewportSizeOverride->height : std::nullopt });
+}
+
+void FrameView::overrideSizeForCSSLargeViewportUnits(OverrideViewportSize size)
+{
+ if (m_largeViewportSizeOverride && *m_largeViewportSizeOverride == size)
+ return;
+
+ m_largeViewportSizeOverride = size;
+
+ if (auto* document = frame().document())
+ document->styleScope().didChangeStyleSheetEnvironment();
+}
+
+IntSize FrameView::sizeForCSSLargeViewportUnits() const
+{
+ return calculateSizeForCSSViewportUnitsOverride(m_largeViewportSizeOverride);
+}
+
+IntSize FrameView::calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize> override) const
+{
OverrideViewportSize viewportSize;
- if (m_overrideViewportSize) {
- viewportSize = *m_overrideViewportSize;
- // auto-size overrides the width only, so we can't always bail out early here.
- if (viewportSize.width && viewportSize.height)
- return { *viewportSize.width, *viewportSize.height };
- }
+ if (override)
+ viewportSize = *override;
+ // Use the large size if no override is given since it's considered the default size.
+ // if (m_largeViewportSizeOverride) {
+ // if (!viewportSize.width)
+ // viewportSize.width = m_largeViewportSizeOverride->width;
+
+ // if (!viewportSize.height)
+ // viewportSize.height = m_largeViewportSizeOverride->height;
+ // }
+
+ // auto-size overrides the width only, so we can't always bail out early here.
+ if (viewportSize.width && viewportSize.height)
+ return { *viewportSize.width, *viewportSize.height };
+
if (useFixedLayout()) {
auto fixedLayoutSize = this->fixedLayoutSize();
viewportSize.width = viewportSize.width.value_or(fixedLayoutSize.width());
@@ -5601,6 +5664,16 @@
return { *viewportSize.width, *viewportSize.height };
}
+IntSize FrameView::sizeForCSSDynamicViewportUnits() const
+{
+ return visibleContentRectIncludingScrollbars().size();
+}
+
+IntSize FrameView::sizeForCSSDefaultViewportUnits() const
+{
+ return sizeForCSSLargeViewportUnits();
+}
+
bool FrameView::shouldPlaceVerticalScrollbarOnLeft() const
{
return renderView() && renderView()->shouldPlaceVerticalScrollbarOnLeft();
Modified: trunk/Source/WebCore/page/FrameView.h (284627 => 284628)
--- trunk/Source/WebCore/page/FrameView.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/page/FrameView.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -228,10 +228,18 @@
WEBCORE_EXPORT void adjustViewSize();
- WEBCORE_EXPORT void setViewportSizeForCSSViewportUnits(IntSize);
- void clearViewportSizeOverrideForCSSViewportUnits();
- IntSize viewportSizeForCSSViewportUnits() const;
+ WEBCORE_EXPORT void setSizeForCSSSmallViewportUnits(IntSize);
+ void clearSizeOverrideForCSSSmallViewportUnits();
+ IntSize sizeForCSSSmallViewportUnits() const;
+ WEBCORE_EXPORT void setSizeForCSSLargeViewportUnits(IntSize);
+ void clearSizeOverrideForCSSLargeViewportUnits();
+ IntSize sizeForCSSLargeViewportUnits() const;
+
+ IntSize sizeForCSSDynamicViewportUnits() const;
+
+ IntSize sizeForCSSDefaultViewportUnits() const;
+
IntRect windowClipRect() const final;
WEBCORE_EXPORT IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const;
@@ -854,10 +862,16 @@
bool operator==(const OverrideViewportSize& rhs) const { return rhs.width == width && rhs.height == height; }
};
- void overrideViewportSizeForCSSViewportUnits(OverrideViewportSize);
- void overrideViewportWidthForCSSViewportUnits(int);
- void resetOverriddenViewportWidthForCSSViewportUnits();
+ IntSize calculateSizeForCSSViewportUnitsOverride(std::optional<OverrideViewportSize>) const;
+ void overrideSizeForCSSSmallViewportUnits(OverrideViewportSize);
+ void overrideWidthForCSSSmallViewportUnits(int);
+ void resetOverriddenWidthForCSSSmallViewportUnits();
+
+ void overrideSizeForCSSLargeViewportUnits(OverrideViewportSize);
+ void overrideWidthForCSSLargeViewportUnits(int);
+ void resetOverriddenWidthForCSSLargeViewportUnits();
+
void didFinishProhibitingScrollingWhenChangingContentSize() final;
// ScrollableArea.
@@ -925,7 +939,8 @@
std::optional<IntSize> m_customSizeForResizeEvent;
#endif
- std::optional<OverrideViewportSize> m_overrideViewportSize;
+ std::optional<OverrideViewportSize> m_smallViewportSizeOverride;
+ std::optional<OverrideViewportSize> m_largeViewportSizeOverride;
// The view size when autosizing.
IntSize m_autoSizeConstraint;
Modified: trunk/Source/WebCore/platform/graphics/FloatSize.h (284627 => 284628)
--- trunk/Source/WebCore/platform/graphics/FloatSize.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/platform/graphics/FloatSize.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -72,6 +72,9 @@
float width() const { return m_width; }
float height() const { return m_height; }
+ float minDimension() const { return std::min(m_width, m_height); }
+ float maxDimension() const { return std::max(m_width, m_height); }
+
bool hasIntrinsicWidth = false;
bool hasIntrinsicHeight = false;
Modified: trunk/Source/WebCore/platform/graphics/IntSize.h (284627 => 284628)
--- trunk/Source/WebCore/platform/graphics/IntSize.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/platform/graphics/IntSize.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -74,6 +74,9 @@
int width() const { return m_width; }
int height() const { return m_height; }
+ float minDimension() const { return std::min(m_width, m_height); }
+ float maxDimension() const { return std::max(m_width, m_height); }
+
void setWidth(int width) { m_width = width; }
void setHeight(int height) { m_height = height; }
Modified: trunk/Source/WebCore/rendering/RenderView.cpp (284627 => 284628)
--- trunk/Source/WebCore/rendering/RenderView.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/rendering/RenderView.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -697,11 +697,26 @@
return frameView().frame().pageZoomFactor();
}
-IntSize RenderView::viewportSizeForCSSViewportUnits() const
+IntSize RenderView::sizeForCSSSmallViewportUnits() const
{
- return frameView().viewportSizeForCSSViewportUnits();
+ return frameView().sizeForCSSSmallViewportUnits();
}
+IntSize RenderView::sizeForCSSLargeViewportUnits() const
+{
+ return frameView().sizeForCSSLargeViewportUnits();
+}
+
+IntSize RenderView::sizeForCSSDynamicViewportUnits() const
+{
+ return frameView().sizeForCSSDynamicViewportUnits();
+}
+
+IntSize RenderView::sizeForCSSDefaultViewportUnits() const
+{
+ return frameView().sizeForCSSDefaultViewportUnits();
+}
+
Node* RenderView::nodeForHitTest() const
{
return document().documentElement();
Modified: trunk/Source/WebCore/rendering/RenderView.h (284627 => 284628)
--- trunk/Source/WebCore/rendering/RenderView.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebCore/rendering/RenderView.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -143,7 +143,10 @@
bool shouldPaintBaseBackground() const;
- IntSize viewportSizeForCSSViewportUnits() const;
+ IntSize sizeForCSSSmallViewportUnits() const;
+ IntSize sizeForCSSLargeViewportUnits() const;
+ IntSize sizeForCSSDynamicViewportUnits() const;
+ IntSize sizeForCSSDefaultViewportUnits() const;
bool hasQuotesNeedingUpdate() const { return m_hasQuotesNeedingUpdate; }
void setHasQuotesNeedingUpdate(bool b) { m_hasQuotesNeedingUpdate = b; }
Modified: trunk/Source/WebInspectorUI/ChangeLog (284627 => 284628)
--- trunk/Source/WebInspectorUI/ChangeLog 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebInspectorUI/ChangeLog 2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,3 +1,13 @@
+2021-10-21 Devin Rousso <drou...@apple.com>
+
+ [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+ https://bugs.webkit.org/show_bug.cgi?id=219287
+ <rdar://problem/71857370>
+
+ Reviewed by Simon Fraser.
+
+ * UserInterface/Models/CSSCompletions.js:
+
2021-10-18 David Kilzer <ddkil...@apple.com>
Web Inspector: Remove Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js.orig
Modified: trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js (284627 => 284628)
--- trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/CSSCompletions.js 2021-10-21 18:17:59 UTC (rev 284628)
@@ -343,9 +343,17 @@
WI.CSSCompletions.lengthUnits = new Set([
"ch",
"cm",
+ "dvh",
+ "dvmax",
+ "dvmin",
+ "dvw",
"em",
"ex",
"in",
+ "lvh",
+ "lvmax",
+ "lvmin",
+ "lvw",
"mm",
"pc",
"pt",
@@ -352,6 +360,10 @@
"px",
"q",
"rem",
+ "svh",
+ "svmax",
+ "svmin",
+ "svw",
"vh",
"vmax",
"vmin",
Modified: trunk/Source/WebKit/ChangeLog (284627 => 284628)
--- trunk/Source/WebKit/ChangeLog 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/ChangeLog 2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,5 +1,66 @@
2021-10-21 Devin Rousso <drou...@apple.com>
+ [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+ https://bugs.webkit.org/show_bug.cgi?id=219287
+ <rdar://problem/71857370>
+
+ Reviewed by Simon Fraser.
+
+ Spec: <https://drafts.csswg.org/css-values-4/#viewport-variants>
+
+ Tests: CSSViewportUnits.AllSame
+ CSSViewportUnits.EmptyUnobscuredSizeOverrides
+ CSSViewportUnits.SameUnobscuredSizeOverrides
+ CSSViewportUnits.DifferentUnobscuredSizeOverrides
+
+ * UIProcess/API/Cocoa/WKWebViewInternal.h:
+ * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+ * UIProcess/API/ios/WKWebViewIOS.mm:
+ (-[WKWebView _processWillSwapOrDidExit]):
+ (-[WKWebView _dispatchSetMinimumUnobscuredSize:]): Added.
+ (-[WKWebView _frameOrBoundsChanged]):
+ (activeMinimumUnobscuredSize): Added.
+ (-[WKWebView _didCompleteAnimatedResize]):
+ (-[WKWebView _minimumUnobscuredSizeOverride]): Added.
+ (-[WKWebView _setMinimumUnobscuredSizeOverride:]): Added.
+ (-[WKWebView _beginAnimatedResizeWithUpdates:]):
+ (-[WKWebView _overrideLayoutParametersWithMinimumLayoutSize:maximumUnobscuredSizeOverride:]):
+ (-[WKWebView _clearOverrideLayoutParameters]):
+ When this value is set from `-[WKWebView _overrideLayoutParametersWithMinimumLayoutSize:maximumUnobscuredSizeOverride:]`
+ it should be used as the value for "small viewport" `svw`/`svh`/`svmin`/`svmax`, but only
+ from that codepath. Dynamic viewport changes should not update it as they don't necessarily
+ represent a change in the minimum/maximum viewport size, just the current size.
+ "large viewport" `lvw`/`lvh`/`lvmin`/`lvmax` and "dynamic viewport" `dvw`/`dvh`/`dvmin`/`dvmax`
+ (as well as the existing "UA-default viewport" `vw`/`vh`/`vmin`/`vmax`) can be derived from
+ existing logic.
+ See the WebCore ChangeLog for more information.
+
+ * Shared/WebPageCreationParameters.h:
+ * Shared/WebPageCreationParameters.cpp:
+ (WebKit::WebPageCreationParameters::encode):
+ (WebKit::WebPageCreationParameters::decode):
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::creationParameters):
+ * UIProcess/ios/WebPageProxyIOS.mm:
+ (WebKit::WebPageProxy::dynamicViewportSizeUpdate):
+ (WebKit::WebPageProxy::setMinimumUnobscuredSize): Added.
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::WebPage):
+ (WebKit::WebPage::setViewportSizeForCSSViewportUnits):
+ * WebProcess/WebPage/ios/WebPageIOS.mm:
+ (WebKit::WebPage::setMinimumUnobscuredSize): Added.
+ (WebKit::WebPage::dynamicViewportSizeUpdate):
+ (WebKit::WebPage::updateViewportSizeForCSSViewportUnits):
+ Add piping from the UIProcess to the WebProcess for the new minimum unobscured size override.
+
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+ (WebKit::WebFrameLoaderClient::transitionToCommittedForNewPage):
+ Drive-by: Rename `setViewportSizeForCSSViewportUnits` to `setSizeForCSSLargeViewportUnits` for clarity.
+
+2021-10-21 Devin Rousso <drou...@apple.com>
+
[iOS] Zooming out should use the page's background color instead of fading
https://bugs.webkit.org/show_bug.cgi?id=232036
<rdar://problem/81926190>
Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (284627 => 284628)
--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -106,6 +106,7 @@
encoder << availableScreenSize;
encoder << overrideScreenSize;
encoder << textAutosizingWidth;
+ encoder << minimumUnobscuredSize;
encoder << maximumUnobscuredSize;
encoder << deviceOrientation;
encoder << keyboardIsAttached;
@@ -380,6 +381,8 @@
return std::nullopt;
if (!decoder.decode(parameters.textAutosizingWidth))
return std::nullopt;
+ if (!decoder.decode(parameters.minimumUnobscuredSize))
+ return std::nullopt;
if (!decoder.decode(parameters.maximumUnobscuredSize))
return std::nullopt;
if (!decoder.decode(parameters.deviceOrientation))
Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (284627 => 284628)
--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -169,6 +169,7 @@
WebCore::FloatSize availableScreenSize;
WebCore::FloatSize overrideScreenSize;
float textAutosizingWidth;
+ WebCore::FloatSize minimumUnobscuredSize;
WebCore::FloatSize maximumUnobscuredSize;
int32_t deviceOrientation { 0 };
bool keyboardIsAttached { false };
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h (284627 => 284628)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -155,6 +155,8 @@
std::optional<CGSize> _viewLayoutSizeOverride;
std::optional<WebCore::FloatSize> _lastSentViewLayoutSize;
+ std::optional<CGSize> _minimumUnobscuredSizeOverride;
+ std::optional<WebCore::FloatSize> _lastSentMinimumUnobscuredSize;
std::optional<CGSize> _maximumUnobscuredSizeOverride;
std::optional<WebCore::FloatSize> _lastSentMaximumUnobscuredSize;
CGRect _inputViewBoundsInWindow;
Modified: trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm (284627 => 284628)
--- trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm 2021-10-21 18:17:59 UTC (rev 284628)
@@ -695,6 +695,7 @@
_didDeferUpdateVisibleContentRectsForUnstableScrollView = NO;
_currentlyAdjustingScrollViewInsetsForKeyboard = NO;
_lastSentViewLayoutSize = std::nullopt;
+ _lastSentMinimumUnobscuredSize = std::nullopt;
_lastSentMaximumUnobscuredSize = std::nullopt;
_lastSentDeviceOrientation = std::nullopt;
@@ -1902,6 +1903,15 @@
_lastSentViewLayoutSize = viewLayoutSize;
}
+- (void)_dispatchSetMinimumUnobscuredSize:(WebCore::FloatSize)minimumUnobscuredSize
+{
+ if (_lastSentMinimumUnobscuredSize && CGSizeEqualToSize(_lastSentMinimumUnobscuredSize.value(), minimumUnobscuredSize))
+ return;
+
+ _page->setMinimumUnobscuredSize(minimumUnobscuredSize);
+ _lastSentMinimumUnobscuredSize = minimumUnobscuredSize;
+}
+
- (void)_dispatchSetMaximumUnobscuredSize:(WebCore::FloatSize)maximumUnobscuredSize
{
if (_lastSentMaximumUnobscuredSize && CGSizeEqualToSize(_lastSentMaximumUnobscuredSize.value(), maximumUnobscuredSize))
@@ -1937,6 +1947,8 @@
if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing) {
if (!_viewLayoutSizeOverride)
[self _dispatchSetViewLayoutSize:[self activeViewLayoutSize:self.bounds]];
+ if (!_minimumUnobscuredSizeOverride)
+ [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(bounds.size)];
if (!_maximumUnobscuredSizeOverride)
[self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(bounds.size)];
@@ -2257,6 +2269,11 @@
_gestureController->didStartProvisionalLoadForMainFrame();
}
+static WebCore::FloatSize activeMinimumUnobscuredSize(WKWebView *webView, const CGRect& bounds)
+{
+ return WebCore::FloatSize(webView->_minimumUnobscuredSizeOverride.value_or(bounds.size));
+}
+
static WebCore::FloatSize activeMaximumUnobscuredSize(WKWebView *webView, const CGRect& bounds)
{
return WebCore::FloatSize(webView->_maximumUnobscuredSizeOverride.value_or(bounds.size));
@@ -2346,6 +2363,7 @@
CGRect newBounds = self.bounds;
auto newViewLayoutSize = [self activeViewLayoutSize:newBounds];
+ auto newMinimumUnobscuredSize = activeMinimumUnobscuredSize(self, newBounds);
auto newMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, newBounds);
int32_t newOrientation = activeOrientation(self);
@@ -2352,6 +2370,9 @@
if (!_lastSentViewLayoutSize || newViewLayoutSize != _lastSentViewLayoutSize.value())
[self _dispatchSetViewLayoutSize:newViewLayoutSize];
+ if (!_lastSentMinimumUnobscuredSize || newMinimumUnobscuredSize != _lastSentMinimumUnobscuredSize.value())
+ [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(newMinimumUnobscuredSize)];
+
if (!_lastSentMaximumUnobscuredSize || newMaximumUnobscuredSize != _lastSentMaximumUnobscuredSize.value())
[self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(newMaximumUnobscuredSize)];
@@ -2706,6 +2727,21 @@
[self _dispatchSetViewLayoutSize:WebCore::FloatSize(viewLayoutSizeOverride)];
}
+- (CGSize)_minimumUnobscuredSizeOverride
+{
+ ASSERT(_minimumUnobscuredSizeOverride);
+ return _minimumUnobscuredSizeOverride.value_or(CGSizeZero);
+}
+
+- (void)_setMinimumUnobscuredSizeOverride:(CGSize)size
+{
+ ASSERT(size.width <= self.bounds.size.width && size.height <= self.bounds.size.height);
+ _minimumUnobscuredSizeOverride = size;
+
+ if (_dynamicViewportUpdateMode == WebKit::DynamicViewportUpdateMode::NotResizing)
+ [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(size)];
+}
+
// Deprecated SPI
- (CGSize)_maximumUnobscuredSizeOverride
{
@@ -3030,6 +3066,7 @@
oldObscuredInsets = _obscuredInsets;
}
auto oldViewLayoutSize = [self activeViewLayoutSize:oldBounds];
+ auto oldMinimumUnobscuredSize = activeMinimumUnobscuredSize(self, oldBounds);
auto oldMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, oldBounds);
updateBlock();
@@ -3037,6 +3074,7 @@
CGRect newBounds = self.bounds;
auto newMinimumEffectiveDeviceWidth = [self _minimumEffectiveDeviceWidth];
auto newViewLayoutSize = [self activeViewLayoutSize:newBounds];
+ auto newMinimumUnobscuredSize = activeMinimumUnobscuredSize(self, newBounds);
auto newMaximumUnobscuredSize = activeMaximumUnobscuredSize(self, newBounds);
int32_t newOrientation = activeOrientation(self);
UIEdgeInsets newObscuredInsets = _obscuredInsets;
@@ -3058,6 +3096,8 @@
[self _frameOrBoundsChanged];
if (_viewLayoutSizeOverride)
[self _dispatchSetViewLayoutSize:newViewLayoutSize];
+ if (_minimumUnobscuredSizeOverride)
+ [self _dispatchSetMinimumUnobscuredSize:WebCore::FloatSize(newMinimumUnobscuredSize)];
if (_maximumUnobscuredSizeOverride)
[self _dispatchSetMaximumUnobscuredSize:WebCore::FloatSize(newMaximumUnobscuredSize)];
if (_overridesInterfaceOrientation)
@@ -3068,6 +3108,7 @@
if (CGRectEqualToRect(oldBounds, newBounds)
&& oldViewLayoutSize == newViewLayoutSize
+ && oldMinimumUnobscuredSize == newMinimumUnobscuredSize
&& oldMaximumUnobscuredSize == newMaximumUnobscuredSize
&& oldOrientation == newOrientation
&& oldMinimumEffectiveDeviceWidth == newMinimumEffectiveDeviceWidth
@@ -3135,10 +3176,11 @@
WebCore::FloatBoxExtent unobscuredSafeAreaInsetsExtent(unobscuredSafeAreaInsets.top, unobscuredSafeAreaInsets.right, unobscuredSafeAreaInsets.bottom, unobscuredSafeAreaInsets.left);
_lastSentViewLayoutSize = newViewLayoutSize;
+ _lastSentMinimumUnobscuredSize = newMinimumUnobscuredSize;
_lastSentMaximumUnobscuredSize = newMaximumUnobscuredSize;
_lastSentDeviceOrientation = newOrientation;
- _page->dynamicViewportSizeUpdate(newViewLayoutSize, newMaximumUnobscuredSize, visibleRectInContentCoordinates, unobscuredRectInContentCoordinates, futureUnobscuredRectInSelfCoordinates, unobscuredSafeAreaInsetsExtent, targetScale, newOrientation, newMinimumEffectiveDeviceWidth, ++_currentDynamicViewportSizeUpdateID);
+ _page->dynamicViewportSizeUpdate(newViewLayoutSize, newMinimumUnobscuredSize, newMaximumUnobscuredSize, visibleRectInContentCoordinates, unobscuredRectInContentCoordinates, futureUnobscuredRectInSelfCoordinates, unobscuredSafeAreaInsetsExtent, targetScale, newOrientation, newMinimumEffectiveDeviceWidth, ++_currentDynamicViewportSizeUpdateID);
if (WebKit::DrawingAreaProxy* drawingArea = _page->drawingArea())
drawingArea->setSize(WebCore::IntSize(newBounds.size));
@@ -3267,6 +3309,7 @@
RELEASE_LOG_FAULT(VisibleRects, "%s: Error: attempting to override layout parameters with negative width or height: %@", __PRETTY_FUNCTION__, NSStringFromCGSize(minimumLayoutSize));
[self _setViewLayoutSizeOverride:CGSizeMake(std::max<CGFloat>(0, minimumLayoutSize.width), std::max<CGFloat>(0, minimumLayoutSize.height))];
+ [self _setMinimumUnobscuredSizeOverride:minimumLayoutSize];
[self _setMaximumUnobscuredSizeOverride:maximumUnobscuredSizeOverride];
}
@@ -3273,6 +3316,7 @@
- (void)_clearOverrideLayoutParameters
{
_viewLayoutSizeOverride = std::nullopt;
+ _minimumUnobscuredSizeOverride = std::nullopt;
_maximumUnobscuredSizeOverride = std::nullopt;
}
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (284627 => 284628)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -8259,6 +8259,7 @@
parameters.overrideScreenSize = overrideScreenSize();
parameters.textAutosizingWidth = textAutosizingWidth();
parameters.mimeTypesWithCustomContentProviders = pageClient().mimeTypesWithCustomContentProviders();
+ parameters.minimumUnobscuredSize = m_minimumUnobscuredSize;
parameters.maximumUnobscuredSize = m_maximumUnobscuredSize;
parameters.deviceOrientation = m_deviceOrientation;
parameters.keyboardIsAttached = isInHardwareKeyboardMode();
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (284627 => 284628)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -818,9 +818,11 @@
void scrollingNodeScrollWillStartScroll();
void scrollingNodeScrollDidEndScroll();
- void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
+ void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
void setViewportConfigurationViewLayoutSize(const WebCore::FloatSize&, double scaleFactor, double minimumEffectiveDeviceWidth);
+ void setMinimumUnobscuredSize(const WebCore::FloatSize&);
+ WebCore::FloatSize minimumUnobscuredSize() const { return m_minimumUnobscuredSize; }
void setMaximumUnobscuredSize(const WebCore::FloatSize&);
WebCore::FloatSize maximumUnobscuredSize() const { return m_maximumUnobscuredSize; }
void setDeviceOrientation(int32_t);
@@ -2989,6 +2991,7 @@
#if PLATFORM(IOS_FAMILY)
Function<bool()> m_deviceOrientationUserPermissionHandlerForTesting;
bool m_waitingForPostLayoutEditorStateUpdateAfterFocusingElement { false };
+ WebCore::FloatSize m_minimumUnobscuredSize;
WebCore::FloatSize m_maximumUnobscuredSize;
bool m_lastObservedStateWasBackground { false };
#endif
Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (284627 => 284628)
--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm 2021-10-21 18:17:59 UTC (rev 284628)
@@ -264,7 +264,7 @@
pageClient().scrollingNodeScrollDidEndScroll();
}
-void WebPageProxy::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
+void WebPageProxy::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& unobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
{
if (!hasRunningProcess())
return;
@@ -273,7 +273,7 @@
m_viewportConfigurationViewLayoutSize = viewLayoutSize;
m_process->send(Messages::WebPage::DynamicViewportSizeUpdate(viewLayoutSize,
- maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect,
+ minimumUnobscuredSize, maximumUnobscuredSize, targetExposedContentRect, targetUnobscuredRect,
targetUnobscuredRectInScrollViewCoordinates, unobscuredSafeAreaInsets,
targetScale, deviceOrientation, minimumEffectiveDeviceWidth, dynamicViewportSizeUpdateID), m_webPageID);
@@ -300,6 +300,14 @@
m_process->send(Messages::WebPage::SetForceAlwaysUserScalable(userScalable), m_webPageID);
}
+void WebPageProxy::setMinimumUnobscuredSize(const WebCore::FloatSize& size)
+{
+ m_minimumUnobscuredSize = size;
+
+ if (hasRunningProcess())
+ m_process->send(Messages::WebPage::SetMinimumUnobscuredSize(size), m_webPageID);
+}
+
void WebPageProxy::setMaximumUnobscuredSize(const WebCore::FloatSize& size)
{
m_maximumUnobscuredSize = size;
Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (284627 => 284628)
--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -1559,7 +1559,7 @@
}
if (auto viewportSizeForViewportUnits = webPage->viewportSizeForCSSViewportUnits())
- view->setViewportSizeForCSSViewportUnits(*viewportSizeForViewportUnits);
+ view->setSizeForCSSLargeViewportUnits(*viewportSizeForViewportUnits);
view->setProhibitsScrolling(shouldDisableScrolling);
view->setVisualUpdatesAllowedByClient(!webPage->shouldExtendIncrementalRenderingSuppression());
#if PLATFORM(COCOA)
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (284627 => 284628)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -871,6 +871,7 @@
#if PLATFORM(IOS_FAMILY)
setViewportConfigurationViewLayoutSize(parameters.viewportConfigurationViewLayoutSize, parameters.viewportConfigurationLayoutSizeScaleFactor, parameters.viewportConfigurationMinimumEffectiveDeviceWidth);
+ setMinimumUnobscuredSize(parameters.minimumUnobscuredSize);
setMaximumUnobscuredSize(parameters.maximumUnobscuredSize);
#endif
@@ -6266,7 +6267,7 @@
m_viewportSizeForCSSViewportUnits = viewportSize;
if (m_viewportSizeForCSSViewportUnits)
- corePage()->mainFrame().view()->setViewportSizeForCSSViewportUnits(*m_viewportSizeForCSSViewportUnits);
+ corePage()->mainFrame().view()->setSizeForCSSLargeViewportUnits(*m_viewportSizeForCSSViewportUnits);
}
bool WebPage::isSmartInsertDeleteEnabled()
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (284627 => 284628)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-10-21 18:17:59 UTC (rev 284628)
@@ -1081,9 +1081,10 @@
void updateVisibilityState(bool isInitialState = false);
#if PLATFORM(IOS_FAMILY)
+ void setMinimumUnobscuredSize(const WebCore::FloatSize&);
void setMaximumUnobscuredSize(const WebCore::FloatSize&);
void setDeviceOrientation(int32_t);
- void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
+ void dynamicViewportSizeUpdate(const WebCore::FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const WebCore::FloatRect& targetExposedContentRect, const WebCore::FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID);
bool scaleWasSetByUIProcess() const { return m_scaleWasSetByUIProcess; }
void willStartUserTriggeredZooming();
void applicationWillResignActive();
@@ -2258,6 +2259,7 @@
std::optional<WebCore::SimpleRange> m_initialSelection;
WebCore::VisibleSelection m_storedSelectionForAccessibility { WebCore::VisibleSelection() };
+ WebCore::FloatSize m_minimumUnobscuredSize;
WebCore::FloatSize m_maximumUnobscuredSize;
int32_t m_deviceOrientation { 0 };
bool m_keyboardIsAttached { false };
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (284627 => 284628)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2021-10-21 18:17:59 UTC (rev 284628)
@@ -53,10 +53,11 @@
MouseEvent(WebKit::WebMouseEvent event, std::optional<Vector<WebKit::SandboxExtension::Handle>> sandboxExtensions)
#if PLATFORM(IOS_FAMILY)
SetViewportConfigurationViewLayoutSize(WebCore::FloatSize size, double scaleFactor, double minimumEffectiveDeviceWidth)
+ SetMinimumUnobscuredSize(WebCore::FloatSize size)
SetMaximumUnobscuredSize(WebCore::FloatSize size)
SetDeviceOrientation(int32_t deviceOrientation)
SetOverrideViewportArguments(std::optional<WebCore::ViewportArguments> arguments)
- DynamicViewportSizeUpdate(WebCore::FloatSize viewLayoutSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, WebCore::RectEdges<float> targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, uint64_t dynamicViewportSizeUpdateID)
+ DynamicViewportSizeUpdate(WebCore::FloatSize viewLayoutSize, WebCore::FloatSize minimumUnobscuredSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, WebCore::RectEdges<float> targetUnobscuredSafeAreaInsets, double scale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, uint64_t dynamicViewportSizeUpdateID)
SetScreenIsBeingCaptured(bool captured)
Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (284627 => 284628)
--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2021-10-21 18:17:59 UTC (rev 284628)
@@ -3434,6 +3434,12 @@
viewportConfigurationChanged(zoomToInitialScale);
}
+void WebPage::setMinimumUnobscuredSize(const FloatSize& minimumUnobscuredSize)
+{
+ m_minimumUnobscuredSize = minimumUnobscuredSize;
+ updateViewportSizeForCSSViewportUnits();
+}
+
void WebPage::setMaximumUnobscuredSize(const FloatSize& maximumUnobscuredSize)
{
m_maximumUnobscuredSize = maximumUnobscuredSize;
@@ -3453,7 +3459,7 @@
m_page->setOverrideViewportArguments(arguments);
}
-void WebPage::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
+void WebPage::dynamicViewportSizeUpdate(const FloatSize& viewLayoutSize, const WebCore::FloatSize& minimumUnobscuredSize, const WebCore::FloatSize& maximumUnobscuredSize, const FloatRect& targetExposedContentRect, const FloatRect& targetUnobscuredRect, const WebCore::FloatRect& targetUnobscuredRectInScrollViewCoordinates, const WebCore::FloatBoxExtent& targetUnobscuredSafeAreaInsets, double targetScale, int32_t deviceOrientation, double minimumEffectiveDeviceWidth, DynamicViewportSizeUpdateID dynamicViewportSizeUpdateID)
{
SetForScope<bool> dynamicSizeUpdateGuard(m_inDynamicSizeUpdate, true);
// FIXME: this does not handle the cases where the content would change the content size or scroll position from _javascript_.
@@ -3501,6 +3507,7 @@
if (setFixedLayoutSize(newLayoutSize))
resetTextAutosizing();
+ setMinimumUnobscuredSize(minimumUnobscuredSize);
setMaximumUnobscuredSize(maximumUnobscuredSize);
m_page->setUnobscuredSafeAreaInsets(targetUnobscuredSafeAreaInsets);
@@ -3847,13 +3854,19 @@
void WebPage::updateViewportSizeForCSSViewportUnits()
{
+ FloatSize smallestUnobscuredSize = m_minimumUnobscuredSize;
+ if (smallestUnobscuredSize.isEmpty())
+ smallestUnobscuredSize = m_viewportConfiguration.viewLayoutSize();
+
FloatSize largestUnobscuredSize = m_maximumUnobscuredSize;
if (largestUnobscuredSize.isEmpty())
largestUnobscuredSize = m_viewportConfiguration.viewLayoutSize();
FrameView& frameView = *mainFrameView();
+ smallestUnobscuredSize.scale(1 / m_viewportConfiguration.initialScaleIgnoringContentSize());
largestUnobscuredSize.scale(1 / m_viewportConfiguration.initialScaleIgnoringContentSize());
- frameView.setViewportSizeForCSSViewportUnits(roundedIntSize(largestUnobscuredSize));
+ frameView.setSizeForCSSSmallViewportUnits(roundedIntSize(smallestUnobscuredSize));
+ frameView.setSizeForCSSLargeViewportUnits(roundedIntSize(largestUnobscuredSize));
}
void WebPage::applicationWillResignActive()
Modified: trunk/Tools/ChangeLog (284627 => 284628)
--- trunk/Tools/ChangeLog 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/ChangeLog 2021-10-21 18:17:59 UTC (rev 284628)
@@ -1,3 +1,30 @@
+2021-10-21 Devin Rousso <drou...@apple.com>
+
+ [css-values-4] Support small (sv*), large (lv*) and dynamic (dv*) viewport units
+ https://bugs.webkit.org/show_bug.cgi?id=219287
+ <rdar://problem/71857370>
+
+ Reviewed by Simon Fraser.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm: Added.
+ (evaluateForInt):
+ (getElementHeight):
+ (TEST.CSSViewportUnits.AllSame):
+ (TEST.CSSViewportUnits.EmptyUnobscuredSizeOverrides):
+ (TEST.CSSViewportUnits.SameUnobscuredSizeOverrides):
+ (TEST.CSSViewportUnits.DifferentUnobscuredSizeOverrides):
+ * TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html: Added.
+
+ * TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp:
+ (TEST.FloatSize.MinDimension): Added.
+ (TEST.FloatSize.MaxDimension): Added.
+ * TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp:
+ (TEST.IntSize.MinDimension): Added.
+ (TEST.IntSize.MaxDimension): Added.
+ Add utility/helper methods for returning the minimum/maximum of the width vs height.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+
2021-10-21 Chris Dumez <cdu...@apple.com>
WebKit should process-swap for initial navigation of a popup if it has no opener
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (284627 => 284628)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2021-10-21 18:17:59 UTC (rev 284628)
@@ -893,6 +893,8 @@
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 */; };
+ 952F7165270BD97E00D00DCC /* CSSViewportUnits.mm in Sources */ = {isa = PBXBuildFile; fileRef = 952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */; };
+ 952F7167270BD9CB00D00DCC /* CSSViewportUnits.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 952F7166270BD99700D00DCC /* CSSViewportUnits.html */; };
953ABB3525C0D682004C8B73 /* WKWebViewUnderPageBackgroundColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */; };
958B70E126C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 958B70E026C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm */; };
95A524952581A10D00461FE9 /* WKWebViewThemeColor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */; };
@@ -1466,6 +1468,7 @@
9B62630C1F8C25C8007EE29B /* copy-url.html in Copy Resources */,
7AEAD4811E20122700416EFE /* CrossPartitionFileSchemeAccess.html in Copy Resources */,
4995A6F025E8772000E5F0A9 /* csp-document-uri-report.html in Copy Resources */,
+ 952F7167270BD9CB00D00DCC /* CSSViewportUnits.html in Copy Resources */,
2DDD4DA4270B8B3500659A61 /* cube.usdz in Copy Resources */,
F4AB578A1F65165400DB0DA1 /* custom-draggable-div.html in Copy Resources */,
290F4275172A221C00939FF0 /* custom-protocol-sync-xhr.html in Copy Resources */,
@@ -2641,6 +2644,8 @@
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>"; };
+ 952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CSSViewportUnits.mm; sourceTree = "<group>"; };
+ 952F7166270BD99700D00DCC /* CSSViewportUnits.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = CSSViewportUnits.html; sourceTree = "<group>"; };
953ABB3425C0D681004C8B73 /* WKWebViewUnderPageBackgroundColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewUnderPageBackgroundColor.mm; sourceTree = "<group>"; };
958B70E026C46EDC00B2022B /* NSAttributedStringWebKitAdditions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NSAttributedStringWebKitAdditions.mm; sourceTree = "<group>"; };
95A524942581A10D00461FE9 /* WKWebViewThemeColor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewThemeColor.mm; sourceTree = "<group>"; };
@@ -3494,6 +3499,7 @@
1C79201B234BDD9B001EAF23 /* CopyRTF.mm */,
9B7A37C21F8AEBA5004AA228 /* CopyURL.mm */,
510A921D24DB38ED00BFD89C /* CreateWebArchive.mm */,
+ 952F7164270BD97E00D00DCC /* CSSViewportUnits.mm */,
46A911582108E66B0078D40D /* CustomUserAgent.mm */,
2DC4CF761D2D9DD800ECCC94 /* DataDetection.mm */,
518EE51C20A78D3300E024F3 /* DecidePolicyForNavigationAction.mm */,
@@ -4057,6 +4063,7 @@
9B1056421F9047CC00D5583F /* copy-html.html */,
9B62630B1F8C2510007EE29B /* copy-url.html */,
4995A6EF25E876A300E5F0A9 /* csp-document-uri-report.html */,
+ 952F7166270BD99700D00DCC /* CSSViewportUnits.html */,
F4AB57891F65164B00DB0DA1 /* custom-draggable-div.html */,
F47DFB2421A8704A00021FB6 /* data-detectors.html */,
F486B1CF1F6794FF00F34BDD /* DataTransfer-setDragImage.html */,
@@ -5506,6 +5513,7 @@
510A921E24DB38F300BFD89C /* CreateWebArchive.mm in Sources */,
7AEAD47F1E20116C00416EFE /* CrossPartitionFileSchemeAccess.mm in Sources */,
7CCE7EDB1A411A9200447C4C /* CSSParser.cpp in Sources */,
+ 952F7165270BD97E00D00DCC /* CSSViewportUnits.mm in Sources */,
5758597F23A2527A00C74572 /* CtapPinTest.cpp in Sources */,
572B403421769A88000AD43E /* CtapRequestTest.cpp in Sources */,
572B404421781B43000AD43E /* CtapResponseTest.cpp in Sources */,
Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp (284627 => 284628)
--- trunk/Tools/TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/FloatSizeTests.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -93,6 +93,28 @@
testGetAndSet(test);
}
+TEST(FloatSize, MinDimension)
+{
+ WebCore::FloatSize test(1024.0f, 768.0f);
+
+ EXPECT_FLOAT_EQ(768.0f, test.minDimension());
+
+ test.scale(1.0f, 2.0f);
+
+ EXPECT_FLOAT_EQ(1024.0f, test.minDimension());
+}
+
+TEST(FloatSize, MaxDimension)
+{
+ WebCore::FloatSize test(1024.0f, 768.0f);
+
+ EXPECT_FLOAT_EQ(1024.0f, test.maxDimension());
+
+ test.scale(1.0f, 2.0f);
+
+ EXPECT_FLOAT_EQ(1536.0f, test.maxDimension());
+}
+
TEST(FloatSize, Scale)
{
WebCore::FloatSize test(1024.0f, 768.0f);
Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp (284627 => 284628)
--- trunk/Tools/TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp 2021-10-21 18:16:15 UTC (rev 284627)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/IntSizeTests.cpp 2021-10-21 18:17:59 UTC (rev 284628)
@@ -93,6 +93,28 @@
testGetAndSet(test);
}
+TEST(IntSize, MinDimension)
+{
+ WebCore::IntSize test(1024, 768);
+
+ EXPECT_EQ(768, test.minDimension());
+
+ test.scale(1.0f, 2.0f);
+
+ EXPECT_EQ(1024, test.minDimension());
+}
+
+TEST(IntSize, MaxDimension)
+{
+ WebCore::IntSize test(1024, 768);
+
+ EXPECT_EQ(1024, test.maxDimension());
+
+ test.scale(1.0f, 2.0f);
+
+ EXPECT_EQ(1536, test.maxDimension());
+}
+
TEST(IntSize, DiagonalLengthAndArea)
{
WebCore::IntSize test(1024, 768);
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html (0 => 284628)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.html 2021-10-21 18:17:59 UTC (rev 284628)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<head>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <style>
+body {
+ margin: 0;
+}
+div {
+ display: inline-block;
+ width: 1px;
+}
+ </style>
+</head>
+<body>
+ <div id="vw" style="height: 100vw;"></div>
+ <div id="vh" style="height: 100vh;"></div>
+ <div id="vmin" style="height: 100vmin;"></div>
+ <div id="vmax" style="height: 100vmax;"></div>
+
+ <div id="svw" style="height: 100svw;"></div>
+ <div id="svh" style="height: 100svh;"></div>
+ <div id="svmin" style="height: 100svmin;"></div>
+ <div id="svmax" style="height: 100svmax;"></div>
+
+ <div id="lvw" style="height: 100lvw;"></div>
+ <div id="lvh" style="height: 100lvh;"></div>
+ <div id="lvmin" style="height: 100lvmin;"></div>
+ <div id="lvmax" style="height: 100lvmax;"></div>
+
+ <div id="dvw" style="height: 100dvw;"></div>
+ <div id="dvh" style="height: 100dvh;"></div>
+ <div id="dvmin" style="height: 100dvmin;"></div>
+ <div id="dvmax" style="height: 100dvmax;"></div>
+</body>
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm (0 => 284628)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CSSViewportUnits.mm 2021-10-21 18:17:59 UTC (rev 284628)
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2021 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 "PlatformUtilities.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKWebViewPrivate.h>
+#import <wtf/RetainPtr.h>
+
+static int evaluateForInt(WKWebView *webView, NSString *script)
+{
+ return [(NSNumber *)[webView objectByEvaluatingJavaScript:script] intValue];
+}
+
+static int getElementHeight(WKWebView *webView, NSString *elementID)
+{
+ return evaluateForInt(webView, [NSString stringWithFormat:@"document.getElementById('%@').getBoundingClientRect().height", elementID]);
+}
+
+TEST(CSSViewportUnits, AllSame)
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+ [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+ EXPECT_EQ(320, getElementHeight(webView.get(), @"vw"));
+ EXPECT_EQ(500, getElementHeight(webView.get(), @"vh"));
+ EXPECT_EQ(320, getElementHeight(webView.get(), @"vmin"));
+ EXPECT_EQ(500, getElementHeight(webView.get(), @"vmax"));
+
+ EXPECT_EQ(320, getElementHeight(webView.get(), @"svw"));
+ EXPECT_EQ(500, getElementHeight(webView.get(), @"svh"));
+ EXPECT_EQ(320, getElementHeight(webView.get(), @"svmin"));
+ EXPECT_EQ(500, getElementHeight(webView.get(), @"svmax"));
+
+ EXPECT_EQ(320, getElementHeight(webView.get(), @"lvw"));
+ EXPECT_EQ(500, getElementHeight(webView.get(), @"lvh"));
+ EXPECT_EQ(320, getElementHeight(webView.get(), @"lvmin"));
+ EXPECT_EQ(500, getElementHeight(webView.get(), @"lvmax"));
+
+ int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+ int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+#if PLATFORM(IOS_FAMILY)
+
+TEST(CSSViewportUnits, EmptyUnobscuredSizeOverrides)
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+ [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+ maximumUnobscuredSizeOverride:CGSizeZero];
+ [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"vw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"vh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"vmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"vmax"));
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"svw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"svh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"svmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"svmax"));
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"lvw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"lvh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"lvmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"lvmax"));
+
+ int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+ int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+TEST(CSSViewportUnits, SameUnobscuredSizeOverrides)
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+ [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+ maximumUnobscuredSizeOverride:CGSizeMake(10, 20)];
+ [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"vw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"vh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"vmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"vmax"));
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"svw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"svh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"svmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"svmax"));
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"lvw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"lvh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"lvmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"lvmax"));
+
+ int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+ int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+TEST(CSSViewportUnits, DifferentUnobscuredSizeOverrides)
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+ [webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10, 20)
+ maximumUnobscuredSizeOverride:CGSizeMake(30, 40)];
+ [webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
+
+ EXPECT_EQ(30, getElementHeight(webView.get(), @"vw"));
+ EXPECT_EQ(40, getElementHeight(webView.get(), @"vh"));
+ EXPECT_EQ(30, getElementHeight(webView.get(), @"vmin"));
+ EXPECT_EQ(40, getElementHeight(webView.get(), @"vmax"));
+
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"svw"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"svh"));
+ EXPECT_EQ(10, getElementHeight(webView.get(), @"svmin"));
+ EXPECT_EQ(20, getElementHeight(webView.get(), @"svmax"));
+
+ EXPECT_EQ(30, getElementHeight(webView.get(), @"lvw"));
+ EXPECT_EQ(40, getElementHeight(webView.get(), @"lvh"));
+ EXPECT_EQ(30, getElementHeight(webView.get(), @"lvmin"));
+ EXPECT_EQ(40, getElementHeight(webView.get(), @"lvmax"));
+
+ int innerWidth = evaluateForInt(webView.get(), @"window.innerWidth");
+ int innerHeight = evaluateForInt(webView.get(), @"window.innerHeight");
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvw"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvh"));
+ EXPECT_EQ(innerWidth, getElementHeight(webView.get(), @"dvmin"));
+ EXPECT_EQ(innerHeight, getElementHeight(webView.get(), @"dvmax"));
+}
+
+#endif // PLATFORM(IOS_FAMILY)