summaryrefslogtreecommitdiffstats
path: root/content/common/sandbox_mac_fontloading_unittest.mm
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-11 21:56:11 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-11 21:56:11 +0000
commit415c2cdea5dfa8bc87bd36a91bdb8473026f943f (patch)
tree22aefe975f1be77a1bb18cdd96aeb86fbd96e096 /content/common/sandbox_mac_fontloading_unittest.mm
parent5471bc3e9d08d1d955c96a8193ee2d9638c1591a (diff)
downloadchromium_src-415c2cdea5dfa8bc87bd36a91bdb8473026f943f.zip
chromium_src-415c2cdea5dfa8bc87bd36a91bdb8473026f943f.tar.gz
chromium_src-415c2cdea5dfa8bc87bd36a91bdb8473026f943f.tar.bz2
Move some chrome\common code to content in preparation for moving chrome\gpu.
TBR=avi Review URL: http://codereview.chromium.org/6686002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77868 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/common/sandbox_mac_fontloading_unittest.mm')
-rw-r--r--content/common/sandbox_mac_fontloading_unittest.mm179
1 files changed, 179 insertions, 0 deletions
diff --git a/content/common/sandbox_mac_fontloading_unittest.mm b/content/common/sandbox_mac_fontloading_unittest.mm
new file mode 100644
index 0000000..7df1bfe
--- /dev/null
+++ b/content/common/sandbox_mac_fontloading_unittest.mm
@@ -0,0 +1,179 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/mac/scoped_cftyperef.h"
+#include "base/scoped_ptr.h"
+#include "base/shared_memory.h"
+#include "content/common/font_loader_mac.h"
+#include "content/common/sandbox_mac_unittest_helper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+using sandboxtest::MacSandboxTest;
+using sandbox::Sandbox;
+
+bool CGFontFromFontContainer(ATSFontContainerRef container, CGFontRef* out) {
+ // Count the number of fonts that were loaded.
+ ItemCount fontCount = 0;
+ OSStatus err = ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 0,
+ NULL, &fontCount);
+
+ if (err != noErr || fontCount < 1) {
+ return false;
+ }
+
+ // Load font from container.
+ ATSFontRef font_ref_ats = 0;
+ ATSFontFindFromContainer(container, kATSOptionFlagsDefault, 1,
+ &font_ref_ats, NULL);
+
+ if (!font_ref_ats) {
+ return false;
+ }
+
+ // Convert to cgFont.
+ CGFontRef font_ref_cg = CGFontCreateWithPlatformFont(&font_ref_ats);
+
+ if (!font_ref_cg) {
+ return false;
+ }
+
+ *out = font_ref_cg;
+ return true;
+}
+
+class ScopedFontContainer {
+ public:
+ explicit ScopedFontContainer(ATSFontContainerRef ref)
+ : container_ref(ref) {}
+
+ ~ScopedFontContainer() {
+ ATSFontDeactivate(container_ref, NULL, kATSOptionFlagsDefault);
+ }
+
+ ATSFontContainerRef container_ref;
+};
+
+class FontLoadingTestCase : public sandboxtest::MacSandboxTestCase {
+ public:
+ FontLoadingTestCase() : font_data_length_(-1) {}
+ virtual bool BeforeSandboxInit();
+ virtual bool SandboxedTest();
+ private:
+ scoped_ptr<base::SharedMemory> font_shmem_;
+ size_t font_data_length_;
+};
+REGISTER_SANDBOX_TEST_CASE(FontLoadingTestCase);
+
+
+// Load raw font data into shared memory object.
+bool FontLoadingTestCase::BeforeSandboxInit() {
+ std::string font_data;
+ if (!file_util::ReadFileToString(FilePath(test_data_.c_str()), &font_data)) {
+ LOG(ERROR) << "Failed to read font data from file (" << test_data_ << ")";
+ return false;
+ }
+
+ font_data_length_ = font_data.length();
+ if (font_data_length_ <= 0) {
+ LOG(ERROR) << "No font data: " << font_data_length_;
+ return false;
+ }
+
+ font_shmem_.reset(new base::SharedMemory);
+ if (!font_shmem_.get()) {
+ LOG(ERROR) << "Failed to create shared memory object.";
+ return false;
+ }
+
+ if (!font_shmem_->CreateAndMapAnonymous(font_data_length_)) {
+ LOG(ERROR) << "SharedMemory::Create failed";
+ return false;
+ }
+
+ memcpy(font_shmem_->memory(), font_data.c_str(), font_data_length_);
+ if (!font_shmem_->Unmap()) {
+ LOG(ERROR) << "SharedMemory::Unmap failed";
+ return false;
+ }
+ return true;
+}
+
+bool FontLoadingTestCase::SandboxedTest() {
+ base::SharedMemoryHandle shmem_handle;
+ if (!font_shmem_->ShareToProcess(NULL, &shmem_handle)) {
+ LOG(ERROR) << "SharedMemory::ShareToProcess failed";
+ return false;
+ }
+
+ ATSFontContainerRef font_container;
+ if (!FontLoader::ATSFontContainerFromBuffer(shmem_handle, font_data_length_,
+ &font_container)) {
+ LOG(ERROR) << "Call to CreateCGFontFromBuffer() failed";
+ return false;
+ }
+
+ // Unload the font container when done.
+ ScopedFontContainer scoped_unloader(font_container);
+
+ CGFontRef cg_font_ref;
+ if (!CGFontFromFontContainer(font_container, &cg_font_ref)) {
+ LOG(ERROR) << "CGFontFromFontContainer failed";
+ return false;
+ }
+
+ if (!cg_font_ref) {
+ LOG(ERROR) << "Got NULL CGFontRef";
+ return false;
+ }
+ base::mac::ScopedCFTypeRef<CGFontRef> cgfont(cg_font_ref);
+
+ CTFontRef ct_font_ref =
+ CTFontCreateWithGraphicsFont(cgfont.get(), 16.0, NULL, NULL);
+ base::mac::ScopedCFTypeRef<CTFontRef> ctfont(ct_font_ref);
+
+ if (!ct_font_ref) {
+ LOG(ERROR) << "CTFontCreateWithGraphicsFont() failed";
+ return false;
+ }
+
+ // Do something with the font to make sure it's loaded.
+ CGFloat cap_height = CTFontGetCapHeight(ct_font_ref);
+
+ if (cap_height <= 0.0) {
+ LOG(ERROR) << "Got bad value for CTFontGetCapHeight " << cap_height;
+ return false;
+ }
+
+ return true;
+}
+
+TEST_F(MacSandboxTest, FontLoadingTest) {
+ FilePath temp_file_path;
+ FILE* temp_file = file_util::CreateAndOpenTemporaryFile(&temp_file_path);
+ ASSERT_TRUE(temp_file);
+ file_util::ScopedFILE temp_file_closer(temp_file);
+
+ base::SharedMemory font_data;
+ uint32 font_data_size;
+ NSFont* srcFont = [NSFont fontWithName:@"Geeza Pro" size:16.0];
+ EXPECT_TRUE(FontLoader::LoadFontIntoBuffer(srcFont,
+ &font_data, &font_data_size));
+ EXPECT_GT(font_data_size, 0U);
+
+ file_util::WriteFileDescriptor(fileno(temp_file),
+ static_cast<const char *>(font_data.memory()), font_data_size);
+
+ ASSERT_TRUE(RunTestInSandbox(Sandbox::SANDBOX_TYPE_RENDERER,
+ "FontLoadingTestCase", temp_file_path.value().c_str()));
+ temp_file_closer.reset();
+ ASSERT_TRUE(file_util::Delete(temp_file_path, false));
+}
+
+} // namespace