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