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#include "content/ppapi_plugin/ppapi_webkitplatformsupport_impl.h"
6
7#include <map>
8
9#include "base/logging.h"
10#include "base/strings/string16.h"
11#include "base/threading/platform_thread.h"
12#include "build/build_config.h"
13#include "content/child/child_thread.h"
14#include "content/common/child_process_messages.h"
15#include "ppapi/proxy/plugin_globals.h"
16#include "ppapi/shared_impl/proxy_lock.h"
17#include "third_party/WebKit/public/platform/WebString.h"
18
19#if defined(OS_WIN)
20#include "third_party/WebKit/public/platform/win/WebSandboxSupport.h"
21#elif defined(OS_MACOSX)
22#include "third_party/WebKit/public/platform/mac/WebSandboxSupport.h"
23#elif defined(OS_ANDROID)
24#include "third_party/WebKit/public/platform/android/WebSandboxSupport.h"
25#elif defined(OS_POSIX)
26#include "content/common/child_process_sandbox_support_impl_linux.h"
27#include "third_party/WebKit/public/platform/linux/WebFallbackFont.h"
28#include "third_party/WebKit/public/platform/linux/WebSandboxSupport.h"
29#include "third_party/icu/source/common/unicode/utf16.h"
30#endif
31
32using blink::WebSandboxSupport;
33using blink::WebString;
34using blink::WebUChar;
35using blink::WebUChar32;
36
37typedef struct CGFont* CGFontRef;
38
39namespace content {
40
41class PpapiWebKitPlatformSupportImpl::SandboxSupport
42    : public WebSandboxSupport {
43 public:
44  virtual ~SandboxSupport() {}
45
46#if defined(OS_WIN)
47  virtual bool ensureFontLoaded(HFONT);
48#elif defined(OS_MACOSX)
49  virtual bool loadFont(
50      NSFont* srcFont, CGFontRef* out, uint32_t* fontID);
51#elif defined(OS_ANDROID)
52  // Empty class.
53#elif defined(OS_POSIX)
54  SandboxSupport();
55  virtual void getFallbackFontForCharacter(
56      WebUChar32 character,
57      const char* preferred_locale,
58      blink::WebFallbackFont* fallbackFont);
59  virtual void getRenderStyleForStrike(
60      const char* family, int sizeAndStyle, blink::WebFontRenderStyle* out);
61
62 private:
63  // WebKit likes to ask us for the correct font family to use for a set of
64  // unicode code points. It needs this information frequently so we cache it
65  // here.
66  std::map<int32_t, blink::WebFallbackFont> unicode_font_families_;
67  // For debugging crbug.com/312965
68  base::PlatformThreadId creation_thread_;
69#endif
70};
71
72#if defined(OS_WIN)
73
74bool PpapiWebKitPlatformSupportImpl::SandboxSupport::ensureFontLoaded(
75    HFONT font) {
76  LOGFONT logfont;
77  GetObject(font, sizeof(LOGFONT), &logfont);
78
79  // Use the proxy sender rather than going directly to the ChildThread since
80  // the proxy browser sender will properly unlock during sync messages.
81  return ppapi::proxy::PluginGlobals::Get()->GetBrowserSender()->Send(
82      new ChildProcessHostMsg_PreCacheFont(logfont));
83}
84
85#elif defined(OS_MACOSX)
86
87bool PpapiWebKitPlatformSupportImpl::SandboxSupport::loadFont(
88    NSFont* src_font,
89    CGFontRef* out,
90    uint32_t* font_id) {
91  // TODO(brettw) this should do the something similar to what
92  // RendererWebKitClientImpl does and request that the browser load the font.
93  // Note: need to unlock the proxy lock like ensureFontLoaded does.
94  NOTIMPLEMENTED();
95  return false;
96}
97
98#elif defined(OS_ANDROID)
99
100// Empty class.
101
102#elif defined(OS_POSIX)
103
104PpapiWebKitPlatformSupportImpl::SandboxSupport::SandboxSupport()
105    : creation_thread_(base::PlatformThread::CurrentId()) {
106}
107
108void
109PpapiWebKitPlatformSupportImpl::SandboxSupport::getFallbackFontForCharacter(
110    WebUChar32 character,
111    const char* preferred_locale,
112    blink::WebFallbackFont* fallbackFont) {
113  ppapi::ProxyLock::AssertAcquired();
114  // For debugging crbug.com/312965
115  CHECK_EQ(creation_thread_, base::PlatformThread::CurrentId());
116  const std::map<int32_t, blink::WebFallbackFont>::const_iterator iter =
117      unicode_font_families_.find(character);
118  if (iter != unicode_font_families_.end()) {
119    fallbackFont->name = iter->second.name;
120    fallbackFont->filename = iter->second.filename;
121    fallbackFont->fontconfigInterfaceId = iter->second.fontconfigInterfaceId;
122    fallbackFont->ttcIndex = iter->second.ttcIndex;
123    fallbackFont->isBold = iter->second.isBold;
124    fallbackFont->isItalic = iter->second.isItalic;
125    return;
126  }
127
128  GetFallbackFontForCharacter(character, preferred_locale, fallbackFont);
129  unicode_font_families_.insert(std::make_pair(character, *fallbackFont));
130}
131
132void PpapiWebKitPlatformSupportImpl::SandboxSupport::getRenderStyleForStrike(
133    const char* family, int sizeAndStyle, blink::WebFontRenderStyle* out) {
134  GetRenderStyleForStrike(family, sizeAndStyle, out);
135}
136
137#endif
138
139PpapiWebKitPlatformSupportImpl::PpapiWebKitPlatformSupportImpl()
140    : sandbox_support_(new PpapiWebKitPlatformSupportImpl::SandboxSupport()) {
141}
142
143PpapiWebKitPlatformSupportImpl::~PpapiWebKitPlatformSupportImpl() {
144}
145
146void PpapiWebKitPlatformSupportImpl::Shutdown() {
147  // SandboxSupport contains a map of WebFontFamily objects, which hold
148  // WebCStrings, which become invalidated when blink is shut down. Hence, we
149  // need to clear that map now, just before blink::shutdown() is called.
150  sandbox_support_.reset();
151}
152
153blink::WebClipboard* PpapiWebKitPlatformSupportImpl::clipboard() {
154  NOTREACHED();
155  return NULL;
156}
157
158blink::WebMimeRegistry* PpapiWebKitPlatformSupportImpl::mimeRegistry() {
159  NOTREACHED();
160  return NULL;
161}
162
163blink::WebFileUtilities* PpapiWebKitPlatformSupportImpl::fileUtilities() {
164  NOTREACHED();
165  return NULL;
166}
167
168blink::WebSandboxSupport* PpapiWebKitPlatformSupportImpl::sandboxSupport() {
169  return sandbox_support_.get();
170}
171
172bool PpapiWebKitPlatformSupportImpl::sandboxEnabled() {
173  return true;  // Assume PPAPI is always sandboxed.
174}
175
176unsigned long long PpapiWebKitPlatformSupportImpl::visitedLinkHash(
177    const char* canonical_url,
178    size_t length) {
179  NOTREACHED();
180  return 0;
181}
182
183bool PpapiWebKitPlatformSupportImpl::isLinkVisited(
184    unsigned long long link_hash) {
185  NOTREACHED();
186  return false;
187}
188
189void PpapiWebKitPlatformSupportImpl::createMessageChannel(
190    blink::WebMessagePortChannel** channel1,
191    blink::WebMessagePortChannel** channel2) {
192  NOTREACHED();
193  *channel1 = NULL;
194  *channel2 = NULL;
195}
196
197void PpapiWebKitPlatformSupportImpl::setCookies(
198    const blink::WebURL& url,
199    const blink::WebURL& first_party_for_cookies,
200    const blink::WebString& value) {
201  NOTREACHED();
202}
203
204blink::WebString PpapiWebKitPlatformSupportImpl::cookies(
205    const blink::WebURL& url,
206    const blink::WebURL& first_party_for_cookies) {
207  NOTREACHED();
208  return blink::WebString();
209}
210
211blink::WebString PpapiWebKitPlatformSupportImpl::defaultLocale() {
212  NOTREACHED();
213  return blink::WebString();
214}
215
216blink::WebThemeEngine* PpapiWebKitPlatformSupportImpl::themeEngine() {
217  NOTREACHED();
218  return NULL;
219}
220
221blink::WebURLLoader* PpapiWebKitPlatformSupportImpl::createURLLoader() {
222  NOTREACHED();
223  return NULL;
224}
225
226blink::WebSocketStreamHandle*
227    PpapiWebKitPlatformSupportImpl::createSocketStreamHandle() {
228  NOTREACHED();
229  return NULL;
230}
231
232void PpapiWebKitPlatformSupportImpl::getPluginList(bool refresh,
233    blink::WebPluginListBuilder* builder) {
234  NOTREACHED();
235}
236
237blink::WebData PpapiWebKitPlatformSupportImpl::loadResource(const char* name) {
238  NOTREACHED();
239  return blink::WebData();
240}
241
242blink::WebStorageNamespace*
243PpapiWebKitPlatformSupportImpl::createLocalStorageNamespace() {
244  NOTREACHED();
245  return 0;
246}
247
248void PpapiWebKitPlatformSupportImpl::dispatchStorageEvent(
249    const blink::WebString& key, const blink::WebString& old_value,
250    const blink::WebString& new_value, const blink::WebString& origin,
251    const blink::WebURL& url, bool is_local_storage) {
252  NOTREACHED();
253}
254
255int PpapiWebKitPlatformSupportImpl::databaseDeleteFile(
256    const blink::WebString& vfs_file_name, bool sync_dir) {
257  NOTREACHED();
258  return 0;
259}
260
261}  // namespace content
262