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_RENDERER_RENDERER_WEBKITPLATFORMSUPPORT_IMPL_H_
6#define CONTENT_RENDERER_RENDERER_WEBKITPLATFORMSUPPORT_IMPL_H_
7
8#include "base/compiler_specific.h"
9#include "base/id_map.h"
10#include "base/memory/scoped_ptr.h"
11#include "cc/blink/web_compositor_support_impl.h"
12#include "content/child/blink_platform_impl.h"
13#include "content/common/content_export.h"
14#include "content/renderer/webpublicsuffixlist_impl.h"
15#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
16#include "third_party/WebKit/public/platform/WebIDBFactory.h"
17#include "third_party/WebKit/public/platform/WebScreenOrientationType.h"
18
19namespace base {
20class MessageLoopProxy;
21}
22
23namespace cc {
24class ContextProvider;
25}
26
27namespace IPC {
28class SyncMessageFilter;
29}
30
31namespace blink {
32class WebBatteryStatus;
33class WebDeviceMotionData;
34class WebDeviceOrientationData;
35class WebGraphicsContext3DProvider;
36}
37
38namespace content {
39class BatteryStatusDispatcher;
40class DeviceLightEventPump;
41class DeviceMotionEventPump;
42class DeviceOrientationEventPump;
43class PlatformEventObserverBase;
44class QuotaMessageFilter;
45class RendererClipboardClient;
46class RenderView;
47class ThreadSafeSender;
48class WebClipboardImpl;
49class WebDatabaseObserverImpl;
50class WebFileSystemImpl;
51
52class CONTENT_EXPORT RendererWebKitPlatformSupportImpl
53    : public BlinkPlatformImpl {
54 public:
55  RendererWebKitPlatformSupportImpl();
56  virtual ~RendererWebKitPlatformSupportImpl();
57
58  void set_plugin_refresh_allowed(bool plugin_refresh_allowed) {
59    plugin_refresh_allowed_ = plugin_refresh_allowed;
60  }
61  // Platform methods:
62  virtual blink::WebClipboard* clipboard();
63  virtual blink::WebMimeRegistry* mimeRegistry();
64  virtual blink::WebFileUtilities* fileUtilities();
65  virtual blink::WebSandboxSupport* sandboxSupport();
66  virtual blink::WebCookieJar* cookieJar();
67  virtual blink::WebThemeEngine* themeEngine();
68  virtual blink::WebSpeechSynthesizer* createSpeechSynthesizer(
69      blink::WebSpeechSynthesizerClient* client);
70  virtual bool sandboxEnabled();
71  virtual unsigned long long visitedLinkHash(
72      const char* canonicalURL, size_t length);
73  virtual bool isLinkVisited(unsigned long long linkHash);
74  virtual void createMessageChannel(blink::WebMessagePortChannel** channel1,
75                                    blink::WebMessagePortChannel** channel2);
76  virtual blink::WebPrescientNetworking* prescientNetworking();
77  virtual void cacheMetadata(
78      const blink::WebURL&, double, const char*, size_t);
79  virtual blink::WebString defaultLocale();
80  virtual void suddenTerminationChanged(bool enabled);
81  virtual blink::WebStorageNamespace* createLocalStorageNamespace();
82  virtual blink::Platform::FileHandle databaseOpenFile(
83      const blink::WebString& vfs_file_name, int desired_flags);
84  virtual int databaseDeleteFile(const blink::WebString& vfs_file_name,
85                                 bool sync_dir);
86  virtual long databaseGetFileAttributes(
87      const blink::WebString& vfs_file_name);
88  virtual long long databaseGetFileSize(
89      const blink::WebString& vfs_file_name);
90  virtual long long databaseGetSpaceAvailableForOrigin(
91      const blink::WebString& origin_identifier);
92  virtual blink::WebString signedPublicKeyAndChallengeString(
93      unsigned key_size_index,
94      const blink::WebString& challenge,
95      const blink::WebURL& url);
96  virtual void getPluginList(bool refresh,
97                             blink::WebPluginListBuilder* builder);
98  virtual blink::WebPublicSuffixList* publicSuffixList();
99  virtual void screenColorProfile(blink::WebVector<char>* to_profile);
100  virtual blink::WebScrollbarBehavior* scrollbarBehavior();
101  virtual blink::WebIDBFactory* idbFactory();
102  virtual blink::WebFileSystem* fileSystem();
103  virtual bool canAccelerate2dCanvas();
104  virtual bool isThreadedCompositingEnabled();
105  virtual double audioHardwareSampleRate();
106  virtual size_t audioHardwareBufferSize();
107  virtual unsigned audioHardwareOutputChannels();
108  virtual blink::WebDatabaseObserver* databaseObserver();
109
110  virtual blink::WebAudioDevice* createAudioDevice(
111      size_t buffer_size, unsigned input_channels, unsigned channels,
112      double sample_rate, blink::WebAudioDevice::RenderCallback* callback,
113      const blink::WebString& input_device_id);
114
115  virtual bool loadAudioResource(
116      blink::WebAudioBus* destination_bus, const char* audio_file_data,
117      size_t data_size);
118
119  virtual blink::WebMIDIAccessor*
120      createMIDIAccessor(blink::WebMIDIAccessorClient* client);
121
122  virtual blink::WebBlobRegistry* blobRegistry();
123  virtual void sampleGamepads(blink::WebGamepads&);
124  virtual blink::WebRTCPeerConnectionHandler* createRTCPeerConnectionHandler(
125      blink::WebRTCPeerConnectionHandlerClient* client);
126  virtual blink::WebMediaStreamCenter* createMediaStreamCenter(
127      blink::WebMediaStreamCenterClient* client);
128  virtual bool processMemorySizesInBytes(
129      size_t* private_bytes, size_t* shared_bytes);
130  virtual blink::WebGraphicsContext3D* createOffscreenGraphicsContext3D(
131      const blink::WebGraphicsContext3D::Attributes& attributes);
132  virtual blink::WebGraphicsContext3D* createOffscreenGraphicsContext3D(
133      const blink::WebGraphicsContext3D::Attributes& attributes,
134      blink::WebGraphicsContext3D* share_context);
135  virtual blink::WebGraphicsContext3DProvider*
136      createSharedOffscreenGraphicsContext3DProvider();
137  virtual blink::WebCompositorSupport* compositorSupport();
138  virtual blink::WebString convertIDNToUnicode(
139      const blink::WebString& host, const blink::WebString& languages);
140  virtual void startListening(blink::WebPlatformEventType,
141                              blink::WebPlatformEventListener*);
142  virtual void stopListening(blink::WebPlatformEventType);
143  virtual void queryStorageUsageAndQuota(
144      const blink::WebURL& storage_partition,
145      blink::WebStorageQuotaType,
146      blink::WebStorageQuotaCallbacks);
147  virtual void vibrate(unsigned int milliseconds);
148  virtual void cancelVibration();
149
150  // Set the PlatformEventObserverBase in |platform_event_observers_| associated
151  // with |type| to |observer|. If there was already an observer associated to
152  // the given |type|, it will be replaced.
153  // Note that |observer| will be owned by this object after the call.
154  void SetPlatformEventObserverForTesting(
155      blink::WebPlatformEventType type,
156      scoped_ptr<PlatformEventObserverBase> observer);
157
158  // Disables the WebSandboxSupport implementation for testing.
159  // Tests that do not set up a full sandbox environment should call
160  // SetSandboxEnabledForTesting(false) _before_ creating any instances
161  // of this class, to ensure that we don't attempt to use sandbox-related
162  // file descriptors or other resources.
163  //
164  // Returns the previous |enable| value.
165  static bool SetSandboxEnabledForTesting(bool enable);
166
167  //  Set a double to return when setDeviceLightListener is invoked.
168  static void SetMockDeviceLightDataForTesting(double data);
169  // Set WebDeviceMotionData to return when setDeviceMotionListener is invoked.
170  static void SetMockDeviceMotionDataForTesting(
171      const blink::WebDeviceMotionData& data);
172  // Set WebDeviceOrientationData to return when setDeviceOrientationListener
173  // is invoked.
174  static void SetMockDeviceOrientationDataForTesting(
175      const blink::WebDeviceOrientationData& data);
176
177  // Notifies blink::WebBatteryStatusListener that battery status has changed.
178  void MockBatteryStatusChangedForTesting(
179      const blink::WebBatteryStatus& status);
180
181  WebDatabaseObserverImpl* web_database_observer_impl() {
182    return web_database_observer_impl_.get();
183  }
184
185 private:
186  bool CheckPreparsedJsCachingEnabled() const;
187
188  // Factory that takes a type and return PlatformEventObserverBase that matches
189  // it.
190  static PlatformEventObserverBase* CreatePlatformEventObserverFromType(
191      blink::WebPlatformEventType type);
192
193  // Use the data previously set via SetMockDevice...DataForTesting() and send
194  // them to the registered listener.
195  void SendFakeDeviceEventDataForTesting(blink::WebPlatformEventType type);
196
197  scoped_ptr<RendererClipboardClient> clipboard_client_;
198  scoped_ptr<WebClipboardImpl> clipboard_;
199
200  class FileUtilities;
201  scoped_ptr<FileUtilities> file_utilities_;
202
203  class MimeRegistry;
204  scoped_ptr<MimeRegistry> mime_registry_;
205
206  class SandboxSupport;
207  scoped_ptr<SandboxSupport> sandbox_support_;
208
209  // This counter keeps track of the number of times sudden termination is
210  // enabled or disabled. It starts at 0 (enabled) and for every disable
211  // increments by 1, for every enable decrements by 1. When it reaches 0,
212  // we tell the browser to enable fast termination.
213  int sudden_termination_disables_;
214
215  // If true, then a GetPlugins call is allowed to rescan the disk.
216  bool plugin_refresh_allowed_;
217
218  scoped_ptr<blink::WebIDBFactory> web_idb_factory_;
219
220  scoped_ptr<blink::WebBlobRegistry> blob_registry_;
221
222  WebPublicSuffixListImpl public_suffix_list_;
223
224  scoped_ptr<DeviceLightEventPump> device_light_event_pump_;
225  scoped_ptr<DeviceMotionEventPump> device_motion_event_pump_;
226  scoped_ptr<DeviceOrientationEventPump> device_orientation_event_pump_;
227
228  scoped_refptr<base::MessageLoopProxy> child_thread_loop_;
229  scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_;
230  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
231  scoped_refptr<QuotaMessageFilter> quota_message_filter_;
232
233  scoped_ptr<WebDatabaseObserverImpl> web_database_observer_impl_;
234
235  cc_blink::WebCompositorSupportImpl compositor_support_;
236
237  scoped_ptr<blink::WebScrollbarBehavior> web_scrollbar_behavior_;
238
239  scoped_ptr<BatteryStatusDispatcher> battery_status_dispatcher_;
240
241  IDMap<PlatformEventObserverBase, IDMapOwnPointer> platform_event_observers_;
242
243  DISALLOW_COPY_AND_ASSIGN(RendererWebKitPlatformSupportImpl);
244};
245
246}  // namespace content
247
248#endif  // CONTENT_RENDERER_RENDERER_WEBKITPLATFORMSUPPORT_IMPL_H_
249