15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_main_platform_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/win/scoped_comptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/win_util.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/win/windows_version.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/common/sandbox_win.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/injection_test_win.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "content/public/renderer/render_font_warmup_win.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/render_thread_impl.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "skia/ext/fontmgr_default_win.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/vector_platform_device_emf_win.h"
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/WebKit/public/web/win/WebFontRendering.h"
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/timezone.h"
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "third_party/skia/include/ports/SkFontMgr.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/ports/SkTypeface_win.h"
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/win/dpi.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifdef ENABLE_VTUNE_JIT_INTERFACE
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "v8/src/third_party/vtune/v8-vtune.h"
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <dwrite.h>
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows-only skia sandbox support
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// These are used for GDI-path rendering.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SkiaPreCacheFont(const LOGFONT& logfont) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread* render_thread = RenderThread::Get();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (render_thread) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    render_thread->PreCacheFont(logfont);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SkiaPreCacheFontCharacters(const LOGFONT& logfont,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const wchar_t* text,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                unsigned int text_length) {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_thread_impl) {
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    render_thread_impl->PreCacheFontCharacters(
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        logfont,
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::string16(text, text_length));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WarmupDirectWrite() {
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The objects used here are intentionally not freed as we want the Skia
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // code to use these objects after warmup.
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SkTypeface* typeface =
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GetPreSandboxWarmupFontMgr()->legacyCreateTypeface("Times New Roman", 0);
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DoPreSandboxWarmupForTypeface(typeface);
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetDefaultSkiaFactory(GetPreSandboxWarmupFontMgr());
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererMainPlatformDelegate::RendererMainPlatformDelegate(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MainFunctionParams& parameters)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : parameters_(parameters),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sandbox_test_module_(NULL) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererMainPlatformDelegate::~RendererMainPlatformDelegate() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RendererMainPlatformDelegate::PlatformInitialize() {
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const CommandLine& command_line = parameters_.command_line;
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifdef ENABLE_VTUNE_JIT_INTERFACE
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableVtune))
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    vTune::InitializeVtuneForV8();
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Be mindful of what resources you acquire here. They can be used by
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // malicious code if the renderer gets compromised.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool no_sandbox = command_line.HasSwitch(switches::kNoSandbox);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool use_direct_write = ShouldUseDirectWrite();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!no_sandbox) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ICU DateFormat class (used in base/time_format.cc) needs to get the
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Olson timezone ID by accessing the registry keys under
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // After TimeZone::createDefault is called once here, the timezone ID is
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cached and there's no more need to access the registry. If the sandbox
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is disabled, we don't have to make this dummy call.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (use_direct_write) {
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      WarmupDirectWrite();
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } else {
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      SkTypeface_SetEnsureLOGFONTAccessibleProc(SkiaPreCacheFont);
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      skia::SetSkiaEnsureTypefaceCharactersAccessible(
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          SkiaPreCacheFontCharacters);
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  blink::WebFontRendering::setUseDirectWrite(use_direct_write);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  blink::WebFontRendering::setDeviceScaleFactor(gfx::GetDPIScale());
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (use_direct_write) {
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    blink::WebRuntimeFeatures::enableSubpixelFontScaling(true);
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RendererMainPlatformDelegate::PlatformUninitialize() {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererMainPlatformDelegate::EnableSandbox() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sandbox::TargetServices* target_services =
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parameters_.sandbox_info->target_services;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target_services) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cause advapi32 to load before the sandbox is turned on.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int dummy_rand;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rand_s(&dummy_rand);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Warm up language subsystems before the sandbox is turned on.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::GetUserDefaultLangID();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::GetUserDefaultLCID();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target_services->LowerToken();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
138