Index: content/test/dwrite_font_fake_sender_win.h |
diff --git a/content/test/dwrite_font_fake_sender_win.h b/content/test/dwrite_font_fake_sender_win.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b3d7ba02de5319dbcfce17813b4ec296ff9ab1e |
--- /dev/null |
+++ b/content/test/dwrite_font_fake_sender_win.h |
@@ -0,0 +1,135 @@ |
+// Copyright (c) 2015 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. |
+ |
+#ifndef CONTENT_TEST_DWRITE_FONT_FAKE_SENDER_WIN_H_ |
+#define CONTENT_TEST_DWRITE_FONT_FAKE_SENDER_WIN_H_ |
+ |
+#include <wrl.h> |
+ |
+#include <utility> |
+#include <vector> |
+ |
+#include "base/memory/ref_counted.h" |
+#include "base/strings/string16.h" |
+#include "ipc/ipc_message.h" |
+#include "ipc/ipc_sender.h" |
+ |
+namespace content { |
+ |
+IPC::Sender* CreateFakeCollectionSender(); |
+ |
+class FakeFontCollection; |
+// Helper class for describing a font object. Use FakeFontCollection instead. |
+class FakeFont { |
+ public: |
+ explicit FakeFont(const base::string16& name) : font_name_(name) {} |
+ FakeFont& AddFilePath(const base::string16& file_path) { |
+ file_paths_.push_back(file_path); |
+ return *this; |
+ } |
+ FakeFont& AddFamilyName(const base::string16& locale, |
+ const base::string16& family_name) { |
+ family_names_.emplace_back(locale, family_name); |
+ return *this; |
+ } |
+ |
+ private: |
+ friend FakeFontCollection; |
+ base::string16 font_name_; |
+ std::vector<base::string16> file_paths_; |
+ std::vector<std::pair<base::string16, base::string16>> family_names_; |
+}; |
+ |
+// Implements a font collection that supports interaction through sending IPC |
+// messages from dwrite_font_proxy_messages.h. |
+// Usage: |
+// Create a new FakeFontCollection. |
+// Call AddFont() to add fonts. |
+// For each font, call methods on the font to configure the font. |
+// Note: the indices of the fonts will correspond to the order they were |
+// added. The collection will not sort or reorder fonts in any way. |
+// Call GetSender()/GetTrackingSender() to obtain an IPC::Sender. |
+// Call Send() with DWriteFontProxyMsg_* to interact with the collection. |
+// Call MessageCount()/GetMessage() to inspect the messages that were sent. |
+// |
+// The internal code flow for GetSender()/Send() is as follows: |
+// GetSender() returns a new FakeSender, pointing back to the collection. |
+// FakeSender::Send() will create a new ReplySender and call |
+// ReplySender::OnMessageReceived() |
+// ReplySender::OnMessageReceived() contains the message map, which will |
+// internally call ReplySender::On*() and ReplySender::Send() |
+// ReplySender::Send() will save the reply message, to be used later. |
+// FakeSender::Send() will retrieve the reply message and save the output. |
+class FakeFontCollection : public base::RefCounted<FakeFontCollection> { |
+ public: |
+ FakeFont& AddFont(const base::string16& font_name); |
+ |
+ unsigned int MessageCount(); |
+ |
+ IPC::Message* GetMessage(unsigned int index); |
+ |
+ IPC::Sender* GetSender(); |
+ |
+ // Like GetSender(), but will keep track of all sent messages for inspection. |
+ IPC::Sender* GetTrackingSender(); |
+ |
+ protected: |
+ // This class handles sending the reply message back to the "renderer" |
+ class ReplySender : public IPC::Sender { |
+ public: |
+ explicit ReplySender(FakeFontCollection* collection) |
+ : collection_(collection) {} |
+ scoped_ptr<IPC::Message>& OnMessageReceived(const IPC::Message& msg); |
+ bool Send(IPC::Message* msg) override; |
+ |
+ private: |
+ void OnFindFamily(const base::string16& family_name, uint32* index); |
+ |
+ void OnGetFamilyCount(uint32* count); |
+ |
+ void OnGetFamilyNames( |
+ uint32 family_index, |
+ std::vector<std::pair<base::string16, base::string16>>* family_names); |
+ void OnGetFontFiles(uint32 family_index, |
+ std::vector<base::string16>* file_paths_); |
+ |
+ private: |
+ scoped_refptr<FakeFontCollection> collection_; |
+ scoped_ptr<IPC::Message> reply_; |
+ }; |
+ // This class can be used by the "renderer" to send messages to the "browser" |
+ class FakeSender : public IPC::Sender { |
+ public: |
+ FakeSender(FakeFontCollection* collection, bool track_messages) |
+ : collection_(collection), track_messages_(track_messages) {} |
+ bool Send(IPC::Message* message) override; |
+ |
+ private: |
+ bool track_messages_; |
+ scoped_refptr<FakeFontCollection> collection_; |
+ }; |
+ |
+ void OnFindFamily(const base::string16& family_name, uint32* index); |
+ |
+ void OnGetFamilyCount(uint32* count); |
+ |
+ void OnGetFamilyNames( |
+ uint32 family_index, |
+ std::vector<std::pair<base::string16, base::string16>>* family_names); |
+ void OnGetFontFiles(uint32 family_index, |
+ std::vector<base::string16>* file_paths); |
+ |
+ std::unique_ptr<ReplySender> GetReplySender(); |
+ |
+ private: |
+ friend class base::RefCounted<FakeFontCollection>; |
+ ~FakeFontCollection() {} |
+ |
+ std::vector<FakeFont> fonts_; |
+ std::vector<std::unique_ptr<IPC::Message>> messages_; |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_TEST_DWRITE_FONT_FAKE_SENDER_WIN_H_ |