2 * Copyright 2004, 2005 Martin Fuchs
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 // ROS Internet Web Browser
25 // Martin Fuchs, 25.01.2005
30 #include <exdisp.h> // for IConnectionPointContainer
31 #include <exdispid.h> // for DWebBrowserEvents2 IDs
34 #ifndef DISPID_BEFORENAVIGATE // missing in MinGW (as of 07.02.2004)
35 #define DISPID_BEFORENAVIGATE 100
36 #define DISPID_NAVIGATECOMPLETE 101
37 #define DISPID_STATUSTEXTCHANGE 102
38 #define DISPID_QUIT 103
39 #define DISPID_DOWNLOADCOMPLETE 104
40 #define DISPID_COMMANDSTATECHANGE 105
41 #define DISPID_DOWNLOADBEGIN 106
42 #define DISPID_NEWWINDOW 107
43 #define DISPID_PROGRESSCHANGE 108
44 #define DISPID_WINDOWMOVE 109
45 #define DISPID_WINDOWRESIZE 110
46 #define DISPID_WINDOWACTIVATE 111
47 #define DISPID_PROPERTYCHANGE 112
48 #define DISPID_TITLECHANGE 113
49 #define DISPID_TITLEICONCHANGE 114
50 #define DISPID_FRAMEBEFORENAVIGATE 200
51 #define DISPID_FRAMENAVIGATECOMPLETE 201
52 #define DISPID_FRAMENEWWINDOW 204
54 #define DISPID_NAVIGATECOMPLETE2 252
55 #define DISPID_ONQUIT 253
56 #define DISPID_ONVISIBLE 254
57 #define DISPID_ONTOOLBAR 255
58 #define DISPID_ONMENUBAR 256
59 #define DISPID_ONSTATUSBAR 257
60 #define DISPID_ONFULLSCREEN 258
61 #define DISPID_DOCUMENTCOMPLETE 259
62 #define DISPID_ONTHEATERMODE 260
63 #define DISPID_ONADDRESSBAR 261
64 #define DISPID_WINDOWSETRESIZABLE 262
65 #define DISPID_WINDOWCLOSING 263
66 #define DISPID_WINDOWSETLEFT 264
67 #define DISPID_WINDOWSETTOP 265
68 #define DISPID_WINDOWSETWIDTH 266
69 #define DISPID_WINDOWSETHEIGHT 267
70 #define DISPID_CLIENTTOHOSTWINDOW 268
71 #define DISPID_SETSECURELOCKICON 269
72 #define DISPID_FILEDOWNLOAD 270
73 #define DISPID_NAVIGATEERROR 271
74 #define DISPID_PRIVACYIMPACTEDSTATECHANGE 272
77 #ifndef V_INT // missing in MinGW (as of 07.02.2004)
78 #define V_INT(x) V_UNION(x, intVal)
82 #define NOVTABLE __declspec(novtable)
89 #pragma warning(disable: 4355) // use of 'this' for initialization of _connector
93 struct NOVTABLE ComSrvObject
// NOVTABLE erlaubt, da protected Destruktor
96 ComSrvObject() : _ref(1) {}
97 virtual ~ComSrvObject() {}
102 struct SimpleComObject
: public ComSrvObject
104 ULONG
IncRef() {return ++_ref
;}
105 ULONG
DecRef() {ULONG ref
=--_ref
; if (!ref
) {_ref
++; delete this;} return ref
;}
109 // server object interfaces
111 template<typename BASE
> struct IComSrvQI
: public BASE
113 IComSrvQI(REFIID uuid_base
)
114 : _uuid_base(uuid_base
)
118 STDMETHODIMP
QueryInterface(REFIID riid
, LPVOID
* ppv
)
122 if (IsEqualIID(riid
, _uuid_base
) || IsEqualIID(riid
, IID_IUnknown
))
123 {*ppv
=static_cast<BASE
*>(this); this->AddRef(); return S_OK
;}
125 return E_NOINTERFACE
;
130 virtual ~IComSrvQI() {}
135 template<> struct IComSrvQI
<IUnknown
> : public IUnknown
137 STDMETHODIMP
QueryInterface(REFIID riid
, LPVOID
* ppv
)
141 if (IsEqualIID(riid
, IID_IUnknown
))
142 {*ppv
=this; AddRef(); return S_OK
;}
144 return E_NOINTERFACE
;
148 IComSrvQI
<IUnknown
>() {}
149 virtual ~IComSrvQI
<IUnknown
>() {}
153 template<typename BASE
, typename OBJ
>
154 class IComSrvBase
: public IComSrvQI
<BASE
>
156 typedef IComSrvQI
<BASE
> super
;
159 IComSrvBase(REFIID uuid_base
)
165 STDMETHODIMP_(ULONG
) AddRef() {return static_cast<OBJ
*>(this)->IncRef();}
166 STDMETHODIMP_(ULONG
) Release() {return static_cast<OBJ
*>(this)->DecRef();}
170 template<typename T
> struct ConnectionPoint
: public SIfacePtr
<T
>
172 ConnectionPoint(IConnectionPointContainer
* pCPC
, REFIID riid
)
174 CheckError(pCPC
->FindConnectionPoint(riid
, &this->_p
));
178 struct EventConnection
180 EventConnection(IConnectionPoint
* connectionpoint
, IUnknown
* sink
)
182 CheckError(connectionpoint
->Advise(sink
, &_cookie
));
183 _connectionpoint
= connectionpoint
;
186 template<typename T
> EventConnection(T
& connectionpoint
, IUnknown
* sink
)
188 CheckError(connectionpoint
->Advise(sink
, &_cookie
));
189 _connectionpoint
= connectionpoint
;
192 /* template<typename T> EventConnection(SIfacePtr<T>& connectionpoint, IUnknown* sink)
194 CheckError(connectionpoint->Advise(sink, &_cookie));
195 _connectionpoint = connectionpoint.GetPtr();
198 /* template<typename T> EventConnection(T& connectionpoint, IUnknown* sink)
200 CheckError(connectionpoint->Advise(sink, &_cookie));
201 _connectionpoint = connectionpoint;
206 if (_connectionpoint
)
207 _connectionpoint
->Unadvise(_cookie
);
211 SIfacePtr
<IConnectionPoint
> _connectionpoint
;
215 struct EventConnector
: public EventConnection
217 EventConnector(IUnknown
* unknown
, REFIID riid
, IUnknown
* sink
)
218 : EventConnection(ConnectionPoint
<IConnectionPoint
>(
219 SIfacePtr
<IConnectionPointContainer
>(unknown
, IID_IConnectionPointContainer
), riid
), sink
)
225 struct OleInPlaceClient
: public SimpleComObject
,
226 public IOleClientSite
,
227 public IOleInPlaceSite
233 OleInPlaceClient(HWND hwnd
=0)
238 void attach(HWND hwnd
)
243 HRESULT
attach_control(IOleObject
* ole_obj
, LONG iVerb
=OLEIVERB_INPLACEACTIVATE
, HWND hwndParent
=0, LPCRECT pRect
=NULL
)
245 HRESULT hr
= ole_obj
->SetClientSite(this);
249 // hr = ole_obj->SetHostNames(app, doc));
251 hr
= ole_obj
->DoVerb(iVerb
, NULL
, this, 0, 0/*hwnd*/, NULL
/*&rcPos*/);
256 HRESULT
detach(IOleObject
* ole_obj
, DWORD dwSaveOption
=OLECLOSE_SAVEIFDIRTY
)
258 HRESULT hr
= ole_obj
->Close(dwSaveOption
);
265 STDMETHODIMP
QueryInterface(REFIID riid
, LPVOID
* ppv
)
267 if (IsEqualIID(riid
, IID_IOleClientSite
))
268 {*ppv
=static_cast<IOleClientSite
*>(this); IncRef(); return S_OK
;}
270 if (IsEqualIID(riid
, IID_IOleInPlaceSite
))
271 {*ppv
=static_cast<IOleInPlaceSite
*>(this); IncRef(); return S_OK
;}
273 if (IsEqualIID(riid
, IID_IUnknown
))
274 {*ppv
=static_cast<IOleClientSite
/*oder auch IOleInPlaceSite*/*>(this); IncRef(); return S_OK
;}
276 return E_NOINTERFACE
;
279 STDMETHODIMP_(ULONG
) AddRef() {return IncRef();}
280 STDMETHODIMP_(ULONG
) Release() {return DecRef();}
285 virtual /* [input_sync] */ HRESULT STDMETHODCALLTYPE
GetWindow(/* [out] */ HWND __RPC_FAR
*phwnd
)
291 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(/* [in] */ BOOL fEnterMode
)
299 virtual HRESULT STDMETHODCALLTYPE
SaveObject()
304 virtual HRESULT STDMETHODCALLTYPE
GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
, IMoniker __RPC_FAR
*__RPC_FAR
*ppmk
)
309 virtual HRESULT STDMETHODCALLTYPE
GetContainer(IOleContainer __RPC_FAR
*__RPC_FAR
*ppContainer
)
312 return E_NOINTERFACE
;
315 virtual HRESULT STDMETHODCALLTYPE
ShowObject()
320 virtual HRESULT STDMETHODCALLTYPE
OnShowWindow(BOOL fShow
)
325 virtual HRESULT STDMETHODCALLTYPE
RequestNewObjectLayout()
333 virtual HRESULT STDMETHODCALLTYPE
CanInPlaceActivate()
338 virtual HRESULT STDMETHODCALLTYPE
OnInPlaceActivate()
343 virtual HRESULT STDMETHODCALLTYPE
OnUIActivate()
348 virtual HRESULT STDMETHODCALLTYPE
GetWindowContext(
349 /* [out] */ IOleInPlaceFrame __RPC_FAR
*__RPC_FAR
*ppFrame
,
350 /* [out] */ IOleInPlaceUIWindow __RPC_FAR
*__RPC_FAR
*ppDoc
,
351 /* [out] */ LPRECT lprcPosRect
,
352 /* [out] */ LPRECT lprcClipRect
,
353 /* [out][in] */ LPOLEINPLACEFRAMEINFO lpFrameInfo
)
355 ClientRect
rect(_hwnd
);
360 *lprcClipRect
= rect
;
362 assert(lpFrameInfo
->cb
>=sizeof(OLEINPLACEFRAMEINFO
));
363 lpFrameInfo
->fMDIApp
= FALSE
;
364 lpFrameInfo
->hwndFrame
= 0;
365 lpFrameInfo
->haccel
= 0;
366 lpFrameInfo
->cAccelEntries
= 0;
371 virtual HRESULT STDMETHODCALLTYPE
Scroll(/* [in] */ SIZE scrollExtant
)
376 virtual HRESULT STDMETHODCALLTYPE
OnUIDeactivate(/* [in] */ BOOL fUndoable
)
381 virtual HRESULT STDMETHODCALLTYPE
OnInPlaceDeactivate()
386 virtual HRESULT STDMETHODCALLTYPE
DiscardUndoState()
391 virtual HRESULT STDMETHODCALLTYPE
DeactivateAndUndo()
396 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChange(/* [in] */ LPCRECT lprcPosRect
)
403 // window with in place activates Active-X Control
405 template<typename BASE
, typename SMARTPTR
> struct IPCtrlWindow
: public BASE
409 IPCtrlWindow(HWND hwnd
)
414 template<typename T
> IPCtrlWindow(HWND hwnd
, T
& info
)
419 HRESULT
create_control(HWND hwnd
, REFIID clsid
, REFIID riid
)
421 // Erzeugen einer Instanz des Controls
422 HRESULT hr
= _control
.CreateInstance(clsid
, riid
);
426 _client_side
.attach(hwnd
);
428 hr
= _client_side
.attach_control(SIfacePtr
<IOleObject
>(_control
, IID_IOleObject
)/*, OLEIVERB_INPLACEACTIVATE,
429 hwnd, &Rect(10, 10, 500, 500)*/);
433 // try to get a IOleInPlaceObject interface for window resizing
434 return _control
.QueryInterface(IID_IOleInPlaceObject
, &_in_place_object
); // _in_place_object = _control
438 LRESULT
WndProc(UINT nmsg
, WPARAM wparam
, LPARAM lparam
)
440 if (nmsg
== WM_SIZE
) {
441 if (_in_place_object
) {
442 RECT rect
= {0, 0, LOWORD(lparam
), HIWORD(lparam
)};
444 _in_place_object
->SetObjectRects(&rect
, &rect
);
446 } else if (nmsg
== WM_CLOSE
) {
447 _in_place_object
= NULL
;
450 _client_side
.detach(SIfacePtr
<IOleObject
>(_control
, IID_IOleObject
), OLECLOSE_NOSAVE
);
455 return super::WndProc(nmsg
, wparam
, lparam
);
460 OleInPlaceClient _client_side
;
461 SIfacePtr
<IOleInPlaceObject
> _in_place_object
;
466 #include "exdispid.h"
469 struct DWebBrowserEvents2IF
471 virtual ~DWebBrowserEvents2IF() {}
473 virtual void StatusTextChange(const BStr
& text
)
476 virtual void ProgressChange(long progress
, long progressMax
)
479 virtual void WindowMove()
482 virtual void WindowResize()
485 virtual void WindowActivate()
488 virtual void PropertyChange(const BStr
& property
)
491 virtual void DownloadComplete()
494 virtual void CommandStateChange(long command
, bool enable
)
497 virtual void DownloadBegin()
500 virtual void NewWindow2(IDispatch
** ppDisp
, VARIANT_BOOL
& cancel
)
503 virtual void TitleChange(const BStr
& text
)
506 virtual void TitleIconChange(const BStr
& text
)
509 virtual void FrameBeforeNavigate(const BStr
& url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& cancel
)
512 virtual void FrameNavigateComplete(const BStr
& url
)
515 virtual void FrameNewWindow(const BStr
&url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& processed
)
518 virtual void BeforeNavigate2(IDispatch
* pDisp
, const Variant
& url
, const Variant
& flags
,
519 const Variant
& targetFrameName
, const Variant
& postData
,
520 const Variant
& headers
, VARIANT_BOOL
& cancel
)
523 virtual void NavigateComplete2(IDispatch
* pDisp
, const Variant
& url
)
526 virtual void OnQuit()
529 virtual void OnVisible(bool Visible
)
532 virtual void OnToolbar(bool Visible
)
535 virtual void OnMenubar(bool Visible
)
538 virtual void OnStatusbar(bool Visible
)
541 virtual void OnFullscreen(bool Visible
)
544 virtual void DocumentComplete()
547 virtual void OnTheatermode(bool Visible
)
550 virtual void OnAddressbar(bool Visible
)
553 virtual void WindowSetResizable(bool Visible
)
556 virtual void WindowClosing(VARIANT_BOOL IsChildWindow
, VARIANT_BOOL
& cancel
)
559 virtual void WindowSetLeft(long Left
)
562 virtual void WindowSetTop(long Top
)
565 virtual void WindowSetWidth(long Width
)
568 virtual void WindowSetHeight(long Height
)
571 virtual void ClientToHostWindow(long& CX
, long& CY
)
574 virtual void SetSecureLockIcon(long SecureLockIcon
)
577 virtual void FileDownload(Variant
& cancel
)
580 virtual void NavigateError(IDispatch
* pDisp
, const Variant
& url
, const Variant
& Frame
, const Variant
& StatusCode
, VARIANT_BOOL
& cancel
)
583 virtual void PrivacyImpactedStateChange(bool bImpacted
)
588 // The web browser control has to be initialized completely before being able,
589 // to display a page, that does not access internet.
590 struct ANSUNC BrowserNavigator
594 void attach(IWebBrowser
* browser
);
595 void goto_url(LPCTSTR url
);
596 void set_html_page(const String
& html_txt
);
597 void navigated(LPCTSTR url
);
599 IWebBrowser
* get_browser() {return _browser
.get();}
602 SIfacePtr
<IWebBrowser
> _browser
;
604 String _new_html_txt
;
605 bool _browser_initialized
;
609 // MinGW defines a wrong FixedDWebBrowserEvents2 interface with virtual functions for DISPID calls, so we use our own, corrected version:
610 interface FixedDWebBrowserEvents2
: public IDispatch
613 virtual ~FixedDWebBrowserEvents2() {}
617 struct ANSUNC DWebBrowserEvents2Impl
: public SimpleComObject
,
618 public IComSrvBase
<FixedDWebBrowserEvents2
, DWebBrowserEvents2Impl
>,
619 public DWebBrowserEvents2IF
621 typedef IComSrvBase
<FixedDWebBrowserEvents2
, DWebBrowserEvents2Impl
> super
;
624 DWebBrowserEvents2IF
* _callback
;
627 DWebBrowserEvents2Impl(BrowserNavigator
& navigator
)
628 : super(DIID_DWebBrowserEvents2
),
629 _navigator(navigator
)
636 STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
640 if (SUCCEEDED(super::QueryInterface(riid, ppv)))
643 return E_NOINTERFACE;
648 STDMETHOD(GetTypeInfoCount
)(UINT
* pctinfo
)
651 STDMETHOD(GetTypeInfo
)(UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
654 STDMETHOD(GetIDsOfNames
)(REFIID riid
, LPOLESTR
* rgszNames
, UINT cNames
, LCID lcid
, DISPID
* rgDispId
)
657 STDMETHOD(Invoke
)(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
658 DISPPARAMS __RPC_FAR
*pDispParams
, VARIANT __RPC_FAR
*pVarResult
, EXCEPINFO __RPC_FAR
*pExcepInfo
, UINT __RPC_FAR
*puArgErr
)
660 switch(dispIdMember
) {
661 case DISPID_STATUSTEXTCHANGE
:
662 _callback
->StatusTextChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
665 case DISPID_COMMANDSTATECHANGE
:
666 _callback
->CommandStateChange(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
669 case DISPID_DOWNLOADBEGIN
:
670 _callback
->DownloadBegin();
673 case DISPID_PROGRESSCHANGE
: // sent when download progress is updated
674 _callback
->ProgressChange(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
677 case DISPID_WINDOWMOVE
: // sent when main window has been moved
678 _callback
->WindowMove();
681 case DISPID_WINDOWRESIZE
: // sent when main window has been sized
682 _callback
->WindowResize();
685 case DISPID_WINDOWACTIVATE
: // sent when main window has been activated
686 _callback
->WindowActivate();
689 case DISPID_PROPERTYCHANGE
: // sent when the PutProperty method is called
690 _callback
->PropertyChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
693 case DISPID_TITLECHANGE
: // sent when the document title changes
694 _callback
->TitleChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
697 case DISPID_TITLEICONCHANGE
: // sent when the top level window icon may have changed.
698 _callback
->TitleIconChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
702 // anything below here is not present in DWebBrowserEvents, only in DWebBrowserEvents2: ->
704 case DISPID_FRAMEBEFORENAVIGATE
:
705 if (pDispParams
->cArgs
!= 6)
707 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
709 _callback
->FrameBeforeNavigate(
710 (BStr
)Variant(&pDispParams
->rgvarg
[5]), Variant(&pDispParams
->rgvarg
[4]),
711 (BStr
)Variant(&pDispParams
->rgvarg
[3]), &pDispParams
->rgvarg
[2],
712 (BStr
)Variant(&pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
715 case DISPID_FRAMENAVIGATECOMPLETE
:
716 if (pDispParams
->cArgs
!= 1)
718 _callback
->FrameNavigateComplete((BStr
)Variant(pDispParams
->rgvarg
[0]));
721 case DISPID_FRAMENEWWINDOW
:
722 if (pDispParams
->cArgs
!= 6)
724 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
726 _callback
->FrameNewWindow((BStr
)Variant(&pDispParams
->rgvarg
[5]), Variant(&pDispParams
->rgvarg
[4]),
727 (BStr
)Variant(&pDispParams
->rgvarg
[3]), &pDispParams
->rgvarg
[2],
728 (BStr
)Variant(&pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
731 case DISPID_BEFORENAVIGATE2
: // hyperlink clicked on
732 if (pDispParams
->cArgs
!= 7)
734 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
736 _callback
->BeforeNavigate2(Variant(pDispParams
->rgvarg
[6]),
737 pDispParams
->rgvarg
[5], &pDispParams
->rgvarg
[4],
738 pDispParams
->rgvarg
[3], &pDispParams
->rgvarg
[2],
739 pDispParams
->rgvarg
[1], *V_BOOLREF(&pDispParams
->rgvarg
[0]));
742 case DISPID_NEWWINDOW2
: // sent when a new window should be created
743 if (pDispParams
->cArgs
!= 2)
745 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
747 if (V_VT(&pDispParams
->rgvarg
[1]) != (VT_DISPATCH
|VT_BYREF
))
749 _callback
->NewWindow2(V_DISPATCHREF(&pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
752 case DISPID_NAVIGATECOMPLETE2
:// UIActivate new document
753 if (pDispParams
->cArgs
!= 2)
756 // notify the navigator
757 NavigateComplete2(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
759 _callback
->NavigateComplete2(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
766 case DISPID_ONVISIBLE
: // sent when the window goes visible/hidden
767 if (pDispParams
->cArgs
!= 1)
769 _callback
->OnVisible(Variant(pDispParams
->rgvarg
[0]));
772 case DISPID_ONTOOLBAR
: // sent when the toolbar should be shown/hidden
773 if (pDispParams
->cArgs
!= 1)
775 _callback
->OnToolbar(Variant(pDispParams
->rgvarg
[0]));
778 case DISPID_ONMENUBAR
: // sent when the menubar should be shown/hidden
779 if (pDispParams
->cArgs
!= 1)
781 _callback
->OnMenubar(Variant(pDispParams
->rgvarg
[0]));
784 case DISPID_ONSTATUSBAR
: // sent when the statusbar should be shown/hidden
785 if (pDispParams
->cArgs
!= 1)
787 _callback
->OnStatusbar(Variant(pDispParams
->rgvarg
[0]));
790 case DISPID_ONFULLSCREEN
: // sent when kiosk mode should be on/off
791 if (pDispParams
->cArgs
!= 1)
793 _callback
->OnFullscreen(Variant(pDispParams
->rgvarg
[0]));
796 case DISPID_DOCUMENTCOMPLETE
:// new document goes ReadyState_Complete
797 _callback
->DocumentComplete();
800 case DISPID_DOWNLOADCOMPLETE
:
801 _callback
->DownloadComplete();
804 case DISPID_ONTHEATERMODE
: // sent when theater mode should be on/off
805 if (pDispParams
->cArgs
!= 1)
807 _callback
->OnTheatermode(Variant(pDispParams
->rgvarg
[0]));
810 case DISPID_ONADDRESSBAR
: // sent when the address bar should be shown/hidden
811 if (pDispParams
->cArgs
!= 1)
813 _callback
->OnAddressbar(Variant(pDispParams
->rgvarg
[0]));
816 case DISPID_WINDOWSETRESIZABLE
:// sent to set the style of the host window frame
817 if (pDispParams
->cArgs
!= 1)
819 _callback
->WindowSetResizable(Variant(pDispParams
->rgvarg
[0]));
822 case DISPID_WINDOWCLOSING
: // sent before script window.close closes the window
823 if (pDispParams
->cArgs
!= 2)
825 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
827 _callback
->WindowClosing(Variant(pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
830 case DISPID_WINDOWSETLEFT
: // sent when the put_left method is called on the WebOC
831 if (pDispParams
->cArgs
!= 1)
833 _callback
->WindowSetLeft(Variant(pDispParams
->rgvarg
[0]));
836 case DISPID_WINDOWSETTOP
: // sent when the put_top method is called on the WebOC
837 if (pDispParams
->cArgs
!= 1)
839 _callback
->WindowSetTop(Variant(pDispParams
->rgvarg
[0]));
842 case DISPID_WINDOWSETWIDTH
: // sent when the put_width method is called on the WebOC
843 if (pDispParams
->cArgs
!= 1)
845 _callback
->WindowSetWidth(Variant(pDispParams
->rgvarg
[0]));
848 case DISPID_WINDOWSETHEIGHT
: // sent when the put_height method is called on the WebOC
849 if (pDispParams
->cArgs
!= 1)
851 _callback
->WindowSetHeight(Variant(pDispParams
->rgvarg
[0]));
854 case DISPID_CLIENTTOHOSTWINDOW
:// sent during window.open to request conversion of dimensions
855 if (pDispParams
->cArgs
!= 2)
857 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_I4
|VT_BYREF
))
859 if (V_VT(&pDispParams
->rgvarg
[1]) != (VT_I4
|VT_BYREF
))
861 _callback
->ClientToHostWindow(*V_I4REF(&pDispParams
->rgvarg
[1]), *V_I4REF(&pDispParams
->rgvarg
[0]));
864 case DISPID_SETSECURELOCKICON
:// sent to suggest the appropriate security icon to show
865 if (pDispParams
->cArgs
!= 1)
867 _callback
->SetSecureLockIcon(Variant(pDispParams
->rgvarg
[0]));
870 case DISPID_FILEDOWNLOAD
: { // Fired to indicate the File Download dialog is opening
871 if (pDispParams
->cArgs
!= 1) //@@ every time 2 ?!
873 Variant
var(pDispParams
->rgvarg
[0]);
874 _callback
->FileDownload(var
);}
877 case DISPID_NAVIGATEERROR
: // Fired to indicate the a binding error has occured
878 if (pDispParams
->cArgs
!= 5)
880 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
882 _callback
->NavigateError(Variant(pDispParams
->rgvarg
[4]), Variant(pDispParams
->rgvarg
[3]),
883 Variant(pDispParams
->rgvarg
[2]), Variant(pDispParams
->rgvarg
[1]),
884 *V_BOOLREF(&pDispParams
->rgvarg
[0]));
887 case DISPID_PRIVACYIMPACTEDSTATECHANGE
:// Fired when the user's browsing experience is impacted
888 if (pDispParams
->cArgs
!= 1)
890 _callback
->PrivacyImpactedStateChange(Variant(pDispParams
->rgvarg
[0]));
901 BrowserNavigator
& _navigator
;
903 void NavigateComplete2(IDispatch
* pDisp
, const Variant
& url
)
905 String adr
= (BStr
)url
;
907 _navigator
.navigated(adr
);
912 /// encapsulation of the Web control
913 struct WebChildWindow
: public IPCtrlWindow
<ChildWindow
, SIfacePtr
<IWebBrowser2
> >,
914 public DWebBrowserEvents2Impl
916 typedef IPCtrlWindow
<ChildWindow
, SIfacePtr
<IWebBrowser2
> > super
;
917 typedef DWebBrowserEvents2Impl web_super
;
919 WebChildWindow(HWND hwnd
, const WebChildWndInfo
& info
);
921 static WebChildWindow
* create(const WebChildWndInfo
& info
)
923 ChildWindow
* child
= ChildWindow::create(info
,
924 WINDOW_CREATOR_INFO(WebChildWindow
,WebChildWndInfo
), CLASSNAME_CHILDWND
, NULL
, WS_CHILD
|WS_VISIBLE
);
926 return static_cast<WebChildWindow
*>(child
);
930 // DWebBrowserEvents2Impl overides ->
932 void BeforeNavigate2(IDispatch
* pDisp
, const Variant
& url
, const Variant
& flags
,
933 const Variant
& targetFrameName
, const Variant
& postData
,
934 const Variant
& headers
, VARIANT_BOOL
& cancel
)
936 //String adr = (BStr)url;
939 void NavigateComplete2(IDispatch
* pDisp
, const Variant
& url
)
941 web_super::NavigateComplete2(pDisp
, url
);
943 set_url(String(BStr(url
)));
946 void StatusTextChange(const BStr
& text
)
949 SendMessage(_hwndFrame
, PM_SETSTATUSTEXT
, 0, (LPARAM
)_statusText
.c_str());
952 void ProgressChange(long Progress
, long ProgressMax
)
964 void WindowActivate()
968 void PropertyChange(const BStr
& Property
)
971 _control
->GetProperty(Property
, &value
);
974 void CommandStateChange(long command
/*CSC_NAVIGATEFORWARD, CSC_NAVIGATEBACK*/, bool enable
)
982 void NewWindow2(IDispatch
** ppDisp
, VARIANT_BOOL
& cancel
)
988 void TitleChange(const BStr
& text
)
990 SetWindowText(_hwnd
, String(text
));
993 void TitleIconChange(const BStr
& text
)
997 void FrameBeforeNavigate(const BStr
& url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& cancel
)
1001 void FrameNavigateComplete(const BStr
& url
)
1005 void FrameNewWindow(const BStr
& url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& processed
)
1013 void OnVisible(bool Visible
)
1017 void OnToolbar(bool Visible
)
1021 void OnMenubar(bool Visible
)
1025 void OnStatusbar(bool Visible
)
1029 void OnFullscreen(bool Visible
)
1033 void DocumentComplete()
1037 void OnTheatermode(bool Visible
)
1041 void OnAddressbar(bool Visible
)
1045 void WindowSetResizable(bool Visible
)
1049 void WindowClosing(VARIANT_BOOL IsChildWindow
, VARIANT_BOOL
& cancel
)
1053 void WindowSetLeft(long Left
)
1057 void WindowSetTop(long Top
)
1061 void WindowSetWidth(long Width
)
1065 void WindowSetHeight(long Height
)
1069 void ClientToHostWindow(long& CX
, long& CY
)
1073 void SetSecureLockIcon(long SecureLockIcon
)
1077 void FileDownload(Variant
& cancel
)
1081 void NavigateError(IDispatch
* pDisp
, const Variant
& url
, const Variant
& Frame
, const Variant
& StatusCode
, VARIANT_BOOL
& cancel
)
1085 void PrivacyImpactedStateChange(bool bImpacted
)
1091 BrowserNavigator _navigator
;
1092 auto_ptr
<EventConnector
> _connector
;
1094 LRESULT
WndProc(UINT nmsg
, WPARAM wparam
, LPARAM lparam
);
1096 virtual String
jump_to_int(LPCTSTR url
);