Reviewed by Maciej.
[WebKit-https.git] / WebKit / COM / WebView.cpp
1 /*
2  * Copyright (C) 2006 Apple Computer, 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "WebKitDLL.h"
28
29 #include "IWebURLResponse.h"
30 #include "WebView.h"
31
32 #include "WebFrame.h"
33 #include "WebBackForwardList.h"
34
35 #pragma warning( push, 0 )
36 #include "ResourceLoaderClient.h"
37 #include "FrameWin.h"
38 #include "Document.h"
39 #include "FrameView.h"
40 #include "IntRect.h"
41 #include "PlatformKeyboardEvent.h"
42 #include "PlatformMouseEvent.h"
43 #include "SelectionController.h"
44 #include "TypingCommand.h"
45 #pragma warning(pop)
46
47 using namespace WebCore;
48
49 const LPCWSTR kWebViewWindowClassName = L"WebViewWindowClass";
50 static bool nextCharIsInputText = false;
51
52 static ATOM registerWebView();
53 static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
54 static int calculateScrollDelta(WPARAM wParam, int oldPosition, int pageSize);
55 static int scrollMessageForKey(WPARAM keyCode);
56
57 // WebView ----------------------------------------------------------------
58
59 WebView::WebView()
60 : m_refCount(0)
61 , m_frameName(0)
62 , m_groupName(0)
63 , m_hostWindow(0)
64 , m_viewWindow(0)
65 , m_mainFrame(0)
66 , m_frameLoadDelegate(0)
67 , m_uiDelegate(0)
68 , m_backForwardList(0)
69 {
70     SetRectEmpty(&m_frame);
71
72     m_mainFrame = WebFrame::createInstance();
73     m_backForwardList = WebBackForwardList::createInstance();
74
75     gClassCount++;
76 }
77
78 WebView::~WebView()
79 {
80     if (m_backForwardList)
81         m_backForwardList->Release();
82     if (m_mainFrame)
83         m_mainFrame->Release();
84     if (m_frameLoadDelegate)
85         m_frameLoadDelegate->Release();
86
87     SysFreeString(m_frameName);
88     SysFreeString(m_groupName);
89     gClassCount--;
90 }
91
92 WebView* WebView::createInstance()
93 {
94     WebView* instance = new WebView();
95     instance->AddRef();
96     return instance;
97 }
98
99 void WebView::mouseMoved(UINT message, WPARAM wParam, LPARAM lParam)
100 {
101     PlatformMouseEvent mouseEvent(m_viewWindow, message, wParam, lParam);
102     m_mainFrame->impl()->view()->handleMouseMoveEvent(mouseEvent);
103 }
104
105 void WebView::mouseDown(UINT message, WPARAM wParam, LPARAM lParam)
106 {
107     PlatformMouseEvent mouseEvent(m_viewWindow, message, wParam, lParam);
108     m_mainFrame->impl()->view()->handleMousePressEvent(mouseEvent);
109 }
110
111 void WebView::mouseUp(UINT message, WPARAM wParam, LPARAM lParam)
112 {
113     PlatformMouseEvent mouseEvent(m_viewWindow, message, wParam, lParam);
114     m_mainFrame->impl()->view()->handleMouseReleaseEvent(mouseEvent);
115 }
116
117 void WebView::mouseDoubleClick(UINT message, WPARAM wParam, LPARAM lParam)
118 {
119     PlatformMouseEvent mouseEvent(m_viewWindow, message, wParam, lParam);
120     m_mainFrame->impl()->view()->handleMouseReleaseEvent(mouseEvent);
121 }
122
123 bool WebView::keyPress(WPARAM wParam, LPARAM lParam)
124 {
125     PlatformKeyboardEvent keyEvent(m_viewWindow, wParam, lParam);
126
127     FrameWin* frame = static_cast<FrameWin*>(m_mainFrame->impl());
128     bool handled = frame->keyPress(keyEvent);
129     if (!handled && !keyEvent.isKeyUp()) {
130         Node* start = frame->selectionController()->start().node();
131         if (start && start->isContentEditable()) {
132             switch(keyEvent.WindowsKeyCode()) {
133             case VK_BACK:
134                 TypingCommand::deleteKeyPressed(frame->document());
135                 break;
136             case VK_DELETE:
137                 TypingCommand::forwardDeleteKeyPressed(frame->document());
138                 break;
139             case VK_LEFT:
140                 frame->selectionController()->modify(SelectionController::MOVE, SelectionController::LEFT, CharacterGranularity);
141                 break;
142             case VK_RIGHT:
143                 frame->selectionController()->modify(SelectionController::MOVE, SelectionController::RIGHT, CharacterGranularity);
144                 break;
145             case VK_UP:
146                 frame->selectionController()->modify(SelectionController::MOVE, SelectionController::BACKWARD, ParagraphGranularity);
147                 break;
148             case VK_DOWN:
149                 frame->selectionController()->modify(SelectionController::MOVE, SelectionController::FORWARD, ParagraphGranularity);
150                 break;
151             case VK_RETURN:
152                 if (start->isContentRichlyEditable())
153                     TypingCommand::insertParagraphSeparator(frame->document());
154                 else
155                     TypingCommand::insertLineBreak(frame->document());
156                 break;
157             default:
158                 nextCharIsInputText = true;
159             }
160             handled = true;
161         }
162     }
163     return handled;
164 }
165
166 static ATOM registerWebView()
167 {
168     static bool haveRegisteredWindowClass = false;
169     if (haveRegisteredWindowClass)
170         return true;
171
172     WNDCLASSEX wcex;
173
174     wcex.cbSize = sizeof(WNDCLASSEX);
175
176     wcex.style          = CS_DBLCLKS;
177     wcex.lpfnWndProc    = WebViewWndProc;
178     wcex.cbClsExtra     = 0;
179     wcex.cbWndExtra     = 4; // 4 bytes for the IWebView pointer
180     wcex.hInstance      = gInstance;
181     wcex.hIcon          = 0;
182     wcex.hCursor        = LoadCursor(0, IDC_ARROW);
183     wcex.hbrBackground  = 0;
184     wcex.lpszMenuName   = 0;
185     wcex.lpszClassName  = kWebViewWindowClassName;
186     wcex.hIconSm        = 0;
187
188     return RegisterClassEx(&wcex);
189 }
190
191 static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
192 {
193     LRESULT lResult = 0;
194     HRESULT hr = S_OK;
195     LONG_PTR longPtr = GetWindowLongPtr(hWnd, 0);
196     WebView* webView = reinterpret_cast<WebView*>(longPtr);
197     IWebFrame* mainFrame = 0;
198     WebFrame* mainFrameImpl = 0;
199     if (webView) {
200         hr = webView->mainFrame(&mainFrame);
201         if (SUCCEEDED(hr))
202             mainFrameImpl = static_cast<WebFrame*>(mainFrame);
203     }
204
205     switch (message) {
206         case WM_PAINT:
207             if (mainFrameImpl) {
208                 IWebDataSource* dataSource = 0;
209                 mainFrameImpl->dataSource(&dataSource);
210                 if (!dataSource || !mainFrameImpl->loading())
211                     mainFrameImpl->paint();
212                 else
213                     ValidateRect(hWnd, 0);
214                 if (dataSource)
215                     dataSource->Release();
216             }
217             break;
218         case WM_DESTROY:
219             // Do nothing?
220             break;
221         case WM_MOUSEMOVE:
222             if (webView)
223                 webView->mouseMoved(message, wParam, lParam);
224             break;
225         case WM_LBUTTONDOWN:
226             // Make ourselves the focused window before doing anything else
227             // FIXME: I'm not sure if this is the "right" way to do this
228             // but w/o this call, we never become focused since we don't allow
229             // the default handling of mouse events.
230             SetFocus(hWnd);
231         case WM_MBUTTONDOWN:
232         case WM_RBUTTONDOWN:
233             if (webView)
234                 webView->mouseDown(message, wParam, lParam);
235             break;
236         case WM_LBUTTONUP:
237         case WM_MBUTTONUP:
238         case WM_RBUTTONUP:
239             if (webView)
240                 webView->mouseUp(message, wParam, lParam);
241             break;
242         case WM_LBUTTONDBLCLK:
243         case WM_MBUTTONDBLCLK:
244         case WM_RBUTTONDBLCLK:
245             if (webView)
246                 webView->mouseDoubleClick(message, wParam, lParam);
247             break;
248         case WM_HSCROLL: {
249             if (mainFrameImpl) {
250                 ScrollView* view = mainFrameImpl->impl()->view();
251                 view->scrollBy(calculateScrollDelta(wParam, view->contentsX(), view->visibleWidth()), 0);
252                 mainFrameImpl->impl()->sendScrollEvent();
253             }
254             break;
255         }
256         case WM_VSCROLL: {
257             if (mainFrameImpl) {
258                 ScrollView* view = mainFrameImpl->impl()->view();
259                 view->scrollBy(0, calculateScrollDelta(wParam, view->contentsY(), view->visibleHeight()));
260                 mainFrameImpl->impl()->sendScrollEvent();
261             }
262             break;
263         }
264         case WM_KEYDOWN: {
265             // FIXME: First we should send key events up through the DOM
266             // to form controls, etc.  If they are not handled, we fall
267             // through to the top level webView and do things like scrolling
268             if (webView && webView->keyPress(wParam, lParam))
269                 break;
270             DWORD wScrollNotify = scrollMessageForKey(wParam);
271             if (wScrollNotify != -1)
272                 SendMessage(hWnd, WM_VSCROLL, MAKELONG(wScrollNotify, 0), 0L);
273             break;
274         }
275         case WM_CHAR: {
276             // FIXME: We need to use WM_UNICHAR to support international text.
277             if (nextCharIsInputText && mainFrameImpl) {
278                 UChar c = (UChar)wParam;
279                 TypingCommand::insertText(mainFrameImpl->impl()->document(), String(&c, 1), false);
280                 nextCharIsInputText = false;
281             }
282             break;
283         }
284         case WM_KEYUP: {
285             if (webView)
286                 webView->keyPress(wParam, lParam);
287             break;
288         }
289         case WM_SIZE:
290             if (mainFrameImpl && lParam != 0 && !mainFrameImpl->loading())
291                 mainFrameImpl->impl()->sendResizeEvent();
292             break;
293         case WM_SETFOCUS:
294             if (mainFrameImpl) {
295                 mainFrameImpl->impl()->setWindowHasFocus(true);
296                 // FIXME: This is wrong. Should listen to WM_ACTIVATE instead.
297                 mainFrameImpl->impl()->setIsActive(true);
298             }
299             break;
300         case WM_KILLFOCUS:
301             if (mainFrameImpl) {
302                 mainFrameImpl->impl()->setWindowHasFocus(false);
303                 // FIXME: This is wrong.
304                 mainFrameImpl->impl()->setIsActive(false);
305             }
306             break;
307         default:
308             lResult = DefWindowProc(hWnd, message, wParam, lParam);
309     }
310
311     if (mainFrame)
312         mainFrame->Release();
313
314     return lResult;
315 }
316
317 #define LINE_SCROLL_SIZE 30
318
319 static int calculateScrollDelta(WPARAM wParam, int oldPosition, int pageSize)
320 {
321     switch (LOWORD(wParam)) {
322         case SB_PAGEUP: 
323             return -(pageSize - LINE_SCROLL_SIZE); 
324          case SB_PAGEDOWN: 
325             return (pageSize - LINE_SCROLL_SIZE); 
326         case SB_LINEUP: 
327             return -LINE_SCROLL_SIZE;
328         case SB_LINEDOWN: 
329             return LINE_SCROLL_SIZE;
330         case SB_THUMBPOSITION: 
331         case SB_THUMBTRACK:
332             return HIWORD(wParam) - oldPosition; 
333     }
334     return 0;
335 }
336
337 static int scrollMessageForKey(WPARAM keyCode)
338 {
339     switch (keyCode) {
340     case VK_UP:
341         return SB_LINEUP;
342     case VK_PRIOR: 
343         return SB_PAGEUP;
344     case VK_NEXT:
345         return SB_PAGEDOWN;
346     case VK_DOWN:
347         return SB_LINEDOWN;
348     case VK_HOME:
349         return SB_TOP;
350     case VK_END:
351         return SB_BOTTOM;
352     case VK_SPACE:
353         return (GetKeyState(VK_SHIFT) & 0x8000) ? SB_PAGEUP : SB_PAGEDOWN;
354     }
355     return -1;
356 }
357
358 HRESULT WebView::goToItem(IWebHistoryItem* item, WebFrameLoadType withLoadType)
359 {
360     m_mainFrame->stopLoading();
361     return m_mainFrame->goToItem(item, withLoadType);
362 }
363
364 // IUnknown -------------------------------------------------------------------
365
366 HRESULT STDMETHODCALLTYPE WebView::QueryInterface(REFIID riid, void** ppvObject)
367 {
368     *ppvObject = 0;
369     if (IsEqualGUID(riid, IID_IUnknown))
370         *ppvObject = static_cast<IWebView*>(this);
371     else if (IsEqualGUID(riid, IID_IWebView))
372         *ppvObject = static_cast<IWebView*>(this);
373     else if (IsEqualGUID(riid, IID_IWebIBActions))
374         *ppvObject = static_cast<IWebIBActions*>(this);
375     else if (IsEqualGUID(riid, IID_IWebViewCSS))
376         *ppvObject = static_cast<IWebViewCSS*>(this);
377     else if (IsEqualGUID(riid, IID_IWebViewEditing))
378         *ppvObject = static_cast<IWebViewEditing*>(this);
379     else if (IsEqualGUID(riid, IID_IWebViewUndoableEditing))
380         *ppvObject = static_cast<IWebViewUndoableEditing*>(this);
381     else if (IsEqualGUID(riid, IID_IWebViewEditingActions))
382         *ppvObject = static_cast<IWebViewEditingActions*>(this);
383     else if (IsEqualGUID(riid, IID_IWebViewExt))
384         *ppvObject = static_cast<IWebViewExt*>(this);
385     else
386         return E_NOINTERFACE;
387
388     AddRef();
389     return S_OK;
390 }
391
392 ULONG STDMETHODCALLTYPE WebView::AddRef(void)
393 {
394     return ++m_refCount;
395 }
396
397 ULONG STDMETHODCALLTYPE WebView::Release(void)
398 {
399     ULONG newRef = --m_refCount;
400     if (!newRef)
401         delete(this);
402
403     return newRef;
404 }
405
406 // IWebView --------------------------------------------------------------------
407
408 HRESULT STDMETHODCALLTYPE WebView::canShowMIMEType( 
409     /* [in] */ BSTR /*mimeType*/,
410     /* [retval][out] */ BOOL* /*canShow*/)
411 {
412     DebugBreak();
413     return E_NOTIMPL;
414 }
415
416 HRESULT STDMETHODCALLTYPE WebView::canShowMIMETypeAsHTML( 
417     /* [in] */ BSTR /*mimeType*/,
418     /* [retval][out] */ BOOL* /*canShow*/)
419 {
420     DebugBreak();
421     return E_NOTIMPL;
422 }
423
424 HRESULT STDMETHODCALLTYPE WebView::MIMETypesShownAsHTML( 
425     /* [out] */ int* /*count*/,
426     /* [retval][out] */ BSTR** /*mimeTypes*/) 
427 {
428     DebugBreak();
429     return E_NOTIMPL;
430 }
431
432 HRESULT STDMETHODCALLTYPE WebView::setMIMETypesShownAsHTML( 
433         /* [size_is][in] */ BSTR* /*mimeTypes*/,
434         /* [in] */ int /*cMimeTypes*/)
435 {
436     DebugBreak();
437     return E_NOTIMPL;
438 }
439
440 HRESULT STDMETHODCALLTYPE WebView::URLFromPasteboard( 
441     /* [in] */ IDataObject* /*pasteboard*/,
442     /* [retval][out] */ BSTR* /*url*/)
443 {
444     DebugBreak();
445     return E_NOTIMPL;
446 }
447
448 HRESULT STDMETHODCALLTYPE WebView::URLTitleFromPasteboard( 
449     /* [in] */ IDataObject* /*pasteboard*/,
450     /* [retval][out] */ BSTR* /*urlTitle*/)
451 {
452     DebugBreak();
453     return E_NOTIMPL;
454 }
455
456 HRESULT STDMETHODCALLTYPE WebView::initWithFrame( 
457     /* [in] */ RECT* frame,
458     /* [in] */ BSTR frameName,
459     /* [in] */ BSTR groupName)
460 {
461     HRESULT hr = S_OK;
462
463     if (m_viewWindow)
464         return E_FAIL;
465
466     m_frame = *frame;
467     m_frameName = SysAllocString(frameName);
468     m_groupName = SysAllocString(groupName);
469
470     registerWebView();
471
472     m_viewWindow = CreateWindowEx(0, kWebViewWindowClassName, 0, WS_CHILD | WS_HSCROLL | WS_VSCROLL,
473        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, m_hostWindow, 0, gInstance, 0);
474
475     m_mainFrame->initWithName(0, 0/*FIXME*/, this);
476
477     #pragma warning(suppress: 4244)
478     SetWindowLongPtr(m_viewWindow, 0, (LONG_PTR)this);
479
480     ShowWindow(m_viewWindow, SW_SHOW);
481
482     return hr;
483 }
484
485 HRESULT STDMETHODCALLTYPE WebView::setUIDelegate( 
486     /* [in] */ IWebUIDelegate* d)
487 {
488     if (m_uiDelegate)
489         m_uiDelegate->Release();
490     m_uiDelegate = d;
491     if (d)
492         d->AddRef();
493
494     return S_OK;
495 }
496
497 HRESULT STDMETHODCALLTYPE WebView::uiDelegate( 
498     /* [out][retval] */ IWebUIDelegate** d)
499 {
500     if (m_uiDelegate)
501         m_uiDelegate->AddRef();
502     *d = m_uiDelegate;
503     return S_OK;
504 }
505
506 HRESULT STDMETHODCALLTYPE WebView::setResourceLoadDelegate( 
507     /* [in] */ IWebResourceLoadDelegate* /*d*/)
508 {
509     DebugBreak();
510     return E_NOTIMPL;
511 }
512
513 HRESULT STDMETHODCALLTYPE WebView::resourceLoadDelegate( 
514     /* [out][retval] */ IWebResourceLoadDelegate** /*d*/)
515 {
516     DebugBreak();
517     return E_NOTIMPL;
518 }
519
520 HRESULT STDMETHODCALLTYPE WebView::setDownloadDelegate( 
521     /* [in] */ IWebDownloadDelegate* /*d*/)
522 {
523     DebugBreak();
524     return E_NOTIMPL;
525 }
526
527 HRESULT STDMETHODCALLTYPE WebView::downloadDelegate( 
528     /* [out][retval] */ IWebDownloadDelegate** /*d*/)
529 {
530     DebugBreak();
531     return E_NOTIMPL;
532 }
533
534 HRESULT STDMETHODCALLTYPE WebView::setFrameLoadDelegate( 
535     /* [in] */ IWebFrameLoadDelegate* d)
536 {
537     if (m_frameLoadDelegate)
538         m_frameLoadDelegate->Release();
539     m_frameLoadDelegate = d;
540     if (d)
541         d->AddRef();
542
543     return S_OK;
544 }
545
546 HRESULT STDMETHODCALLTYPE WebView::frameLoadDelegate( 
547     /* [out][retval] */ IWebFrameLoadDelegate** d)
548 {
549     if (m_frameLoadDelegate)
550         m_frameLoadDelegate->AddRef();
551     *d = m_frameLoadDelegate;
552     return S_OK;
553 }
554
555 HRESULT STDMETHODCALLTYPE WebView::setPolicyDelegate( 
556     /* [in] */ IWebPolicyDelegate* /*d*/)
557 {
558     DebugBreak();
559     return E_NOTIMPL;
560 }
561
562 HRESULT STDMETHODCALLTYPE WebView::policyDelegate( 
563     /* [out][retval] */ IWebPolicyDelegate** /*d*/)
564 {
565     DebugBreak();
566     return E_NOTIMPL;
567 }
568
569 HRESULT STDMETHODCALLTYPE WebView::mainFrame( 
570     /* [out][retval] */ IWebFrame** frame)
571 {
572     *frame = m_mainFrame;
573     if (!m_mainFrame)
574         return E_FAIL;
575
576     m_mainFrame->AddRef();
577     return S_OK;
578 }
579
580 HRESULT STDMETHODCALLTYPE WebView::backForwardList( 
581     /* [out][retval] */ IWebBackForwardList** list)
582 {
583     *list = 0;
584     if (!m_backForwardList)
585         return E_FAIL;
586
587     m_backForwardList->AddRef();
588     *list = m_backForwardList;
589
590     return S_OK;
591 }
592
593 HRESULT STDMETHODCALLTYPE WebView::setMaintainsBackForwardList( 
594     /* [in] */ BOOL flag)
595 {
596     if (flag && !m_backForwardList)
597         m_backForwardList = WebBackForwardList::createInstance();
598     else if (!flag && m_backForwardList) {
599         m_backForwardList->Release();
600         m_backForwardList = 0;
601     }
602
603     return S_OK;
604 }
605
606 HRESULT STDMETHODCALLTYPE WebView::goBack( 
607     /* [retval][out] */ BOOL* succeeded)
608 {
609     HRESULT hr = S_OK;
610
611     *succeeded = FALSE;
612
613     if (!m_backForwardList)
614         return E_FAIL;
615
616     IWebHistoryItem* item;
617     hr = m_backForwardList->backItem(&item);
618     if (SUCCEEDED(hr) && item) {
619         hr = goToBackForwardItem(item, succeeded);
620         item->Release();
621     }
622     return hr;
623 }
624
625 HRESULT STDMETHODCALLTYPE WebView::goForward( 
626     /* [retval][out] */ BOOL* succeeded)
627 {
628     HRESULT hr = S_OK;
629
630     *succeeded = FALSE;
631
632     if (!m_backForwardList)
633         return E_FAIL;
634
635     IWebHistoryItem* item;
636     hr = m_backForwardList->forwardItem(&item);
637     if (SUCCEEDED(hr) && item) {
638         hr = goToBackForwardItem(item, succeeded);
639         item->Release();
640     }
641     return hr;
642 }
643
644 HRESULT STDMETHODCALLTYPE WebView::goToBackForwardItem( 
645     /* [in] */ IWebHistoryItem* item,
646     /* [retval][out] */ BOOL* succeeded)
647 {
648     *succeeded = FALSE;
649
650     HRESULT hr = goToItem(item, WebFrameLoadTypeIndexedBackForward);
651     if (SUCCEEDED(hr))
652         *succeeded = TRUE;
653
654     return hr;
655 }
656
657 HRESULT STDMETHODCALLTYPE WebView::setTextSizeMultiplier( 
658     /* [in] */ float /*multiplier*/)
659 {
660     DebugBreak();
661     return E_NOTIMPL;
662 }
663
664 HRESULT STDMETHODCALLTYPE WebView::textSizeMultiplier( 
665     /* [retval][out] */ float* /*multiplier*/)
666 {
667     DebugBreak();
668     return E_NOTIMPL;
669 }
670
671 HRESULT STDMETHODCALLTYPE WebView::setApplicationNameForUserAgent( 
672     /* [in] */ BSTR /*applicationName*/)
673 {
674     DebugBreak();
675     return E_NOTIMPL;
676 }
677
678 HRESULT STDMETHODCALLTYPE WebView::applicationNameForUserAgent( 
679     /* [retval][out] */ BSTR* /*applicationName*/)
680 {
681     DebugBreak();
682     return E_NOTIMPL;
683 }
684
685 HRESULT STDMETHODCALLTYPE WebView::setCustomUserAgent( 
686     /* [in] */ BSTR /*userAgentString*/)
687 {
688     DebugBreak();
689     return E_NOTIMPL;
690 }
691
692 HRESULT STDMETHODCALLTYPE WebView::customUserAgent( 
693     /* [retval][out] */ BSTR* /*userAgentString*/)
694 {
695     DebugBreak();
696     return E_NOTIMPL;
697 }
698
699 HRESULT STDMETHODCALLTYPE WebView::userAgentForURL( 
700     /* [in] */ BSTR /*url*/,
701     /* [retval][out] */ BSTR* /*userAgent*/)
702 {
703     DebugBreak();
704     return E_NOTIMPL;
705 }
706
707 HRESULT STDMETHODCALLTYPE WebView::supportsTextEncoding( 
708     /* [retval][out] */ BOOL* /*supports*/)
709 {
710     DebugBreak();
711     return E_NOTIMPL;
712 }
713
714 HRESULT STDMETHODCALLTYPE WebView::setCustomTextEncodingName( 
715     /* [in] */ BSTR /*encodingName*/)
716 {
717     DebugBreak();
718     return E_NOTIMPL;
719 }
720
721 HRESULT STDMETHODCALLTYPE WebView::customTextEncodingName( 
722     /* [retval][out] */ BSTR* /*encodingName*/)
723 {
724     DebugBreak();
725     return E_NOTIMPL;
726 }
727
728 HRESULT STDMETHODCALLTYPE WebView::setMediaStyle( 
729     /* [in] */ BSTR /*media*/)
730 {
731     DebugBreak();
732     return E_NOTIMPL;
733 }
734
735 HRESULT STDMETHODCALLTYPE WebView::mediaStyle( 
736     /* [retval][out] */ BSTR* /*media*/)
737 {
738     DebugBreak();
739     return E_NOTIMPL;
740 }
741
742 HRESULT STDMETHODCALLTYPE WebView::stringByEvaluatingJavaScriptFromString( 
743     /* [in] */ BSTR /*script*/,
744     /* [retval][out] */ BSTR* /*result*/)
745 {
746     DebugBreak();
747     return E_NOTIMPL;
748 }
749
750 HRESULT STDMETHODCALLTYPE WebView::windowScriptObject( 
751     /* [retval][out] */ IWebScriptObject* /*webScriptObject*/)
752 {
753     DebugBreak();
754     return E_NOTIMPL;
755 }
756
757 HRESULT STDMETHODCALLTYPE WebView::setPreferences( 
758     /* [in] */ IWebPreferences* /*prefs*/)
759 {
760     DebugBreak();
761     return E_NOTIMPL;
762 }
763
764 HRESULT STDMETHODCALLTYPE WebView::preferences( 
765     /* [retval][out] */ IWebPreferences** /*prefs*/)
766 {
767     DebugBreak();
768     return E_NOTIMPL;
769 }
770
771 HRESULT STDMETHODCALLTYPE WebView::setPreferencesIdentifier( 
772     /* [in] */ BSTR /*anIdentifier*/)
773 {
774     DebugBreak();
775     return E_NOTIMPL;
776 }
777
778 HRESULT STDMETHODCALLTYPE WebView::preferencesIdentifier( 
779     /* [retval][out] */ BSTR* /*anIdentifier*/)
780 {
781     DebugBreak();
782     return E_NOTIMPL;
783 }
784
785 HRESULT STDMETHODCALLTYPE WebView::setHostWindow( 
786     /* [in] */ HWND window)
787 {
788     if (m_viewWindow)
789         SetParent(m_viewWindow, window);
790
791     m_hostWindow = window;
792
793     return S_OK;
794 }
795
796 HRESULT STDMETHODCALLTYPE WebView::hostWindow( 
797     /* [retval][out] */ HWND* window)
798 {
799     *window = m_hostWindow;
800     return S_OK;
801 }
802
803 HRESULT STDMETHODCALLTYPE WebView::searchFor( 
804     /* [in] */ BSTR /*str*/,
805     /* [in] */ BOOL /*forward*/,
806     /* [in] */ BOOL /*caseFlag*/,
807     /* [in] */ BOOL /*wrapFlag*/,
808     /* [retval][out] */ BOOL* /*found*/)
809 {
810     DebugBreak();
811     return E_NOTIMPL;
812 }
813
814 HRESULT STDMETHODCALLTYPE WebView::registerViewClass( 
815     /* [in] */ IWebDocumentView* /*view*/,
816     /* [in] */ IWebDocumentRepresentation* /*representation*/,
817     /* [in] */ BSTR /*forMIMEType*/)
818 {
819     DebugBreak();
820     return E_NOTIMPL;
821 }
822
823 // IWebIBActions ---------------------------------------------------------------
824
825 HRESULT STDMETHODCALLTYPE WebView::takeStringURLFrom( 
826         /* [in] */ IUnknown* /*sender*/)
827 {
828     DebugBreak();
829     return E_NOTIMPL;
830 }
831     
832 HRESULT STDMETHODCALLTYPE WebView::stopLoading( 
833         /* [in] */ IUnknown* /*sender*/)
834 {
835     DebugBreak();
836     return E_NOTIMPL;
837 }
838     
839 HRESULT STDMETHODCALLTYPE WebView::reload( 
840         /* [in] */ IUnknown* /*sender*/)
841 {
842     DebugBreak();
843     return E_NOTIMPL;
844 }
845     
846 HRESULT STDMETHODCALLTYPE WebView::canGoBack( 
847         /* [in] */ IUnknown* /*sender*/,
848         /* [retval][out] */ BOOL* /*result*/)
849 {
850     DebugBreak();
851     return E_NOTIMPL;
852 }
853     
854 HRESULT STDMETHODCALLTYPE WebView::goBack( 
855         /* [in] */ IUnknown* /*sender*/)
856 {
857     DebugBreak();
858     return E_NOTIMPL;
859 }
860     
861 HRESULT STDMETHODCALLTYPE WebView::canGoForward( 
862         /* [in] */ IUnknown* /*sender*/,
863         /* [retval][out] */ BOOL* /*result*/)
864 {
865     DebugBreak();
866     return E_NOTIMPL;
867 }
868     
869 HRESULT STDMETHODCALLTYPE WebView::goForward( 
870         /* [in] */ IUnknown* /*sender*/)
871 {
872     DebugBreak();
873     return E_NOTIMPL;
874 }
875     
876 HRESULT STDMETHODCALLTYPE WebView::canMakeTextLarger( 
877         /* [in] */ IUnknown* /*sender*/,
878         /* [retval][out] */ BOOL* /*result*/)
879 {
880     DebugBreak();
881     return E_NOTIMPL;
882 }
883     
884 HRESULT STDMETHODCALLTYPE WebView::makeTextLarger( 
885         /* [in] */ IUnknown* /*sender*/)
886 {
887     DebugBreak();
888     return E_NOTIMPL;
889 }
890     
891 HRESULT STDMETHODCALLTYPE WebView::canMakeTextSmaller( 
892         /* [in] */ IUnknown* /*sender*/,
893         /* [retval][out] */ BOOL* /*result*/)
894 {
895     DebugBreak();
896     return E_NOTIMPL;
897 }
898     
899 HRESULT STDMETHODCALLTYPE WebView::makeTextSmaller( 
900         /* [in] */ IUnknown* /*sender*/)
901 {
902     DebugBreak();
903     return E_NOTIMPL;
904 }
905
906 // IWebViewCSS -----------------------------------------------------------------
907
908 HRESULT STDMETHODCALLTYPE WebView::computedStyleForElement( 
909         /* [in] */ IDOMElement* /*element*/,
910         /* [in] */ BSTR /*pseudoElement*/,
911         /* [retval][out] */ IDOMCSSStyleDeclaration** /*style*/)
912 {
913     DebugBreak();
914     return E_NOTIMPL;
915 }
916
917 // IWebViewEditing -------------------------------------------------------------
918
919 HRESULT STDMETHODCALLTYPE WebView::editableDOMRangeForPoint( 
920         /* [in] */ LPPOINT /*point*/,
921         /* [retval][out] */ IDOMRange** /*range*/)
922 {
923     DebugBreak();
924     return E_NOTIMPL;
925 }
926     
927 HRESULT STDMETHODCALLTYPE WebView::setSelectedDOMRange( 
928         /* [in] */ IDOMRange* /*range*/,
929         /* [in] */ WebSelectionAffinity /*affinity*/)
930 {
931     DebugBreak();
932     return E_NOTIMPL;
933 }
934     
935 HRESULT STDMETHODCALLTYPE WebView::selectedDOMRange( 
936         /* [retval][out] */ IDOMRange** /*range*/)
937 {
938     DebugBreak();
939     return E_NOTIMPL;
940 }
941     
942 HRESULT STDMETHODCALLTYPE WebView::selectionAffinity( 
943         /* [retval][out][retval][out] */ WebSelectionAffinity* /*affinity*/)
944 {
945     DebugBreak();
946     return E_NOTIMPL;
947 }
948     
949 HRESULT STDMETHODCALLTYPE WebView::setEditable( 
950         /* [in] */ BOOL /*flag*/)
951 {
952     DebugBreak();
953     return E_NOTIMPL;
954 }
955     
956 HRESULT STDMETHODCALLTYPE WebView::isEditable( 
957         /* [retval][out] */ BOOL* /*isEditable*/)
958 {
959     DebugBreak();
960     return E_NOTIMPL;
961 }
962     
963 HRESULT STDMETHODCALLTYPE WebView::setTypingStyle( 
964         /* [in] */ IDOMCSSStyleDeclaration* /*style*/)
965 {
966     DebugBreak();
967     return E_NOTIMPL;
968 }
969     
970 HRESULT STDMETHODCALLTYPE WebView::typingStyle( 
971         /* [retval][out] */ IDOMCSSStyleDeclaration** /*style*/)
972 {
973     DebugBreak();
974     return E_NOTIMPL;
975 }
976     
977 HRESULT STDMETHODCALLTYPE WebView::setSmartInsertDeleteEnabled( 
978         /* [in] */ BOOL /*flag*/)
979 {
980     DebugBreak();
981     return E_NOTIMPL;
982 }
983     
984 HRESULT STDMETHODCALLTYPE WebView::smartInsertDeleteEnabled( 
985         /* [in] */ BOOL /*enabled*/)
986 {
987     DebugBreak();
988     return E_NOTIMPL;
989 }
990     
991 HRESULT STDMETHODCALLTYPE WebView::setContinuousSpellCheckingEnabled( 
992         /* [in] */ BOOL /*flag*/)
993 {
994     DebugBreak();
995     return E_NOTIMPL;
996 }
997     
998 HRESULT STDMETHODCALLTYPE WebView::isContinuousSpellCheckingEnabled( 
999         /* [retval][out] */ BOOL* /*enabled*/)
1000 {
1001     DebugBreak();
1002     return E_NOTIMPL;
1003 }
1004     
1005 HRESULT STDMETHODCALLTYPE WebView::spellCheckerDocumentTag( 
1006         /* [retval][out] */ int* /*tag*/)
1007 {
1008     DebugBreak();
1009     return E_NOTIMPL;
1010 }
1011     
1012 HRESULT STDMETHODCALLTYPE WebView::undoManager( 
1013         /* [retval][out] */ IWebUndoManager* /*manager*/)
1014 {
1015     DebugBreak();
1016     return E_NOTIMPL;
1017 }
1018     
1019 HRESULT STDMETHODCALLTYPE WebView::setEditingDelegate( 
1020         /* [in] */ IWebViewEditingDelegate* /*d*/)
1021 {
1022     DebugBreak();
1023     return E_NOTIMPL;
1024 }
1025     
1026 HRESULT STDMETHODCALLTYPE WebView::editingDelegate( 
1027         /* [retval][out] */ IWebViewEditingDelegate** /*d*/)
1028 {
1029     DebugBreak();
1030     return E_NOTIMPL;
1031 }
1032     
1033 HRESULT STDMETHODCALLTYPE WebView::styleDeclarationWithText( 
1034         /* [in] */ BSTR /*text*/,
1035         /* [retval][out] */ IDOMCSSStyleDeclaration** /*style*/)
1036 {
1037     DebugBreak();
1038     return E_NOTIMPL;
1039 }
1040
1041 // IWebViewUndoableEditing -----------------------------------------------------
1042
1043 HRESULT STDMETHODCALLTYPE WebView::replaceSelectionWithNode( 
1044         /* [in] */ IDOMNode* /*node*/)
1045 {
1046     DebugBreak();
1047     return E_NOTIMPL;
1048 }
1049     
1050 HRESULT STDMETHODCALLTYPE WebView::replaceSelectionWithText( 
1051         /* [in] */ BSTR /*text*/)
1052 {
1053     DebugBreak();
1054     return E_NOTIMPL;
1055 }
1056     
1057 HRESULT STDMETHODCALLTYPE WebView::replaceSelectionWithMarkupString( 
1058         /* [in] */ BSTR /*markupString*/)
1059 {
1060     DebugBreak();
1061     return E_NOTIMPL;
1062 }
1063     
1064 HRESULT STDMETHODCALLTYPE WebView::replaceSelectionWithArchive( 
1065         /* [in] */ IWebArchive* /*archive*/)
1066 {
1067     DebugBreak();
1068     return E_NOTIMPL;
1069 }
1070     
1071 HRESULT STDMETHODCALLTYPE WebView::deleteSelection( void)
1072 {
1073     DebugBreak();
1074     return E_NOTIMPL;
1075 }
1076     
1077 HRESULT STDMETHODCALLTYPE WebView::applyStyle( 
1078         /* [in] */ IDOMCSSStyleDeclaration* /*style*/)
1079 {
1080     DebugBreak();
1081     return E_NOTIMPL;
1082 }
1083
1084 // IWebViewEditingActions ------------------------------------------------------
1085
1086 HRESULT STDMETHODCALLTYPE WebView::copy( 
1087         /* [in] */ IUnknown* /*sender*/)
1088 {
1089     DebugBreak();
1090     return E_NOTIMPL;
1091 }
1092     
1093 HRESULT STDMETHODCALLTYPE WebView::cut( 
1094         /* [in] */ IUnknown* /*sender*/)
1095 {
1096     DebugBreak();
1097     return E_NOTIMPL;
1098 }
1099     
1100 HRESULT STDMETHODCALLTYPE WebView::paste( 
1101         /* [in] */ IUnknown* /*sender*/)
1102 {
1103     DebugBreak();
1104     return E_NOTIMPL;
1105 }
1106     
1107 HRESULT STDMETHODCALLTYPE WebView::copyFont( 
1108         /* [in] */ IUnknown* /*sender*/)
1109 {
1110     DebugBreak();
1111     return E_NOTIMPL;
1112 }
1113     
1114 HRESULT STDMETHODCALLTYPE WebView::pasteFont( 
1115         /* [in] */ IUnknown* /*sender*/)
1116 {
1117     DebugBreak();
1118     return E_NOTIMPL;
1119 }
1120     
1121 HRESULT STDMETHODCALLTYPE WebView::delete_( 
1122         /* [in] */ IUnknown* /*sender*/)
1123 {
1124     DebugBreak();
1125     return E_NOTIMPL;
1126 }
1127     
1128 HRESULT STDMETHODCALLTYPE WebView::pasteAsPlainText( 
1129         /* [in] */ IUnknown* /*sender*/)
1130 {
1131     DebugBreak();
1132     return E_NOTIMPL;
1133 }
1134     
1135 HRESULT STDMETHODCALLTYPE WebView::pasteAsRichText( 
1136         /* [in] */ IUnknown* /*sender*/)
1137 {
1138     DebugBreak();
1139     return E_NOTIMPL;
1140 }
1141     
1142 HRESULT STDMETHODCALLTYPE WebView::changeFont( 
1143         /* [in] */ IUnknown* /*sender*/)
1144 {
1145     DebugBreak();
1146     return E_NOTIMPL;
1147 }
1148     
1149 HRESULT STDMETHODCALLTYPE WebView::changeAttributes( 
1150         /* [in] */ IUnknown* /*sender*/)
1151 {
1152     DebugBreak();
1153     return E_NOTIMPL;
1154 }
1155     
1156 HRESULT STDMETHODCALLTYPE WebView::changeDocumentBackgroundColor( 
1157         /* [in] */ IUnknown* /*sender*/)
1158 {
1159     DebugBreak();
1160     return E_NOTIMPL;
1161 }
1162     
1163 HRESULT STDMETHODCALLTYPE WebView::changeColor( 
1164         /* [in] */ IUnknown* /*sender*/)
1165 {
1166     DebugBreak();
1167     return E_NOTIMPL;
1168 }
1169     
1170 HRESULT STDMETHODCALLTYPE WebView::alignCenter( 
1171         /* [in] */ IUnknown* /*sender*/)
1172 {
1173     DebugBreak();
1174     return E_NOTIMPL;
1175 }
1176     
1177 HRESULT STDMETHODCALLTYPE WebView::alignJustified( 
1178         /* [in] */ IUnknown* /*sender*/)
1179 {
1180     DebugBreak();
1181     return E_NOTIMPL;
1182 }
1183     
1184 HRESULT STDMETHODCALLTYPE WebView::alignLeft( 
1185         /* [in] */ IUnknown* /*sender*/)
1186 {
1187     DebugBreak();
1188     return E_NOTIMPL;
1189 }
1190     
1191 HRESULT STDMETHODCALLTYPE WebView::alignRight( 
1192         /* [in] */ IUnknown* /*sender*/)
1193 {
1194     DebugBreak();
1195     return E_NOTIMPL;
1196 }
1197     
1198 HRESULT STDMETHODCALLTYPE WebView::checkSpelling( 
1199         /* [in] */ IUnknown* /*sender*/)
1200 {
1201     DebugBreak();
1202     return E_NOTIMPL;
1203 }
1204     
1205 HRESULT STDMETHODCALLTYPE WebView::showGuessPanel( 
1206         /* [in] */ IUnknown* /*sender*/)
1207 {
1208     DebugBreak();
1209     return E_NOTIMPL;
1210 }
1211     
1212 HRESULT STDMETHODCALLTYPE WebView::performFindPanelAction( 
1213         /* [in] */ IUnknown* /*sender*/)
1214 {
1215     DebugBreak();
1216     return E_NOTIMPL;
1217 }
1218     
1219 HRESULT STDMETHODCALLTYPE WebView::startSpeaking( 
1220         /* [in] */ IUnknown* /*sender*/)
1221 {
1222     DebugBreak();
1223     return E_NOTIMPL;
1224 }
1225     
1226 HRESULT STDMETHODCALLTYPE WebView::stopSpeaking( 
1227         /* [in] */ IUnknown* /*sender*/)
1228 {
1229     DebugBreak();
1230     return E_NOTIMPL;
1231 }
1232
1233 // IWebViewExt -----------------------------------------------------------------
1234
1235 HRESULT STDMETHODCALLTYPE WebView::viewWindow( 
1236         /* [retval][out] */ HWND *window)
1237 {
1238     *window = m_viewWindow;
1239     return S_OK;
1240 }