Home | History | Annotate | Download | only in WebKitSupport
      1 /*
      2  * Copyright (C) 2007 Kevin Ollivier <kevino (at) theolliviers.com>
      3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
      4  *
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     21  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     24  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #include "config.h"
     30 #include "ChromeClientWx.h"
     31 #include "Console.h"
     32 #if ENABLE(DATABASE)
     33 #include "DatabaseTracker.h"
     34 #endif
     35 #include "FileChooser.h"
     36 #include "FloatRect.h"
     37 #include "Frame.h"
     38 #include "FrameLoadRequest.h"
     39 #include "Icon.h"
     40 #include "NavigationAction.h"
     41 #include "NotImplemented.h"
     42 #include "PlatformString.h"
     43 #include "SecurityOrigin.h"
     44 #include "PopupMenuWx.h"
     45 #include "SearchPopupMenuWx.h"
     46 #include "WindowFeatures.h"
     47 
     48 #include <stdio.h>
     49 
     50 #include <wx/wxprec.h>
     51 #ifndef WX_PRECOMP
     52     #include <wx/wx.h>
     53 #endif
     54 #include <wx/textdlg.h>
     55 #include <wx/tooltip.h>
     56 
     57 #include "WebBrowserShell.h"
     58 #include "WebView.h"
     59 #include "WebViewPrivate.h"
     60 
     61 namespace WebCore {
     62 
     63 wxWebKitWindowFeatures wkFeaturesforWindowFeatures(const WindowFeatures& features)
     64 {
     65     wxWebKitWindowFeatures wkFeatures;
     66     wkFeatures.menuBarVisible = features.menuBarVisible;
     67     wkFeatures.statusBarVisible = features.statusBarVisible;
     68     wkFeatures.toolBarVisible = features.toolBarVisible;
     69     wkFeatures.locationBarVisible = features.locationBarVisible;
     70     wkFeatures.scrollbarsVisible = features.scrollbarsVisible;
     71     wkFeatures.resizable = features.resizable;
     72     wkFeatures.fullscreen = features.fullscreen;
     73     wkFeatures.dialog = features.dialog;
     74 
     75     return wkFeatures;
     76 }
     77 
     78 ChromeClientWx::ChromeClientWx(wxWebView* webView)
     79 {
     80     m_webView = webView;
     81 }
     82 
     83 ChromeClientWx::~ChromeClientWx()
     84 {
     85 }
     86 
     87 void ChromeClientWx::chromeDestroyed()
     88 {
     89     notImplemented();
     90 }
     91 
     92 void ChromeClientWx::setWindowRect(const FloatRect&)
     93 {
     94     notImplemented();
     95 }
     96 
     97 FloatRect ChromeClientWx::windowRect()
     98 {
     99     notImplemented();
    100     return FloatRect();
    101 }
    102 
    103 FloatRect ChromeClientWx::pageRect()
    104 {
    105     notImplemented();
    106     return FloatRect();
    107 }
    108 
    109 float ChromeClientWx::scaleFactor()
    110 {
    111     notImplemented();
    112     return 1.0;
    113 }
    114 
    115 void ChromeClientWx::focus()
    116 {
    117     notImplemented();
    118 }
    119 
    120 void ChromeClientWx::unfocus()
    121 {
    122     notImplemented();
    123 }
    124 
    125 bool ChromeClientWx::canTakeFocus(FocusDirection)
    126 {
    127     notImplemented();
    128     return false;
    129 }
    130 
    131 void ChromeClientWx::takeFocus(FocusDirection)
    132 {
    133     notImplemented();
    134 }
    135 
    136 void ChromeClientWx::focusedNodeChanged(Node*)
    137 {
    138 }
    139 
    140 void ChromeClientWx::focusedFrameChanged(Frame*)
    141 {
    142 }
    143 
    144 Page* ChromeClientWx::createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures& features, const NavigationAction&)
    145 {
    146     Page* myPage = 0;
    147     wxWebViewNewWindowEvent wkEvent(m_webView);
    148 
    149     wxWebKitWindowFeatures wkFeatures = wkFeaturesforWindowFeatures(features);
    150     wkEvent.SetWindowFeatures(wkFeatures);
    151 
    152     if (m_webView->GetEventHandler()->ProcessEvent(wkEvent)) {
    153         if (wxWebView* webView = wkEvent.GetWebView()) {
    154             WebViewPrivate* impl = webView->m_impl;
    155             if (impl)
    156                 myPage = impl->page;
    157         }
    158     }
    159 
    160     return myPage;
    161 }
    162 
    163 Page* ChromeClientWx::createModalDialog(Frame*, const FrameLoadRequest&)
    164 {
    165     notImplemented();
    166     return 0;
    167 }
    168 
    169 void ChromeClientWx::show()
    170 {
    171     notImplemented();
    172 }
    173 
    174 bool ChromeClientWx::canRunModal()
    175 {
    176     notImplemented();
    177     return false;
    178 }
    179 
    180 void ChromeClientWx::runModal()
    181 {
    182     notImplemented();
    183 }
    184 
    185 void ChromeClientWx::setToolbarsVisible(bool)
    186 {
    187     notImplemented();
    188 }
    189 
    190 bool ChromeClientWx::toolbarsVisible()
    191 {
    192     notImplemented();
    193     return false;
    194 }
    195 
    196 void ChromeClientWx::setStatusbarVisible(bool)
    197 {
    198     notImplemented();
    199 }
    200 
    201 bool ChromeClientWx::statusbarVisible()
    202 {
    203     notImplemented();
    204     return false;
    205 }
    206 
    207 void ChromeClientWx::setScrollbarsVisible(bool)
    208 {
    209     notImplemented();
    210 }
    211 
    212 bool ChromeClientWx::scrollbarsVisible()
    213 {
    214     notImplemented();
    215     return false;
    216 }
    217 
    218 void ChromeClientWx::setMenubarVisible(bool)
    219 {
    220     notImplemented();
    221 }
    222 
    223 bool ChromeClientWx::menubarVisible()
    224 {
    225     notImplemented();
    226     return false;
    227 }
    228 
    229 void ChromeClientWx::setResizable(bool)
    230 {
    231     notImplemented();
    232 }
    233 
    234 void ChromeClientWx::addMessageToConsole(MessageSource source,
    235                                           MessageType type,
    236                                           MessageLevel level,
    237                                           const String& message,
    238                                           unsigned int lineNumber,
    239                                           const String& sourceID)
    240 {
    241     if (m_webView) {
    242         wxWebViewConsoleMessageEvent wkEvent(m_webView);
    243         wkEvent.SetMessage(message);
    244         wkEvent.SetLineNumber(lineNumber);
    245         wkEvent.SetSourceID(sourceID);
    246         wkEvent.SetLevel(static_cast<wxWebViewConsoleMessageLevel>(level));
    247         m_webView->GetEventHandler()->ProcessEvent(wkEvent);
    248     }
    249 }
    250 
    251 bool ChromeClientWx::canRunBeforeUnloadConfirmPanel()
    252 {
    253     notImplemented();
    254     return true;
    255 }
    256 
    257 bool ChromeClientWx::runBeforeUnloadConfirmPanel(const String& string,
    258                                                   Frame* frame)
    259 {
    260     wxMessageDialog dialog(NULL, string, wxT("Confirm Action?"), wxYES_NO);
    261     return dialog.ShowModal() == wxYES;
    262 }
    263 
    264 void ChromeClientWx::closeWindowSoon()
    265 {
    266     notImplemented();
    267 }
    268 
    269 /*
    270     Sites for testing prompts:
    271     Alert - just type in a bad web address or http://www.htmlite.com/JS002.php
    272     Prompt - http://www.htmlite.com/JS007.php
    273     Confirm - http://www.htmlite.com/JS006.php
    274 */
    275 
    276 void ChromeClientWx::runJavaScriptAlert(Frame* frame, const String& string)
    277 {
    278     if (m_webView) {
    279         wxWebViewAlertEvent wkEvent(m_webView);
    280         wkEvent.SetMessage(string);
    281         if (!m_webView->GetEventHandler()->ProcessEvent(wkEvent))
    282             wxMessageBox(string, wxT("JavaScript Alert"), wxOK);
    283     }
    284 }
    285 
    286 bool ChromeClientWx::runJavaScriptConfirm(Frame* frame, const String& string)
    287 {
    288     bool result = false;
    289     if (m_webView) {
    290         wxWebViewConfirmEvent wkEvent(m_webView);
    291         wkEvent.SetMessage(string);
    292         if (m_webView->GetEventHandler()->ProcessEvent(wkEvent))
    293             result = wkEvent.GetReturnCode() == wxID_YES;
    294         else {
    295             wxMessageDialog dialog(NULL, string, wxT("JavaScript Confirm"), wxYES_NO);
    296             dialog.Centre();
    297             result = (dialog.ShowModal() == wxID_YES);
    298         }
    299     }
    300     return result;
    301 }
    302 
    303 bool ChromeClientWx::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
    304 {
    305     if (m_webView) {
    306         wxWebViewPromptEvent wkEvent(m_webView);
    307         wkEvent.SetMessage(message);
    308         wkEvent.SetResponse(defaultValue);
    309         if (m_webView->GetEventHandler()->ProcessEvent(wkEvent)) {
    310             result = wkEvent.GetResponse();
    311             return true;
    312         }
    313         else {
    314             wxTextEntryDialog dialog(NULL, message, wxT("JavaScript Prompt"), wxEmptyString, wxOK | wxCANCEL);
    315             dialog.Centre();
    316             if (dialog.ShowModal() == wxID_OK) {
    317                 result = dialog.GetValue();
    318                 return true;
    319             }
    320         }
    321     }
    322     return false;
    323 }
    324 
    325 void ChromeClientWx::setStatusbarText(const String&)
    326 {
    327     notImplemented();
    328 }
    329 
    330 bool ChromeClientWx::shouldInterruptJavaScript()
    331 {
    332     notImplemented();
    333     return false;
    334 }
    335 
    336 KeyboardUIMode ChromeClientWx::keyboardUIMode()
    337 {
    338     notImplemented();
    339     return KeyboardAccessDefault;
    340 }
    341 
    342 IntRect ChromeClientWx::windowResizerRect() const
    343 {
    344     notImplemented();
    345     return IntRect();
    346 }
    347 
    348 void ChromeClientWx::invalidateWindow(const IntRect& rect, bool immediate)
    349 {
    350     if (immediate)
    351         m_webView->Update();
    352 }
    353 
    354 void ChromeClientWx::invalidateContentsForSlowScroll(const IntRect& rect, bool immediate)
    355 {
    356     invalidateContentsAndWindow(rect, immediate);
    357 }
    358 
    359 void ChromeClientWx::invalidateContentsAndWindow(const IntRect& rect, bool immediate)
    360 {
    361     if (!m_webView)
    362         return;
    363 
    364     m_webView->RefreshRect(rect);
    365 
    366     if (immediate) {
    367         m_webView->Update();
    368     }
    369 }
    370 
    371 IntRect ChromeClientWx::windowToScreen(const IntRect& rect) const
    372 {
    373     notImplemented();
    374     return rect;
    375 }
    376 
    377 IntPoint ChromeClientWx::screenToWindow(const IntPoint& point) const
    378 {
    379     notImplemented();
    380     return point;
    381 }
    382 
    383 PlatformPageClient ChromeClientWx::platformPageClient() const
    384 {
    385     return m_webView;
    386 }
    387 
    388 void ChromeClientWx::contentsSizeChanged(Frame*, const IntSize&) const
    389 {
    390     notImplemented();
    391 }
    392 
    393 void ChromeClientWx::scrollBackingStore(int dx, int dy,
    394                     const IntRect& scrollViewRect,
    395                     const IntRect& clipRect)
    396 {
    397     notImplemented();
    398 }
    399 
    400 void ChromeClientWx::updateBackingStore()
    401 {
    402     notImplemented();
    403 }
    404 
    405 void ChromeClientWx::mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags)
    406 {
    407     notImplemented();
    408 }
    409 
    410 void ChromeClientWx::setToolTip(const String& tip, TextDirection)
    411 {
    412     wxToolTip* tooltip = m_webView->GetToolTip();
    413     if (!tooltip || tooltip->GetTip() != wxString(tip))
    414         m_webView->SetToolTip(tip);
    415 }
    416 
    417 void ChromeClientWx::print(Frame*)
    418 {
    419     notImplemented();
    420 }
    421 
    422 #if ENABLE(DATABASE)
    423 void ChromeClientWx::exceededDatabaseQuota(Frame*, const String&)
    424 {
    425     unsigned long long quota = 5 * 1024 * 1024;
    426 
    427     if (wxWebFrame* webFrame = m_webView->GetMainFrame())
    428         if (Frame* frame = webFrame->GetFrame())
    429             if (Document* document = frame->document())
    430                 if (!DatabaseTracker::tracker().hasEntryForOrigin(document->securityOrigin()))
    431                     DatabaseTracker::tracker().setQuota(document->securityOrigin(), quota);
    432 }
    433 #endif
    434 
    435 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
    436 void ChromeClientWx::reachedMaxAppCacheSize(int64_t spaceNeeded)
    437 {
    438     notImplemented();
    439 }
    440 
    441 void ChromeClientWx::reachedApplicationCacheOriginQuota(SecurityOrigin*)
    442 {
    443     notImplemented();
    444 }
    445 #endif
    446 
    447 void ChromeClientWx::scroll(const IntSize&, const IntRect&, const IntRect&)
    448 {
    449     m_webView->Refresh();
    450     notImplemented();
    451 }
    452 
    453 void ChromeClientWx::runOpenPanel(Frame*, PassRefPtr<FileChooser>)
    454 {
    455     notImplemented();
    456 }
    457 
    458 void ChromeClientWx::chooseIconForFiles(const Vector<String>& filenames, FileChooser* chooser)
    459 {
    460     chooser->iconLoaded(Icon::createIconForFiles(filenames));
    461 }
    462 
    463 void ChromeClientWx::setCursor(const Cursor& cursor)
    464 {
    465     if (m_webView && cursor.impl())
    466         m_webView->SetCursor(*cursor.impl());
    467 }
    468 
    469 void ChromeClientWx::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
    470 {
    471     // See the comment in WebCore/page/ChromeClient.h
    472     notImplemented();
    473 }
    474 
    475 bool ChromeClientWx::selectItemWritingDirectionIsNatural()
    476 {
    477     return false;
    478 }
    479 
    480 bool ChromeClientWx::selectItemAlignmentFollowsMenuWritingDirection()
    481 {
    482     return false;
    483 }
    484 
    485 PassRefPtr<PopupMenu> ChromeClientWx::createPopupMenu(PopupMenuClient* client) const
    486 {
    487     return adoptRef(new PopupMenuWx(client));
    488 }
    489 
    490 PassRefPtr<SearchPopupMenu> ChromeClientWx::createSearchPopupMenu(PopupMenuClient* client) const
    491 {
    492     return adoptRef(new SearchPopupMenuWx(client));
    493 }
    494 
    495 }
    496