2 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "WebAudioDevice.h"
39 #include "WebCommon.h"
41 #include "WebGamepads.h"
42 #include "WebGraphicsContext3D.h"
43 #include "WebLocalizedString.h"
44 #include "WebSpeechSynthesizer.h"
45 #include "WebStorageQuotaType.h"
46 #include "WebString.h"
47 #include "WebURLError.h"
48 #include "WebVector.h"
55 class WebBlobRegistry;
56 class WebContentDecryptionModule;
58 class WebCompositorSupport;
61 class WebDatabaseObserver;
62 class WebDeviceMotionListener;
63 class WebDeviceOrientationListener;
64 class WebDiscardableMemory;
65 class WebFallbackThemeEngine;
67 class WebFileUtilities;
68 class WebFlingAnimator;
69 class WebGestureCurveTarget;
70 class WebGestureCurve;
71 class WebGraphicsContext3DProvider;
73 class WebMIDIAccessor;
74 class WebMIDIAccessorClient;
75 class WebMediaStreamCenter;
76 class WebMediaStreamCenterClient;
77 class WebMessagePortChannel;
78 class WebMimeRegistry;
79 class WebPluginListBuilder;
80 class WebPrescientNetworking;
81 class WebPublicSuffixList;
82 class WebRTCPeerConnectionHandler;
83 class WebRTCPeerConnectionHandlerClient;
84 class WebSandboxSupport;
85 class WebSocketHandle;
86 class WebSocketStreamHandle;
87 class WebSpeechSynthesizer;
88 class WebSpeechSynthesizerClient;
89 class WebStorageNamespace;
90 class WebStorageQuotaCallbacks;
96 class WebUnitTestSupport;
97 class WebWaitableEvent;
98 class WebWorkerRunLoop;
99 struct WebLocalizedString;
104 // HTML5 Database ------------------------------------------------------
107 typedef HANDLE FileHandle;
109 typedef int FileHandle;
112 BLINK_PLATFORM_EXPORT static void initialize(Platform*);
113 BLINK_PLATFORM_EXPORT static void shutdown();
114 BLINK_PLATFORM_EXPORT static Platform* current();
117 virtual WebCookieJar* cookieJar() { return 0; }
119 // Must return non-null.
120 virtual WebClipboard* clipboard() { return 0; }
122 // Must return non-null.
123 virtual WebFileUtilities* fileUtilities() { return 0; }
125 // Must return non-null.
126 virtual WebMimeRegistry* mimeRegistry() { return 0; }
128 // May return null if sandbox support is not necessary
129 virtual WebSandboxSupport* sandboxSupport() { return 0; }
131 // May return null on some platforms.
132 virtual WebThemeEngine* themeEngine() { return 0; }
134 virtual WebFallbackThemeEngine* fallbackThemeEngine() { return 0; }
137 virtual WebSpeechSynthesizer* createSpeechSynthesizer(WebSpeechSynthesizerClient*) { return 0; }
140 // Media --------------------------------------------------------------
143 virtual WebContentDecryptionModule* createContentDecryptionModule(const WebString& keySystem) { return 0; }
146 // Audio --------------------------------------------------------------
148 virtual double audioHardwareSampleRate() { return 0; }
149 virtual size_t audioHardwareBufferSize() { return 0; }
150 virtual unsigned audioHardwareOutputChannels() { return 0; }
152 // Creates a device for audio I/O.
153 // Pass in (numberOfInputChannels > 0) if live/local audio input is desired.
154 virtual WebAudioDevice* createAudioDevice(size_t bufferSize, unsigned numberOfInputChannels, unsigned numberOfChannels, double sampleRate, WebAudioDevice::RenderCallback*, const WebString& deviceId) { return 0; }
156 // FIXME: remove deprecated APIs once chromium switches over to new method.
157 virtual WebAudioDevice* createAudioDevice(size_t bufferSize, unsigned numberOfChannels, double sampleRate, WebAudioDevice::RenderCallback*) { return 0; }
158 virtual WebAudioDevice* createAudioDevice(size_t bufferSize, unsigned numberOfInputChannels, unsigned numberOfChannels, double sampleRate, WebAudioDevice::RenderCallback*) { return 0; }
161 // MIDI ----------------------------------------------------------------
163 // Creates a platform dependent WebMIDIAccessor. MIDIAccessor under platform
164 // creates and owns it.
165 virtual WebMIDIAccessor* createMIDIAccessor(WebMIDIAccessorClient*) { return 0; }
168 // Blob ----------------------------------------------------------------
170 // Must return non-null.
171 virtual WebBlobRegistry* blobRegistry() { return 0; }
174 // Database ------------------------------------------------------------
176 // Opens a database file; dirHandle should be 0 if the caller does not need
177 // a handle to the directory containing this file
178 virtual FileHandle databaseOpenFile(const WebString& vfsFileName, int desiredFlags) { return FileHandle(); }
180 // Deletes a database file and returns the error code
181 virtual int databaseDeleteFile(const WebString& vfsFileName, bool syncDir) { return 0; }
183 // Returns the attributes of the given database file
184 virtual long databaseGetFileAttributes(const WebString& vfsFileName) { return 0; }
186 // Returns the size of the given database file
187 virtual long long databaseGetFileSize(const WebString& vfsFileName) { return 0; }
189 // Returns the space available for the given origin
190 virtual long long databaseGetSpaceAvailableForOrigin(const blink::WebString& originIdentifier) { return 0; }
193 // DOM Storage --------------------------------------------------
195 // Return a LocalStorage namespace
196 virtual WebStorageNamespace* createLocalStorageNamespace() { return 0; }
199 // FileSystem ----------------------------------------------------------
201 // Must return non-null.
202 virtual WebFileSystem* fileSystem() { return 0; }
205 // IDN conversion ------------------------------------------------------
207 virtual WebString convertIDNToUnicode(const WebString& host, const WebString& languages) { return host; }
210 // IndexedDB ----------------------------------------------------------
212 // Must return non-null.
213 virtual WebIDBFactory* idbFactory() { return 0; }
216 // Gamepad -------------------------------------------------------------
218 virtual void sampleGamepads(WebGamepads& into) { into.length = 0; }
221 // History -------------------------------------------------------------
223 // Returns the hash for the given canonicalized URL for use in visited
225 virtual unsigned long long visitedLinkHash(
226 const char* canonicalURL, size_t length) { return 0; }
228 // Returns whether the given link hash is in the user's history. The
229 // hash must have been generated by calling VisitedLinkHash().
230 virtual bool isLinkVisited(unsigned long long linkHash) { return false; }
233 // Keygen --------------------------------------------------------------
235 // Handle the <keygen> tag for generating client certificates
236 // Returns a base64 encoded signed copy of a public key from a newly
237 // generated key pair and the supplied challenge string. keySizeindex
238 // specifies the strength of the key.
239 virtual WebString signedPublicKeyAndChallengeString(unsigned keySizeIndex,
240 const WebString& challenge,
241 const WebURL& url) { return WebString(); }
244 // Memory --------------------------------------------------------------
246 // Returns the current space allocated for the pagefile, in MB.
247 // That is committed size for Windows and virtual memory size for POSIX
248 virtual size_t memoryUsageMB() { return 0; }
250 // Same as above, but always returns actual value, without any caches.
251 virtual size_t actualMemoryUsageMB() { return 0; }
253 // Return the physical memory of the current machine, in MB.
254 virtual size_t physicalMemoryMB() { return 0; }
256 // Return the number of of processors of the current machine.
257 virtual size_t numberOfProcessors() { return 0; }
259 // Returns private and shared usage, in bytes. Private bytes is the amount of
260 // memory currently allocated to this process that cannot be shared. Returns
261 // false on platform specific error conditions.
262 virtual bool processMemorySizesInBytes(size_t* privateBytes, size_t* sharedBytes) { return false; }
264 // A callback interface for requestProcessMemorySizes
265 class ProcessMemorySizesCallback {
267 virtual ~ProcessMemorySizesCallback() { }
268 virtual void dataReceived(size_t privateBytes, size_t sharedBytes) = 0;
271 // Requests private and shared usage, in bytes. Private bytes is the amount of
272 // memory currently allocated to this process that cannot be shared.
273 // The callback ownership is passed to the callee.
274 virtual void requestProcessMemorySizes(ProcessMemorySizesCallback* requestCallback) { }
276 // Reports number of bytes used by memory allocator for internal needs.
277 // Returns true if the size has been reported, or false otherwise.
278 virtual bool memoryAllocatorWasteInBytes(size_t*) { return false; }
280 // Allocates discardable memory. May return 0, even if the platform supports
281 // discardable memory. If nonzero, however, then the WebDiscardableMmeory is
282 // returned in an locked state. You may use its underlying data() member
283 // directly, taking care to unlock it when you are ready to let it become
285 virtual WebDiscardableMemory* allocateAndLockDiscardableMemory(size_t bytes) { return 0; }
287 // A wrapper for tcmalloc's HeapProfilerStart();
288 virtual void startHeapProfiling(const WebString& /*prefix*/) { }
289 // A wrapper for tcmalloc's HeapProfilerStop();
290 virtual void stopHeapProfiling() { }
291 // A wrapper for tcmalloc's HeapProfilerDump()
292 virtual void dumpHeapProfiling(const WebString& /*reason*/) { }
293 // A wrapper for tcmalloc's GetHeapProfile()
294 virtual WebString getHeapProfile() { return WebString(); }
296 static const size_t noDecodedImageByteLimit = static_cast<size_t>(-1);
298 // Returns the maximum amount of memory a decoded image should be allowed.
299 // See comments on ImageDecoder::m_maxDecodedBytes.
300 virtual size_t maxDecodedImageBytes() { return noDecodedImageByteLimit; }
303 // Message Ports -------------------------------------------------------
305 // Creates a Message Port Channel. This can be called on any thread.
306 // The returned object should only be used on the thread it was created on.
307 virtual WebMessagePortChannel* createMessagePortChannel() { return 0; }
310 // Network -------------------------------------------------------------
312 // Returns a new WebURLLoader instance.
313 virtual WebURLLoader* createURLLoader() { return 0; }
316 virtual WebPrescientNetworking* prescientNetworking() { return 0; }
318 // Returns a new WebSocketStreamHandle instance.
319 virtual WebSocketStreamHandle* createSocketStreamHandle() { return 0; }
321 // Returns a new WebSocketHandle instance.
322 virtual WebSocketHandle* createWebSocketHandle() { return 0; }
324 // Returns the User-Agent string that should be used for the given URL.
325 virtual WebString userAgent(const WebURL&) { return WebString(); }
327 // A suggestion to cache this metadata in association with this URL.
328 virtual void cacheMetadata(const WebURL&, double responseTime, const char* data, size_t dataSize) { }
330 // Returns the decoded data url if url had a supported mimetype and parsing was successful.
331 virtual WebData parseDataURL(const WebURL&, WebString& mimetype, WebString& charset) { return WebData(); }
333 virtual WebURLError cancelledError(const WebURL&) const { return WebURLError(); }
336 // Plugins -------------------------------------------------------------
338 // If refresh is true, then cached information should not be used to
339 // satisfy this call.
340 virtual void getPluginList(bool refresh, WebPluginListBuilder*) { }
343 // Public Suffix List --------------------------------------------------
345 // May return null on some platforms.
346 virtual WebPublicSuffixList* publicSuffixList() { return 0; }
349 // Resources -----------------------------------------------------------
351 // Returns a localized string resource (with substitution parameters).
352 virtual WebString queryLocalizedString(WebLocalizedString::Name) { return WebString(); }
353 virtual WebString queryLocalizedString(WebLocalizedString::Name, const WebString& parameter) { return WebString(); }
354 virtual WebString queryLocalizedString(WebLocalizedString::Name, const WebString& parameter1, const WebString& parameter2) { return WebString(); }
357 // Threads -------------------------------------------------------
359 // Creates an embedder-defined thread.
360 virtual WebThread* createThread(const char* name) { return 0; }
362 // Returns an interface to the current thread. This is owned by the
364 virtual WebThread* currentThread() { return 0; }
367 // WaitableEvent -------------------------------------------------------
369 // Creates an embedder-defined waitable event object.
370 virtual WebWaitableEvent* createWaitableEvent() { return 0; }
372 // Waits on multiple events and returns the event object that has been
373 // signaled. This may return 0 if it fails to wait events.
374 // Any event objects given to this method must not deleted while this
375 // wait is happening.
376 virtual WebWaitableEvent* waitMultipleEvents(const WebVector<WebWaitableEvent*>& events) { return 0; }
379 // Profiling -----------------------------------------------------------
381 virtual void decrementStatsCounter(const char* name) { }
382 virtual void incrementStatsCounter(const char* name) { }
385 // Resources -----------------------------------------------------------
387 // Returns a blob of data corresponding to the named resource.
388 virtual WebData loadResource(const char* name) { return WebData(); }
390 // Decodes the in-memory audio file data and returns the linear PCM audio data in the destinationBus.
391 // A sample-rate conversion to sampleRate will occur if the file data is at a different sample-rate.
392 // Returns true on success.
393 virtual bool loadAudioResource(WebAudioBus* destinationBus, const char* audioFileData, size_t dataSize, double sampleRate) { return false; }
396 // Screen -------------------------------------------------------------
398 // Supplies the system monitor color profile.
399 virtual void screenColorProfile(WebVector<char>* profile) { }
402 // Sudden Termination --------------------------------------------------
404 // Disable/Enable sudden termination.
405 virtual void suddenTerminationChanged(bool enabled) { }
408 // System --------------------------------------------------------------
410 // Returns a value such as "en-US".
411 virtual WebString defaultLocale() { return WebString(); }
413 // Wall clock time in seconds since the epoch.
414 virtual double currentTime() { return 0; }
416 // Monotonically increasing time in seconds from an arbitrary fixed point in the past.
417 // This function is expected to return at least millisecond-precision values. For this reason,
418 // it is recommended that the fixed point be no further in the past than the epoch.
419 virtual double monotonicallyIncreasingTime() { return 0; }
421 // WebKit clients must implement this funcion if they use cryptographic randomness.
422 virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length) = 0;
424 // Delayed work is driven by a shared timer.
425 typedef void (*SharedTimerFunction)();
426 virtual void setSharedTimerFiredFunction(SharedTimerFunction timerFunction) { }
427 virtual void setSharedTimerFireInterval(double) { }
428 virtual void stopSharedTimer() { }
430 // Callable from a background WebKit thread.
431 virtual void callOnMainThread(void (*func)(void*), void* context) { }
434 // Vibration -----------------------------------------------------------
436 // Starts a vibration for the given duration in milliseconds. If there is currently an active
437 // vibration it will be cancelled before the new one is started.
438 virtual void vibrate(unsigned time) { }
440 // Cancels the current vibration, if there is one.
441 virtual void cancelVibration() { }
444 // Testing -------------------------------------------------------------
446 #define HAVE_WEBUNITTESTSUPPORT 1
447 // Get a pointer to testing support interfaces. Will not be available in production builds.
448 virtual WebUnitTestSupport* unitTestSupport() { return 0; }
451 // Tracing -------------------------------------------------------------
453 // Get a pointer to the enabled state of the given trace category. The
454 // embedder can dynamically change the enabled state as trace event
455 // recording is started and stopped by the application. Only long-lived
456 // literal strings should be given as the category name. The implementation
457 // expects the returned pointer to be held permanently in a local static. If
458 // the unsigned char is non-zero, tracing is enabled. If tracing is enabled,
459 // addTraceEvent is expected to be called by the trace event macros.
460 virtual const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) { return 0; }
462 typedef long int TraceEventAPIAtomicWord;
464 // Get a pointer to a global state of the given thread. An embedder is
465 // expected to update the global state as the state of the embedder changes.
466 // A sampling thread in the Chromium side reads the global state periodically
467 // and reflects the sampling profiled results into about:tracing.
468 virtual TraceEventAPIAtomicWord* getTraceSamplingState(const unsigned bucketName) { return 0; }
470 typedef uint64_t TraceEventHandle;
472 // Add a trace event to the platform tracing system. Depending on the actual
473 // enabled state, this event may be recorded or dropped.
474 // - phase specifies the type of event:
475 // - BEGIN ('B'): Marks the beginning of a scoped event.
476 // - END ('E'): Marks the end of a scoped event.
477 // - COMPLETE ('X'): Marks the beginning of a scoped event, but doesn't
478 // need a matching END event. Instead, at the end of the scope,
479 // updateTraceEventDuration() must be called with the TraceEventHandle
480 // returned from addTraceEvent().
481 // - INSTANT ('I'): Standalone, instantaneous event.
482 // - START ('S'): Marks the beginning of an asynchronous event (the end
483 // event can occur in a different scope or thread). The id parameter is
484 // used to match START/FINISH pairs.
485 // - FINISH ('F'): Marks the end of an asynchronous event.
486 // - COUNTER ('C'): Used to trace integer quantities that change over
487 // time. The argument values are expected to be of type int.
488 // - METADATA ('M'): Reserved for internal use.
489 // - categoryEnabled is the pointer returned by getTraceCategoryEnabledFlag.
490 // - name is the name of the event. Also used to match BEGIN/END and
491 // START/FINISH pairs.
492 // - id optionally allows events of the same name to be distinguished from
493 // each other. For example, to trace the consutruction and destruction of
494 // objects, specify the pointer as the id parameter.
495 // - numArgs specifies the number of elements in argNames, argTypes, and
497 // - argNames is the array of argument names. Use long-lived literal strings
498 // or specify the COPY flag.
499 // - argTypes is the array of argument types:
501 // - UINT (2): unsigned long long
502 // - INT (3): long long
503 // - DOUBLE (4): double
504 // - POINTER (5): void*
505 // - STRING (6): char* (long-lived null-terminated char* string)
506 // - COPY_STRING (7): char* (temporary null-terminated char* string)
507 // - argValues is the array of argument values. Each value is the unsigned
508 // long long member of a union of all supported types.
509 // - thresholdBeginId optionally specifies the value returned by a previous
510 // call to addTraceEvent with a BEGIN phase.
511 // - threshold is used on an END phase event in conjunction with the
512 // thresholdBeginId of a prior BEGIN event. The threshold is the minimum
513 // number of microseconds that must have passed since the BEGIN event. If
514 // less than threshold microseconds has passed, the BEGIN/END pair is
516 // - flags can be 0 or one or more of the following, ORed together:
517 // - COPY (0x1): treat all strings (name, argNames and argValues of type
518 // string) as temporary so that they will be copied by addTraceEvent.
519 // - HAS_ID (0x2): use the id argument to uniquely identify the event for
520 // matching with other events of the same name.
521 // - MANGLE_ID (0x4): specify this flag if the id parameter is the value
523 virtual TraceEventHandle addTraceEvent(
525 const unsigned char* categoryEnabledFlag,
527 unsigned long long id,
529 const char** argNames,
530 const unsigned char* argTypes,
531 const unsigned long long* argValues,
537 // Set the duration field of a COMPLETE trace event.
538 virtual void updateTraceEventDuration(const unsigned char* categoryEnabledFlag, const char* name, TraceEventHandle) { }
540 // Callbacks for reporting histogram data.
541 // CustomCounts histogram has exponential bucket sizes, so that min=1, max=1000000, bucketCount=50 would do.
542 virtual void histogramCustomCounts(const char* name, int sample, int min, int max, int bucketCount) { }
543 // Enumeration histogram buckets are linear, boundaryValue should be larger than any possible sample value.
544 virtual void histogramEnumeration(const char* name, int sample, int boundaryValue) { }
545 // Unlike enumeration histograms, sparse histograms only allocate memory for non-empty buckets.
546 virtual void histogramSparse(const char* name, int sample) { }
549 // GPU ----------------------------------------------------------------
551 // May return null if GPU is not supported.
552 // Returns newly allocated and initialized offscreen WebGraphicsContext3D instance.
553 virtual WebGraphicsContext3D* createOffscreenGraphicsContext3D(const WebGraphicsContext3D::Attributes&) { return 0; }
555 // Returns a newly allocated and initialized offscreen context provider. The provider may return a null
556 // graphics context if GPU is not supported.
557 virtual WebGraphicsContext3DProvider* createSharedOffscreenGraphicsContext3DProvider() { return 0; }
559 // Returns true if the platform is capable of producing an offscreen context suitable for accelerating 2d canvas.
560 // This will return false if the platform cannot promise that contexts will be preserved across operations like
561 // locking the screen or if the platform cannot provide a context with suitable performance characteristics.
563 // This value must be checked again after a context loss event as the platform's capabilities may have changed.
564 virtual bool canAccelerate2dCanvas() { return false; }
566 virtual bool isThreadedCompositingEnabled() { return false; }
568 virtual WebCompositorSupport* compositorSupport() { return 0; }
570 virtual WebFlingAnimator* createFlingAnimator() { return 0; }
572 // Creates a new fling animation curve instance for device |deviceSource|
573 // with |velocity| and already scrolled |cumulativeScroll| pixels.
574 virtual WebGestureCurve* createFlingAnimationCurve(int deviceSource, const WebFloatPoint& velocity, const WebSize& cumulativeScroll) { return 0; }
577 // WebRTC ----------------------------------------------------------
579 // Creates an WebRTCPeerConnectionHandler for RTCPeerConnection.
580 // May return null if WebRTC functionality is not avaliable or out of resources.
581 virtual WebRTCPeerConnectionHandler* createRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient*) { return 0; }
583 // May return null if WebRTC functionality is not avaliable or out of resources.
584 virtual WebMediaStreamCenter* createMediaStreamCenter(WebMediaStreamCenterClient*) { return 0; }
587 // WebWorker ----------------------------------------------------------
589 virtual void didStartWorkerRunLoop(const WebWorkerRunLoop&) { }
590 virtual void didStopWorkerRunLoop(const WebWorkerRunLoop&) { }
593 // WebCrypto ----------------------------------------------------------
595 virtual WebCrypto* crypto() { return 0; }
598 // Device Motion / Orientation ----------------------------------------
600 // Sets a Listener to listen for device motion data updates.
601 // If null, the platform stops providing device motion data to the current listener.
602 virtual void setDeviceMotionListener(blink::WebDeviceMotionListener*) { }
604 // Sets a Listener to listen for device orientation data updates.
605 // If null, the platform stops proving device orientation data to the current listener.
606 virtual void setDeviceOrientationListener(blink::WebDeviceOrientationListener*) { }
609 // Quota -----------------------------------------------------------
611 // Queries the storage partition's storage usage and quota information.
612 // WebStorageQuotaCallbacks::didQueryStorageUsageAndQuota will be called
613 // with the current usage and quota information for the partition. When
614 // an error occurs WebStorageQuotaCallbacks::didFail is called with an
616 // The callbacks object is deleted when the callback method is called
617 // and does not need to be (and should not be) deleted manually.
618 virtual void queryStorageUsageAndQuota(
619 const WebURL& storagePartition,
621 WebStorageQuotaCallbacks*) { }
624 // WebDatabase --------------------------------------------------------
626 virtual WebDatabaseObserver* databaseObserver() { return 0; }
630 virtual ~Platform() { }