Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2009 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      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
     13  * distribution.
     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.
     17  *
     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.
     29  */
     30 
     31 #include "config.h"
     32 #include "PlatformBridge.h"
     33 
     34 #include <googleurl/src/url_util.h>
     35 
     36 #include "Chrome.h"
     37 #include "ChromeClientImpl.h"
     38 #include "WebAudioBus.h"
     39 #include "WebClipboard.h"
     40 #include "WebCookie.h"
     41 #include "WebCookieJar.h"
     42 #include "WebData.h"
     43 #include "WebDragData.h"
     44 #include "WebFileUtilities.h"
     45 #include "WebFrameClient.h"
     46 #include "WebFrameImpl.h"
     47 #include "WebIDBKey.h"
     48 #include "WebImage.h"
     49 #include "WebKit.h"
     50 #include "WebKitClient.h"
     51 #include "WebMimeRegistry.h"
     52 #include "WebPluginContainerImpl.h"
     53 #include "WebPluginListBuilderImpl.h"
     54 #include "WebSandboxSupport.h"
     55 #include "WebSerializedScriptValue.h"
     56 #include "WebScreenInfo.h"
     57 #include "WebString.h"
     58 #include "WebURL.h"
     59 #include "WebVector.h"
     60 #include "WebViewClient.h"
     61 #include "WebViewImpl.h"
     62 #include "WebWorkerClientImpl.h"
     63 
     64 #if USE(CG)
     65 #include <CoreGraphics/CGContext.h>
     66 #endif
     67 
     68 #if OS(WINDOWS)
     69 #include "WebRect.h"
     70 #include "win/WebThemeEngine.h"
     71 #endif
     72 
     73 #if OS(LINUX) || OS(FREEBSD)
     74 #include "linux/WebThemeEngine.h"
     75 #include "WebFontInfo.h"
     76 #include "WebFontRenderStyle.h"
     77 #endif
     78 
     79 #if OS(DARWIN)
     80 #include "mac/WebThemeEngine.h"
     81 #endif
     82 
     83 #if WEBKIT_USING_SKIA
     84 #include "NativeImageSkia.h"
     85 #endif
     86 
     87 #include "BitmapImage.h"
     88 #include "Cookie.h"
     89 #include "FrameView.h"
     90 #include "GraphicsContext.h"
     91 #include "IDBFactoryBackendProxy.h"
     92 #include "KURL.h"
     93 #include "NotImplemented.h"
     94 #include "PlatformContextSkia.h"
     95 #include "PluginData.h"
     96 #include "SharedBuffer.h"
     97 
     98 #include "Worker.h"
     99 #include "WorkerContextProxy.h"
    100 #include <wtf/Assertions.h>
    101 
    102 // We are part of the WebKit implementation.
    103 using namespace WebKit;
    104 
    105 namespace WebCore {
    106 
    107 static WebWidgetClient* toWebWidgetClient(Widget* widget)
    108 {
    109     if (!widget)
    110         return 0;
    111 
    112     FrameView* view;
    113     if (widget->isFrameView())
    114         view = static_cast<FrameView*>(widget);
    115     else if (widget->parent() && widget->parent()->isFrameView())
    116         view = static_cast<FrameView*>(widget->parent());
    117     else
    118         return 0;
    119 
    120     Page* page = view->frame() ? view->frame()->page() : 0;
    121     if (!page)
    122         return 0;
    123 
    124     void* webView = page->chrome()->client()->webView();
    125     if (!webView)
    126         return 0;
    127 
    128     return static_cast<WebViewImpl*>(webView)->client();
    129 }
    130 
    131 static WebCookieJar* getCookieJar(const Document* document)
    132 {
    133     WebFrameImpl* frameImpl = WebFrameImpl::fromFrame(document->frame());
    134     if (!frameImpl || !frameImpl->client())
    135         return 0;
    136     WebCookieJar* cookieJar = frameImpl->client()->cookieJar(frameImpl);
    137     if (!cookieJar)
    138         cookieJar = webKitClient()->cookieJar();
    139     return cookieJar;
    140 }
    141 
    142 // Cache ----------------------------------------------------------------------
    143 
    144 void PlatformBridge::cacheMetadata(const KURL& url, double responseTime, const Vector<char>& data)
    145 {
    146     webKitClient()->cacheMetadata(url, responseTime, data.data(), data.size());
    147 }
    148 
    149 // Clipboard ------------------------------------------------------------------
    150 
    151 bool PlatformBridge::clipboardIsFormatAvailable(
    152     PasteboardPrivate::ClipboardFormat format,
    153     PasteboardPrivate::ClipboardBuffer buffer)
    154 {
    155     return webKitClient()->clipboard()->isFormatAvailable(
    156         static_cast<WebClipboard::Format>(format),
    157         static_cast<WebClipboard::Buffer>(buffer));
    158 }
    159 
    160 String PlatformBridge::clipboardReadPlainText(
    161     PasteboardPrivate::ClipboardBuffer buffer)
    162 {
    163     return webKitClient()->clipboard()->readPlainText(
    164         static_cast<WebClipboard::Buffer>(buffer));
    165 }
    166 
    167 void PlatformBridge::clipboardReadHTML(
    168     PasteboardPrivate::ClipboardBuffer buffer,
    169     String* htmlText, KURL* sourceURL)
    170 {
    171     WebURL url;
    172     *htmlText = webKitClient()->clipboard()->readHTML(
    173         static_cast<WebClipboard::Buffer>(buffer), &url);
    174     *sourceURL = url;
    175 }
    176 
    177 PassRefPtr<SharedBuffer> PlatformBridge::clipboardReadImage(
    178     PasteboardPrivate::ClipboardBuffer buffer)
    179 {
    180     return webKitClient()->clipboard()->readImage(static_cast<WebClipboard::Buffer>(buffer));
    181 }
    182 
    183 void PlatformBridge::clipboardWriteSelection(const String& htmlText,
    184                                              const KURL& sourceURL,
    185                                              const String& plainText,
    186                                              bool writeSmartPaste)
    187 {
    188     webKitClient()->clipboard()->writeHTML(
    189         htmlText, sourceURL, plainText, writeSmartPaste);
    190 }
    191 
    192 void PlatformBridge::clipboardWritePlainText(const String& plainText)
    193 {
    194     webKitClient()->clipboard()->writePlainText(plainText);
    195 }
    196 
    197 void PlatformBridge::clipboardWriteURL(const KURL& url, const String& title)
    198 {
    199     webKitClient()->clipboard()->writeURL(url, title);
    200 }
    201 
    202 void PlatformBridge::clipboardWriteImage(NativeImagePtr image,
    203                                          const KURL& sourceURL,
    204                                          const String& title)
    205 {
    206 #if WEBKIT_USING_SKIA
    207     WebImage webImage(*image);
    208 #else
    209     WebImage webImage(image);
    210 #endif
    211     webKitClient()->clipboard()->writeImage(webImage, sourceURL, title);
    212 }
    213 
    214 void PlatformBridge::clipboardWriteData(const String& type,
    215                                         const String& data,
    216                                         const String& metadata)
    217 {
    218     webKitClient()->clipboard()->writeData(type, data, metadata);
    219 }
    220 
    221 HashSet<String> PlatformBridge::clipboardReadAvailableTypes(
    222     PasteboardPrivate::ClipboardBuffer buffer, bool* containsFilenames)
    223 {
    224     WebVector<WebString> result = webKitClient()->clipboard()->readAvailableTypes(
    225         static_cast<WebClipboard::Buffer>(buffer), containsFilenames);
    226     HashSet<String> types;
    227     for (size_t i = 0; i < result.size(); ++i)
    228         types.add(result[i]);
    229     return types;
    230 }
    231 
    232 bool PlatformBridge::clipboardReadData(PasteboardPrivate::ClipboardBuffer buffer,
    233                                        const String& type, String& data, String& metadata)
    234 {
    235     WebString resultData;
    236     WebString resultMetadata;
    237     bool succeeded = webKitClient()->clipboard()->readData(
    238         static_cast<WebClipboard::Buffer>(buffer), type, &resultData, &resultMetadata);
    239     if (succeeded) {
    240         data = resultData;
    241         metadata = resultMetadata;
    242     }
    243     return succeeded;
    244 }
    245 
    246 Vector<String> PlatformBridge::clipboardReadFilenames(PasteboardPrivate::ClipboardBuffer buffer)
    247 {
    248     WebVector<WebString> result = webKitClient()->clipboard()->readFilenames(
    249         static_cast<WebClipboard::Buffer>(buffer));
    250     Vector<String> convertedResult;
    251     for (size_t i = 0; i < result.size(); ++i)
    252         convertedResult.append(result[i]);
    253     return convertedResult;
    254 }
    255 
    256 // Cookies --------------------------------------------------------------------
    257 
    258 void PlatformBridge::setCookies(const Document* document, const KURL& url,
    259                                 const String& value)
    260 {
    261     WebCookieJar* cookieJar = getCookieJar(document);
    262     if (cookieJar)
    263         cookieJar->setCookie(url, document->firstPartyForCookies(), value);
    264 }
    265 
    266 String PlatformBridge::cookies(const Document* document, const KURL& url)
    267 {
    268     String result;
    269     WebCookieJar* cookieJar = getCookieJar(document);
    270     if (cookieJar)
    271         result = cookieJar->cookies(url, document->firstPartyForCookies());
    272     return result;
    273 }
    274 
    275 String PlatformBridge::cookieRequestHeaderFieldValue(const Document* document,
    276                                                      const KURL& url)
    277 {
    278     String result;
    279     WebCookieJar* cookieJar = getCookieJar(document);
    280     if (cookieJar)
    281         result = cookieJar->cookieRequestHeaderFieldValue(url, document->firstPartyForCookies());
    282     return result;
    283 }
    284 
    285 bool PlatformBridge::rawCookies(const Document* document, const KURL& url, Vector<Cookie>& rawCookies)
    286 {
    287     rawCookies.clear();
    288     WebVector<WebCookie> webCookies;
    289 
    290     WebCookieJar* cookieJar = getCookieJar(document);
    291     if (cookieJar)
    292         cookieJar->rawCookies(url, document->firstPartyForCookies(), webCookies);
    293 
    294     for (unsigned i = 0; i < webCookies.size(); ++i) {
    295         const WebCookie& webCookie = webCookies[i];
    296         Cookie cookie(webCookie.name,
    297                       webCookie.value,
    298                       webCookie.domain,
    299                       webCookie.path,
    300                       webCookie.expires,
    301                       webCookie.httpOnly,
    302                       webCookie.secure,
    303                       webCookie.session);
    304         rawCookies.append(cookie);
    305     }
    306     return true;
    307 }
    308 
    309 void PlatformBridge::deleteCookie(const Document* document, const KURL& url, const String& cookieName)
    310 {
    311     WebCookieJar* cookieJar = getCookieJar(document);
    312     if (cookieJar)
    313         cookieJar->deleteCookie(url, cookieName);
    314 }
    315 
    316 bool PlatformBridge::cookiesEnabled(const Document* document)
    317 {
    318     bool result = false;
    319     WebCookieJar* cookieJar = getCookieJar(document);
    320     if (cookieJar)
    321         result = cookieJar->cookiesEnabled(document->cookieURL(), document->firstPartyForCookies());
    322     return result;
    323 }
    324 
    325 // DNS ------------------------------------------------------------------------
    326 
    327 void PlatformBridge::prefetchDNS(const String& hostname)
    328 {
    329     webKitClient()->prefetchHostName(hostname);
    330 }
    331 
    332 // File ------------------------------------------------------------------------
    333 
    334 bool PlatformBridge::fileExists(const String& path)
    335 {
    336     return webKitClient()->fileUtilities()->fileExists(path);
    337 }
    338 
    339 bool PlatformBridge::deleteFile(const String& path)
    340 {
    341     return webKitClient()->fileUtilities()->deleteFile(path);
    342 }
    343 
    344 bool PlatformBridge::deleteEmptyDirectory(const String& path)
    345 {
    346     return webKitClient()->fileUtilities()->deleteEmptyDirectory(path);
    347 }
    348 
    349 bool PlatformBridge::getFileSize(const String& path, long long& result)
    350 {
    351     return webKitClient()->fileUtilities()->getFileSize(path, result);
    352 }
    353 
    354 void PlatformBridge::revealFolderInOS(const String& path)
    355 {
    356     webKitClient()->fileUtilities()->revealFolderInOS(path);
    357 }
    358 
    359 bool PlatformBridge::getFileModificationTime(const String& path, time_t& result)
    360 {
    361     double modificationTime;
    362     if (!webKitClient()->fileUtilities()->getFileModificationTime(path, modificationTime))
    363         return false;
    364     result = static_cast<time_t>(modificationTime);
    365     return true;
    366 }
    367 
    368 String PlatformBridge::directoryName(const String& path)
    369 {
    370     return webKitClient()->fileUtilities()->directoryName(path);
    371 }
    372 
    373 String PlatformBridge::pathByAppendingComponent(const String& path, const String& component)
    374 {
    375     return webKitClient()->fileUtilities()->pathByAppendingComponent(path, component);
    376 }
    377 
    378 bool PlatformBridge::makeAllDirectories(const String& path)
    379 {
    380     return webKitClient()->fileUtilities()->makeAllDirectories(path);
    381 }
    382 
    383 String PlatformBridge::getAbsolutePath(const String& path)
    384 {
    385     return webKitClient()->fileUtilities()->getAbsolutePath(path);
    386 }
    387 
    388 bool PlatformBridge::isDirectory(const String& path)
    389 {
    390     return webKitClient()->fileUtilities()->isDirectory(path);
    391 }
    392 
    393 KURL PlatformBridge::filePathToURL(const String& path)
    394 {
    395     return webKitClient()->fileUtilities()->filePathToURL(path);
    396 }
    397 
    398 PlatformFileHandle PlatformBridge::openFile(const String& path, FileOpenMode mode)
    399 {
    400     return webKitClient()->fileUtilities()->openFile(path, mode);
    401 }
    402 
    403 void PlatformBridge::closeFile(PlatformFileHandle& handle)
    404 {
    405     webKitClient()->fileUtilities()->closeFile(handle);
    406 }
    407 
    408 long long PlatformBridge::seekFile(PlatformFileHandle handle, long long offset, FileSeekOrigin origin)
    409 {
    410     return webKitClient()->fileUtilities()->seekFile(handle, offset, origin);
    411 }
    412 
    413 bool PlatformBridge::truncateFile(PlatformFileHandle handle, long long offset)
    414 {
    415     return webKitClient()->fileUtilities()->truncateFile(handle, offset);
    416 }
    417 
    418 int PlatformBridge::readFromFile(PlatformFileHandle handle, char* data, int length)
    419 {
    420     return webKitClient()->fileUtilities()->readFromFile(handle, data, length);
    421 }
    422 
    423 int PlatformBridge::writeToFile(PlatformFileHandle handle, const char* data, int length)
    424 {
    425     return webKitClient()->fileUtilities()->writeToFile(handle, data, length);
    426 }
    427 
    428 // Font -----------------------------------------------------------------------
    429 
    430 #if OS(WINDOWS)
    431 bool PlatformBridge::ensureFontLoaded(HFONT font)
    432 {
    433     WebSandboxSupport* ss = webKitClient()->sandboxSupport();
    434 
    435     // if there is no sandbox, then we can assume the font
    436     // was able to be loaded successfully already
    437     return ss ? ss->ensureFontLoaded(font) : true;
    438 }
    439 #endif
    440 
    441 #if OS(LINUX) || OS(FREEBSD)
    442 String PlatformBridge::getFontFamilyForCharacters(const UChar* characters, size_t numCharacters, const char* preferredLocale)
    443 {
    444     if (webKitClient()->sandboxSupport())
    445         return webKitClient()->sandboxSupport()->getFontFamilyForCharacters(characters, numCharacters, preferredLocale);
    446 
    447     WebCString family = WebFontInfo::familyForChars(characters, numCharacters, preferredLocale);
    448     if (family.data())
    449         return WebString::fromUTF8(family.data());
    450 
    451     return WebString();
    452 }
    453 
    454 void PlatformBridge::getRenderStyleForStrike(const char* font, int sizeAndStyle, FontRenderStyle* result)
    455 {
    456     WebFontRenderStyle style;
    457 
    458     if (webKitClient()->sandboxSupport())
    459         webKitClient()->sandboxSupport()->getRenderStyleForStrike(font, sizeAndStyle, &style);
    460     else
    461         WebFontInfo::renderStyleForStrike(font, sizeAndStyle, &style);
    462 
    463     style.toFontRenderStyle(result);
    464 }
    465 #endif
    466 
    467 #if OS(DARWIN)
    468 bool PlatformBridge::loadFont(NSFont* srcFont, ATSFontContainerRef* out)
    469 {
    470     WebSandboxSupport* ss = webKitClient()->sandboxSupport();
    471     if (ss)
    472         return ss->loadFont(srcFont, out);
    473 
    474     // This function should only be called in response to an error loading a
    475     // font due to being blocked by the sandbox.
    476     // This by definition shouldn't happen if there is no sandbox support.
    477     ASSERT_NOT_REACHED();
    478     *out = 0;
    479     return false;
    480 }
    481 #endif
    482 
    483 // Databases ------------------------------------------------------------------
    484 
    485 PlatformFileHandle PlatformBridge::databaseOpenFile(const String& vfsFileName, int desiredFlags)
    486 {
    487     return webKitClient()->databaseOpenFile(WebString(vfsFileName), desiredFlags);
    488 }
    489 
    490 int PlatformBridge::databaseDeleteFile(const String& vfsFileName, bool syncDir)
    491 {
    492     return webKitClient()->databaseDeleteFile(WebString(vfsFileName), syncDir);
    493 }
    494 
    495 long PlatformBridge::databaseGetFileAttributes(const String& vfsFileName)
    496 {
    497     return webKitClient()->databaseGetFileAttributes(WebString(vfsFileName));
    498 }
    499 
    500 long long PlatformBridge::databaseGetFileSize(const String& vfsFileName)
    501 {
    502     return webKitClient()->databaseGetFileSize(WebString(vfsFileName));
    503 }
    504 
    505 // Indexed Database -----------------------------------------------------------
    506 
    507 PassRefPtr<IDBFactoryBackendInterface> PlatformBridge::idbFactory()
    508 {
    509     // There's no reason why we need to allocate a new proxy each time, but
    510     // there's also no strong reason not to.
    511     return IDBFactoryBackendProxy::create();
    512 }
    513 
    514 void PlatformBridge::createIDBKeysFromSerializedValuesAndKeyPath(const Vector<RefPtr<SerializedScriptValue> >& values, const String& keyPath, Vector<RefPtr<IDBKey> >& keys)
    515 {
    516     WebVector<WebSerializedScriptValue> webValues = values;
    517     WebVector<WebIDBKey> webKeys;
    518     webKitClient()->createIDBKeysFromSerializedValuesAndKeyPath(webValues, keyPath, webKeys);
    519 
    520     size_t webKeysSize = webKeys.size();
    521     keys.reserveCapacity(webKeysSize);
    522     for (size_t i = 0; i < webKeysSize; ++i)
    523         keys.append(PassRefPtr<IDBKey>(webKeys[i]));
    524 }
    525 
    526 PassRefPtr<SerializedScriptValue> PlatformBridge::injectIDBKeyIntoSerializedValue(PassRefPtr<IDBKey> key, PassRefPtr<SerializedScriptValue> value, const String& keyPath)
    527 {
    528     return webKitClient()->injectIDBKeyIntoSerializedValue(key, value, keyPath);
    529 }
    530 
    531 // Keygen ---------------------------------------------------------------------
    532 
    533 String PlatformBridge::signedPublicKeyAndChallengeString(
    534     unsigned keySizeIndex, const String& challenge, const KURL& url)
    535 {
    536     return webKitClient()->signedPublicKeyAndChallengeString(keySizeIndex,
    537                                                              WebString(challenge),
    538                                                              WebURL(url));
    539 }
    540 
    541 // Language -------------------------------------------------------------------
    542 
    543 String PlatformBridge::computedDefaultLanguage()
    544 {
    545     return webKitClient()->defaultLocale();
    546 }
    547 
    548 // LayoutTestMode -------------------------------------------------------------
    549 
    550 bool PlatformBridge::layoutTestMode()
    551 {
    552     return WebKit::layoutTestMode();
    553 }
    554 
    555 // MimeType -------------------------------------------------------------------
    556 
    557 bool PlatformBridge::isSupportedImageMIMEType(const String& mimeType)
    558 {
    559     return webKitClient()->mimeRegistry()->supportsImageMIMEType(mimeType)
    560         != WebMimeRegistry::IsNotSupported;
    561 }
    562 
    563 bool PlatformBridge::isSupportedJavaScriptMIMEType(const String& mimeType)
    564 {
    565     return webKitClient()->mimeRegistry()->supportsJavaScriptMIMEType(mimeType)
    566         != WebMimeRegistry::IsNotSupported;
    567 }
    568 
    569 bool PlatformBridge::isSupportedNonImageMIMEType(const String& mimeType)
    570 {
    571     return webKitClient()->mimeRegistry()->supportsNonImageMIMEType(mimeType)
    572         != WebMimeRegistry::IsNotSupported;
    573 }
    574 
    575 String PlatformBridge::mimeTypeForExtension(const String& extension)
    576 {
    577     return webKitClient()->mimeRegistry()->mimeTypeForExtension(extension);
    578 }
    579 
    580 String PlatformBridge::mimeTypeFromFile(const String& path)
    581 {
    582     return webKitClient()->mimeRegistry()->mimeTypeFromFile(path);
    583 }
    584 
    585 String PlatformBridge::preferredExtensionForMIMEType(const String& mimeType)
    586 {
    587     return webKitClient()->mimeRegistry()->preferredExtensionForMIMEType(mimeType);
    588 }
    589 
    590 // Plugin ---------------------------------------------------------------------
    591 
    592 bool PlatformBridge::plugins(bool refresh, Vector<PluginInfo>* results)
    593 {
    594     WebPluginListBuilderImpl builder(results);
    595     webKitClient()->getPluginList(refresh, &builder);
    596     return true;  // FIXME: There is no need for this function to return a value.
    597 }
    598 
    599 NPObject* PlatformBridge::pluginScriptableObject(Widget* widget)
    600 {
    601     if (!widget || !widget->isPluginContainer())
    602         return 0;
    603 
    604     return static_cast<WebPluginContainerImpl*>(widget)->scriptableObject();
    605 }
    606 
    607 // Resources ------------------------------------------------------------------
    608 
    609 PassRefPtr<Image> PlatformBridge::loadPlatformImageResource(const char* name)
    610 {
    611     const WebData& resource = webKitClient()->loadResource(name);
    612     if (resource.isEmpty())
    613         return Image::nullImage();
    614 
    615     RefPtr<Image> image = BitmapImage::create();
    616     image->setData(resource, true);
    617     return image;
    618 }
    619 
    620 #if ENABLE(WEB_AUDIO)
    621 
    622 PassOwnPtr<AudioBus> PlatformBridge::loadPlatformAudioResource(const char* name, double sampleRate)
    623 {
    624     const WebData& resource = webKitClient()->loadResource(name);
    625     if (resource.isEmpty())
    626         return 0;
    627 
    628     return decodeAudioFileData(resource.data(), resource.size(), sampleRate);
    629 }
    630 
    631 PassOwnPtr<AudioBus> PlatformBridge::decodeAudioFileData(const char* data, size_t size, double sampleRate)
    632 {
    633     WebAudioBus webAudioBus;
    634     if (webKitClient()->loadAudioResource(&webAudioBus, data, size, sampleRate))
    635         return webAudioBus.release();
    636     return 0;
    637 }
    638 
    639 #endif // ENABLE(WEB_AUDIO)
    640 
    641 // Sandbox --------------------------------------------------------------------
    642 
    643 bool PlatformBridge::sandboxEnabled()
    644 {
    645     return webKitClient()->sandboxEnabled();
    646 }
    647 
    648 // SharedTimers ---------------------------------------------------------------
    649 
    650 void PlatformBridge::setSharedTimerFiredFunction(void (*func)())
    651 {
    652     webKitClient()->setSharedTimerFiredFunction(func);
    653 }
    654 
    655 void PlatformBridge::setSharedTimerFireTime(double fireTime)
    656 {
    657     webKitClient()->setSharedTimerFireTime(fireTime);
    658 }
    659 
    660 void PlatformBridge::stopSharedTimer()
    661 {
    662     webKitClient()->stopSharedTimer();
    663 }
    664 
    665 // StatsCounters --------------------------------------------------------------
    666 
    667 void PlatformBridge::decrementStatsCounter(const char* name)
    668 {
    669     webKitClient()->decrementStatsCounter(name);
    670 }
    671 
    672 void PlatformBridge::incrementStatsCounter(const char* name)
    673 {
    674     webKitClient()->incrementStatsCounter(name);
    675 }
    676 
    677 void PlatformBridge::histogramCustomCounts(const char* name, int sample, int min, int max, int bucketCount)
    678 {
    679     webKitClient()->histogramCustomCounts(name, sample, min, max, bucketCount);
    680 }
    681 
    682 void PlatformBridge::histogramEnumeration(const char* name, int sample, int boundaryValue)
    683 {
    684     webKitClient()->histogramEnumeration(name, sample, boundaryValue);
    685 }
    686 
    687 // Sudden Termination ---------------------------------------------------------
    688 
    689 void PlatformBridge::suddenTerminationChanged(bool enabled)
    690 {
    691     webKitClient()->suddenTerminationChanged(enabled);
    692 }
    693 
    694 // SystemTime -----------------------------------------------------------------
    695 
    696 double PlatformBridge::currentTime()
    697 {
    698     return webKitClient()->currentTime();
    699 }
    700 
    701 // Theming --------------------------------------------------------------------
    702 
    703 #if OS(WINDOWS)
    704 
    705 void PlatformBridge::paintButton(
    706     GraphicsContext* gc, int part, int state, int classicState,
    707     const IntRect& rect)
    708 {
    709     webKitClient()->themeEngine()->paintButton(
    710         gc->platformContext()->canvas(), part, state, classicState, rect);
    711 }
    712 
    713 void PlatformBridge::paintMenuList(
    714     GraphicsContext* gc, int part, int state, int classicState,
    715     const IntRect& rect)
    716 {
    717     webKitClient()->themeEngine()->paintMenuList(
    718         gc->platformContext()->canvas(), part, state, classicState, rect);
    719 }
    720 
    721 void PlatformBridge::paintScrollbarArrow(
    722     GraphicsContext* gc, int state, int classicState,
    723     const IntRect& rect)
    724 {
    725     webKitClient()->themeEngine()->paintScrollbarArrow(
    726         gc->platformContext()->canvas(), state, classicState, rect);
    727 }
    728 
    729 void PlatformBridge::paintScrollbarThumb(
    730     GraphicsContext* gc, int part, int state, int classicState,
    731     const IntRect& rect)
    732 {
    733     webKitClient()->themeEngine()->paintScrollbarThumb(
    734         gc->platformContext()->canvas(), part, state, classicState, rect);
    735 }
    736 
    737 void PlatformBridge::paintScrollbarTrack(
    738     GraphicsContext* gc, int part, int state, int classicState,
    739     const IntRect& rect, const IntRect& alignRect)
    740 {
    741     webKitClient()->themeEngine()->paintScrollbarTrack(
    742         gc->platformContext()->canvas(), part, state, classicState, rect,
    743         alignRect);
    744 }
    745 
    746 void PlatformBridge::paintSpinButton(
    747     GraphicsContext* gc, int part, int state, int classicState,
    748     const IntRect& rect)
    749 {
    750     webKitClient()->themeEngine()->paintSpinButton(
    751         gc->platformContext()->canvas(), part, state, classicState, rect);
    752 }
    753 
    754 void PlatformBridge::paintTextField(
    755     GraphicsContext* gc, int part, int state, int classicState,
    756     const IntRect& rect, const Color& color, bool fillContentArea,
    757     bool drawEdges)
    758 {
    759     // Fallback to white when |color| is invalid.
    760     RGBA32 backgroundColor = color.isValid() ? color.rgb() : Color::white;
    761 
    762     webKitClient()->themeEngine()->paintTextField(
    763         gc->platformContext()->canvas(), part, state, classicState, rect,
    764         backgroundColor, fillContentArea, drawEdges);
    765 }
    766 
    767 void PlatformBridge::paintTrackbar(
    768     GraphicsContext* gc, int part, int state, int classicState,
    769     const IntRect& rect)
    770 {
    771     webKitClient()->themeEngine()->paintTrackbar(
    772         gc->platformContext()->canvas(), part, state, classicState, rect);
    773 }
    774 
    775 void PlatformBridge::paintProgressBar(
    776     GraphicsContext* gc, const IntRect& barRect, const IntRect& valueRect, bool determinate, double animatedSeconds)
    777 {
    778     webKitClient()->themeEngine()->paintProgressBar(
    779         gc->platformContext()->canvas(), barRect, valueRect, determinate, animatedSeconds);
    780 }
    781 
    782 #elif OS(LINUX)
    783 
    784 static WebThemeEngine::Part WebThemePart(PlatformBridge::ThemePart part)
    785 {
    786     switch (part) {
    787     case PlatformBridge::PartScrollbarDownArrow: return WebThemeEngine::PartScrollbarDownArrow;
    788     case PlatformBridge::PartScrollbarLeftArrow: return WebThemeEngine::PartScrollbarLeftArrow;
    789     case PlatformBridge::PartScrollbarRightArrow: return WebThemeEngine::PartScrollbarRightArrow;
    790     case PlatformBridge::PartScrollbarUpArrow: return WebThemeEngine::PartScrollbarUpArrow;
    791     case PlatformBridge::PartScrollbarHorizontalThumb: return WebThemeEngine::PartScrollbarHorizontalThumb;
    792     case PlatformBridge::PartScrollbarVerticalThumb: return WebThemeEngine::PartScrollbarVerticalThumb;
    793     case PlatformBridge::PartScrollbarHorizontalTrack: return WebThemeEngine::PartScrollbarHorizontalTrack;
    794     case PlatformBridge::PartScrollbarVerticalTrack: return WebThemeEngine::PartScrollbarVerticalTrack;
    795     case PlatformBridge::PartCheckbox: return WebThemeEngine::PartCheckbox;
    796     case PlatformBridge::PartRadio: return WebThemeEngine::PartRadio;
    797     case PlatformBridge::PartButton: return WebThemeEngine::PartButton;
    798     case PlatformBridge::PartTextField: return WebThemeEngine::PartTextField;
    799     case PlatformBridge::PartMenuList: return WebThemeEngine::PartMenuList;
    800     case PlatformBridge::PartSliderTrack: return WebThemeEngine::PartSliderTrack;
    801     case PlatformBridge::PartSliderThumb: return WebThemeEngine::PartSliderThumb;
    802     case PlatformBridge::PartInnerSpinButton: return WebThemeEngine::PartInnerSpinButton;
    803     case PlatformBridge::PartProgressBar: return WebThemeEngine::PartProgressBar;
    804     }
    805     ASSERT_NOT_REACHED();
    806     return WebThemeEngine::PartScrollbarDownArrow;
    807 }
    808 
    809 static WebThemeEngine::State WebThemeState(PlatformBridge::ThemePaintState state)
    810 {
    811     switch (state) {
    812     case PlatformBridge::StateDisabled: return WebThemeEngine::StateDisabled;
    813     case PlatformBridge::StateHover: return WebThemeEngine::StateHover;
    814     case PlatformBridge::StateNormal: return WebThemeEngine::StateNormal;
    815     case PlatformBridge::StatePressed: return WebThemeEngine::StatePressed;
    816     }
    817     ASSERT_NOT_REACHED();
    818     return WebThemeEngine::StateDisabled;
    819 }
    820 
    821 static void GetWebThemeExtraParams(PlatformBridge::ThemePart part, PlatformBridge::ThemePaintState state, const PlatformBridge::ThemePaintExtraParams* extraParams, WebThemeEngine::ExtraParams* webThemeExtraParams)
    822 {
    823     switch (part) {
    824     case PlatformBridge::PartScrollbarHorizontalTrack:
    825     case PlatformBridge::PartScrollbarVerticalTrack:
    826         webThemeExtraParams->scrollbarTrack.trackX = extraParams->scrollbarTrack.trackX;
    827         webThemeExtraParams->scrollbarTrack.trackY = extraParams->scrollbarTrack.trackY;
    828         webThemeExtraParams->scrollbarTrack.trackWidth = extraParams->scrollbarTrack.trackWidth;
    829         webThemeExtraParams->scrollbarTrack.trackHeight = extraParams->scrollbarTrack.trackHeight;
    830         break;
    831     case PlatformBridge::PartCheckbox:
    832         webThemeExtraParams->button.checked = extraParams->button.checked;
    833         webThemeExtraParams->button.indeterminate = extraParams->button.indeterminate;
    834         break;
    835     case PlatformBridge::PartRadio:
    836         webThemeExtraParams->button.checked = extraParams->button.checked;
    837         break;
    838     case PlatformBridge::PartButton:
    839         webThemeExtraParams->button.isDefault = extraParams->button.isDefault;
    840         webThemeExtraParams->button.hasBorder = extraParams->button.hasBorder;
    841         webThemeExtraParams->button.backgroundColor = extraParams->button.backgroundColor;
    842         break;
    843     case PlatformBridge::PartTextField:
    844         webThemeExtraParams->textField.isTextArea = extraParams->textField.isTextArea;
    845         webThemeExtraParams->textField.isListbox = extraParams->textField.isListbox;
    846         webThemeExtraParams->textField.backgroundColor = extraParams->textField.backgroundColor;
    847         break;
    848     case PlatformBridge::PartMenuList:
    849         webThemeExtraParams->menuList.hasBorder = extraParams->menuList.hasBorder;
    850         webThemeExtraParams->menuList.hasBorderRadius = extraParams->menuList.hasBorderRadius;
    851         webThemeExtraParams->menuList.arrowX = extraParams->menuList.arrowX;
    852         webThemeExtraParams->menuList.arrowY = extraParams->menuList.arrowY;
    853         webThemeExtraParams->menuList.backgroundColor = extraParams->menuList.backgroundColor;
    854         break;
    855     case PlatformBridge::PartSliderTrack:
    856     case PlatformBridge::PartSliderThumb:
    857         webThemeExtraParams->slider.vertical = extraParams->slider.vertical;
    858         webThemeExtraParams->slider.inDrag = extraParams->slider.inDrag;
    859         break;
    860     case PlatformBridge::PartInnerSpinButton:
    861         webThemeExtraParams->innerSpin.spinUp = extraParams->innerSpin.spinUp;
    862         webThemeExtraParams->innerSpin.readOnly = extraParams->innerSpin.readOnly;
    863         break;
    864     case PlatformBridge::PartProgressBar:
    865         webThemeExtraParams->progressBar.determinate = extraParams->progressBar.determinate;
    866         webThemeExtraParams->progressBar.valueRectX = extraParams->progressBar.valueRectX;
    867         webThemeExtraParams->progressBar.valueRectY = extraParams->progressBar.valueRectY;
    868         webThemeExtraParams->progressBar.valueRectWidth = extraParams->progressBar.valueRectWidth;
    869         webThemeExtraParams->progressBar.valueRectHeight = extraParams->progressBar.valueRectHeight;
    870         break;
    871     default:
    872         break; // Parts that have no extra params get here.
    873     }
    874 }
    875 
    876 IntSize PlatformBridge::getThemePartSize(ThemePart part)
    877 {
    878      return webKitClient()->themeEngine()->getSize(WebThemePart(part));
    879 }
    880 
    881 void PlatformBridge::paintThemePart(
    882     GraphicsContext* gc, ThemePart part, ThemePaintState state, const IntRect& rect, const ThemePaintExtraParams* extraParams)
    883 {
    884     WebThemeEngine::ExtraParams webThemeExtraParams;
    885     GetWebThemeExtraParams(part, state, extraParams, &webThemeExtraParams);
    886     webKitClient()->themeEngine()->paint(
    887         gc->platformContext()->canvas(), WebThemePart(part), WebThemeState(state), rect, &webThemeExtraParams);
    888 }
    889 
    890 #elif OS(DARWIN)
    891 
    892 void PlatformBridge::paintScrollbarThumb(
    893     GraphicsContext* gc, ThemePaintState state, ThemePaintSize size, const IntRect& rect, const ThemePaintScrollbarInfo& scrollbarInfo)
    894 {
    895     WebThemeEngine::ScrollbarInfo webThemeScrollbarInfo;
    896 
    897     webThemeScrollbarInfo.orientation = static_cast<WebThemeEngine::ScrollbarOrientation>(scrollbarInfo.orientation);
    898     webThemeScrollbarInfo.parent = static_cast<WebThemeEngine::ScrollbarParent>(scrollbarInfo.parent);
    899     webThemeScrollbarInfo.maxValue = scrollbarInfo.maxValue;
    900     webThemeScrollbarInfo.currentValue = scrollbarInfo.currentValue;
    901     webThemeScrollbarInfo.visibleSize = scrollbarInfo.visibleSize;
    902     webThemeScrollbarInfo.totalSize = scrollbarInfo.totalSize;
    903 
    904     webKitClient()->themeEngine()->paintScrollbarThumb(
    905         gc->platformContext(),
    906         static_cast<WebThemeEngine::State>(state),
    907         static_cast<WebThemeEngine::Size>(size),
    908         rect,
    909         webThemeScrollbarInfo);
    910 }
    911 
    912 #endif
    913 
    914 // Trace Event ----------------------------------------------------------------
    915 
    916 void PlatformBridge::traceEventBegin(const char* name, void* id, const char* extra)
    917 {
    918     webKitClient()->traceEventBegin(name, id, extra);
    919 }
    920 
    921 void PlatformBridge::traceEventEnd(const char* name, void* id, const char* extra)
    922 {
    923     webKitClient()->traceEventEnd(name, id, extra);
    924 }
    925 
    926 // Visited Links --------------------------------------------------------------
    927 
    928 LinkHash PlatformBridge::visitedLinkHash(const UChar* url, unsigned length)
    929 {
    930     url_canon::RawCanonOutput<2048> buffer;
    931     url_parse::Parsed parsed;
    932     if (!url_util::Canonicalize(url, length, 0, &buffer, &parsed))
    933         return 0;  // Invalid URLs are unvisited.
    934     return webKitClient()->visitedLinkHash(buffer.data(), buffer.length());
    935 }
    936 
    937 LinkHash PlatformBridge::visitedLinkHash(const KURL& base,
    938                                          const AtomicString& attributeURL)
    939 {
    940     // Resolve the relative URL using googleurl and pass the absolute URL up to
    941     // the embedder. We could create a GURL object from the base and resolve
    942     // the relative URL that way, but calling the lower-level functions
    943     // directly saves us the string allocation in most cases.
    944     url_canon::RawCanonOutput<2048> buffer;
    945     url_parse::Parsed parsed;
    946 
    947 #if USE(GOOGLEURL)
    948     const CString& cstr = base.utf8String();
    949     const char* data = cstr.data();
    950     int length = cstr.length();
    951     const url_parse::Parsed& srcParsed = base.parsed();
    952 #else
    953     // When we're not using GoogleURL, first canonicalize it so we can resolve it
    954     // below.
    955     url_canon::RawCanonOutput<2048> srcCanon;
    956     url_parse::Parsed srcParsed;
    957     String str = base.string();
    958     if (!url_util::Canonicalize(str.characters(), str.length(), 0, &srcCanon, &srcParsed))
    959         return 0;
    960     const char* data = srcCanon.data();
    961     int length = srcCanon.length();
    962 #endif
    963 
    964     if (!url_util::ResolveRelative(data, length, srcParsed, attributeURL.characters(),
    965                                    attributeURL.length(), 0, &buffer, &parsed))
    966         return 0;  // Invalid resolved URL.
    967 
    968     return webKitClient()->visitedLinkHash(buffer.data(), buffer.length());
    969 }
    970 
    971 bool PlatformBridge::isLinkVisited(LinkHash visitedLinkHash)
    972 {
    973     return webKitClient()->isLinkVisited(visitedLinkHash);
    974 }
    975 
    976 // These are temporary methods that the WebKit layer can use to call to the
    977 // Glue layer. Once the Glue layer moves entirely into the WebKit layer, these
    978 // methods will be deleted.
    979 
    980 void PlatformBridge::notifyJSOutOfMemory(Frame* frame)
    981 {
    982     if (!frame)
    983         return;
    984 
    985     WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame);
    986     if (!webFrame->client())
    987         return;
    988     webFrame->client()->didExhaustMemoryAvailableForScript(webFrame);
    989 }
    990 
    991 int PlatformBridge::memoryUsageMB()
    992 {
    993     return static_cast<int>(webKitClient()->memoryUsageMB());
    994 }
    995 
    996 int PlatformBridge::actualMemoryUsageMB()
    997 {
    998     return static_cast<int>(webKitClient()->actualMemoryUsageMB());
    999 }
   1000 
   1001 int PlatformBridge::screenDepth(Widget* widget)
   1002 {
   1003     WebWidgetClient* client = toWebWidgetClient(widget);
   1004     if (!client)
   1005         return 0;
   1006     return client->screenInfo().depth;
   1007 }
   1008 
   1009 int PlatformBridge::screenDepthPerComponent(Widget* widget)
   1010 {
   1011     WebWidgetClient* client = toWebWidgetClient(widget);
   1012     if (!client)
   1013         return 0;
   1014     return client->screenInfo().depthPerComponent;
   1015 }
   1016 
   1017 bool PlatformBridge::screenIsMonochrome(Widget* widget)
   1018 {
   1019     WebWidgetClient* client = toWebWidgetClient(widget);
   1020     if (!client)
   1021         return 0;
   1022     return client->screenInfo().isMonochrome;
   1023 }
   1024 
   1025 IntRect PlatformBridge::screenRect(Widget* widget)
   1026 {
   1027     WebWidgetClient* client = toWebWidgetClient(widget);
   1028     if (!client)
   1029         return IntRect();
   1030     return client->screenInfo().rect;
   1031 }
   1032 
   1033 IntRect PlatformBridge::screenAvailableRect(Widget* widget)
   1034 {
   1035     WebWidgetClient* client = toWebWidgetClient(widget);
   1036     if (!client)
   1037         return IntRect();
   1038     return client->screenInfo().availableRect;
   1039 }
   1040 
   1041 bool PlatformBridge::popupsAllowed(NPP npp)
   1042 {
   1043     // FIXME: Give the embedder a way to control this.
   1044     return false;
   1045 }
   1046 
   1047 WorkerContextProxy* WorkerContextProxy::create(Worker* worker)
   1048 {
   1049     return WebWorkerClientImpl::createWorkerContextProxy(worker);
   1050 }
   1051 
   1052 } // namespace WebCore
   1053