// 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 #include #include #include "base/command_line.h" #include "base/macros.h" #include "base/synchronization/lock.h" #include "content/browser/renderer_host/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 { 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 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 fallback_fonts_; std::map font_names_; std::set 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