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