blob: a87caa3e867d682ee8a505d33c540b9016cf3439 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Foundation/Foundation.h>
#include <stddef.h>
#include "base/macros.h"
#import "ios/web/public/test/web_js_test.h"
#import "ios/web/public/test/web_test_with_web_state.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
// Test fixture for accessibility.js testing.
class FontSizeJsTest : public web::WebJsTest<web::WebTestWithWebState> {
public:
FontSizeJsTest()
: web::WebJsTest<web::WebTestWithWebState>(@[ @"accessibility" ]) {}
// Find DOM element by |element_id| and get computed font size in px.
float GetElementFontSize(NSString* element_id) {
NSNumber* res = ExecuteJavaScriptWithFormat(
@"parseFloat(getComputedStyle(document.getElementById('%@'))."
@"getPropertyValue('font-size'));",
element_id);
return res.floatValue;
}
// Wraps |html| in <html> and loads. Adds <meta name='viewport'
// content='initial-scale=1.0'> to avoid implicit font size inflation (e.g.
// for <div style='font-size:10px'>d<div style='font-size:10px'>d</div></div>
// the |GetElementFontSize| returns 17px instead of 10px under default
// viewport and '-webkit-text-size-adjust=auto'). Setting
// '-webkit-text-size-adjust=none' also works.
void LoadHtml(NSString* html) {
LoadHtmlAndInject(
[NSString stringWithFormat:@"<html><meta name='viewport' "
@"content='initial-scale=1.0'>%@</html>",
html]);
}
// Executes JavaScript "__gCrWeb.accessibility.adjustFontSize(|scale|)" to
// adjust font size to |scale|% and return if it is executed without
// exception.
bool AdjustFontSize(int scale) WARN_UNUSED_RESULT {
id script_result = ExecuteJavaScriptWithFormat(
@"__gCrWeb.accessibility.adjustFontSize(%d); true;", scale);
return [script_result isEqual:@YES];
}
DISALLOW_COPY_AND_ASSIGN(FontSizeJsTest);
};
// Tests that __gCrWeb.accessibility.adjustFontSize works for any scale.
TEST_F(FontSizeJsTest, TestAdjustFontSizeForScale) {
float original_size = 0;
float current_size = 0;
LoadHtml(@"<div id='e'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(20));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 20 / 100);
LoadHtml(@"<div id='e'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(50));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 50 / 100);
LoadHtml(@"<div id='e'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(90));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 90 / 100);
LoadHtml(@"<div id='e'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(150));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 150 / 100);
LoadHtml(@"<div id='e'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(200));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 200 / 100);
LoadHtml(@"<h1 id='e'>h</h1>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(20));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 20 / 100);
LoadHtml(@"<h1 id='e'>h</h1>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(50));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 50 / 100);
LoadHtml(@"<h1 id='e'>h</h1>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(90));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 90 / 100);
LoadHtml(@"<h1 id='e'>h</h1>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<h1 id='e'>h</h1>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(150));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 150 / 100);
LoadHtml(@"<h1 id='e'>h</h1>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(200));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 200 / 100);
LoadHtml(@"<span id='e'>s</span>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(20));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 20 / 100);
LoadHtml(@"<span id='e'>s</span>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(50));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 50 / 100);
LoadHtml(@"<span id='e'>s</span>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(90));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 90 / 100);
LoadHtml(@"<span id='e'>s</span>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<span id='e'>s</span>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(150));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 150 / 100);
LoadHtml(@"<span id='e'>s</span>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(200));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 200 / 100);
}
// Tests that __gCrWeb.accessibility.adjustFontSize works for any CSS unit.
TEST_F(FontSizeJsTest, TestAdjustFontSizeForUnit) {
float original_size = 0;
float current_size = 0;
LoadHtml(@"<div id='e' style='font-size: xx-large'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 1cm'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 5mm'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 1in'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 10px'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 18pt'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 2pc'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 2.5em'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 0.8rem'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
LoadHtml(@"<div id='e' style='font-size: 70%'>d</div>");
original_size = GetElementFontSize(@"e");
ASSERT_TRUE(AdjustFontSize(110));
current_size = GetElementFontSize(@"e");
EXPECT_FLOAT_EQ(current_size, original_size * 110 / 100);
}
// Tests that __gCrWeb.accessibility.adjustFontSize works for nested elements.
TEST_F(FontSizeJsTest, TestAdjustFontSizeForNestedElements) {
float original_size_1 = 0;
float original_size_2 = 0;
float current_size_1 = 0;
float current_size_2 = 0;
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:xx-large'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:1cm'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:5mm'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:1in'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:18pt'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:2pc'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:2.5em'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:0.8rem'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:70%'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:10px'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:xx-large'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
LoadHtml(
@"<div id='e1' style='font-size: 10px'>d<div id='e2' "
@"style='font-size:inherit'>d</div></div>");
original_size_1 = GetElementFontSize(@"e1");
original_size_2 = GetElementFontSize(@"e2");
ASSERT_TRUE(AdjustFontSize(110));
current_size_1 = GetElementFontSize(@"e1");
current_size_2 = GetElementFontSize(@"e2");
EXPECT_FLOAT_EQ(current_size_1, original_size_1 * 110 / 100);
EXPECT_FLOAT_EQ(current_size_2, original_size_2 * 110 / 100);
}