Index: content/browser/renderer_host/render_process_host_impl.cc |
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc |
index 69d34d542ad96490de6720db63ee075e3b229c24..aa641535602a062bf6427dab39500cb8e8823afe 100644 |
--- a/content/browser/renderer_host/render_process_host_impl.cc |
+++ b/content/browser/renderer_host/render_process_host_impl.cc |
@@ -175,11 +175,14 @@ |
#endif |
#if defined(OS_WIN) |
+#include "base/memory/shared_memory.h" |
#include "base/win/scoped_com_initializer.h" |
#include "base/win/windows_version.h" |
#include "content/common/font_cache_dispatcher_win.h" |
#include "content/common/sandbox_win.h" |
+#include "content/public/common/dwrite_font_platform_win.h" |
#include "sandbox/win/src/sandbox_policy.h" |
+#include "ui/gfx/win/direct_write.h" |
#include "ui/gfx/win/dpi.h" |
#endif |
@@ -329,7 +332,9 @@ class RendererSandboxedProcessLauncherDelegate |
explicit RendererSandboxedProcessLauncherDelegate(IPC::ChannelProxy* channel) |
#if defined(OS_POSIX) |
: ipc_fd_(channel->TakeClientFileDescriptor()) |
-#endif // OS_POSIX |
+#elif defined(OS_WIN) |
+ : direct_write_font_cache_section_(NULL) |
+#endif // OS_WIN |
{} |
~RendererSandboxedProcessLauncherDelegate() override {} |
@@ -356,9 +361,18 @@ class RendererSandboxedProcessLauncherDelegate |
} |
} |
+ // If we have a valid DirectWrite font cache section then add its handle to |
+ // the list of handles being shared with the renderer process. |
+ if (direct_write_font_cache_section_) |
+ policy->AddHandleToShare(direct_write_font_cache_section_); |
+ |
GetContentClient()->browser()->PreSpawnRenderer(policy, success); |
} |
+ void set_direct_write_font_cache_handle( |
+ base::SharedMemoryHandle direct_write_font_cache_section) { |
+ direct_write_font_cache_section_ = direct_write_font_cache_section; |
Shrikant Kelkar
2015/05/05 20:43:16
Scope/DuplicateHandle?
ananta
2015/05/07 22:00:47
This code is no longer needed. Based on a discussi
|
+ } |
#elif defined(OS_POSIX) |
bool ShouldUseZygote() override { |
const base::CommandLine& browser_command_line = |
@@ -374,6 +388,10 @@ class RendererSandboxedProcessLauncherDelegate |
#if defined(OS_POSIX) |
base::ScopedFD ipc_fd_; |
#endif // OS_POSIX |
+ |
+#if defined(OS_WIN) |
+ base::SharedMemoryHandle direct_write_font_cache_section_; |
Shrikant Kelkar
2015/05/05 20:43:15
Scope? Who is the owner?
ananta
2015/05/07 22:00:48
Reworked the patch to move the handle sharing and
|
+#endif |
}; |
const char kSessionStorageHolderKey[] = "kSessionStorageHolderKey"; |
@@ -665,6 +683,24 @@ bool RenderProcessHostImpl::Init() { |
g_in_process_thread = in_process_renderer_->message_loop(); |
} else { |
+ RendererSandboxedProcessLauncherDelegate* sandbox_delegate = |
+ new RendererSandboxedProcessLauncherDelegate(channel_.get()); |
+#if defined(OS_WIN) |
+ // If DirectWrite is enabled for font rendering then open the font cache |
+ // section and pass the handle to the renderer process. This is needed |
+ // because renderer processes on Windows 8+ may be running in an |
+ // AppContainer sandbox and hence their kernel object namespace may be |
+ // partitioned. |
+ if (!run_renderer_in_process() && gfx::win::ShouldUseDirectWrite()) { |
+ std::string name(content::kFontCacheSharedSectionName); |
+ name.append(base::UintToString(base::GetCurrentProcId())); |
+ direct_write_font_cache_section_.set_inheritable(true); |
+ if (direct_write_font_cache_section_.Open(name, true)) { |
+ sandbox_delegate->set_direct_write_font_cache_handle( |
+ direct_write_font_cache_section_.handle()); |
+ } |
+ } |
+#endif |
// Build command line for renderer. We call AppendRendererCommandLine() |
// first so the process type argument will appear first. |
base::CommandLine* cmd_line = new base::CommandLine(renderer_path); |
@@ -677,7 +713,7 @@ bool RenderProcessHostImpl::Init() { |
// As long as there's no renderer prefix, we can use the zygote process |
// at this stage. |
child_process_launcher_.reset(new ChildProcessLauncher( |
- new RendererSandboxedProcessLauncherDelegate(channel_.get()), |
+ sandbox_delegate, |
cmd_line, |
GetID(), |
this)); |
@@ -1198,9 +1234,12 @@ void RenderProcessHostImpl::AppendRendererCommandLine( |
#if defined(OS_WIN) |
command_line->AppendSwitchASCII(switches::kDeviceScaleFactor, |
base::DoubleToString(gfx::GetDPIScale())); |
- command_line->AppendSwitchASCII( |
- switches::kFontCacheSharedMemSuffix, |
- base::UintToString(base::GetCurrentProcId())); |
+ if (direct_write_font_cache_section_.handle()) { |
+ command_line->AppendSwitchASCII( |
+ switches::kFontCacheSharedHandle, |
+ base::UintToString(reinterpret_cast<unsigned int>( |
+ direct_write_font_cache_section_.handle()))); |
+ } |
#endif |
AppendCompositorCommandLineFlags(command_line); |