15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_webkitplatformsupport_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/message_loop/message_loop_proxy.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/safe_numerics.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/database_util.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/webfilesystem_impl.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/indexed_db/proxy_webidbfactory_impl.h"
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/npobject_util.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/quota_dispatcher.h"
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/child/quota_message_filter.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/thread_safe_sender.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/webblobregistry_impl.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/webmessageportchannel_impl.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/file_utilities_messages.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/client/context_provider_command_buffer.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/mime_registry_messages.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/content_renderer_client.h"
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/device_orientation/device_motion_event_pump.h"
352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/device_orientation/device_orientation_event_pump.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/dom_storage/webstoragenamespace_impl.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/gamepad_shared_memory_reader.h"
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/audio_decoder.h"
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/renderer/media/crypto/key_systems.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_dependency_factory.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/renderer_webaudiodevice_impl.h"
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/renderer_webmidiaccessor_impl.h"
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/renderer/media/webcontentdecryptionmodule_impl.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/renderer_clipboard_client.h"
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/webclipboard_impl.h"
479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/renderer/webcrypto_impl.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/websharedworkerrepository_impl.h"
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_message_filter.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_output_device.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_hardware_config.h"
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/filters/stream_parser_factory.h"
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/mime_util.h"
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/base/net_util.h"
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebBlobRegistry.h"
579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "third_party/WebKit/public/platform/WebDeviceMotionListener.h"
582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "third_party/WebKit/public/platform/WebDeviceOrientationListener.h"
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFileInfo.h"
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h"
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamCenter.h"
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h"
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/platform/WebPluginListBuilder.h"
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h"
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "third_party/WebKit/public/web/WebFrame.h"
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/gpu/webgraphicscontext3d_provider_impl.h"
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/common/quota/quota_types.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/simple_webmimeregistry_impl.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webfileutilities_impl.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webkit_glue.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/child_process_messages.h"
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/win/WebSandboxSupport.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/mac/font_descriptor.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/mac/font_loader.h"
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/mac/WebSandboxSupport.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/child_process_sandbox_support_impl_linux.h"
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/linux/WebFontFamily.h"
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/linux/WebSandboxSupport.h"
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "third_party/icu/source/common/unicode/utf16.h"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_descriptor_posix.h"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/android/audio_decoder_android.h"
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebAudioDevice;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebBlobRegistry;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFileInfo;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFileSystem;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFrame;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebGamepads;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebIDBFactory;
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing WebKit::WebMIDIAccessor;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::Platform;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaStreamCenter;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMediaStreamCenterClient;
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing WebKit::WebMimeRegistry;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRTCPeerConnectionHandler;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRTCPeerConnectionHandlerClient;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebStorageNamespace;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebVector;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool g_sandbox_enabled = true;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::LazyInstance<WebGamepads>::Leaky g_test_gamepads =
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
1299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochbase::LazyInstance<WebKit::WebDeviceMotionData>::Leaky
1309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    g_test_device_motion_data = LAZY_INSTANCE_INITIALIZER;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererWebKitPlatformSupportImpl::MimeRegistry
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public webkit_glue::SimpleWebMimeRegistryImpl {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // TODO(ddorwin): Remove after http://webk.it/82983 lands.
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual WebKit::WebMimeRegistry::SupportsType supportsMediaMIMEType(
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& mime_type,
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& codecs);
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual WebKit::WebMimeRegistry::SupportsType supportsMediaMIMEType(
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& mime_type,
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& codecs,
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& key_system);
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual bool supportsMediaSourceMIMEType(const WebKit::WebString& mime_type,
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                           const WebKit::WebString& codecs);
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual WebKit::WebString mimeTypeForExtension(
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& file_extension);
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual WebKit::WebString mimeTypeFromFile(
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& file_path);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebKit::WebString preferredExtensionForMIMEType(
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const WebKit::WebString& mime_type);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererWebKitPlatformSupportImpl::FileUtilities
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public webkit_glue::WebFileUtilitiesImpl {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FileUtilities(ThreadSafeSender* sender)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : thread_safe_sender_(sender) {}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool getFileInfo(const WebString& path, WebFileInfo& result);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SendSyncMessageFromAnyThread(IPC::SyncMessage* msg) const;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit doesn't use WebSandboxSupport on android so we don't need to
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implement anything here.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererWebKitPlatformSupportImpl::SandboxSupport {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererWebKitPlatformSupportImpl::SandboxSupport
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public WebKit::WebSandboxSupport {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SandboxSupport() {}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ensureFontLoaded(HFONT);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool loadFont(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NSFont* src_font,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CGFontRef* container,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32* font_id);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void getFontFamilyForCharacter(
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      WebKit::WebUChar32 character,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* preferred_locale,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebFontFamily* family);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void getRenderStyleForStrike(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* family, int sizeAndStyle, WebKit::WebFontRenderStyle* out);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit likes to ask us for the correct font family to use for a set of
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unicode code points. It needs this information frequently so we cache it
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // here.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock unicode_font_families_mutex_;
197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::map<int32_t, WebKit::WebFontFamily> unicode_font_families_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_ANDROID)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::RendererWebKitPlatformSupportImpl()
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : clipboard_client_(new RendererClipboardClient),
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      clipboard_(new WebClipboardImpl(clipboard_client_.get())),
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mime_registry_(new RendererWebKitPlatformSupportImpl::MimeRegistry),
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sudden_termination_disables_(0),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_refresh_allowed_(true),
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shared_worker_repository_(new WebSharedWorkerRepositoryImpl),
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      child_thread_loop_(base::MessageLoopProxy::current()) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (g_sandbox_enabled && sandboxEnabled()) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sandbox_support_.reset(
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new RendererWebKitPlatformSupportImpl::SandboxSupport);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Disabling sandbox support for testing.";
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ChildThread may not exist in some tests.
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (ChildThread::current()) {
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    sync_message_filter_ = ChildThread::current()->sync_message_filter();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    thread_safe_sender_ = ChildThread::current()->thread_safe_sender();
223558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    quota_message_filter_ = ChildThread::current()->quota_message_filter();
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::~RendererWebKitPlatformSupportImpl() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebClipboard* RendererWebKitPlatformSupportImpl::clipboard() {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebClipboard* clipboard =
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentClient()->renderer()->OverrideWebClipboard();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (clipboard)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return clipboard;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return clipboard_.get();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebMimeRegistry* RendererWebKitPlatformSupportImpl::mimeRegistry() {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return mime_registry_.get();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebFileUtilities*
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::fileUtilities() {
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!file_utilities_) {
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    file_utilities_.reset(new FileUtilities(thread_safe_sender_.get()));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_utilities_->set_sandbox_enabled(sandboxEnabled());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return file_utilities_.get();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSandboxSupport* RendererWebKitPlatformSupportImpl::sandboxSupport() {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit doesn't use WebSandboxSupport on android.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sandbox_support_.get();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebCookieJar* RendererWebKitPlatformSupportImpl::cookieJar() {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() << "Use WebFrameClient::cookieJar() instead!";
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebThemeEngine* RendererWebKitPlatformSupportImpl::themeEngine() {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKit::WebThemeEngine* theme_engine =
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentClient()->renderer()->OverrideThemeEngine();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (theme_engine)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return theme_engine;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebKitPlatformSupportImpl::themeEngine();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::sandboxEnabled() {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As explained in Platform.h, this function is used to decide
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // whether to allow file system operations to come out of WebKit or not.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even if the sandbox is disabled, there's no reason why the code should
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // act any differently...unless we're in single process mode.  In which
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, we have no other choice.  Platform.h discourages using
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this switch unless absolutely necessary, so hopefully we won't end up
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with too many code paths being different in single-process mode.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned long long RendererWebKitPlatformSupportImpl::visitedLinkHash(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* canonical_url,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t length) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentClient()->renderer()->VisitedLinkHash(canonical_url, length);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::isLinkVisited(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned long long link_hash) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentClient()->renderer()->IsLinkVisited(link_hash);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebMessagePortChannel*
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::createMessagePortChannel() {
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return new WebMessagePortChannelImpl(child_thread_loop_.get());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)WebKit::WebPrescientNetworking*
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)RendererWebKitPlatformSupportImpl::prescientNetworking() {
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return GetContentClient()->renderer()->GetPrescientNetworking();
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::CheckPreparsedJsCachingEnabled() const {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool checked = false;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool result = false;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!checked) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CommandLine& command_line = *CommandLine::ForCurrentProcess();
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = command_line.HasSwitch(switches::kEnablePreparsedJsCaching);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checked = true;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RendererWebKitPlatformSupportImpl::cacheMetadata(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebURL& url,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double response_time,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* data,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t size) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CheckPreparsedJsCachingEnabled())
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the browser know we generated cacheable metadata for this resource. The
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser may cache it and return it on subsequent responses to speed
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the processing of this resource.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> copy(data, data + size);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->Send(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ViewHostMsg_DidGenerateCacheableMetadata(url, response_time, copy));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString RendererWebKitPlatformSupportImpl::defaultLocale() {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ASCIIToUTF16(RenderThread::Get()->GetLocale());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RendererWebKitPlatformSupportImpl::suddenTerminationChanged(bool enabled) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enabled) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should not get more enables than disables, but we want it to be a
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // non-fatal error if it does happen.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_GT(sudden_termination_disables_, 0);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sudden_termination_disables_ = std::max(sudden_termination_disables_ - 1,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            0);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sudden_termination_disables_ != 0)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sudden_termination_disables_++;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sudden_termination_disables_ != 1)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread* thread = RenderThread::Get();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (thread)  // NULL in unittests.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thread->Send(new ViewHostMsg_SuddenTerminationChanged(enabled));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebStorageNamespace*
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRendererWebKitPlatformSupportImpl::createLocalStorageNamespace() {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new WebStorageNamespaceImpl();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebIDBFactory* RendererWebKitPlatformSupportImpl::idbFactory() {
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!web_idb_factory_)
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    web_idb_factory_.reset(
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new RendererWebIDBFactoryImpl(thread_safe_sender_.get()));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_idb_factory_.get();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebFileSystem* RendererWebKitPlatformSupportImpl::fileSystem() {
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_file_system_)
378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    web_file_system_.reset(new WebFileSystemImpl(child_thread_loop_.get()));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_file_system_.get();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebMimeRegistry::SupportsType
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRendererWebKitPlatformSupportImpl::MimeRegistry::supportsMediaMIMEType(
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebString& mime_type,
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebString& codecs) {
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return supportsMediaMIMEType(mime_type, codecs, WebString());
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebMimeRegistry::SupportsType
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRendererWebKitPlatformSupportImpl::MimeRegistry::supportsMediaMIMEType(
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebString& mime_type,
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebString& codecs,
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebString& key_system) {
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string mime_type_ascii = ToASCIIOrEmpty(mime_type);
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Not supporting the container is a flat-out no.
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!net::IsSupportedMediaMimeType(mime_type_ascii))
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return IsNotSupported;
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!key_system.isEmpty()) {
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Check whether the key system is supported with the mime_type and codecs.
403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Not supporting the key system is a flat-out no.
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!IsSupportedKeySystem(key_system))
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return IsNotSupported;
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> strict_codecs;
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool strip_suffix = !net::IsStrictMediaMimeType(mime_type_ascii);
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    net::ParseCodecString(ToASCIIOrEmpty(codecs), &strict_codecs, strip_suffix);
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!IsSupportedKeySystemWithMediaMimeType(
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            mime_type_ascii, strict_codecs, ToASCIIOrEmpty(key_system)))
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return IsNotSupported;
415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Continue processing the mime_type and codecs.
417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Check list of strict codecs to see if it is supported.
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (net::IsStrictMediaMimeType(mime_type_ascii)) {
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // We support the container, but no codecs were specified.
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (codecs.isNull())
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return MayBeSupported;
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Check if the codecs are a perfect match.
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> strict_codecs;
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    net::ParseCodecString(ToASCIIOrEmpty(codecs), &strict_codecs, false);
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!net::IsSupportedStrictMediaMimeType(mime_type_ascii, strict_codecs))
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return IsNotSupported;
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Good to go!
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return IsSupported;
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // If we don't recognize the codec, it's possible we support it.
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> parsed_codecs;
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::ParseCodecString(ToASCIIOrEmpty(codecs), &parsed_codecs, true);
438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!net::AreSupportedMediaCodecs(parsed_codecs))
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return MayBeSupported;
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Otherwise we have a perfect match.
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return IsSupported;
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRendererWebKitPlatformSupportImpl::MimeRegistry::supportsMediaSourceMIMEType(
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebKit::WebString& mime_type,
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const WebString& codecs) {
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string mime_type_ascii = ToASCIIOrEmpty(mime_type);
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::string> parsed_codec_ids;
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::ParseCodecString(ToASCIIOrEmpty(codecs), &parsed_codec_ids, false);
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (mime_type_ascii.empty() || parsed_codec_ids.size() == 0)
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return media::StreamParserFactory::IsTypeSupported(
455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      mime_type_ascii, parsed_codec_ids);
456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::MimeRegistry::mimeTypeForExtension(
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& file_extension) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsPluginProcess())
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SimpleWebMimeRegistryImpl::mimeTypeForExtension(file_extension);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sandbox restricts our access to the registry, so we need to proxy
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // these calls over to the browser process.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->Send(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MimeRegistryMsg_GetMimeTypeFromExtension(
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          base::FilePath::FromUTF16Unsafe(file_extension).value(), &mime_type));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ASCIIToUTF16(mime_type);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString RendererWebKitPlatformSupportImpl::MimeRegistry::mimeTypeFromFile(
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& file_path) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsPluginProcess())
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SimpleWebMimeRegistryImpl::mimeTypeFromFile(file_path);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sandbox restricts our access to the registry, so we need to proxy
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // these calls over to the browser process.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string mime_type;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->Send(new MimeRegistryMsg_GetMimeTypeFromFile(
482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::FilePath::FromUTF16Unsafe(file_path),
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &mime_type));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ASCIIToUTF16(mime_type);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebString
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::MimeRegistry::preferredExtensionForMIMEType(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& mime_type) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (IsPluginProcess())
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SimpleWebMimeRegistryImpl::preferredExtensionForMIMEType(mime_type);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sandbox restricts our access to the registry, so we need to proxy
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // these calls over to the browser process.
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::StringType file_extension;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->Send(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new MimeRegistryMsg_GetPreferredExtensionForMimeType(
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UTF16ToASCII(mime_type), &file_extension));
499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return base::FilePath(file_extension).AsUTF16Unsafe();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::FileUtilities::getFileInfo(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& path,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebFileInfo& web_file_info) {
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFileInfo file_info;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFileError status;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SendSyncMessageFromAnyThread(new FileUtilitiesMsg_GetFileInfo(
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           base::FilePath::FromUTF16Unsafe(path), &file_info, &status)) ||
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status != base::PLATFORM_FILE_OK) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webkit_glue::PlatformFileInfoToWebFileInfo(file_info, &web_file_info);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_file_info.platformPath = path;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RendererWebKitPlatformSupportImpl::FileUtilities::
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SendSyncMessageFromAnyThread(IPC::SyncMessage* msg) const {
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks begin = base::TimeTicks::Now();
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool success = thread_safe_sender_->Send(msg);
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta delta = base::TimeTicks::Now() - begin;
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_TIMES("RendererSyncIPC.ElapsedTime", delta);
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return success;
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::SandboxSupport::ensureFontLoaded(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HFONT font) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOGFONT logfont;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetObject(font, sizeof(LOGFONT), &logfont);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->PreCacheFont(logfont);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::SandboxSupport::loadFont(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NSFont* src_font, CGFontRef* out, uint32* font_id) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 font_data_size;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontDescriptor src_font_descriptor(src_font);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SharedMemoryHandle font_data;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!RenderThread::Get()->Send(new ViewHostMsg_LoadFont(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        src_font_descriptor, &font_data_size, &font_data, font_id))) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out = NULL;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *font_id = 0;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (font_data_size == 0 || font_data == base::SharedMemory::NULLHandle() ||
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *font_id == 0) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Bad response from ViewHostMsg_LoadFont() for " <<
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        src_font_descriptor.font_name;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out = NULL;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *font_id = 0;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jeremy): Need to call back into WebKit to make sure that the font
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // isn't already activated, based on the font id.  If it's already
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // activated, don't reactivate it here - crbug.com/72727 .
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FontLoader::CGFontRefFromBuffer(font_data, font_data_size, out);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebKit doesn't use WebSandboxSupport on android so we don't need to
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implement anything here. This is cleaner to support than excluding the
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whole class for android.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)RendererWebKitPlatformSupportImpl::SandboxSupport::getFontFamilyForCharacter(
580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    WebKit::WebUChar32 character,
581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const char* preferred_locale,
582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    WebKit::WebFontFamily* family) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(unicode_font_families_mutex_);
584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::map<int32_t, WebKit::WebFontFamily>::const_iterator iter =
585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      unicode_font_families_.find(character);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != unicode_font_families_.end()) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    family->name = iter->second.name;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    family->isBold = iter->second.isBold;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    family->isItalic = iter->second.isItalic;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  GetFontFamilyForCharacter(character, preferred_locale, family);
594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  unicode_font_families_.insert(std::make_pair(character, *family));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::SandboxSupport::getRenderStyleForStrike(
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* family, int sizeAndStyle, WebKit::WebFontRenderStyle* out) {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetRenderStyleForStrike(family, sizeAndStyle, out);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Platform::FileHandle
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::databaseOpenFile(
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& vfs_file_name, int desired_flags) {
610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return DatabaseUtil::DatabaseOpenFile(
611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      vfs_file_name, desired_flags, sync_message_filter_.get());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RendererWebKitPlatformSupportImpl::databaseDeleteFile(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& vfs_file_name, bool sync_dir) {
616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return DatabaseUtil::DatabaseDeleteFile(
617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      vfs_file_name, sync_dir, sync_message_filter_.get());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long RendererWebKitPlatformSupportImpl::databaseGetFileAttributes(
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& vfs_file_name) {
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return DatabaseUtil::DatabaseGetFileAttributes(vfs_file_name,
623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                 sync_message_filter_.get());
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long long RendererWebKitPlatformSupportImpl::databaseGetFileSize(
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& vfs_file_name) {
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return DatabaseUtil::DatabaseGetFileSize(vfs_file_name,
629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                           sync_message_filter_.get());
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long long RendererWebKitPlatformSupportImpl::databaseGetSpaceAvailableForOrigin(
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& origin_identifier) {
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return DatabaseUtil::DatabaseGetSpaceAvailable(origin_identifier,
635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                 sync_message_filter_.get());
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebSharedWorkerRepository*
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::sharedWorkerRepository() {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          switches::kDisableSharedWorkers)) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return shared_worker_repository_.get();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::canAccelerate2dCanvas() {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThreadImpl* thread = RenderThreadImpl::current();
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHost* host = thread->EstablishGpuChannelSync(
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CAUSE_FOR_GPU_LAUNCH_CANVAS_2D);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const gpu::GPUInfo& gpu_info = host->gpu_info();
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gpu_info.can_lose_context || gpu_info.software_rendering)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RendererWebKitPlatformSupportImpl::isThreadedCompositingEnabled() {
6637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return !!RenderThreadImpl::current()->compositor_message_loop_proxy().get();
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double RendererWebKitPlatformSupportImpl::audioHardwareSampleRate() {
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderThreadImpl* thread = RenderThreadImpl::current();
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return thread->GetAudioHardwareConfig()->GetOutputSampleRate();
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t RendererWebKitPlatformSupportImpl::audioHardwareBufferSize() {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderThreadImpl* thread = RenderThreadImpl::current();
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return thread->GetAudioHardwareConfig()->GetOutputBufferSize();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)unsigned RendererWebKitPlatformSupportImpl::audioHardwareOutputChannels() {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderThreadImpl* thread = RenderThreadImpl::current();
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return thread->GetAudioHardwareConfig()->GetOutputChannels();
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(crogers): remove deprecated API as soon as WebKit calls new API.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebAudioDevice*
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::createAudioDevice(
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t buffer_size,
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned channels,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double sample_rate,
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebAudioDevice::RenderCallback* callback) {
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return createAudioDevice(
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer_size, 0, channels, sample_rate, callback, "default");
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(crogers): remove deprecated API as soon as WebKit calls new API.
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebAudioDevice*
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RendererWebKitPlatformSupportImpl::createAudioDevice(
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t buffer_size,
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned input_channels,
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned channels,
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double sample_rate,
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebAudioDevice::RenderCallback* callback) {
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return createAudioDevice(
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer_size, input_channels, channels, sample_rate, callback, "default");
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebAudioDevice*
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RendererWebKitPlatformSupportImpl::createAudioDevice(
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t buffer_size,
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned input_channels,
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned channels,
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double sample_rate,
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebAudioDevice::RenderCallback* callback,
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebString& input_device_id) {
7127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Use a mock for testing.
7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  WebKit::WebAudioDevice* mock_device =
7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetContentClient()->renderer()->OverrideCreateAudioDevice(sample_rate);
7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (mock_device)
7167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return mock_device;
7177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The |channels| does not exactly identify the channel layout of the
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // device. The switch statement below assigns a best guess to the channel
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // layout based on number of channels.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(crogers): WebKit should give the channel layout instead of the hard
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // channel count.
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  media::ChannelLayout layout = media::CHANNEL_LAYOUT_UNSUPPORTED;
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (channels) {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_MONO;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_STEREO;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_2_1;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 4:
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_4_0;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 5:
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_5_0;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 6:
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_5_1;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 7:
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_7_0;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 8:
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_7_1;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layout = media::CHANNEL_LAYOUT_STEREO;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int session_id = 0;
754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (input_device_id.isNull() ||
755868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !base::StringToInt(UTF16ToUTF8(input_device_id), &session_id)) {
756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (input_channels > 0)
757868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DLOG(WARNING) << "createAudioDevice(): request for audio input ignored";
758868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
759868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    input_channels = 0;
760868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media::AudioParameters params(
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layout, input_channels,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<int>(sample_rate), 16, buffer_size);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return new RendererWebAudioDeviceImpl(params, callback, session_id);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_ANDROID)
771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool RendererWebKitPlatformSupportImpl::loadAudioResource(
772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WebKit::WebAudioBus* destination_bus, const char* audio_file_data,
773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    size_t data_size, double sample_rate) {
774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return DecodeAudioFileData(destination_bus,
775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             audio_file_data,
776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             data_size,
777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             sample_rate,
778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             thread_safe_sender_);
779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else
781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool RendererWebKitPlatformSupportImpl::loadAudioResource(
782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WebKit::WebAudioBus* destination_bus, const char* audio_file_data,
783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    size_t data_size, double sample_rate) {
7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return DecodeAudioFileData(
7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      destination_bus, audio_file_data, data_size, sample_rate);
786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // defined(OS_ANDROID)
788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)WebKit::WebContentDecryptionModule*
7927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)RendererWebKitPlatformSupportImpl::createContentDecryptionModule(
7937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const WebKit::WebString& key_system) {
7947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return WebContentDecryptionModuleImpl::Create(key_system);
7957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//------------------------------------------------------------------------------
798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebKit::WebMIDIAccessor*
800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRendererWebKitPlatformSupportImpl::createMIDIAccessor(
801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WebKit::WebMIDIAccessorClient* client) {
802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WebKit::WebMIDIAccessor* accessor =
803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetContentClient()->renderer()->OverrideCreateMIDIAccessor(client);
804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (accessor)
805eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return accessor;
806eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return new RendererWebMIDIAccessorImpl(client);
808eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
809eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
810ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RendererWebKitPlatformSupportImpl::getPluginList(
811ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bool refresh,
812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    WebKit::WebPluginListBuilder* builder) {
813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(ENABLE_PLUGINS)
814ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::vector<WebPluginInfo> plugins;
815ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!plugin_refresh_allowed_)
816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    refresh = false;
817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderThread::Get()->Send(
818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new ViewHostMsg_GetPlugins(refresh, &plugins));
819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (size_t i = 0; i < plugins.size(); ++i) {
820ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const WebPluginInfo& plugin = plugins[i];
821ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    builder->addPlugin(
823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        plugin.name, plugin.desc,
824ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        plugin.path.BaseName().AsUTF16Unsafe());
825ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
826ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    for (size_t j = 0; j < plugin.mime_types.size(); ++j) {
827ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const WebPluginMimeType& mime_type = plugin.mime_types[j];
828ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      builder->addMediaTypeToLastPlugin(
830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          WebString::fromUTF8(mime_type.mime_type), mime_type.description);
831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      for (size_t k = 0; k < mime_type.file_extensions.size(); ++k) {
833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        builder->addFileExtensionToLastMediaType(
834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            WebString::fromUTF8(mime_type.file_extensions[k]));
835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      }
836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//------------------------------------------------------------------------------
8427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::signedPublicKeyAndChallengeString(
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned key_size_index,
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebString& challenge,
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebURL& url) {
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string signed_public_key;
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->Send(new ViewHostMsg_Keygen(
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<uint32>(key_size_index),
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      challenge.utf8(),
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(url),
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &signed_public_key));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebString::fromUTF8(signed_public_key);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RendererWebKitPlatformSupportImpl::screenColorProfile(
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebVector<char>* to_profile) {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<char> profile;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->Send(
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ViewHostMsg_GetMonitorColorProfile(&profile));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *to_profile = profile;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebBlobRegistry* RendererWebKitPlatformSupportImpl::blobRegistry() {
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // thread_safe_sender_ can be NULL when running some tests.
871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!blob_registry_.get() && thread_safe_sender_.get())
872868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    blob_registry_.reset(new WebBlobRegistryImpl(thread_safe_sender_.get()));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return blob_registry_.get();
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RendererWebKitPlatformSupportImpl::sampleGamepads(WebGamepads& gamepads) {
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (g_test_gamepads == 0) {
8803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    RenderThreadImpl::current()->SampleGamepads(&gamepads);
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gamepads = g_test_gamepads.Get();
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebString RendererWebKitPlatformSupportImpl::userAgent(
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebURL& url) {
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebKitPlatformSupportImpl::userAgent(url);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebRTCPeerConnectionHandler*
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::createRTCPeerConnectionHandler(
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRTCPeerConnectionHandlerClient* client) {
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThreadImpl* render_thread = RenderThreadImpl::current();
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(render_thread);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!render_thread)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_WEBRTC)
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebRTCPeerConnectionHandler* peer_connection_handler =
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentClient()->renderer()->OverrideCreateWebRTCPeerConnectionHandler(
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          client);
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (peer_connection_handler)
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return peer_connection_handler;
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaStreamDependencyFactory* rtc_dependency_factory =
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_thread->GetMediaStreamDependencyFactory();
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rtc_dependency_factory->CreateRTCPeerConnectionHandler(client);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(ENABLE_WEBRTC)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMediaStreamCenter*
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererWebKitPlatformSupportImpl::createMediaStreamCenter(
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebMediaStreamCenterClient* client) {
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThreadImpl* render_thread = RenderThreadImpl::current();
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(render_thread);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!render_thread)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return render_thread->CreateMediaStreamCenter(client);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererWebKitPlatformSupportImpl::SetSandboxEnabledForTesting(
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool enable) {
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_enabled = g_sandbox_enabled;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_sandbox_enabled = enable;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return was_enabled;
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RendererWebKitPlatformSupportImpl::SetMockGamepadsForTesting(
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebGamepads& pads) {
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  g_test_gamepads.Get() = pads;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebKit::WebSpeechSynthesizer*
945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RendererWebKitPlatformSupportImpl::createSpeechSynthesizer(
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WebKit::WebSpeechSynthesizerClient* client) {
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return GetContentClient()->renderer()->OverrideSpeechSynthesizer(client);
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//------------------------------------------------------------------------------
951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RendererWebKitPlatformSupportImpl::processMemorySizesInBytes(
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t* private_bytes, size_t* shared_bytes) {
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RenderThread::Get()->Send(
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new ViewHostMsg_GetProcessMemorySizes(private_bytes, shared_bytes));
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebGraphicsContext3D*
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RendererWebKitPlatformSupportImpl::createOffscreenGraphicsContext3D(
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebGraphicsContext3D::Attributes& attributes) {
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebGraphicsContext3DCommandBufferImpl::CreateOffscreenContext(
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderThreadImpl::current(),
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      attributes,
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL(attributes.topDocumentURL));
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)WebKit::WebGraphicsContext3DProvider* RendererWebKitPlatformSupportImpl::
97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    createSharedOffscreenGraphicsContext3DProvider() {
974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!shared_offscreen_context_.get() ||
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shared_offscreen_context_->DestroyedOnMainThread()) {
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shared_offscreen_context_ =
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderThreadImpl::current()->OffscreenContextProviderForMainThread();
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
979868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!shared_offscreen_context_.get())
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
98190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return new webkit::gpu::WebGraphicsContext3DProviderImpl(
98290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      shared_offscreen_context_);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)//------------------------------------------------------------------------------
98690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
987b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)WebKit::WebCompositorSupport*
988b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)RendererWebKitPlatformSupportImpl::compositorSupport() {
989b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return &compositor_support_;
990b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
991b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
9927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//------------------------------------------------------------------------------
9937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
9947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)WebKit::WebString RendererWebKitPlatformSupportImpl::convertIDNToUnicode(
9957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const WebKit::WebString& host,
9967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const WebKit::WebString& languages) {
9977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return net::IDNToUnicode(host.utf8(), languages.utf8());
9987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
9997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
10007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch//------------------------------------------------------------------------------
10017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid RendererWebKitPlatformSupportImpl::setDeviceMotionListener(
10037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    WebKit::WebDeviceMotionListener* listener) {
10049ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (g_test_device_motion_data == 0) {
10059ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    if (!device_motion_event_pump_) {
10069ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      device_motion_event_pump_.reset(new DeviceMotionEventPump);
10079ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      device_motion_event_pump_->Attach(RenderThreadImpl::current());
10089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    }
10099ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    device_motion_event_pump_->SetListener(listener);
1010a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  } else if (listener) {
1011a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Testing mode: just echo the test data to the listener.
10129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    base::MessageLoopProxy::current()->PostTask(
10139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        FROM_HERE,
10149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        base::Bind(&WebKit::WebDeviceMotionListener::didChangeDeviceMotion,
10159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                   base::Unretained(listener),
10169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch                   g_test_device_motion_data.Get()));
10177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
10189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
10199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
10209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// static
10219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid RendererWebKitPlatformSupportImpl::SetMockDeviceMotionDataForTesting(
10229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    const WebKit::WebDeviceMotionData& data) {
10239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  g_test_device_motion_data.Get() = data;
10249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
10259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
10269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch//------------------------------------------------------------------------------
10279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
10282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid RendererWebKitPlatformSupportImpl::setDeviceOrientationListener(
10292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    WebKit::WebDeviceOrientationListener* listener) {
10302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (!device_orientation_event_pump_) {
10312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    device_orientation_event_pump_.reset(new DeviceOrientationEventPump);
10322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    device_orientation_event_pump_->Attach(RenderThreadImpl::current());
10332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
10342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  device_orientation_event_pump_->SetListener(listener);
10352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
10362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
10372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch//------------------------------------------------------------------------------
10382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
10399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochWebKit::WebCrypto* RendererWebKitPlatformSupportImpl::crypto() {
104058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // Use a mock implementation for testing in-progress work.
104158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  WebKit::WebCrypto* crypto =
104258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      GetContentClient()->renderer()->OverrideWebCrypto();
104358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (crypto)
104458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    return crypto;
104558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
10469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!web_crypto_)
10479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    web_crypto_.reset(new WebCryptoImpl());
10489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  return web_crypto_.get();
10499ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
10507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
10517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1052ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//------------------------------------------------------------------------------
1053ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1054ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID)
1055ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RendererWebKitPlatformSupportImpl::vibrate(unsigned int milliseconds) {
1056ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderThread::Get()->Send(
1057ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new ViewHostMsg_Vibrate(base::checked_numeric_cast<int64>(milliseconds)));
1058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RendererWebKitPlatformSupportImpl::cancelVibration() {
1061ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderThread::Get()->Send(new ViewHostMsg_CancelVibration());
1062ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif  // defined(OS_ANDROID)
1064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch//------------------------------------------------------------------------------
1066ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1067ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RendererWebKitPlatformSupportImpl::queryStorageUsageAndQuota(
1068ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const WebKit::WebURL& storage_partition,
1069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    WebKit::WebStorageQuotaType type,
1070ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    WebKit::WebStorageQuotaCallbacks* callbacks) {
1071558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!thread_safe_sender_.get() || !quota_message_filter_.get())
1072558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
1073558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QuotaDispatcher::ThreadSpecificInstance(
1074558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      thread_safe_sender_.get(),
1075558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      quota_message_filter_.get())->QueryStorageUsageAndQuota(
1076558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          storage_partition,
1077558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          static_cast<quota::StorageType>(type),
1078558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks));
1079ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1080ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1082