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