Index: content/browser/renderer_host/render_sandbox_host_linux.cc |
=================================================================== |
--- content/browser/renderer_host/render_sandbox_host_linux.cc (revision 187566) |
+++ content/browser/renderer_host/render_sandbox_host_linux.cc (working copy) |
@@ -30,10 +30,11 @@ |
#include "content/common/font_config_ipc_linux.h" |
#include "content/common/sandbox_linux.h" |
#include "content/common/webkitplatformsupport_impl.h" |
-#include "skia/ext/SkFontHost_fontconfig_direct.h" |
+#include "skia/ext/skia_utils_base.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/linux/WebFontInfo.h" |
#include "third_party/npapi/bindings/npapi_extensions.h" |
+#include "third_party/skia/include/ports/SkFontConfigInterface.h" |
#include "ui/gfx/font_render_params_linux.h" |
using WebKit::WebCString; |
@@ -59,8 +60,7 @@ |
SandboxIPCProcess(int lifeline_fd, int browser_socket, |
std::string sandbox_cmd) |
: lifeline_fd_(lifeline_fd), |
- browser_socket_(browser_socket), |
- font_config_(new FontConfigDirect()) { |
+ browser_socket_(browser_socket) { |
if (!sandbox_cmd.empty()) { |
sandbox_cmd_.push_back(sandbox_cmd); |
sandbox_cmd_.push_back(base::kFindInodeSwitch); |
@@ -119,7 +119,7 @@ |
// bytes long (this is the largest message type). |
// 128 bytes padding are necessary so recvmsg() does not return MSG_TRUNC |
// error for a maximum length message. |
- char buf[FontConfigInterface::kMaxFontFamilyLength + 128]; |
+ char buf[FontConfigIPC::kMaxFontFamilyLength + 128]; |
const ssize_t len = UnixDomainSocket::RecvMsg(fd, buf, sizeof(buf), &fds); |
if (len == -1) { |
@@ -163,64 +163,58 @@ |
} |
} |
- void HandleFontMatchRequest(int fd, const Pickle& pickle, PickleIterator iter, |
- std::vector<int>& fds) { |
- bool filefaceid_valid; |
- uint32_t filefaceid = 0; |
- |
- if (!pickle.ReadBool(&iter, &filefaceid_valid)) |
- return; |
- if (filefaceid_valid) { |
- if (!pickle.ReadUInt32(&iter, &filefaceid)) |
- return; |
+ int FindOrAddPath(const SkString& path) { |
+ int count = paths_.count(); |
+ for (int i = 0; i < count; ++i) { |
+ if (path == *paths_[i]) |
+ return i; |
} |
- bool is_bold, is_italic; |
- if (!pickle.ReadBool(&iter, &is_bold) || |
- !pickle.ReadBool(&iter, &is_italic)) { |
- return; |
- } |
+ *paths_.append() = new SkString(path); |
+ return count; |
+ } |
- uint32_t characters_bytes; |
- if (!pickle.ReadUInt32(&iter, &characters_bytes)) |
- return; |
- const char* characters = NULL; |
- if (characters_bytes > 0) { |
- const uint32_t kMaxCharactersBytes = 1 << 10; |
- if (characters_bytes % 2 != 0 || // We expect UTF-16. |
- characters_bytes > kMaxCharactersBytes || |
- !pickle.ReadBytes(&iter, &characters, characters_bytes)) |
- return; |
- } |
- |
+ void HandleFontMatchRequest(int fd, const Pickle& pickle, PickleIterator iter, |
+ std::vector<int>& fds) { |
+ uint32_t requested_style; |
std::string family; |
- if (!pickle.ReadString(&iter, &family)) |
+ if (!pickle.ReadString(&iter, &family) || |
+ !pickle.ReadUInt32(&iter, &requested_style)) |
return; |
- std::string result_family; |
- unsigned result_filefaceid; |
- const bool r = font_config_->Match( |
- &result_family, &result_filefaceid, filefaceid_valid, filefaceid, |
- family, characters, characters_bytes, &is_bold, &is_italic); |
+ SkFontConfigInterface::FontIdentity result_identity; |
+ SkString result_family; |
+ SkTypeface::Style result_style; |
+ SkFontConfigInterface* fc = |
+ SkFontConfigInterface::GetSingletonDirectInterface(); |
+ const bool r = fc->matchFamilyName( |
+ family.c_str(), static_cast<SkTypeface::Style>(requested_style), |
+ &result_identity, &result_family, &result_style); |
Pickle reply; |
if (!r) { |
reply.WriteBool(false); |
} else { |
+ // Stash away the returned path, so we can give it an ID (index) |
+ // which will later be given to us in a request to open the file. |
+ int index = FindOrAddPath(result_identity.fString); |
+ result_identity.fID = static_cast<uint32_t>(index); |
+ |
reply.WriteBool(true); |
- reply.WriteUInt32(result_filefaceid); |
- reply.WriteString(result_family); |
- reply.WriteBool(is_bold); |
- reply.WriteBool(is_italic); |
+ skia::WriteSkString(&reply, result_family); |
+ skia::WriteSkFontIdentity(&reply, result_identity); |
+ reply.WriteUInt32(result_style); |
} |
SendRendererReply(fds, reply, -1); |
} |
void HandleFontOpenRequest(int fd, const Pickle& pickle, PickleIterator iter, |
std::vector<int>& fds) { |
- uint32_t filefaceid; |
- if (!pickle.ReadUInt32(&iter, &filefaceid)) |
+ uint32_t index; |
+ if (!pickle.ReadUInt32(&iter, &index)) |
return; |
- const int result_fd = font_config_->Open(filefaceid); |
+ if (index >= static_cast<uint32_t>(paths_.count())) |
+ return; |
+ const int result_fd = open(paths_[index]->c_str(), O_RDONLY); |
Pickle reply; |
if (result_fd == -1) { |
@@ -230,9 +224,6 @@ |
} |
SendRendererReply(fds, reply, result_fd); |
- |
- if (result_fd >= 0) |
- close(result_fd); |
} |
void HandleGetFontFamilyForChars(int fd, const Pickle& pickle, |
@@ -659,12 +650,13 @@ |
const int lifeline_fd_; |
const int browser_socket_; |
- scoped_ptr<FontConfigDirect> font_config_; |
std::vector<std::string> sandbox_cmd_; |
scoped_ptr<WebKitPlatformSupportImpl> webkit_platform_support_; |
+ SkTDArray<SkString*> paths_; |
}; |
SandboxIPCProcess::~SandboxIPCProcess() { |
+ paths_.deleteAll(); |
if (webkit_platform_support_.get()) |
WebKit::shutdown(); |
} |