OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/shell/app/webkit_test_platform_support.h" | |
6 | |
7 #include <windows.h> | |
8 #include <iostream> | |
9 #include <list> | |
10 #include <string> | |
11 | |
12 #include "base/command_line.h" | |
13 #include "base/files/file_path.h" | |
14 #include "base/files/file_util.h" | |
15 #include "base/logging.h" | |
16 #include "base/path_service.h" | |
17 #include "base/strings/utf_string_conversions.h" | |
18 #include "content/shell/common/shell_switches.h" | |
19 | |
20 #define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(struct_name, member) \ | |
21 offsetof(struct_name, member) + \ | |
22 (sizeof static_cast<struct_name*>(0)->member) | |
23 #define NONCLIENTMETRICS_SIZE_PRE_VISTA \ | |
24 SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont) | |
25 | |
26 namespace content { | |
27 | |
28 namespace { | |
29 | |
30 bool SetupFonts() { | |
31 // Load Ahem font. | |
32 // AHEM____.TTF is copied to the directory of DumpRenderTree.exe by | |
33 // WebKit.gyp. | |
34 base::FilePath base_path; | |
35 PathService::Get(base::DIR_MODULE, &base_path); | |
36 base::FilePath font_path = | |
37 base_path.Append(FILE_PATH_LITERAL("/AHEM____.TTF")); | |
38 | |
39 // We do two registrations: | |
40 // 1. For GDI font rendering via ::AddFontMemResourceEx. | |
41 // 2. For DirectWrite rendering by appending a command line flag that tells | |
42 // the sandbox policy/warmup to grant access to the given path. | |
43 | |
44 // GDI registration. | |
45 std::string font_buffer; | |
46 if (!base::ReadFileToString(font_path, &font_buffer)) { | |
47 std::cerr << "Failed to load font " << base::WideToUTF8(font_path.value()) | |
48 << "\n"; | |
49 return false; | |
50 } | |
51 | |
52 DWORD num_fonts = 1; | |
53 HANDLE font_handle = | |
54 ::AddFontMemResourceEx(const_cast<char*>(font_buffer.c_str()), | |
55 font_buffer.length(), | |
56 0, | |
57 &num_fonts); | |
58 if (!font_handle) { | |
59 std::cerr << "Failed to register Ahem font\n"; | |
60 return false; | |
61 } | |
62 | |
63 // DirectWrite sandbox registration. | |
64 CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); | |
65 command_line.AppendSwitchASCII(switches::kRegisterFontFiles, | |
66 base::WideToUTF8(font_path.value())); | |
67 | |
68 return true; | |
69 } | |
70 | |
71 } // namespace | |
72 | |
73 bool CheckLayoutSystemDeps() { | |
74 std::list<std::string> errors; | |
75 | |
76 // This metric will be 17 when font size is "Normal". | |
77 // The size of drop-down menus depends on it. | |
78 if (::GetSystemMetrics(SM_CXVSCROLL) != 17) | |
79 errors.push_back("Must use normal size fonts (96 dpi)."); | |
80 | |
81 // Check that we're using the default system fonts. | |
82 OSVERSIONINFO version_info = {0}; | |
83 version_info.dwOSVersionInfoSize = sizeof(version_info); | |
84 ::GetVersionEx(&version_info); | |
85 bool is_vista_or_later = (version_info.dwMajorVersion >= 6); | |
86 NONCLIENTMETRICS metrics = {0}; | |
87 metrics.cbSize = is_vista_or_later ? sizeof(NONCLIENTMETRICS) | |
88 : NONCLIENTMETRICS_SIZE_PRE_VISTA; | |
89 bool success = !!::SystemParametersInfo( | |
90 SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0); | |
91 CHECK(success); | |
92 LOGFONTW* system_fonts[] = | |
93 {&metrics.lfStatusFont, &metrics.lfMenuFont, &metrics.lfSmCaptionFont}; | |
94 const wchar_t* required_font = is_vista_or_later ? L"Segoe UI" : L"Tahoma"; | |
95 int required_font_size = is_vista_or_later ? -12 : -11; | |
96 for (size_t i = 0; i < arraysize(system_fonts); ++i) { | |
97 if (system_fonts[i]->lfHeight != required_font_size || | |
98 wcscmp(required_font, system_fonts[i]->lfFaceName)) { | |
99 errors.push_back(is_vista_or_later | |
100 ? "Must use either the Aero or Basic theme." | |
101 : "Must use the default XP theme (Luna)."); | |
102 break; | |
103 } | |
104 } | |
105 | |
106 for (std::list<std::string>::iterator it = errors.begin(); it != errors.end(); | |
107 ++it) { | |
108 std::cerr << *it << "\n"; | |
109 } | |
110 return errors.empty(); | |
111 } | |
112 | |
113 bool WebKitTestPlatformInitialize() { | |
114 return SetupFonts(); | |
115 } | |
116 | |
117 } // namespace content | |
OLD | NEW |