summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorreed@google.com <reed@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-11 13:36:35 +0000
committerreed@google.com <reed@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-11 13:36:35 +0000
commitc7f723c82709ca3b09d4711be191ca762550eab4 (patch)
treea8d8bc2772f7b39be15349e722931f95f720acbd /content
parenta5fda2a512b1f0f56185b2e9426e41b0db6d2e4d (diff)
downloadchromium_src-c7f723c82709ca3b09d4711be191ca762550eab4.zip
chromium_src-c7f723c82709ca3b09d4711be191ca762550eab4.tar.gz
chromium_src-c7f723c82709ca3b09d4711be191ca762550eab4.tar.bz2
Revert 187283
memcheck reported errors which need to be investigated > Call version of SkFontHost_fontconfig in Skia (cloned from here). > Retool the direct/remove plumbing to use SkFontConfigInterface. > > This change allows Skia to interate on the details of SkFontHost w/o having > to synchromize with chrome on each change. It also means Skia's internal testing > can exercise exactly the same config that Chrome does. > Review URL: https://codereview.chromium.org/12391070 TBR=reed@google.com Review URL: https://codereview.chromium.org/12771003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187287 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/renderer_host/render_sandbox_host_linux.cc88
-rw-r--r--content/common/font_config_ipc_linux.cc70
-rw-r--r--content/common/font_config_ipc_linux.h25
-rw-r--r--content/zygote/zygote_main_linux.cc10
4 files changed, 106 insertions, 87 deletions
diff --git a/content/browser/renderer_host/render_sandbox_host_linux.cc b/content/browser/renderer_host/render_sandbox_host_linux.cc
index 48a9912..bfd8e28 100644
--- a/content/browser/renderer_host/render_sandbox_host_linux.cc
+++ b/content/browser/renderer_host/render_sandbox_host_linux.cc
@@ -30,11 +30,10 @@
#include "content/common/font_config_ipc_linux.h"
#include "content/common/sandbox_linux.h"
#include "content/common/webkitplatformsupport_impl.h"
-#include "skia/ext/skia_utils_base.h"
+#include "skia/ext/SkFontHost_fontconfig_direct.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;
@@ -60,7 +59,8 @@ class SandboxIPCProcess {
SandboxIPCProcess(int lifeline_fd, int browser_socket,
std::string sandbox_cmd)
: lifeline_fd_(lifeline_fd),
- browser_socket_(browser_socket) {
+ browser_socket_(browser_socket),
+ font_config_(new FontConfigDirect()) {
if (!sandbox_cmd.empty()) {
sandbox_cmd_.push_back(sandbox_cmd);
sandbox_cmd_.push_back(base::kFindInodeSwitch);
@@ -119,7 +119,7 @@ class SandboxIPCProcess {
// 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[FontConfigIPC::kMaxFontFamilyLength + 128];
+ char buf[FontConfigInterface::kMaxFontFamilyLength + 128];
const ssize_t len = UnixDomainSocket::RecvMsg(fd, buf, sizeof(buf), &fds);
if (len == -1) {
@@ -163,58 +163,64 @@ class SandboxIPCProcess {
}
}
- int FindOrAddPath(const SkString& path) {
- int count = paths_.count();
- for (int i = 0; i < count; ++i) {
- if (path == *paths_[i])
- return i;
- }
- *paths_.append() = new SkString(path);
- return count;
- }
-
void HandleFontMatchRequest(int fd, const Pickle& pickle, PickleIterator iter,
std::vector<int>& fds) {
- uint32_t requested_style;
+ bool filefaceid_valid;
+ uint32_t filefaceid = 0;
+
+ if (!pickle.ReadBool(&iter, &filefaceid_valid))
+ return;
+ if (filefaceid_valid) {
+ if (!pickle.ReadUInt32(&iter, &filefaceid))
+ return;
+ }
+ bool is_bold, is_italic;
+ if (!pickle.ReadBool(&iter, &is_bold) ||
+ !pickle.ReadBool(&iter, &is_italic)) {
+ return;
+ }
+
+ 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;
+ }
+
std::string family;
- if (!pickle.ReadString(&iter, &family) ||
- !pickle.ReadUInt32(&iter, &requested_style))
+ if (!pickle.ReadString(&iter, &family))
return;
- 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);
+ 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);
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);
- skia::WriteSkString(&reply, result_family);
- skia::WriteSkFontIdentity(&reply, result_identity);
- reply.WriteUInt32(result_style);
+ reply.WriteUInt32(result_filefaceid);
+ reply.WriteString(result_family);
+ reply.WriteBool(is_bold);
+ reply.WriteBool(is_italic);
}
SendRendererReply(fds, reply, -1);
}
void HandleFontOpenRequest(int fd, const Pickle& pickle, PickleIterator iter,
std::vector<int>& fds) {
- uint32_t index;
- if (!pickle.ReadUInt32(&iter, &index))
+ uint32_t filefaceid;
+ if (!pickle.ReadUInt32(&iter, &filefaceid))
return;
- if (index >= static_cast<uint32_t>(paths_.count()))
- return;
- const int result_fd = open(paths_[index]->c_str(), O_RDONLY);
+ const int result_fd = font_config_->Open(filefaceid);
Pickle reply;
if (result_fd == -1) {
@@ -224,6 +230,9 @@ class SandboxIPCProcess {
}
SendRendererReply(fds, reply, result_fd);
+
+ if (result_fd >= 0)
+ close(result_fd);
}
void HandleGetFontFamilyForChars(int fd, const Pickle& pickle,
@@ -650,13 +659,12 @@ class SandboxIPCProcess {
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();
}
diff --git a/content/common/font_config_ipc_linux.cc b/content/common/font_config_ipc_linux.cc
index a5efe1b..8dd45a8 100644
--- a/content/common/font_config_ipc_linux.cc
+++ b/content/common/font_config_ipc_linux.cc
@@ -12,8 +12,6 @@
#include "base/pickle.h"
#include "base/posix/unix_domain_socket_linux.h"
-#include "skia/ext/skia_utils_base.h"
-#include "third_party/skia/include/core/SkStream.h"
namespace content {
@@ -25,21 +23,31 @@ FontConfigIPC::~FontConfigIPC() {
close(fd_);
}
-bool FontConfigIPC::matchFamilyName(const char familyName[],
- SkTypeface::Style requestedStyle,
- FontIdentity* outFontIdentity,
- SkString* outFamilyName,
- SkTypeface::Style* outStyle) {
- size_t familyNameLen = familyName ? strlen(familyName) : 0;
- if (familyNameLen > kMaxFontFamilyLength)
+bool FontConfigIPC::Match(std::string* result_family,
+ unsigned* result_filefaceid,
+ bool filefaceid_valid, unsigned filefaceid,
+ const std::string& family,
+ const void* characters, size_t characters_bytes,
+ bool* is_bold, bool* is_italic) {
+ if (family.length() > kMaxFontFamilyLength)
return false;
Pickle request;
request.WriteInt(METHOD_MATCH);
- request.WriteData(familyName, familyNameLen);
- request.WriteUInt32(requestedStyle);
+ request.WriteBool(filefaceid_valid);
+ if (filefaceid_valid)
+ request.WriteUInt32(filefaceid);
- uint8_t reply_buf[2048];
+ request.WriteBool(is_bold && *is_bold);
+ request.WriteBool(is_bold && *is_italic);
+
+ request.WriteUInt32(characters_bytes);
+ if (characters_bytes)
+ request.WriteBytes(characters, characters_bytes);
+
+ request.WriteString(family);
+
+ uint8_t reply_buf[512];
const ssize_t r = UnixDomainSocket::SendRecvMsg(fd_, reply_buf,
sizeof(reply_buf), NULL,
request);
@@ -54,29 +62,33 @@ bool FontConfigIPC::matchFamilyName(const char familyName[],
if (!result)
return false;
- SkString reply_family;
- FontIdentity reply_identity;
- uint32_t reply_style;
- if (!skia::ReadSkString(reply, &iter, &reply_family) ||
- !skia::ReadSkFontIdentity(reply, &iter, &reply_identity) ||
- !reply.ReadUInt32(&iter, &reply_style)) {
+ uint32_t reply_filefaceid;
+ std::string reply_family;
+ bool resulting_bold, resulting_italic;
+ if (!reply.ReadUInt32(&iter, &reply_filefaceid) ||
+ !reply.ReadString(&iter, &reply_family) ||
+ !reply.ReadBool(&iter, &resulting_bold) ||
+ !reply.ReadBool(&iter, &resulting_italic)) {
return false;
}
- if (outFontIdentity)
- *outFontIdentity = reply_identity;
- if (outFamilyName)
- *outFamilyName = reply_family;
- if (outStyle)
- *outStyle = static_cast<SkTypeface::Style>(reply_style);
+ if (result_filefaceid)
+ *result_filefaceid = reply_filefaceid;
+ if (result_family)
+ *result_family = reply_family;
+
+ if (is_bold)
+ *is_bold = resulting_bold;
+ if (is_italic)
+ *is_italic = resulting_italic;
return true;
}
-SkStream* FontConfigIPC::openStream(const FontIdentity& identity) {
+int FontConfigIPC::Open(unsigned filefaceid) {
Pickle request;
request.WriteInt(METHOD_OPEN);
- request.WriteUInt32(identity.fID);
+ request.WriteUInt32(filefaceid);
int result_fd = -1;
uint8_t reply_buf[256];
@@ -85,7 +97,7 @@ SkStream* FontConfigIPC::openStream(const FontIdentity& identity) {
&result_fd, request);
if (r == -1)
- return NULL;
+ return -1;
Pickle reply(reinterpret_cast<char*>(reply_buf), r);
bool result;
@@ -94,10 +106,10 @@ SkStream* FontConfigIPC::openStream(const FontIdentity& identity) {
!result) {
if (result_fd)
close(result_fd);
- return NULL;
+ return -1;
}
- return new SkFDStream(result_fd, true);
+ return result_fd;
}
} // namespace content
diff --git a/content/common/font_config_ipc_linux.h b/content/common/font_config_ipc_linux.h
index 0325dc4..2ba3375 100644
--- a/content/common/font_config_ipc_linux.h
+++ b/content/common/font_config_ipc_linux.h
@@ -6,7 +6,7 @@
#define CONTENT_COMMON_FONT_CONFIG_IPC_LINUX_H_
#include "base/compiler_specific.h"
-#include "third_party/skia/include/ports/SkFontConfigInterface.h"
+#include "skia/ext/SkFontHost_fontconfig_impl.h"
#include <string>
@@ -14,28 +14,27 @@ namespace content {
// FontConfig implementation for Skia that proxies out of process to get out
// of the sandbox. See http://code.google.com/p/chromium/wiki/LinuxSandboxIPC
-class FontConfigIPC : public SkFontConfigInterface {
+class FontConfigIPC : public FontConfigInterface {
public:
explicit FontConfigIPC(int fd);
virtual ~FontConfigIPC();
- virtual bool matchFamilyName(const char familyName[],
- SkTypeface::Style requested,
- FontIdentity* outFontIdentifier,
- SkString* outFamilyName,
- SkTypeface::Style* outStyle) OVERRIDE;
-
- virtual SkStream* openStream(const FontIdentity&) OVERRIDE;
+ // FontConfigInterface implementation.
+ virtual bool Match(std::string* result_family,
+ unsigned* result_filefaceid,
+ bool filefaceid_valid,
+ unsigned filefaceid,
+ const std::string& family,
+ const void* characters,
+ size_t characters_bytes,
+ bool* is_bold, bool* is_italic) OVERRIDE;
+ virtual int Open(unsigned filefaceid) OVERRIDE;
enum Method {
METHOD_MATCH = 0,
METHOD_OPEN = 1,
};
- enum {
- kMaxFontFamilyLength = 2048
- };
-
private:
const int fd_;
};
diff --git a/content/zygote/zygote_main_linux.cc b/content/zygote/zygote_main_linux.cc
index fd4a709..4ef3eefc 100644
--- a/content/zygote/zygote_main_linux.cc
+++ b/content/zygote/zygote_main_linux.cc
@@ -37,8 +37,8 @@
#include "crypto/nss_util.h"
#include "sandbox/linux/services/libc_urandom_override.h"
#include "sandbox/linux/suid/client/setuid_sandbox_client.h"
+#include "skia/ext/SkFontHost_fontconfig_control.h"
#include "third_party/icu/public/i18n/unicode/timezone.h"
-#include "third_party/skia/include/ports/SkFontConfigInterface.h"
#if defined(OS_LINUX)
#include <sys/epoll.h>
@@ -368,8 +368,8 @@ static bool EnterSandbox(sandbox::SetuidSandboxClient* setuid_sandbox,
return false;
PreSandboxInit();
- SkFontConfigInterface::SetGlobal(
- new FontConfigIPC(Zygote::kMagicSandboxIPCDescriptor))->unref();
+ SkiaFontConfigSetImplementation(
+ new FontConfigIPC(Zygote::kMagicSandboxIPCDescriptor));
if (setuid_sandbox->IsSuidSandboxChild()) {
// Use the SUID sandbox. This still allows the seccomp sandbox to
@@ -438,8 +438,8 @@ static bool EnterSandbox(sandbox::SetuidSandboxClient* setuid_sandbox,
return false;
PreSandboxInit();
- SkFontConfigInterface::SetGlobal(
- new FontConfigIPC(Zygote::kMagicSandboxIPCDescriptor)))->unref();
+ SkiaFontConfigSetImplementation(
+ new FontConfigIPC(Zygote::kMagicSandboxIPCDescriptor));
return true;
}