Home | History | Annotate | Download | only in WebCoreSupport
      1 /*
      2  * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
      3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     24  * THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #include "config.h"
     28 #include "WebChromeClient.h"
     29 
     30 #include "DrawingArea.h"
     31 #include "InjectedBundleNavigationAction.h"
     32 #include "InjectedBundleUserMessageCoders.h"
     33 #include "WebContextMenu.h"
     34 #include "WebCoreArgumentCoders.h"
     35 #include "WebFrame.h"
     36 #include "WebFrameLoaderClient.h"
     37 #include "WebFullScreenManager.h"
     38 #include "WebOpenPanelParameters.h"
     39 #include "WebOpenPanelResultListener.h"
     40 #include "WebPage.h"
     41 #include "WebPageCreationParameters.h"
     42 #include "WebPageProxyMessages.h"
     43 #include "WebPopupMenu.h"
     44 #include "WebPreferencesStore.h"
     45 #include "WebProcess.h"
     46 #include "WebSearchPopupMenu.h"
     47 #include <WebCore/DatabaseTracker.h>
     48 #include <WebCore/FileChooser.h>
     49 #include <WebCore/Frame.h>
     50 #include <WebCore/FrameLoader.h>
     51 #include <WebCore/FrameView.h>
     52 #include <WebCore/HTMLNames.h>
     53 #include <WebCore/HTMLPlugInImageElement.h>
     54 #include <WebCore/Icon.h>
     55 #include <WebCore/NotImplemented.h>
     56 #include <WebCore/Page.h>
     57 #include <WebCore/SecurityOrigin.h>
     58 
     59 using namespace WebCore;
     60 using namespace HTMLNames;
     61 
     62 namespace WebKit {
     63 
     64 static double area(WebFrame* frame)
     65 {
     66     IntSize size = frame->visibleContentBoundsExcludingScrollbars().size();
     67     return static_cast<double>(size.height()) * size.width();
     68 }
     69 
     70 
     71 static WebFrame* findLargestFrameInFrameSet(WebPage* page)
     72 {
     73     // Approximate what a user could consider a default target frame for application menu operations.
     74 
     75     WebFrame* mainFrame = page->mainFrame();
     76     if (!mainFrame->isFrameSet())
     77         return 0;
     78 
     79     WebFrame* largestSoFar = 0;
     80 
     81     RefPtr<ImmutableArray> frameChildren = mainFrame->childFrames();
     82     size_t count = frameChildren->size();
     83     for (size_t i = 0; i < count; ++i) {
     84         WebFrame* childFrame = frameChildren->at<WebFrame>(i);
     85         if (!largestSoFar || area(childFrame) > area(largestSoFar))
     86             largestSoFar = childFrame;
     87     }
     88 
     89     return largestSoFar;
     90 }
     91 
     92 void WebChromeClient::chromeDestroyed()
     93 {
     94     delete this;
     95 }
     96 
     97 void WebChromeClient::setWindowRect(const FloatRect& windowFrame)
     98 {
     99     m_page->send(Messages::WebPageProxy::SetWindowFrame(windowFrame));
    100 }
    101 
    102 FloatRect WebChromeClient::windowRect()
    103 {
    104     FloatRect newWindowFrame;
    105 
    106     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetWindowFrame(), Messages::WebPageProxy::GetWindowFrame::Reply(newWindowFrame), m_page->pageID()))
    107         return FloatRect();
    108 
    109     return newWindowFrame;
    110 }
    111 
    112 FloatRect WebChromeClient::pageRect()
    113 {
    114     return FloatRect(FloatPoint(), m_page->size());
    115 }
    116 
    117 float WebChromeClient::scaleFactor()
    118 {
    119     return m_page->userSpaceScaleFactor();
    120 }
    121 
    122 void WebChromeClient::focus()
    123 {
    124     m_page->send(Messages::WebPageProxy::SetFocus(true));
    125 }
    126 
    127 void WebChromeClient::unfocus()
    128 {
    129     m_page->send(Messages::WebPageProxy::SetFocus(false));
    130 }
    131 
    132 bool WebChromeClient::canTakeFocus(FocusDirection)
    133 {
    134     notImplemented();
    135     return true;
    136 }
    137 
    138 void WebChromeClient::takeFocus(FocusDirection direction)
    139 {
    140     m_page->send(Messages::WebPageProxy::TakeFocus(direction));
    141 }
    142 
    143 void WebChromeClient::focusedNodeChanged(Node*)
    144 {
    145     notImplemented();
    146 }
    147 
    148 void WebChromeClient::focusedFrameChanged(Frame* frame)
    149 {
    150     WebFrame* webFrame = frame ? static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame() : 0;
    151 
    152     WebProcess::shared().connection()->send(Messages::WebPageProxy::FocusedFrameChanged(webFrame ? webFrame->frameID() : 0), m_page->pageID());
    153 }
    154 
    155 Page* WebChromeClient::createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures& windowFeatures, const NavigationAction& navigationAction)
    156 {
    157     uint32_t modifiers = static_cast<uint32_t>(InjectedBundleNavigationAction::modifiersForNavigationAction(navigationAction));
    158     int32_t mouseButton = static_cast<int32_t>(InjectedBundleNavigationAction::mouseButtonForNavigationAction(navigationAction));
    159 
    160     uint64_t newPageID = 0;
    161     WebPageCreationParameters parameters;
    162     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::CreateNewPage(windowFeatures, modifiers, mouseButton), Messages::WebPageProxy::CreateNewPage::Reply(newPageID, parameters), m_page->pageID()))
    163         return 0;
    164 
    165     if (!newPageID)
    166         return 0;
    167 
    168     WebProcess::shared().createWebPage(newPageID, parameters);
    169     return WebProcess::shared().webPage(newPageID)->corePage();
    170 }
    171 
    172 void WebChromeClient::show()
    173 {
    174     m_page->show();
    175 }
    176 
    177 bool WebChromeClient::canRunModal()
    178 {
    179     return m_page->canRunModal();
    180 }
    181 
    182 void WebChromeClient::runModal()
    183 {
    184     m_page->runModal();
    185 }
    186 
    187 void WebChromeClient::setToolbarsVisible(bool toolbarsAreVisible)
    188 {
    189     m_page->send(Messages::WebPageProxy::SetToolbarsAreVisible(toolbarsAreVisible));
    190 }
    191 
    192 bool WebChromeClient::toolbarsVisible()
    193 {
    194     bool toolbarsAreVisible = true;
    195     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetToolbarsAreVisible(), Messages::WebPageProxy::GetToolbarsAreVisible::Reply(toolbarsAreVisible), m_page->pageID()))
    196         return true;
    197 
    198     return toolbarsAreVisible;
    199 }
    200 
    201 void WebChromeClient::setStatusbarVisible(bool statusBarIsVisible)
    202 {
    203     m_page->send(Messages::WebPageProxy::SetStatusBarIsVisible(statusBarIsVisible));
    204 }
    205 
    206 bool WebChromeClient::statusbarVisible()
    207 {
    208     bool statusBarIsVisible = true;
    209     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetStatusBarIsVisible(), Messages::WebPageProxy::GetStatusBarIsVisible::Reply(statusBarIsVisible), m_page->pageID()))
    210         return true;
    211 
    212     return statusBarIsVisible;
    213 }
    214 
    215 void WebChromeClient::setScrollbarsVisible(bool)
    216 {
    217     notImplemented();
    218 }
    219 
    220 bool WebChromeClient::scrollbarsVisible()
    221 {
    222     notImplemented();
    223     return true;
    224 }
    225 
    226 void WebChromeClient::setMenubarVisible(bool menuBarVisible)
    227 {
    228     m_page->send(Messages::WebPageProxy::SetMenuBarIsVisible(menuBarVisible));
    229 }
    230 
    231 bool WebChromeClient::menubarVisible()
    232 {
    233     bool menuBarIsVisible = true;
    234     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::GetMenuBarIsVisible(), Messages::WebPageProxy::GetMenuBarIsVisible::Reply(menuBarIsVisible), m_page->pageID()))
    235         return true;
    236 
    237     return menuBarIsVisible;
    238 }
    239 
    240 void WebChromeClient::setResizable(bool resizable)
    241 {
    242     m_page->send(Messages::WebPageProxy::SetIsResizable(resizable));
    243 }
    244 
    245 void WebChromeClient::addMessageToConsole(MessageSource, MessageType, MessageLevel, const String& message, unsigned int lineNumber, const String& sourceID)
    246 {
    247     // Notify the bundle client.
    248     m_page->injectedBundleUIClient().willAddMessageToConsole(m_page, message, lineNumber);
    249 
    250     notImplemented();
    251 }
    252 
    253 bool WebChromeClient::canRunBeforeUnloadConfirmPanel()
    254 {
    255     return m_page->canRunBeforeUnloadConfirmPanel();
    256 }
    257 
    258 bool WebChromeClient::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
    259 {
    260     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    261 
    262     bool shouldClose = false;
    263     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunBeforeUnloadConfirmPanel(message, webFrame->frameID()), Messages::WebPageProxy::RunBeforeUnloadConfirmPanel::Reply(shouldClose), m_page->pageID()))
    264         return false;
    265 
    266     return shouldClose;
    267 }
    268 
    269 void WebChromeClient::closeWindowSoon()
    270 {
    271     // FIXME: This code assumes that the client will respond to a close page
    272     // message by actually closing the page. Safari does this, but there is
    273     // no guarantee that other applications will, which will leave this page
    274     // half detached. This approach is an inherent limitation making parts of
    275     // a close execute synchronously as part of window.close, but other parts
    276     // later on.
    277 
    278     m_page->corePage()->setGroupName(String());
    279 
    280     if (WebFrame* frame = m_page->mainFrame()) {
    281         if (Frame* coreFrame = frame->coreFrame())
    282             coreFrame->loader()->stopForUserCancel();
    283     }
    284 
    285     m_page->sendClose();
    286 }
    287 
    288 void WebChromeClient::runJavaScriptAlert(Frame* frame, const String& alertText)
    289 {
    290     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    291 
    292     // Notify the bundle client.
    293     m_page->injectedBundleUIClient().willRunJavaScriptAlert(m_page, alertText, webFrame);
    294 
    295     WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptAlert(webFrame->frameID(), alertText), Messages::WebPageProxy::RunJavaScriptAlert::Reply(), m_page->pageID());
    296 }
    297 
    298 bool WebChromeClient::runJavaScriptConfirm(Frame* frame, const String& message)
    299 {
    300     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    301 
    302     // Notify the bundle client.
    303     m_page->injectedBundleUIClient().willRunJavaScriptConfirm(m_page, message, webFrame);
    304 
    305     bool result = false;
    306     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptConfirm(webFrame->frameID(), message), Messages::WebPageProxy::RunJavaScriptConfirm::Reply(result), m_page->pageID()))
    307         return false;
    308 
    309     return result;
    310 }
    311 
    312 bool WebChromeClient::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
    313 {
    314     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    315 
    316     // Notify the bundle client.
    317     m_page->injectedBundleUIClient().willRunJavaScriptPrompt(m_page, message, defaultValue, webFrame);
    318 
    319     if (!WebProcess::shared().connection()->sendSync(Messages::WebPageProxy::RunJavaScriptPrompt(webFrame->frameID(), message, defaultValue), Messages::WebPageProxy::RunJavaScriptPrompt::Reply(result), m_page->pageID()))
    320         return false;
    321 
    322     return !result.isNull();
    323 }
    324 
    325 void WebChromeClient::setStatusbarText(const String& statusbarText)
    326 {
    327     // Notify the bundle client.
    328     m_page->injectedBundleUIClient().willSetStatusbarText(m_page, statusbarText);
    329 
    330     m_page->send(Messages::WebPageProxy::SetStatusText(statusbarText));
    331 }
    332 
    333 bool WebChromeClient::shouldInterruptJavaScript()
    334 {
    335     notImplemented();
    336     return false;
    337 }
    338 
    339 KeyboardUIMode WebChromeClient::keyboardUIMode()
    340 {
    341     return m_page->keyboardUIMode();
    342 }
    343 
    344 IntRect WebChromeClient::windowResizerRect() const
    345 {
    346     return m_page->windowResizerRect();
    347 }
    348 
    349 void WebChromeClient::invalidateWindow(const IntRect&, bool)
    350 {
    351     // Do nothing here, there's no concept of invalidating the window in the web process.
    352 }
    353 
    354 void WebChromeClient::invalidateContentsAndWindow(const IntRect& rect, bool)
    355 {
    356     if (m_page->corePage()->mainFrame()->document()->printing())
    357         return;
    358     m_page->drawingArea()->setNeedsDisplay(rect);
    359 }
    360 
    361 void WebChromeClient::invalidateContentsForSlowScroll(const IntRect& rect, bool)
    362 {
    363     if (m_page->corePage()->mainFrame()->document()->printing())
    364         return;
    365     m_page->pageDidScroll();
    366     m_page->drawingArea()->setNeedsDisplay(rect);
    367 }
    368 
    369 void WebChromeClient::scroll(const IntSize& scrollOffset, const IntRect& scrollRect, const IntRect& clipRect)
    370 {
    371     m_page->pageDidScroll();
    372     m_page->drawingArea()->scroll(intersection(scrollRect, clipRect), scrollOffset);
    373 }
    374 
    375 #if ENABLE(TILED_BACKING_STORE)
    376 void WebChromeClient::delegatedScrollRequested(const IntPoint& scrollOffset)
    377 {
    378     m_page->pageDidRequestScroll(scrollOffset);
    379 }
    380 #endif
    381 
    382 IntPoint WebChromeClient::screenToWindow(const IntPoint&) const
    383 {
    384     notImplemented();
    385     return IntPoint();
    386 }
    387 
    388 IntRect WebChromeClient::windowToScreen(const IntRect& rect) const
    389 {
    390     return m_page->windowToScreen(rect);
    391 }
    392 
    393 PlatformPageClient WebChromeClient::platformPageClient() const
    394 {
    395     notImplemented();
    396     return 0;
    397 }
    398 
    399 void WebChromeClient::contentsSizeChanged(Frame* frame, const IntSize& size) const
    400 {
    401 #if PLATFORM(QT)
    402 #if ENABLE(TILED_BACKING_STORE)
    403     if (frame->page()->mainFrame() == frame)
    404         m_page->resizeToContentsIfNeeded();
    405 #endif
    406 
    407     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    408 
    409     if (!m_page->mainFrame() || m_page->mainFrame() != webFrame)
    410         return;
    411 
    412     m_page->send(Messages::WebPageProxy::DidChangeContentsSize(size));
    413 #endif
    414 
    415     WebFrame* largestFrame = findLargestFrameInFrameSet(m_page);
    416     if (largestFrame != m_cachedFrameSetLargestFrame.get()) {
    417         m_cachedFrameSetLargestFrame = largestFrame;
    418         m_page->send(Messages::WebPageProxy::FrameSetLargestFrameChanged(largestFrame ? largestFrame->frameID() : 0));
    419     }
    420 
    421     if (frame->page()->mainFrame() != frame)
    422         return;
    423     FrameView* frameView = frame->view();
    424     if (!frameView)
    425         return;
    426 
    427     bool hasHorizontalScrollbar = frameView->horizontalScrollbar();
    428     bool hasVerticalScrollbar = frameView->verticalScrollbar();
    429 
    430     if (hasHorizontalScrollbar != m_cachedMainFrameHasHorizontalScrollbar || hasVerticalScrollbar != m_cachedMainFrameHasVerticalScrollbar) {
    431         m_page->send(Messages::WebPageProxy::DidChangeScrollbarsForMainFrame(hasHorizontalScrollbar, hasVerticalScrollbar));
    432 
    433         m_cachedMainFrameHasHorizontalScrollbar = hasHorizontalScrollbar;
    434         m_cachedMainFrameHasVerticalScrollbar = hasVerticalScrollbar;
    435     }
    436 }
    437 
    438 void WebChromeClient::scrollRectIntoView(const IntRect&, const ScrollView*) const
    439 {
    440     notImplemented();
    441 }
    442 
    443 bool WebChromeClient::shouldMissingPluginMessageBeButton() const
    444 {
    445     // FIXME: <rdar://problem/8794397> We should only return true when there is a
    446     // missingPluginButtonClicked callback defined on the Page UI client.
    447     return true;
    448 }
    449 
    450 void WebChromeClient::missingPluginButtonClicked(Element* element) const
    451 {
    452     ASSERT(element->hasTagName(objectTag) || element->hasTagName(embedTag));
    453 
    454     HTMLPlugInImageElement* pluginElement = static_cast<HTMLPlugInImageElement*>(element);
    455 
    456     m_page->send(Messages::WebPageProxy::MissingPluginButtonClicked(pluginElement->serviceType(), pluginElement->url(), pluginElement->getAttribute(pluginspageAttr)));
    457 }
    458 
    459 void WebChromeClient::scrollbarsModeDidChange() const
    460 {
    461     notImplemented();
    462 }
    463 
    464 void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& hitTestResult, unsigned modifierFlags)
    465 {
    466     RefPtr<APIObject> userData;
    467 
    468     // Notify the bundle client.
    469     m_page->injectedBundleUIClient().mouseDidMoveOverElement(m_page, hitTestResult, static_cast<WebEvent::Modifiers>(modifierFlags), userData);
    470 
    471     // Notify the UIProcess.
    472     m_page->send(Messages::WebPageProxy::MouseDidMoveOverElement(modifierFlags, InjectedBundleUserMessageEncoder(userData.get())));
    473 }
    474 
    475 void WebChromeClient::setToolTip(const String& toolTip, TextDirection)
    476 {
    477     // Only send a tool tip to the WebProcess if it has changed since the last time this function was called.
    478 
    479     if (toolTip == m_cachedToolTip)
    480         return;
    481     m_cachedToolTip = toolTip;
    482 
    483     m_page->send(Messages::WebPageProxy::SetToolTip(m_cachedToolTip));
    484 }
    485 
    486 void WebChromeClient::print(Frame* frame)
    487 {
    488     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    489     m_page->sendSync(Messages::WebPageProxy::PrintFrame(webFrame->frameID()), Messages::WebPageProxy::PrintFrame::Reply());
    490 }
    491 
    492 #if ENABLE(DATABASE)
    493 void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName)
    494 {
    495     WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
    496     SecurityOrigin* origin = frame->document()->securityOrigin();
    497 
    498     DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(databaseName, origin);
    499     uint64_t currentQuota = DatabaseTracker::tracker().quotaForOrigin(origin);
    500     uint64_t newQuota = 0;
    501     WebProcess::shared().connection()->sendSync(
    502         Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), databaseName, details.displayName(), currentQuota, details.currentUsage(), details.expectedUsage()),
    503         Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page->pageID());
    504 
    505     DatabaseTracker::tracker().setQuota(origin, newQuota);
    506 }
    507 #endif
    508 
    509 
    510 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
    511 void WebChromeClient::reachedMaxAppCacheSize(int64_t)
    512 {
    513     notImplemented();
    514 }
    515 
    516 void WebChromeClient::reachedApplicationCacheOriginQuota(SecurityOrigin*)
    517 {
    518     notImplemented();
    519 }
    520 #endif
    521 
    522 #if ENABLE(DASHBOARD_SUPPORT)
    523 void WebChromeClient::dashboardRegionsChanged()
    524 {
    525     notImplemented();
    526 }
    527 #endif
    528 
    529 void WebChromeClient::populateVisitedLinks()
    530 {
    531 }
    532 
    533 FloatRect WebChromeClient::customHighlightRect(Node*, const AtomicString& type, const FloatRect& lineRect)
    534 {
    535     notImplemented();
    536     return FloatRect();
    537 }
    538 
    539 void WebChromeClient::paintCustomHighlight(Node*, const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect,
    540                                   bool behindText, bool entireLine)
    541 {
    542     notImplemented();
    543 }
    544 
    545 bool WebChromeClient::shouldReplaceWithGeneratedFileForUpload(const String& path, String& generatedFilename)
    546 {
    547     generatedFilename = m_page->injectedBundleUIClient().shouldGenerateFileForUpload(m_page, path);
    548     return !generatedFilename.isNull();
    549 }
    550 
    551 String WebChromeClient::generateReplacementFile(const String& path)
    552 {
    553     return m_page->injectedBundleUIClient().generateFileForUpload(m_page, path);
    554 }
    555 
    556 bool WebChromeClient::paintCustomScrollbar(GraphicsContext*, const FloatRect&, ScrollbarControlSize,
    557                                            ScrollbarControlState, ScrollbarPart pressedPart, bool vertical,
    558                                            float value, float proportion, ScrollbarControlPartMask)
    559 {
    560     notImplemented();
    561     return false;
    562 }
    563 
    564 bool WebChromeClient::paintCustomScrollCorner(GraphicsContext*, const FloatRect&)
    565 {
    566     notImplemented();
    567     return false;
    568 }
    569 
    570 bool WebChromeClient::paintCustomOverhangArea(GraphicsContext* context, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect)
    571 {
    572     if (!m_page->injectedBundleUIClient().shouldPaintCustomOverhangArea())
    573         return false;
    574 
    575     m_page->injectedBundleUIClient().paintCustomOverhangArea(m_page, context, horizontalOverhangArea, verticalOverhangArea, dirtyRect);
    576     return true;
    577 }
    578 
    579 void WebChromeClient::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
    580 {
    581     notImplemented();
    582 }
    583 
    584 void WebChromeClient::cancelGeolocationPermissionRequestForFrame(Frame*, Geolocation*)
    585 {
    586     notImplemented();
    587 }
    588 
    589 void WebChromeClient::runOpenPanel(Frame* frame, PassRefPtr<FileChooser> prpFileChooser)
    590 {
    591     if (m_page->activeOpenPanelResultListener())
    592         return;
    593 
    594     RefPtr<FileChooser> fileChooser = prpFileChooser;
    595 
    596     m_page->setActiveOpenPanelResultListener(WebOpenPanelResultListener::create(m_page, fileChooser.get()));
    597 
    598     WebOpenPanelParameters::Data parameters;
    599     parameters.allowMultipleFiles = fileChooser->allowsMultipleFiles();
    600 #if ENABLE(DIRECTORY_UPLOAD)
    601     parameters.allowsDirectoryUpload = fileChooser->allowsDirectoryUpload();
    602 #else
    603     parameters.allowsDirectoryUpload = false;
    604 #endif
    605     parameters.acceptTypes = fileChooser->acceptTypes();
    606     parameters.filenames = fileChooser->filenames();
    607 
    608     m_page->send(Messages::WebPageProxy::RunOpenPanel(static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame()->frameID(), parameters));
    609 }
    610 
    611 void WebChromeClient::chooseIconForFiles(const Vector<String>& filenames, FileChooser* chooser)
    612 {
    613     chooser->iconLoaded(Icon::createIconForFiles(filenames));
    614 }
    615 
    616 void WebChromeClient::setCursor(const WebCore::Cursor& cursor)
    617 {
    618 #if USE(LAZY_NATIVE_CURSOR)
    619     m_page->send(Messages::WebPageProxy::SetCursor(cursor));
    620 #endif
    621 }
    622 
    623 void WebChromeClient::formStateDidChange(const Node*)
    624 {
    625     notImplemented();
    626 }
    627 
    628 void WebChromeClient::formDidFocus(const Node*)
    629 {
    630     notImplemented();
    631 }
    632 
    633 void WebChromeClient::formDidBlur(const Node*)
    634 {
    635     notImplemented();
    636 }
    637 
    638 bool WebChromeClient::selectItemWritingDirectionIsNatural()
    639 {
    640 #if PLATFORM(WIN)
    641     return true;
    642 #else
    643     return false;
    644 #endif
    645 }
    646 
    647 bool WebChromeClient::selectItemAlignmentFollowsMenuWritingDirection()
    648 {
    649 #if PLATFORM(WIN)
    650     return false;
    651 #else
    652     return true;
    653 #endif
    654 }
    655 
    656 PassRefPtr<WebCore::PopupMenu> WebChromeClient::createPopupMenu(WebCore::PopupMenuClient* client) const
    657 {
    658     return WebPopupMenu::create(m_page, client);
    659 }
    660 
    661 PassRefPtr<WebCore::SearchPopupMenu> WebChromeClient::createSearchPopupMenu(WebCore::PopupMenuClient* client) const
    662 {
    663     return WebSearchPopupMenu::create(m_page, client);
    664 }
    665 
    666 #if ENABLE(CONTEXT_MENUS)
    667 void WebChromeClient::showContextMenu()
    668 {
    669     m_page->contextMenu()->show();
    670 }
    671 #endif
    672 
    673 #if USE(ACCELERATED_COMPOSITING)
    674 void WebChromeClient::attachRootGraphicsLayer(Frame*, GraphicsLayer* layer)
    675 {
    676     if (layer)
    677         m_page->enterAcceleratedCompositingMode(layer);
    678     else
    679         m_page->exitAcceleratedCompositingMode();
    680 }
    681 
    682 void WebChromeClient::setNeedsOneShotDrawingSynchronization()
    683 {
    684     notImplemented();
    685 }
    686 
    687 void WebChromeClient::scheduleCompositingLayerSync()
    688 {
    689     if (m_page->drawingArea())
    690         m_page->drawingArea()->scheduleCompositingLayerSync();
    691 }
    692 
    693 #endif
    694 
    695 #if ENABLE(NOTIFICATIONS)
    696 WebCore::NotificationPresenter* WebChromeClient::notificationPresenter() const
    697 {
    698     return 0;
    699 }
    700 #endif
    701 
    702 #if ENABLE(TOUCH_EVENTS)
    703 void WebChromeClient::needTouchEvents(bool)
    704 {
    705 }
    706 #endif
    707 
    708 #if PLATFORM(WIN)
    709 void WebChromeClient::setLastSetCursorToCurrentCursor()
    710 {
    711 }
    712 #endif
    713 
    714 #if ENABLE(FULLSCREEN_API)
    715 bool WebChromeClient::supportsFullScreenForElement(const WebCore::Element* element, bool withKeyboard)
    716 {
    717     return m_page->fullScreenManager()->supportsFullScreen(withKeyboard);
    718 }
    719 
    720 void WebChromeClient::enterFullScreenForElement(WebCore::Element* element)
    721 {
    722     m_page->fullScreenManager()->enterFullScreenForElement(element);
    723 }
    724 
    725 void WebChromeClient::exitFullScreenForElement(WebCore::Element* element)
    726 {
    727     m_page->fullScreenManager()->exitFullScreenForElement(element);
    728 }
    729 
    730 void WebChromeClient::setRootFullScreenLayer(GraphicsLayer* layer)
    731 {
    732     m_page->fullScreenManager()->setRootFullScreenLayer(layer);
    733 }
    734 
    735 #endif
    736 
    737 void WebChromeClient::dispatchViewportDataDidChange(const ViewportArguments& args) const
    738 {
    739     m_page->send(Messages::WebPageProxy::DidChangeViewportData(args));
    740 }
    741 
    742 void WebChromeClient::didCompleteRubberBandForMainFrame(const IntSize& initialOverhang) const
    743 {
    744     m_page->send(Messages::WebPageProxy::DidCompleteRubberBandForMainFrame(initialOverhang));
    745 }
    746 
    747 } // namespace WebKit
    748