1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_COMMON_MAC_ATTRIBUTED_STRING_CODER_H_
6#define CONTENT_COMMON_MAC_ATTRIBUTED_STRING_CODER_H_
7
8#include <set>
9
10#include "base/strings/string16.h"
11#include "content/common/content_export.h"
12#include "content/common/mac/font_descriptor.h"
13#include "ipc/ipc_message_utils.h"
14#include "ui/gfx/range/range.h"
15
16#if __OBJC__
17@class NSAttributedString;
18@class NSDictionary;
19#else
20class NSAttributedString;
21class NSDictionary;
22#endif
23
24namespace mac {
25
26// This class will serialize the font information of an NSAttributedString so
27// that it can be sent over IPC. This class only stores the information of the
28// NSFontAttributeName. The motive is that of security: using NSArchiver and
29// friends to send objects from the renderer to the browser could lead to
30// deserialization of arbitrary objects. This class restricts serialization to
31// a specific object class and specific attributes of that object.
32class CONTENT_EXPORT AttributedStringCoder {
33 public:
34  // A C++ IPC-friendly representation of the NSFontAttributeName attribute
35  // set.
36  class FontAttribute {
37   public:
38    FontAttribute(NSDictionary* ns_attributes, gfx::Range effective_range);
39    FontAttribute(FontDescriptor font, gfx::Range range);
40    FontAttribute();
41    ~FontAttribute();
42
43    // Creates an autoreleased NSDictionary that can be attached to an
44    // NSAttributedString.
45    NSDictionary* ToAttributesDictionary() const;
46
47    // Whether or not the attribute should be placed in the EncodedString. This
48    // can return false, e.g. if the Cocoa-based constructor can't find any
49    // information to encode.
50    bool ShouldEncode() const;
51
52    // Accessors:
53    FontDescriptor font_descriptor() const { return font_descriptor_; }
54    gfx::Range effective_range() const { return effective_range_; }
55
56   private:
57    FontDescriptor font_descriptor_;
58    gfx::Range effective_range_;
59  };
60
61  // A class that contains the pertinent information from an NSAttributedString,
62  // which can be serialized over IPC.
63  class EncodedString {
64   public:
65    explicit EncodedString(base::string16 string);
66    EncodedString();
67    ~EncodedString();
68
69    // Accessors:
70    base::string16 string() const { return string_; }
71    const std::vector<FontAttribute>& attributes() const {
72      return attributes_;
73    }
74    std::vector<FontAttribute>* attributes() { return &attributes_; }
75
76   private:
77    // The plain-text string.
78    base::string16 string_;
79    // The set of attributes that style |string_|.
80    std::vector<FontAttribute> attributes_;
81  };
82
83  // Takes an NSAttributedString, extracts the pertinent attributes, and returns
84  // an object that represents it. Caller owns the result.
85  static const EncodedString* Encode(NSAttributedString* str);
86
87  // Returns an autoreleased NSAttributedString from an encoded representation.
88  static NSAttributedString* Decode(const EncodedString* str);
89
90 private:
91  AttributedStringCoder();
92};
93
94}  // namespace mac
95
96// IPC ParamTraits specialization //////////////////////////////////////////////
97
98namespace IPC {
99
100template <>
101struct ParamTraits<mac::AttributedStringCoder::EncodedString> {
102  typedef mac::AttributedStringCoder::EncodedString param_type;
103  static void Write(Message* m, const param_type& p);
104  static bool Read(const Message* m, PickleIterator* iter, param_type* r);
105  static void Log(const param_type& p, std::string* l);
106};
107
108template <>
109struct ParamTraits<mac::AttributedStringCoder::FontAttribute> {
110  typedef mac::AttributedStringCoder::FontAttribute param_type;
111  static void Write(Message* m, const param_type& p);
112  static bool Read(const Message* m, PickleIterator* iter, param_type* r);
113  static void Log(const param_type& p, std::string* l);
114};
115
116}  // namespace IPC
117
118#endif  // CONTENT_COMMON_MAC_ATTRIBUTED_STRING_CODER_H_
119