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