| // Copyright 2017 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. |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| |
| #include "base/command_line.h" |
| #include "base/macros.h" |
| #include "base/synchronization/lock.h" |
| #include "content/browser/sandbox_ipc_linux.h" |
| #include "content/public/common/content_switches.h" |
| #include "content/public/test/content_browser_test.h" |
| #include "content/public/test/content_browser_test_utils.h" |
| #include "testing/gmock/include/gmock/gmock-matchers.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/gfx/test/fontconfig_util_linux.h" |
| |
| namespace content { |
| |
| class LinuxIPCBrowserTest : public ContentBrowserTest, |
| public SandboxIPCHandler::TestObserver, |
| public testing::WithParamInterface<std::string> { |
| public: |
| LinuxIPCBrowserTest() { |
| SetUpFontConfigForTest(); |
| SandboxIPCHandler::SetObserverForTests(this); |
| } |
| ~LinuxIPCBrowserTest() override {} |
| |
| protected: |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| ContentBrowserTest::SetUpCommandLine(command_line); |
| if (GetParam() == "no-zygote") { |
| command_line->AppendSwitch(switches::kNoZygote); |
| command_line->AppendSwitch(switches::kNoSandbox); |
| } |
| } |
| |
| // Override the system fontconfig configuration with a test configuration so |
| // that the tested font fallback will work the same across systems. |
| void SetUpFontConfigForTest() { |
| gfx::SetUpFontconfig(); |
| for (size_t i = 0; i < gfx::kNumSystemFontsForFontconfig; ++i) { |
| gfx::LoadFontIntoFontconfig( |
| base::FilePath(gfx::kSystemFontsForFontconfig[i])); |
| } |
| } |
| |
| void OnFontOpen(int id) override { |
| base::AutoLock lock(lock_); |
| opened_fonts_.insert(font_names_[id]); |
| } |
| |
| void OnGetFallbackFontForChar(UChar32 c, std::string name, int id) override { |
| base::AutoLock lock(lock_); |
| fallback_fonts_[c] = name; |
| font_names_[id] = name; |
| } |
| |
| std::string FallbackFontName(UChar32 c) { |
| base::AutoLock lock(lock_); |
| return fallback_fonts_[c]; |
| } |
| |
| std::set<std::string> OpenedFonts() { |
| base::AutoLock lock(lock_); |
| return opened_fonts_; |
| } |
| |
| // These variables are accessed on the IPC thread and the test thread. |
| // All accesses on the IPC thread should be before the renderer process |
| // completes navigation, and all accesses on the test thread should be after. |
| // However we still need a mutex for the accesses to be sequenced according to |
| // the C++ memory model. |
| base::Lock lock_; |
| std::map<UChar32, std::string> fallback_fonts_; |
| std::map<int, std::string> font_names_; |
| std::set<std::string> opened_fonts_; |
| |
| DISALLOW_COPY_AND_ASSIGN(LinuxIPCBrowserTest); |
| }; |
| |
| // Tests that Linux IPC font fallback code runs round-trip when Zygote is |
| // disabled. It doesn't care what font is chosen, just that the IPC messages are |
| // flowing. This test assumes that U+65E5 (CJK "Sun" character) will trigger the |
| // font fallback codepath. |
| IN_PROC_BROWSER_TEST_P(LinuxIPCBrowserTest, FontFallbackIPCWorks) { |
| GURL test_url = GetTestUrl("font", "font_fallback.html"); |
| EXPECT_TRUE(NavigateToURL(shell(), test_url)); |
| EXPECT_THAT(FallbackFontName(U'\U000065E5'), testing::Ne("")); |
| EXPECT_THAT(OpenedFonts(), |
| testing::Contains(FallbackFontName(U'\U000065E5'))); |
| } |
| |
| INSTANTIATE_TEST_CASE_P(LinuxIPCBrowserTest, |
| LinuxIPCBrowserTest, |
| ::testing::Values("zygote", "no-zygote")); |
| |
| } // namespace |