WebKitTools/DumpRenderTree/win/UIDelegate.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2005, 2006, 2007, 2008 Apple 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
       
     6  * are met:
       
     7  *
       
     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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
       
    14  *     its contributors may be used to endorse or promote products derived
       
    15  *     from this software without specific prior written permission. 
       
    16  *
       
    17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
       
    18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
    19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
       
    20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
       
    21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
       
    22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
       
    23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
       
    24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
       
    26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    27  */
       
    28 
       
    29 #include "config.h"
       
    30 #include "UIDelegate.h"
       
    31 
       
    32 #include "DumpRenderTree.h"
       
    33 #include "DraggingInfo.h"
       
    34 #include "EventSender.h"
       
    35 #include "LayoutTestController.h"
       
    36 #include "DRTDesktopNotificationPresenter.h"
       
    37 
       
    38 #include <WebCore/COMPtr.h>
       
    39 #include <wtf/Platform.h>
       
    40 #include <wtf/Vector.h>
       
    41 #include <JavaScriptCore/Assertions.h>
       
    42 #include <JavaScriptCore/JavaScriptCore.h>
       
    43 #include <WebKit/WebKit.h>
       
    44 #include <stdio.h>
       
    45 
       
    46 using std::wstring;
       
    47 
       
    48 class DRTUndoObject {
       
    49 public:
       
    50     DRTUndoObject(IWebUndoTarget* target, BSTR actionName, IUnknown* obj)
       
    51         : m_target(target)
       
    52         , m_actionName(SysAllocString(actionName))
       
    53         , m_obj(obj)
       
    54     {
       
    55     }
       
    56 
       
    57     ~DRTUndoObject()
       
    58     {
       
    59         SysFreeString(m_actionName);
       
    60     }
       
    61 
       
    62     void invoke()
       
    63     {
       
    64         m_target->invoke(m_actionName, m_obj.get());
       
    65     }
       
    66 
       
    67 private:
       
    68     IWebUndoTarget* m_target;
       
    69     BSTR m_actionName;
       
    70     COMPtr<IUnknown> m_obj;
       
    71 };
       
    72 
       
    73 class DRTUndoStack {
       
    74 public:
       
    75     ~DRTUndoStack() { deleteAllValues(m_undoVector); }
       
    76 
       
    77     bool isEmpty() const { return m_undoVector.isEmpty(); }
       
    78     void clear() { deleteAllValues(m_undoVector); m_undoVector.clear(); }
       
    79 
       
    80     void push(DRTUndoObject* undoObject) { m_undoVector.append(undoObject); }
       
    81     DRTUndoObject* pop() { DRTUndoObject* top = m_undoVector.last(); m_undoVector.removeLast(); return top; }
       
    82 
       
    83 private:
       
    84     Vector<DRTUndoObject*> m_undoVector;
       
    85 };
       
    86 
       
    87 class DRTUndoManager {
       
    88 public:
       
    89     DRTUndoManager();
       
    90 
       
    91     void removeAllActions();
       
    92     void registerUndoWithTarget(IWebUndoTarget* target, BSTR actionName, IUnknown* obj);
       
    93     void redo();
       
    94     void undo();
       
    95     bool canRedo() { return !m_redoStack->isEmpty(); }
       
    96     bool canUndo() { return !m_undoStack->isEmpty(); }
       
    97 
       
    98 private:
       
    99     OwnPtr<DRTUndoStack> m_redoStack;
       
   100     OwnPtr<DRTUndoStack> m_undoStack;
       
   101     bool m_isRedoing;
       
   102     bool m_isUndoing;
       
   103 };
       
   104 
       
   105 DRTUndoManager::DRTUndoManager()
       
   106     : m_redoStack(new DRTUndoStack)
       
   107     , m_undoStack(new DRTUndoStack)
       
   108     , m_isRedoing(false)
       
   109     , m_isUndoing(false)
       
   110 {
       
   111 }
       
   112 
       
   113 void DRTUndoManager::removeAllActions()
       
   114 {
       
   115     m_redoStack->clear();
       
   116     m_undoStack->clear();
       
   117 }
       
   118 
       
   119 void DRTUndoManager::registerUndoWithTarget(IWebUndoTarget* target, BSTR actionName, IUnknown* obj)
       
   120 {
       
   121     if (!m_isUndoing && !m_isRedoing)
       
   122         m_redoStack->clear();
       
   123 
       
   124     DRTUndoStack* stack = m_isUndoing ? m_redoStack.get() : m_undoStack.get();
       
   125     stack->push(new DRTUndoObject(target, actionName, obj));
       
   126 }
       
   127 
       
   128 void DRTUndoManager::redo()
       
   129 {
       
   130     if (!canRedo())
       
   131         return;
       
   132 
       
   133     m_isRedoing = true;
       
   134 
       
   135     DRTUndoObject* redoObject = m_redoStack->pop();
       
   136     redoObject->invoke();
       
   137     delete redoObject;
       
   138 
       
   139     m_isRedoing = false;
       
   140 }
       
   141 
       
   142 void DRTUndoManager::undo()
       
   143 {
       
   144     if (!canUndo())
       
   145         return;
       
   146 
       
   147     m_isUndoing = true;
       
   148 
       
   149     DRTUndoObject* undoObject = m_undoStack->pop();
       
   150     undoObject->invoke();
       
   151     delete undoObject;
       
   152 
       
   153     m_isUndoing = false;
       
   154 }
       
   155 
       
   156 UIDelegate::UIDelegate()
       
   157     : m_refCount(1)
       
   158     , m_undoManager(new DRTUndoManager)
       
   159     , m_desktopNotifications(new DRTDesktopNotificationPresenter)
       
   160 {
       
   161     m_frame.bottom = 0;
       
   162     m_frame.top = 0;
       
   163     m_frame.left = 0;
       
   164     m_frame.right = 0;
       
   165 }
       
   166 
       
   167 void UIDelegate::resetUndoManager()
       
   168 {
       
   169     m_undoManager.set(new DRTUndoManager);
       
   170 }
       
   171 
       
   172 HRESULT STDMETHODCALLTYPE UIDelegate::QueryInterface(REFIID riid, void** ppvObject)
       
   173 {
       
   174     *ppvObject = 0;
       
   175     if (IsEqualGUID(riid, IID_IUnknown))
       
   176         *ppvObject = static_cast<IWebUIDelegate*>(this);
       
   177     else if (IsEqualGUID(riid, IID_IWebUIDelegate))
       
   178         *ppvObject = static_cast<IWebUIDelegate*>(this);
       
   179     else if (IsEqualGUID(riid, IID_IWebUIDelegate2))
       
   180         *ppvObject = static_cast<IWebUIDelegate2*>(this);
       
   181     else if (IsEqualGUID(riid, IID_IWebUIDelegatePrivate))
       
   182         *ppvObject = static_cast<IWebUIDelegatePrivate*>(this);
       
   183     else if (IsEqualGUID(riid, IID_IWebUIDelegatePrivate2))
       
   184         *ppvObject = static_cast<IWebUIDelegatePrivate2*>(this);
       
   185     else if (IsEqualGUID(riid, IID_IWebUIDelegatePrivate3))
       
   186         *ppvObject = static_cast<IWebUIDelegatePrivate3*>(this);
       
   187     else
       
   188         return E_NOINTERFACE;
       
   189 
       
   190     AddRef();
       
   191     return S_OK;
       
   192 }
       
   193 
       
   194 ULONG STDMETHODCALLTYPE UIDelegate::AddRef()
       
   195 {
       
   196     return ++m_refCount;
       
   197 }
       
   198 
       
   199 ULONG STDMETHODCALLTYPE UIDelegate::Release()
       
   200 {
       
   201     ULONG newRef = --m_refCount;
       
   202     if (!newRef)
       
   203         delete(this);
       
   204 
       
   205     return newRef;
       
   206 }
       
   207 
       
   208 HRESULT STDMETHODCALLTYPE UIDelegate::hasCustomMenuImplementation( 
       
   209         /* [retval][out] */ BOOL *hasCustomMenus)
       
   210 {
       
   211     *hasCustomMenus = TRUE;
       
   212 
       
   213     return S_OK;
       
   214 }
       
   215 
       
   216 HRESULT STDMETHODCALLTYPE UIDelegate::trackCustomPopupMenu( 
       
   217         /* [in] */ IWebView *sender,
       
   218         /* [in] */ OLE_HANDLE menu,
       
   219         /* [in] */ LPPOINT point)
       
   220 {
       
   221     // Do nothing
       
   222     return S_OK;
       
   223 }
       
   224 
       
   225 HRESULT STDMETHODCALLTYPE UIDelegate::registerUndoWithTarget(
       
   226         /* [in] */ IWebUndoTarget* target,
       
   227         /* [in] */ BSTR actionName,
       
   228         /* [in] */ IUnknown* actionArg)
       
   229 {
       
   230     m_undoManager->registerUndoWithTarget(target, actionName, actionArg);
       
   231     return S_OK;
       
   232 }
       
   233 
       
   234 HRESULT STDMETHODCALLTYPE UIDelegate::removeAllActionsWithTarget(
       
   235         /* [in] */ IWebUndoTarget*)
       
   236 {
       
   237     m_undoManager->removeAllActions();
       
   238     return S_OK;
       
   239 }
       
   240 
       
   241 HRESULT STDMETHODCALLTYPE UIDelegate::setActionTitle(
       
   242         /* [in] */ BSTR actionTitle)
       
   243 {
       
   244     // It is not neccessary to implement this for DRT because there is
       
   245     // menu to write out the title to.
       
   246     return S_OK;
       
   247 }
       
   248 
       
   249 HRESULT STDMETHODCALLTYPE UIDelegate::undo()
       
   250 {
       
   251     m_undoManager->undo();
       
   252     return S_OK;
       
   253 }
       
   254 
       
   255 HRESULT STDMETHODCALLTYPE UIDelegate::redo()
       
   256 {
       
   257     m_undoManager->redo();
       
   258     return S_OK;
       
   259 }
       
   260 
       
   261 HRESULT STDMETHODCALLTYPE UIDelegate::canUndo(
       
   262         /* [retval][out] */ BOOL* result)
       
   263 {
       
   264     if (!result)
       
   265         return E_POINTER;
       
   266 
       
   267     *result = m_undoManager->canUndo();
       
   268     return S_OK;
       
   269 }
       
   270 
       
   271 HRESULT STDMETHODCALLTYPE UIDelegate::canRedo(
       
   272         /* [retval][out] */ BOOL* result)
       
   273 {
       
   274     if (!result)
       
   275         return E_POINTER;
       
   276 
       
   277     *result = m_undoManager->canRedo();
       
   278     return S_OK;
       
   279 }
       
   280 
       
   281 HRESULT STDMETHODCALLTYPE UIDelegate::printFrame( 
       
   282     /* [in] */ IWebView *webView,
       
   283     /* [in] */ IWebFrame *frame)
       
   284 {
       
   285     return E_NOTIMPL;
       
   286 }
       
   287 
       
   288 HRESULT STDMETHODCALLTYPE UIDelegate::ftpDirectoryTemplatePath( 
       
   289     /* [in] */ IWebView *webView,
       
   290     /* [retval][out] */ BSTR *path)
       
   291 {
       
   292     if (!path)
       
   293         return E_POINTER;
       
   294     *path = 0;
       
   295     return E_NOTIMPL;
       
   296 }
       
   297 
       
   298 
       
   299 HRESULT STDMETHODCALLTYPE UIDelegate::webViewHeaderHeight( 
       
   300     /* [in] */ IWebView *webView,
       
   301     /* [retval][out] */ float *result)
       
   302 {
       
   303     if (!result)
       
   304         return E_POINTER;
       
   305     *result = 0;
       
   306     return E_NOTIMPL;
       
   307 }
       
   308 
       
   309 HRESULT STDMETHODCALLTYPE UIDelegate::webViewFooterHeight( 
       
   310     /* [in] */ IWebView *webView,
       
   311     /* [retval][out] */ float *result)
       
   312 {
       
   313     if (!result)
       
   314         return E_POINTER;
       
   315     *result = 0;
       
   316     return E_NOTIMPL;
       
   317 }
       
   318 
       
   319 HRESULT STDMETHODCALLTYPE UIDelegate::drawHeaderInRect( 
       
   320     /* [in] */ IWebView *webView,
       
   321     /* [in] */ RECT *rect,
       
   322     /* [in] */ OLE_HANDLE drawingContext)
       
   323 {
       
   324     return E_NOTIMPL;
       
   325 }
       
   326 
       
   327 HRESULT STDMETHODCALLTYPE UIDelegate::drawFooterInRect( 
       
   328     /* [in] */ IWebView *webView,
       
   329     /* [in] */ RECT *rect,
       
   330     /* [in] */ OLE_HANDLE drawingContext,
       
   331     /* [in] */ UINT pageIndex,
       
   332     /* [in] */ UINT pageCount)
       
   333 {
       
   334     return E_NOTIMPL;
       
   335 }
       
   336 
       
   337 HRESULT STDMETHODCALLTYPE UIDelegate::webViewPrintingMarginRect( 
       
   338     /* [in] */ IWebView *webView,
       
   339     /* [retval][out] */ RECT *rect)
       
   340 {
       
   341     return E_NOTIMPL;
       
   342 }
       
   343 
       
   344 HRESULT STDMETHODCALLTYPE UIDelegate::canRunModal( 
       
   345     /* [in] */ IWebView *webView,
       
   346     /* [retval][out] */ BOOL *canRunBoolean)
       
   347 {
       
   348     return E_NOTIMPL;
       
   349 }
       
   350 
       
   351 HRESULT STDMETHODCALLTYPE UIDelegate::createModalDialog( 
       
   352     /* [in] */ IWebView *sender,
       
   353     /* [in] */ IWebURLRequest *request,
       
   354     /* [retval][out] */ IWebView **newWebView)
       
   355 {
       
   356     return E_NOTIMPL;
       
   357 }
       
   358 
       
   359 HRESULT STDMETHODCALLTYPE UIDelegate::runModal( 
       
   360     /* [in] */ IWebView *webView)
       
   361 {
       
   362     return E_NOTIMPL;
       
   363 }
       
   364 
       
   365 HRESULT STDMETHODCALLTYPE UIDelegate::isMenuBarVisible( 
       
   366     /* [in] */ IWebView *webView,
       
   367     /* [retval][out] */ BOOL *visible)
       
   368 {
       
   369     if (!visible)
       
   370         return E_POINTER;
       
   371     *visible = false;
       
   372     return E_NOTIMPL;
       
   373 }
       
   374 
       
   375 HRESULT STDMETHODCALLTYPE UIDelegate::setMenuBarVisible( 
       
   376     /* [in] */ IWebView *webView,
       
   377     /* [in] */ BOOL visible)
       
   378 {
       
   379     return E_NOTIMPL;
       
   380 }
       
   381 
       
   382 HRESULT STDMETHODCALLTYPE UIDelegate::runDatabaseSizeLimitPrompt( 
       
   383     /* [in] */ IWebView *webView,
       
   384     /* [in] */ BSTR displayName,
       
   385     /* [in] */ IWebFrame *initiatedByFrame,
       
   386     /* [retval][out] */ BOOL *allowed)
       
   387 {
       
   388     if (!allowed)
       
   389         return E_POINTER;
       
   390     *allowed = false;
       
   391     return E_NOTIMPL;
       
   392 }
       
   393 
       
   394 HRESULT STDMETHODCALLTYPE UIDelegate::paintCustomScrollbar( 
       
   395     /* [in] */ IWebView *webView,
       
   396     /* [in] */ HDC hDC,
       
   397     /* [in] */ RECT rect,
       
   398     /* [in] */ WebScrollBarControlSize size,
       
   399     /* [in] */ WebScrollbarControlState state,
       
   400     /* [in] */ WebScrollbarControlPart pressedPart,
       
   401     /* [in] */ BOOL vertical,
       
   402     /* [in] */ float value,
       
   403     /* [in] */ float proportion,
       
   404     /* [in] */ WebScrollbarControlPartMask parts)
       
   405 {
       
   406     return E_NOTIMPL;
       
   407 }
       
   408 
       
   409 HRESULT STDMETHODCALLTYPE UIDelegate::paintCustomScrollCorner( 
       
   410     /* [in] */ IWebView *webView,
       
   411     /* [in] */ HDC hDC,
       
   412     /* [in] */ RECT rect)
       
   413 {
       
   414     return E_NOTIMPL;
       
   415 }
       
   416 
       
   417 HRESULT STDMETHODCALLTYPE UIDelegate::setFrame( 
       
   418         /* [in] */ IWebView* /*sender*/,
       
   419         /* [in] */ RECT* frame)
       
   420 {
       
   421     m_frame = *frame;
       
   422     return S_OK;
       
   423 }
       
   424 
       
   425 HRESULT STDMETHODCALLTYPE UIDelegate::webViewFrame( 
       
   426         /* [in] */ IWebView* /*sender*/,
       
   427         /* [retval][out] */ RECT* frame)
       
   428 {
       
   429     *frame = m_frame;
       
   430     return S_OK;
       
   431 }
       
   432 
       
   433 HRESULT STDMETHODCALLTYPE UIDelegate::runJavaScriptAlertPanelWithMessage( 
       
   434         /* [in] */ IWebView* /*sender*/,
       
   435         /* [in] */ BSTR message)
       
   436 {
       
   437     printf("ALERT: %S\n", message ? message : L"");
       
   438 
       
   439     return S_OK;
       
   440 }
       
   441 
       
   442 HRESULT STDMETHODCALLTYPE UIDelegate::runJavaScriptConfirmPanelWithMessage( 
       
   443     /* [in] */ IWebView* sender,
       
   444     /* [in] */ BSTR message,
       
   445     /* [retval][out] */ BOOL* result)
       
   446 {
       
   447     printf("CONFIRM: %S\n", message ? message : L"");
       
   448     *result = TRUE;
       
   449 
       
   450     return S_OK;
       
   451 }
       
   452 
       
   453 HRESULT STDMETHODCALLTYPE UIDelegate::runJavaScriptTextInputPanelWithPrompt( 
       
   454     /* [in] */ IWebView *sender,
       
   455     /* [in] */ BSTR message,
       
   456     /* [in] */ BSTR defaultText,
       
   457     /* [retval][out] */ BSTR *result)
       
   458 {
       
   459     printf("PROMPT: %S, default text: %S\n", message ? message : L"", defaultText ? defaultText : L"");
       
   460     *result = SysAllocString(defaultText);
       
   461 
       
   462     return S_OK;
       
   463 }
       
   464 
       
   465 HRESULT STDMETHODCALLTYPE UIDelegate::runBeforeUnloadConfirmPanelWithMessage( 
       
   466     /* [in] */ IWebView* /*sender*/,
       
   467     /* [in] */ BSTR /*message*/,
       
   468     /* [in] */ IWebFrame* /*initiatedByFrame*/,
       
   469     /* [retval][out] */ BOOL* result)
       
   470 {
       
   471     if (!result)
       
   472         return E_POINTER;
       
   473     *result = TRUE;
       
   474     return E_NOTIMPL;
       
   475 }
       
   476 
       
   477 HRESULT STDMETHODCALLTYPE UIDelegate::webViewAddMessageToConsole( 
       
   478     /* [in] */ IWebView* sender,
       
   479     /* [in] */ BSTR message,
       
   480     /* [in] */ int lineNumber,
       
   481     /* [in] */ BSTR url,
       
   482     /* [in] */ BOOL isError)
       
   483 {
       
   484     wstring newMessage;
       
   485     if (message) {
       
   486         newMessage = message;
       
   487         size_t fileProtocol = newMessage.find(L"file://");
       
   488         if (fileProtocol != wstring::npos)
       
   489             newMessage = newMessage.substr(0, fileProtocol) + urlSuitableForTestResult(newMessage.substr(fileProtocol));
       
   490     }
       
   491 
       
   492     printf("CONSOLE MESSAGE: line %d: %s\n", lineNumber, toUTF8(newMessage).c_str());
       
   493     return S_OK;
       
   494 }
       
   495 
       
   496 HRESULT STDMETHODCALLTYPE UIDelegate::doDragDrop( 
       
   497     /* [in] */ IWebView* sender,
       
   498     /* [in] */ IDataObject* object,
       
   499     /* [in] */ IDropSource* source,
       
   500     /* [in] */ DWORD okEffect,
       
   501     /* [retval][out] */ DWORD* performedEffect)
       
   502 {
       
   503     if (!performedEffect)
       
   504         return E_POINTER;
       
   505 
       
   506     *performedEffect = 0;
       
   507 
       
   508     draggingInfo = new DraggingInfo(object, source);
       
   509     HRESULT oleDragAndDropReturnValue = DRAGDROP_S_CANCEL;
       
   510     replaySavedEvents(&oleDragAndDropReturnValue);
       
   511     if (draggingInfo) {
       
   512         *performedEffect = draggingInfo->performedDropEffect();
       
   513         delete draggingInfo;
       
   514         draggingInfo = 0;
       
   515     }
       
   516     return oleDragAndDropReturnValue;
       
   517 }
       
   518 
       
   519 HRESULT STDMETHODCALLTYPE UIDelegate::webViewGetDlgCode( 
       
   520     /* [in] */ IWebView* /*sender*/,
       
   521     /* [in] */ UINT /*keyCode*/,
       
   522     /* [retval][out] */ LONG_PTR *code)
       
   523 {
       
   524     if (!code)
       
   525         return E_POINTER;
       
   526     *code = 0;
       
   527     return E_NOTIMPL;
       
   528 }
       
   529 
       
   530 HRESULT STDMETHODCALLTYPE UIDelegate::createWebViewWithRequest( 
       
   531         /* [in] */ IWebView *sender,
       
   532         /* [in] */ IWebURLRequest *request,
       
   533         /* [retval][out] */ IWebView **newWebView)
       
   534 {
       
   535     if (!::gLayoutTestController->canOpenWindows())
       
   536         return E_FAIL;
       
   537     *newWebView = createWebViewAndOffscreenWindow();
       
   538     return S_OK;
       
   539 }
       
   540 
       
   541 HRESULT STDMETHODCALLTYPE UIDelegate::webViewClose(
       
   542         /* [in] */ IWebView *sender)
       
   543 {
       
   544     HWND hostWindow;
       
   545     sender->hostWindow(reinterpret_cast<OLE_HANDLE*>(&hostWindow));
       
   546     DestroyWindow(hostWindow);
       
   547     return S_OK;
       
   548 }
       
   549 
       
   550 HRESULT STDMETHODCALLTYPE UIDelegate::webViewFocus( 
       
   551         /* [in] */ IWebView *sender)
       
   552 {
       
   553     HWND hostWindow;
       
   554     sender->hostWindow(reinterpret_cast<OLE_HANDLE*>(&hostWindow));
       
   555     SetForegroundWindow(hostWindow);
       
   556     return S_OK; 
       
   557 }
       
   558 
       
   559 HRESULT STDMETHODCALLTYPE UIDelegate::webViewUnfocus( 
       
   560         /* [in] */ IWebView *sender)
       
   561 {
       
   562     SetForegroundWindow(GetDesktopWindow());
       
   563     return S_OK; 
       
   564 }
       
   565 
       
   566 HRESULT STDMETHODCALLTYPE UIDelegate::webViewPainted( 
       
   567         /* [in] */ IWebView *sender)
       
   568 {
       
   569     return S_OK;
       
   570 }
       
   571 
       
   572 HRESULT STDMETHODCALLTYPE UIDelegate::exceededDatabaseQuota( 
       
   573         /* [in] */ IWebView *sender,
       
   574         /* [in] */ IWebFrame *frame,
       
   575         /* [in] */ IWebSecurityOrigin *origin,
       
   576         /* [in] */ BSTR databaseIdentifier)
       
   577 {
       
   578     BSTR protocol;
       
   579     BSTR host;
       
   580     unsigned short port;
       
   581 
       
   582     origin->protocol(&protocol);
       
   583     origin->host(&host);
       
   584     origin->port(&port);
       
   585 
       
   586     if (!done && gLayoutTestController->dumpDatabaseCallbacks())
       
   587         printf("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:{%S, %S, %i} database:%S\n", protocol, host, port, databaseIdentifier);
       
   588 
       
   589     SysFreeString(protocol);
       
   590     SysFreeString(host);
       
   591 
       
   592     static const unsigned long long defaultQuota = 5 * 1024 * 1024;
       
   593     origin->setQuota(defaultQuota);
       
   594 
       
   595     return S_OK;
       
   596 }
       
   597 
       
   598 HRESULT STDMETHODCALLTYPE UIDelegate::embeddedViewWithArguments( 
       
   599     /* [in] */ IWebView *sender,
       
   600     /* [in] */ IWebFrame *frame,
       
   601     /* [in] */ IPropertyBag *arguments,
       
   602     /* [retval][out] */ IWebEmbeddedView **view)
       
   603 {
       
   604     if (!view)
       
   605         return E_POINTER;
       
   606     *view = 0;
       
   607     return E_NOTIMPL;
       
   608 }
       
   609 
       
   610 HRESULT STDMETHODCALLTYPE UIDelegate::webViewClosing( 
       
   611     /* [in] */ IWebView *sender)
       
   612 {
       
   613     return E_NOTIMPL;
       
   614 }
       
   615 
       
   616 HRESULT STDMETHODCALLTYPE UIDelegate::webViewSetCursor( 
       
   617     /* [in] */ IWebView *sender,
       
   618     /* [in] */ OLE_HANDLE cursor)
       
   619 {
       
   620     return E_NOTIMPL;
       
   621 }
       
   622 
       
   623 HRESULT STDMETHODCALLTYPE UIDelegate::webViewDidInvalidate( 
       
   624     /* [in] */ IWebView *sender)
       
   625 {
       
   626     return E_NOTIMPL;
       
   627 }
       
   628 
       
   629 HRESULT STDMETHODCALLTYPE UIDelegate::setStatusText(IWebView*, BSTR text)
       
   630 { 
       
   631     if (gLayoutTestController->dumpStatusCallbacks())
       
   632         printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", text ? toUTF8(text).c_str() : "");
       
   633     return S_OK;
       
   634 }
       
   635 
       
   636 HRESULT STDMETHODCALLTYPE UIDelegate::desktopNotificationsDelegate(IWebDesktopNotificationsDelegate** result)
       
   637 {
       
   638     m_desktopNotifications.copyRefTo(result);
       
   639     return S_OK;
       
   640 }
       
   641 
       
   642 HRESULT STDMETHODCALLTYPE UIDelegate::createWebViewWithRequest(IWebView* sender, IWebURLRequest* request, IPropertyBag* windowFeatures, IWebView** newWebView)
       
   643 {
       
   644     return E_NOTIMPL;
       
   645 }
       
   646 
       
   647 HRESULT STDMETHODCALLTYPE UIDelegate::drawBackground(IWebView* sender, OLE_HANDLE hdc, const RECT* dirtyRect)
       
   648 {
       
   649     return E_NOTIMPL;
       
   650 }
       
   651 
       
   652 HRESULT STDMETHODCALLTYPE UIDelegate::decidePolicyForGeolocationRequest(IWebView* sender, IWebFrame* frame, IWebSecurityOrigin* origin, IWebGeolocationPolicyListener* listener)
       
   653 {
       
   654     return E_NOTIMPL;
       
   655 }
       
   656 
       
   657 HRESULT STDMETHODCALLTYPE UIDelegate::didPressMissingPluginButton(IDOMElement* element)
       
   658 {
       
   659     printf("MISSING PLUGIN BUTTON PRESSED\n");
       
   660     return S_OK;
       
   661 }
       
   662