blob: e0ad058bfbf53385b0873ae18583b2a51e3ef810 [file] [log] [blame]
/*
* 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 double evaluateForNumber(WKWebView *webView, NSString *script)
{
return [(NSNumber *)[webView objectByEvaluatingJavaScript:script] doubleValue];
}
static double getElementHeight(WKWebView *webView, NSString *elementID)
{
return evaluateForNumber(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_FLOAT_EQ(320, getElementHeight(webView.get(), @"vw"));
EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"vh"));
EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"vmin"));
EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"vmax"));
EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"svw"));
EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"svh"));
EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"svmin"));
EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"svmax"));
EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"lvw"));
EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"lvh"));
EXPECT_FLOAT_EQ(320, getElementHeight(webView.get(), @"lvmin"));
EXPECT_FLOAT_EQ(500, getElementHeight(webView.get(), @"lvmax"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.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.5, 20.5)
maximumUnobscuredSizeOverride:CGSizeZero];
[webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vmax"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svmax"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvmax"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
}
TEST(CSSViewportUnits, SameUnobscuredSizeOverrides)
{
auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
[webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
maximumUnobscuredSizeOverride:CGSizeMake(10.5, 20.5)];
[webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"vmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"vmax"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svmax"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"lvmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"lvmax"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
}
TEST(CSSViewportUnits, DifferentUnobscuredSizeOverrides)
{
auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
[webView _overrideLayoutParametersWithMinimumLayoutSize:CGSizeMake(10.5, 20.5)
maximumUnobscuredSizeOverride:CGSizeMake(30.5, 40.5)];
[webView synchronouslyLoadTestPageNamed:@"CSSViewportUnits"];
EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"vw"));
EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"vh"));
EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"vmin"));
EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"vmax"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svw"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svh"));
EXPECT_FLOAT_EQ(10.5, getElementHeight(webView.get(), @"svmin"));
EXPECT_FLOAT_EQ(20.5, getElementHeight(webView.get(), @"svmax"));
EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"lvw"));
EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"lvh"));
EXPECT_FLOAT_EQ(30.5, getElementHeight(webView.get(), @"lvmin"));
EXPECT_FLOAT_EQ(40.5, getElementHeight(webView.get(), @"lvmax"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvw"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvh"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerWidth"), getElementHeight(webView.get(), @"dvmin"));
EXPECT_FLOAT_EQ(evaluateForNumber(webView.get(), @"window.innerHeight"), getElementHeight(webView.get(), @"dvmax"));
}
#endif // PLATFORM(IOS_FAMILY)