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/render_process_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <objidl.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mlang.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/sys_info.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/child/site_isolation_policy.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h"
22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/WebKit/public/web/WebFrame.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "v8/include/v8.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessImpl::RenderProcessImpl()
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : enabled_bindings_(0) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HACK:  See http://b/issue?id=1024307 for rationale.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetModuleHandle(L"LPK.DLL") == NULL) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Makes sure lpk.dll is loaded by gdi32 to make sure ExtTextOut() works
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when buffering into a EMF buffer for printing.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef BOOL (__stdcall *GdiInitializeLanguagePack)(int LoadedShapingDLLs);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GdiInitializeLanguagePack gdi_init_lpk =
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reinterpret_cast<GdiInitializeLanguagePack>(GetProcAddress(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetModuleHandle(L"GDI32.DLL"),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "GdiInitializeLanguagePack"));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(gdi_init_lpk);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (gdi_init_lpk) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gdi_init_lpk(0);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (base::SysInfo::IsLowEndDevice()) {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string optimize_flag("--optimize-for-size");
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    v8::V8::SetFlagsFromString(optimize_flag.c_str(),
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               static_cast<int>(optimize_flag.size()));
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line.HasSwitch(switches::kJavaScriptFlags)) {
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string flags(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        command_line.GetSwitchValueASCII(switches::kJavaScriptFlags));
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    v8::V8::SetFlagsFromString(flags.c_str(), static_cast<int>(flags.size()));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Turn on cross-site document blocking for renderer processes.
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SiteIsolationPolicy::SetPolicyEnabled(
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetContentClient()->renderer()->ShouldEnableSiteIsolationPolicy());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderProcessImpl::~RenderProcessImpl() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int count = blink::WebFrame::instanceCount();
67bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (count)
68bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    DLOG(ERROR) << "WebFrame LEAKED " << count << " TIMES";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetShutDownEvent()->Signal();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderProcessImpl::AddBindings(int bindings) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enabled_bindings_ |= bindings;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RenderProcessImpl::GetEnabledBindings() const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enabled_bindings_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
83