Index: chrome/common/sandbox_mac_fontloading_unittest.mm |
diff --git a/chrome/common/sandbox_mac_fontloading_unittest.mm b/chrome/common/sandbox_mac_fontloading_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9eadf0d57e6c4e27dd9e15a556105e0feeae677b |
--- /dev/null |
+++ b/chrome/common/sandbox_mac_fontloading_unittest.mm |
@@ -0,0 +1,132 @@ |
+// Copyright (c) 2010 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/scoped_cftyperef.h" |
+#include "base/scoped_ptr.h" |
+#include "base/shared_memory.h" |
+#include "chrome/common/font_loader_mac.h" |
+#include "chrome/common/sandbox_mac_unittest_helper.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+using sandboxtest::MacSandboxTest; |
+ |
+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_->Create(L"", false, false, font_data_length_)) { |
+ LOG(ERROR) << "SharedMemory::Create failed"; |
+ return false; |
+ } |
+ |
+ if (!font_shmem_->Map(font_data_length_)) { |
+ LOG(ERROR) << "SharedMemory::Map 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; |
+ } |
+ |
+ CGFontRef font_ref; |
+ if (!FontLoader::CreateCGFontFromBuffer(shmem_handle, font_data_length_, |
+ &font_ref)) { |
+ LOG(ERROR) << "Call to CreateCGFontFromBuffer() failed"; |
+ return false; |
+ } |
+ |
+ scoped_cftyperef<CGFontRef> cgfont; |
+ |
+ if (!font_ref) { |
+ LOG(ERROR) << "Got NULL CGFontRef"; |
+ return false; |
+ } |
+ cgfont.reset(font_ref); |
+ |
+ const NSFont* nsfont = reinterpret_cast<const NSFont*>( |
+ CTFontCreateWithGraphicsFont(cgfont.get(), 16.0, |
+ NULL, NULL)); |
+ if (!nsfont) { |
+ LOG(ERROR) << "CTFontCreateWithGraphicsFont() failed"; |
+ return false; |
+ } |
+ |
+ // Do something with the font to make sure it's loaded. |
+ CGFloat cap_height = [nsfont capHeight]; |
+ |
+ if (cap_height <= 0.0) { |
+ LOG(ERROR) << "Got bad value for [NSFont capHeight] " << 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; |
+ EXPECT_TRUE(FontLoader::LoadFontIntoBuffer(ASCIIToUTF16("Geeza Pro"), 16.0, |
+ &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 |