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
) {*ppv
=0;
119 if (IsEqualIID(riid
, _uuid_base
) ||
120 IsEqualIID(riid
, IID_IUnknown
)) {*ppv
=static_cast<BASE
*>(this); this->AddRef(); return S_OK
;}
121 return E_NOINTERFACE
;}
129 template<> struct IComSrvQI
<IUnknown
> : public IUnknown
131 STDMETHODIMP
QueryInterface(REFIID riid
, LPVOID
* ppv
) {*ppv
=0;
132 if (IsEqualIID(riid
, IID_IUnknown
)) {*ppv
=this; AddRef(); return S_OK
;}
133 return E_NOINTERFACE
;}
136 IComSrvQI
<IUnknown
>() {}
140 template<typename BASE
, typename OBJ
>
141 class IComSrvBase
: public IComSrvQI
<BASE
>
143 typedef IComSrvQI
<BASE
> super
;
146 IComSrvBase(REFIID uuid_base
)
152 STDMETHODIMP_(ULONG
) AddRef() {return static_cast<OBJ
*>(this)->IncRef();}
153 STDMETHODIMP_(ULONG
) Release() {return static_cast<OBJ
*>(this)->DecRef();}
157 template<typename T
> struct ConnectionPoint
: public SIfacePtr
<T
>
159 ConnectionPoint(IConnectionPointContainer
* pCPC
, REFIID riid
)
161 CheckError(pCPC
->FindConnectionPoint(riid
, &this->_p
));
165 struct EventConnection
167 EventConnection(IConnectionPoint
* connectionpoint
, IUnknown
* sink
)
169 CheckError(connectionpoint
->Advise(sink
, &_cookie
));
170 _connectionpoint
= connectionpoint
;
173 template<typename T
> EventConnection(T
& connectionpoint
, IUnknown
* sink
)
175 CheckError(connectionpoint
->Advise(sink
, &_cookie
));
176 _connectionpoint
= connectionpoint
;
179 /* template<typename T> EventConnection(SIfacePtr<T>& connectionpoint, IUnknown* sink)
181 CheckError(connectionpoint->Advise(sink, &_cookie));
182 _connectionpoint = connectionpoint.GetPtr();
185 /* template<typename T> EventConnection(T& connectionpoint, IUnknown* sink)
187 CheckError(connectionpoint->Advise(sink, &_cookie));
188 _connectionpoint = connectionpoint;
193 if (_connectionpoint
)
194 _connectionpoint
->Unadvise(_cookie
);
198 SIfacePtr
<IConnectionPoint
> _connectionpoint
;
202 struct EventConnector
: public EventConnection
204 EventConnector(IUnknown
* unknown
, REFIID riid
, IUnknown
* sink
)
205 : EventConnection(ConnectionPoint
<IConnectionPoint
>(
206 SIfacePtr
<IConnectionPointContainer
>(unknown
, IID_IConnectionPointContainer
), riid
), sink
)
212 struct OleInPlaceClient
: public SimpleComObject
,
213 public IOleClientSite
,
214 public IOleInPlaceSite
220 OleInPlaceClient(HWND hwnd
=0)
225 void attach(HWND hwnd
)
230 HRESULT
attach_control(IOleObject
* ole_obj
, LONG iVerb
=OLEIVERB_INPLACEACTIVATE
, HWND hwndParent
=0, LPCRECT pRect
=NULL
)
232 HRESULT hr
= ole_obj
->SetClientSite(this);
236 // hr = ole_obj->SetHostNames(app, doc));
238 hr
= ole_obj
->DoVerb(iVerb
, NULL
, this, 0, 0/*hwnd*/, NULL
/*&rcPos*/);
243 HRESULT
detach(IOleObject
* ole_obj
, DWORD dwSaveOption
=OLECLOSE_SAVEIFDIRTY
)
245 HRESULT hr
= ole_obj
->Close(dwSaveOption
);
252 STDMETHODIMP
QueryInterface(REFIID riid
, LPVOID
* ppv
)
254 if (IsEqualIID(riid
, IID_IOleClientSite
))
255 {*ppv
=static_cast<IOleClientSite
*>(this); IncRef(); return S_OK
;}
257 if (IsEqualIID(riid
, IID_IOleInPlaceSite
))
258 {*ppv
=static_cast<IOleInPlaceSite
*>(this); IncRef(); return S_OK
;}
260 if (IsEqualIID(riid
, IID_IUnknown
))
261 {*ppv
=static_cast<IOleClientSite
/*oder auch IOleInPlaceSite*/*>(this); IncRef(); return S_OK
;}
263 return E_NOINTERFACE
;
266 STDMETHODIMP_(ULONG
) AddRef() {return IncRef();}
267 STDMETHODIMP_(ULONG
) Release() {return DecRef();}
272 virtual /* [input_sync] */ HRESULT STDMETHODCALLTYPE
GetWindow(/* [out] */ HWND __RPC_FAR
*phwnd
)
278 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(/* [in] */ BOOL fEnterMode
)
286 virtual HRESULT STDMETHODCALLTYPE
SaveObject()
291 virtual HRESULT STDMETHODCALLTYPE
GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
, IMoniker __RPC_FAR
*__RPC_FAR
*ppmk
)
296 virtual HRESULT STDMETHODCALLTYPE
GetContainer(IOleContainer __RPC_FAR
*__RPC_FAR
*ppContainer
)
299 return E_NOINTERFACE
;
302 virtual HRESULT STDMETHODCALLTYPE
ShowObject()
307 virtual HRESULT STDMETHODCALLTYPE
OnShowWindow(BOOL fShow
)
312 virtual HRESULT STDMETHODCALLTYPE
RequestNewObjectLayout()
320 virtual HRESULT STDMETHODCALLTYPE
CanInPlaceActivate()
325 virtual HRESULT STDMETHODCALLTYPE
OnInPlaceActivate()
330 virtual HRESULT STDMETHODCALLTYPE
OnUIActivate()
335 virtual HRESULT STDMETHODCALLTYPE
GetWindowContext(
336 /* [out] */ IOleInPlaceFrame __RPC_FAR
*__RPC_FAR
*ppFrame
,
337 /* [out] */ IOleInPlaceUIWindow __RPC_FAR
*__RPC_FAR
*ppDoc
,
338 /* [out] */ LPRECT lprcPosRect
,
339 /* [out] */ LPRECT lprcClipRect
,
340 /* [out][in] */ LPOLEINPLACEFRAMEINFO lpFrameInfo
)
342 ClientRect
rect(_hwnd
);
347 *lprcClipRect
= rect
;
349 assert(lpFrameInfo
->cb
>=sizeof(OLEINPLACEFRAMEINFO
));
350 lpFrameInfo
->fMDIApp
= FALSE
;
351 lpFrameInfo
->hwndFrame
= 0;
352 lpFrameInfo
->haccel
= 0;
353 lpFrameInfo
->cAccelEntries
= 0;
358 virtual HRESULT STDMETHODCALLTYPE
Scroll(/* [in] */ SIZE scrollExtant
)
363 virtual HRESULT STDMETHODCALLTYPE
OnUIDeactivate(/* [in] */ BOOL fUndoable
)
368 virtual HRESULT STDMETHODCALLTYPE
OnInPlaceDeactivate()
373 virtual HRESULT STDMETHODCALLTYPE
DiscardUndoState()
378 virtual HRESULT STDMETHODCALLTYPE
DeactivateAndUndo()
383 virtual HRESULT STDMETHODCALLTYPE
OnPosRectChange(/* [in] */ LPCRECT lprcPosRect
)
390 // window with in place activates Active-X Control
392 template<typename BASE
, typename SMARTPTR
> struct IPCtrlWindow
: public BASE
396 IPCtrlWindow(HWND hwnd
)
401 template<typename T
> IPCtrlWindow(HWND hwnd
, T
& info
)
406 HRESULT
create_control(HWND hwnd
, REFIID clsid
, REFIID riid
)
408 // Erzeugen einer Instanz des Controls
409 HRESULT hr
= _control
.CreateInstance(clsid
, riid
);
413 _client_side
.attach(hwnd
);
415 hr
= _client_side
.attach_control(SIfacePtr
<IOleObject
>(_control
, IID_IOleObject
)/*, OLEIVERB_INPLACEACTIVATE,
416 hwnd, &Rect(10, 10, 500, 500)*/);
420 // try to get a IOleInPlaceObject interface for window resizing
421 return _control
.QueryInterface(IID_IOleInPlaceObject
, &_in_place_object
); // _in_place_object = _control
425 LRESULT
WndProc(UINT nmsg
, WPARAM wparam
, LPARAM lparam
)
427 if (nmsg
== WM_SIZE
) {
428 if (_in_place_object
) {
429 RECT rect
= {0, 0, LOWORD(lparam
), HIWORD(lparam
)};
431 _in_place_object
->SetObjectRects(&rect
, &rect
);
433 } else if (nmsg
== WM_CLOSE
) {
434 _in_place_object
= NULL
;
437 _client_side
.detach(SIfacePtr
<IOleObject
>(_control
, IID_IOleObject
), OLECLOSE_NOSAVE
);
442 return super::WndProc(nmsg
, wparam
, lparam
);
447 OleInPlaceClient _client_side
;
448 SIfacePtr
<IOleInPlaceObject
> _in_place_object
;
453 #include "exdispid.h"
456 struct DWebBrowserEvents2IF
458 virtual void StatusTextChange(const BStr
& text
)
461 virtual void ProgressChange(long progress
, long progressMax
)
464 virtual void WindowMove()
467 virtual void WindowResize()
470 virtual void WindowActivate()
473 virtual void PropertyChange(const BStr
& property
)
476 virtual void DownloadComplete()
479 virtual void CommandStateChange(long command
, bool enable
)
482 virtual void DownloadBegin()
485 virtual void NewWindow2(IDispatch
** ppDisp
, VARIANT_BOOL
& cancel
)
488 virtual void TitleChange(const BStr
& text
)
491 virtual void TitleIconChange(const BStr
& text
)
494 virtual void FrameBeforeNavigate(const BStr
& url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& cancel
)
497 virtual void FrameNavigateComplete(const BStr
& url
)
500 virtual void FrameNewWindow(const BStr
&url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& processed
)
503 virtual void BeforeNavigate2(IDispatch
* pDisp
, const Variant
& url
, const Variant
& flags
,
504 const Variant
& targetFrameName
, const Variant
& postData
,
505 const Variant
& headers
, VARIANT_BOOL
& cancel
)
508 virtual void NavigateComplete2(IDispatch
* pDisp
, const Variant
& url
)
511 virtual void OnQuit()
514 virtual void OnVisible(bool Visible
)
517 virtual void OnToolbar(bool Visible
)
520 virtual void OnMenubar(bool Visible
)
523 virtual void OnStatusbar(bool Visible
)
526 virtual void OnFullscreen(bool Visible
)
529 virtual void DocumentComplete()
532 virtual void OnTheatermode(bool Visible
)
535 virtual void OnAddressbar(bool Visible
)
538 virtual void WindowSetResizable(bool Visible
)
541 virtual void WindowClosing(VARIANT_BOOL IsChildWindow
, VARIANT_BOOL
& cancel
)
544 virtual void WindowSetLeft(long Left
)
547 virtual void WindowSetTop(long Top
)
550 virtual void WindowSetWidth(long Width
)
553 virtual void WindowSetHeight(long Height
)
556 virtual void ClientToHostWindow(long& CX
, long& CY
)
559 virtual void SetSecureLockIcon(long SecureLockIcon
)
562 virtual void FileDownload(Variant
& cancel
)
565 virtual void NavigateError(IDispatch
* pDisp
, const Variant
& url
, const Variant
& Frame
, const Variant
& StatusCode
, VARIANT_BOOL
& cancel
)
568 virtual void PrivacyImpactedStateChange(bool bImpacted
)
573 // The web browser control has to be initialized completely before being able,
574 // to display a page, that does not access internet.
575 struct ANSUNC BrowserNavigator
579 void attach(IWebBrowser
* browser
);
580 void goto_url(LPCTSTR url
);
581 void set_html_page(const String
& html_txt
);
582 void navigated(LPCTSTR url
);
584 IWebBrowser
* get_browser() {return _browser
.get();}
587 SIfacePtr
<IWebBrowser
> _browser
;
589 String _new_html_txt
;
590 bool _browser_initialized
;
594 // MinGW defines a wrong FixedDWebBrowserEvents2 interface with virtual functions for DISPID calls, so we use our own, corrected version:
595 interface FixedDWebBrowserEvents2
: public IDispatch
599 struct ANSUNC DWebBrowserEvents2Impl
: public SimpleComObject
,
600 public IComSrvBase
<FixedDWebBrowserEvents2
, DWebBrowserEvents2Impl
>,
601 public DWebBrowserEvents2IF
603 typedef IComSrvBase
<FixedDWebBrowserEvents2
, DWebBrowserEvents2Impl
> super
;
606 DWebBrowserEvents2IF
* _callback
;
609 DWebBrowserEvents2Impl(BrowserNavigator
& navigator
)
610 : super(DIID_DWebBrowserEvents2
),
611 _navigator(navigator
)
618 STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
622 if (SUCCEEDED(super::QueryInterface(riid, ppv)))
625 return E_NOINTERFACE;
630 STDMETHOD(GetTypeInfoCount
)(UINT
* pctinfo
)
633 STDMETHOD(GetTypeInfo
)(UINT iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
636 STDMETHOD(GetIDsOfNames
)(REFIID riid
, LPOLESTR
* rgszNames
, UINT cNames
, LCID lcid
, DISPID
* rgDispId
)
639 STDMETHOD(Invoke
)(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
640 DISPPARAMS __RPC_FAR
*pDispParams
, VARIANT __RPC_FAR
*pVarResult
, EXCEPINFO __RPC_FAR
*pExcepInfo
, UINT __RPC_FAR
*puArgErr
)
642 switch(dispIdMember
) {
643 case DISPID_STATUSTEXTCHANGE
:
644 _callback
->StatusTextChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
647 case DISPID_COMMANDSTATECHANGE
:
648 _callback
->CommandStateChange(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
651 case DISPID_DOWNLOADBEGIN
:
652 _callback
->DownloadBegin();
655 case DISPID_PROGRESSCHANGE
: // sent when download progress is updated
656 _callback
->ProgressChange(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
659 case DISPID_WINDOWMOVE
: // sent when main window has been moved
660 _callback
->WindowMove();
663 case DISPID_WINDOWRESIZE
: // sent when main window has been sized
664 _callback
->WindowResize();
667 case DISPID_WINDOWACTIVATE
: // sent when main window has been activated
668 _callback
->WindowActivate();
671 case DISPID_PROPERTYCHANGE
: // sent when the PutProperty method is called
672 _callback
->PropertyChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
675 case DISPID_TITLECHANGE
: // sent when the document title changes
676 _callback
->TitleChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
679 case DISPID_TITLEICONCHANGE
: // sent when the top level window icon may have changed.
680 _callback
->TitleIconChange((BStr
)Variant(pDispParams
->rgvarg
[0]));
684 // anything below here is not present in DWebBrowserEvents, only in DWebBrowserEvents2: ->
686 case DISPID_FRAMEBEFORENAVIGATE
:
687 if (pDispParams
->cArgs
!= 6)
689 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
691 _callback
->FrameBeforeNavigate(
692 (BStr
)Variant(&pDispParams
->rgvarg
[5]), Variant(&pDispParams
->rgvarg
[4]),
693 (BStr
)Variant(&pDispParams
->rgvarg
[3]), &pDispParams
->rgvarg
[2],
694 (BStr
)Variant(&pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
697 case DISPID_FRAMENAVIGATECOMPLETE
:
698 if (pDispParams
->cArgs
!= 1)
700 _callback
->FrameNavigateComplete((BStr
)Variant(pDispParams
->rgvarg
[0]));
703 case DISPID_FRAMENEWWINDOW
:
704 if (pDispParams
->cArgs
!= 6)
706 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
708 _callback
->FrameNewWindow((BStr
)Variant(&pDispParams
->rgvarg
[5]), Variant(&pDispParams
->rgvarg
[4]),
709 (BStr
)Variant(&pDispParams
->rgvarg
[3]), &pDispParams
->rgvarg
[2],
710 (BStr
)Variant(&pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
713 case DISPID_BEFORENAVIGATE2
: // hyperlink clicked on
714 if (pDispParams
->cArgs
!= 7)
716 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
718 _callback
->BeforeNavigate2(Variant(pDispParams
->rgvarg
[6]),
719 pDispParams
->rgvarg
[5], &pDispParams
->rgvarg
[4],
720 pDispParams
->rgvarg
[3], &pDispParams
->rgvarg
[2],
721 pDispParams
->rgvarg
[1], *V_BOOLREF(&pDispParams
->rgvarg
[0]));
724 case DISPID_NEWWINDOW2
: // sent when a new window should be created
725 if (pDispParams
->cArgs
!= 2)
727 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
729 if (V_VT(&pDispParams
->rgvarg
[1]) != (VT_DISPATCH
|VT_BYREF
))
731 _callback
->NewWindow2(V_DISPATCHREF(&pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
734 case DISPID_NAVIGATECOMPLETE2
:// UIActivate new document
735 if (pDispParams
->cArgs
!= 2)
738 // notify the navigator
739 NavigateComplete2(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
741 _callback
->NavigateComplete2(Variant(pDispParams
->rgvarg
[1]), Variant(pDispParams
->rgvarg
[0]));
748 case DISPID_ONVISIBLE
: // sent when the window goes visible/hidden
749 if (pDispParams
->cArgs
!= 1)
751 _callback
->OnVisible(Variant(pDispParams
->rgvarg
[0]));
754 case DISPID_ONTOOLBAR
: // sent when the toolbar should be shown/hidden
755 if (pDispParams
->cArgs
!= 1)
757 _callback
->OnToolbar(Variant(pDispParams
->rgvarg
[0]));
760 case DISPID_ONMENUBAR
: // sent when the menubar should be shown/hidden
761 if (pDispParams
->cArgs
!= 1)
763 _callback
->OnMenubar(Variant(pDispParams
->rgvarg
[0]));
766 case DISPID_ONSTATUSBAR
: // sent when the statusbar should be shown/hidden
767 if (pDispParams
->cArgs
!= 1)
769 _callback
->OnStatusbar(Variant(pDispParams
->rgvarg
[0]));
772 case DISPID_ONFULLSCREEN
: // sent when kiosk mode should be on/off
773 if (pDispParams
->cArgs
!= 1)
775 _callback
->OnFullscreen(Variant(pDispParams
->rgvarg
[0]));
778 case DISPID_DOCUMENTCOMPLETE
:// new document goes ReadyState_Complete
779 _callback
->DocumentComplete();
782 case DISPID_DOWNLOADCOMPLETE
:
783 _callback
->DownloadComplete();
786 case DISPID_ONTHEATERMODE
: // sent when theater mode should be on/off
787 if (pDispParams
->cArgs
!= 1)
789 _callback
->OnTheatermode(Variant(pDispParams
->rgvarg
[0]));
792 case DISPID_ONADDRESSBAR
: // sent when the address bar should be shown/hidden
793 if (pDispParams
->cArgs
!= 1)
795 _callback
->OnAddressbar(Variant(pDispParams
->rgvarg
[0]));
798 case DISPID_WINDOWSETRESIZABLE
:// sent to set the style of the host window frame
799 if (pDispParams
->cArgs
!= 1)
801 _callback
->WindowSetResizable(Variant(pDispParams
->rgvarg
[0]));
804 case DISPID_WINDOWCLOSING
: // sent before script window.close closes the window
805 if (pDispParams
->cArgs
!= 2)
807 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
809 _callback
->WindowClosing(Variant(pDispParams
->rgvarg
[1]), *V_BOOLREF(&pDispParams
->rgvarg
[0]));
812 case DISPID_WINDOWSETLEFT
: // sent when the put_left method is called on the WebOC
813 if (pDispParams
->cArgs
!= 1)
815 _callback
->WindowSetLeft(Variant(pDispParams
->rgvarg
[0]));
818 case DISPID_WINDOWSETTOP
: // sent when the put_top method is called on the WebOC
819 if (pDispParams
->cArgs
!= 1)
821 _callback
->WindowSetTop(Variant(pDispParams
->rgvarg
[0]));
824 case DISPID_WINDOWSETWIDTH
: // sent when the put_width method is called on the WebOC
825 if (pDispParams
->cArgs
!= 1)
827 _callback
->WindowSetWidth(Variant(pDispParams
->rgvarg
[0]));
830 case DISPID_WINDOWSETHEIGHT
: // sent when the put_height method is called on the WebOC
831 if (pDispParams
->cArgs
!= 1)
833 _callback
->WindowSetHeight(Variant(pDispParams
->rgvarg
[0]));
836 case DISPID_CLIENTTOHOSTWINDOW
:// sent during window.open to request conversion of dimensions
837 if (pDispParams
->cArgs
!= 2)
839 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_I4
|VT_BYREF
))
841 if (V_VT(&pDispParams
->rgvarg
[1]) != (VT_I4
|VT_BYREF
))
843 _callback
->ClientToHostWindow(*V_I4REF(&pDispParams
->rgvarg
[1]), *V_I4REF(&pDispParams
->rgvarg
[0]));
846 case DISPID_SETSECURELOCKICON
:// sent to suggest the appropriate security icon to show
847 if (pDispParams
->cArgs
!= 1)
849 _callback
->SetSecureLockIcon(Variant(pDispParams
->rgvarg
[0]));
852 case DISPID_FILEDOWNLOAD
: { // Fired to indicate the File Download dialog is opening
853 if (pDispParams
->cArgs
!= 1) //@@ every time 2 ?!
855 Variant
var(pDispParams
->rgvarg
[0]);
856 _callback
->FileDownload(var
);}
859 case DISPID_NAVIGATEERROR
: // Fired to indicate the a binding error has occured
860 if (pDispParams
->cArgs
!= 5)
862 if (V_VT(&pDispParams
->rgvarg
[0]) != (VT_BOOL
|VT_BYREF
))
864 _callback
->NavigateError(Variant(pDispParams
->rgvarg
[4]), Variant(pDispParams
->rgvarg
[3]),
865 Variant(pDispParams
->rgvarg
[2]), Variant(pDispParams
->rgvarg
[1]),
866 *V_BOOLREF(&pDispParams
->rgvarg
[0]));
869 case DISPID_PRIVACYIMPACTEDSTATECHANGE
:// Fired when the user's browsing experience is impacted
870 if (pDispParams
->cArgs
!= 1)
872 _callback
->PrivacyImpactedStateChange(Variant(pDispParams
->rgvarg
[0]));
883 BrowserNavigator
& _navigator
;
885 void NavigateComplete2(IDispatch
* pDisp
, const Variant
& url
)
887 String adr
= (BStr
)url
;
889 _navigator
.navigated(adr
);
894 /// encapsulation of the Web control
895 struct WebChildWindow
: public IPCtrlWindow
<ChildWindow
, SIfacePtr
<IWebBrowser2
> >,
896 public DWebBrowserEvents2Impl
898 typedef IPCtrlWindow
<ChildWindow
, SIfacePtr
<IWebBrowser2
> > super
;
899 typedef DWebBrowserEvents2Impl web_super
;
901 WebChildWindow(HWND hwnd
, const WebChildWndInfo
& info
);
903 static WebChildWindow
* create(const WebChildWndInfo
& info
)
905 ChildWindow
* child
= ChildWindow::create(info
,
906 WINDOW_CREATOR_INFO(WebChildWindow
,WebChildWndInfo
), CLASSNAME_CHILDWND
, NULL
, WS_CHILD
|WS_VISIBLE
);
908 return static_cast<WebChildWindow
*>(child
);
912 // DWebBrowserEvents2Impl overides ->
914 void BeforeNavigate2(IDispatch
* pDisp
, const Variant
& url
, const Variant
& flags
,
915 const Variant
& targetFrameName
, const Variant
& postData
,
916 const Variant
& headers
, VARIANT_BOOL
& cancel
)
918 //String adr = (BStr)url;
921 void NavigateComplete2(IDispatch
* pDisp
, const Variant
& url
)
923 web_super::NavigateComplete2(pDisp
, url
);
925 set_url(String(BStr(url
)));
928 void StatusTextChange(const BStr
& text
)
931 SendMessage(_hwndFrame
, PM_SETSTATUSTEXT
, 0, (LPARAM
)_statusText
.c_str());
934 void ProgressChange(long Progress
, long ProgressMax
)
946 void WindowActivate()
950 void PropertyChange(const BStr
& Property
)
953 _control
->GetProperty(Property
, &value
);
956 void CommandStateChange(long command
/*CSC_NAVIGATEFORWARD, CSC_NAVIGATEBACK*/, bool enable
)
964 void NewWindow2(IDispatch
** ppDisp
, VARIANT_BOOL
& cancel
)
970 void TitleChange(const BStr
& text
)
972 SetWindowText(_hwnd
, String(text
));
975 void TitleIconChange(const BStr
& text
)
979 void FrameBeforeNavigate(const BStr
& url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& cancel
)
983 void FrameNavigateComplete(const BStr
& url
)
987 void FrameNewWindow(const BStr
& url
, long flags
, const BStr
& targetFrameName
, VARIANT
* postData
, const BStr
& headers
, VARIANT_BOOL
& processed
)
995 void OnVisible(bool Visible
)
999 void OnToolbar(bool Visible
)
1003 void OnMenubar(bool Visible
)
1007 void OnStatusbar(bool Visible
)
1011 void OnFullscreen(bool Visible
)
1015 void DocumentComplete()
1019 void OnTheatermode(bool Visible
)
1023 void OnAddressbar(bool Visible
)
1027 void WindowSetResizable(bool Visible
)
1031 void WindowClosing(VARIANT_BOOL IsChildWindow
, VARIANT_BOOL
& cancel
)
1035 void WindowSetLeft(long Left
)
1039 void WindowSetTop(long Top
)
1043 void WindowSetWidth(long Width
)
1047 void WindowSetHeight(long Height
)
1051 void ClientToHostWindow(long& CX
, long& CY
)
1055 void SetSecureLockIcon(long SecureLockIcon
)
1059 void FileDownload(Variant
& cancel
)
1063 void NavigateError(IDispatch
* pDisp
, const Variant
& url
, const Variant
& Frame
, const Variant
& StatusCode
, VARIANT_BOOL
& cancel
)
1067 void PrivacyImpactedStateChange(bool bImpacted
)
1073 BrowserNavigator _navigator
;
1074 auto_ptr
<EventConnector
> _connector
;
1076 LRESULT
WndProc(UINT nmsg
, WPARAM wparam
, LPARAM lparam
);
1078 virtual String
jump_to_int(LPCTSTR url
);