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