1 /////////////////////////////////////////////////////////////////////////////
2 // Name: include/wx/msw/webviewie.h
3 // Purpose: wxMSW IE wxWebView backend
4 // Author: Marianne Gagnon
6 // Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
15 #if wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE && defined(__WXMSW__)
17 #include "wx/control.h"
18 #include "wx/webview.h"
19 #include "wx/msw/ole/automtn.h"
20 #include "wx/msw/ole/activex.h"
21 #include "wx/msw/ole/oleutils.h"
22 #include "wx/msw/private/comptr.h"
23 #include "wx/msw/wrapwin.h"
24 #include "wx/msw/missing.h"
25 #include "wx/sharedptr.h"
26 #include "wx/vector.h"
28 /* Classes and definitions from urlmon.h vary in their
29 * completeness between compilers and versions of compilers.
30 * We implement our own versions here which should work
31 * for all compilers. The definitions are taken from the
32 * mingw-w64 headers which are public domain.
35 #ifndef REFRESH_NORMAL
36 #define REFRESH_NORMAL 0
39 #ifndef REFRESH_COMPLETELY
40 #define REFRESH_COMPLETELY 3
43 typedef enum __wxMIDL_IBindStatusCallback_0006
45 wxBSCF_FIRSTDATANOTIFICATION
= 0x1,
46 wxBSCF_INTERMEDIATEDATANOTIFICATION
= 0x2,
47 wxBSCF_LASTDATANOTIFICATION
= 0x4,
48 wxBSCF_DATAFULLYAVAILABLE
= 0x8,
49 wxBSCF_AVAILABLEDATASIZEUNKNOWN
= 0x10
52 EXTERN_C
const IID CLSID_FileProtocol
;
54 typedef struct _tagwxBINDINFO
66 SECURITY_ATTRIBUTES securityAttributes
;
72 typedef struct _tagwxPROTOCOLDATA
80 class wxIInternetBindInfo
: public IUnknown
83 virtual HRESULT wxSTDCALL
GetBindInfo(DWORD
*grfBINDF
,wxBINDINFO
*pbindinfo
) = 0;
84 virtual HRESULT wxSTDCALL
GetBindString(ULONG ulStringType
,LPOLESTR
*ppwzStr
,
85 ULONG cEl
,ULONG
*pcElFetched
) = 0;
88 class wxIInternetProtocolSink
: public IUnknown
91 virtual HRESULT wxSTDCALL
Switch(wxPROTOCOLDATA
*pProtocolData
) = 0;
92 virtual HRESULT wxSTDCALL
ReportProgress(ULONG ulStatusCode
,
93 LPCWSTR szStatusText
) = 0;
94 virtual HRESULT wxSTDCALL
ReportData(DWORD grfBSCF
,ULONG ulProgress
,
95 ULONG ulProgressMax
) = 0;
96 virtual HRESULT wxSTDCALL
ReportResult(HRESULT hrResult
,DWORD dwError
,
97 LPCWSTR szResult
) = 0;
100 class wxIInternetProtocolRoot
: public IUnknown
103 virtual HRESULT wxSTDCALL
Start(LPCWSTR szUrl
,wxIInternetProtocolSink
*pOIProtSink
,
104 wxIInternetBindInfo
*pOIBindInfo
,DWORD grfPI
,
105 HANDLE_PTR dwReserved
) = 0;
106 virtual HRESULT wxSTDCALL
Continue(wxPROTOCOLDATA
*pProtocolData
) = 0;
107 virtual HRESULT wxSTDCALL
Abort(HRESULT hrReason
,DWORD dwOptions
) = 0;
108 virtual HRESULT wxSTDCALL
Terminate(DWORD dwOptions
) = 0;
109 virtual HRESULT wxSTDCALL
Suspend(void) = 0;
110 virtual HRESULT wxSTDCALL
Resume(void) = 0;
114 class wxIInternetProtocol
: public wxIInternetProtocolRoot
117 virtual HRESULT wxSTDCALL
Read(void *pv
,ULONG cb
,ULONG
*pcbRead
) = 0;
118 virtual HRESULT wxSTDCALL
Seek(LARGE_INTEGER dlibMove
,DWORD dwOrigin
,
119 ULARGE_INTEGER
*plibNewPosition
) = 0;
120 virtual HRESULT wxSTDCALL
LockRequest(DWORD dwOptions
) = 0;
121 virtual HRESULT wxSTDCALL
UnlockRequest(void) = 0;
125 class wxIInternetSession
: public IUnknown
128 virtual HRESULT wxSTDCALL
RegisterNameSpace(IClassFactory
*pCF
,REFCLSID rclsid
,
131 const LPCWSTR
*ppwzPatterns
,
132 DWORD dwReserved
) = 0;
133 virtual HRESULT wxSTDCALL
UnregisterNameSpace(IClassFactory
*pCF
,
134 LPCWSTR pszProtocol
) = 0;
135 virtual HRESULT wxSTDCALL
RegisterMimeFilter(IClassFactory
*pCF
,
137 LPCWSTR pwzType
) = 0;
138 virtual HRESULT wxSTDCALL
UnregisterMimeFilter(IClassFactory
*pCF
,
139 LPCWSTR pwzType
) = 0;
140 virtual HRESULT wxSTDCALL
CreateBinding(LPBC pBC
,LPCWSTR szUrl
,
141 IUnknown
*pUnkOuter
,IUnknown
**ppUnk
,
142 wxIInternetProtocol
**ppOInetProt
,
144 virtual HRESULT wxSTDCALL
SetSessionOption(DWORD dwOption
,LPVOID pBuffer
,
145 DWORD dwBufferLength
,
146 DWORD dwReserved
) = 0;
147 virtual HRESULT wxSTDCALL
GetSessionOption(DWORD dwOption
,LPVOID pBuffer
,
148 DWORD
*pdwBufferLength
,
149 DWORD dwReserved
) = 0;
152 /* END OF URLMON.H implementation */
154 /* Same goes for the mshtmhst.h, these are also taken
155 * from mingw-w64 headers.
158 typedef enum _tagwxDOCHOSTUIFLAG
160 DOCHOSTUIFLAG_DIALOG
= 0x1,
161 DOCHOSTUIFLAG_DISABLE_HELP_MENU
= 0x2,
162 DOCHOSTUIFLAG_NO3DBORDER
= 0x4,
163 DOCHOSTUIFLAG_SCROLL_NO
= 0x8,
164 DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE
= 0x10,
165 DOCHOSTUIFLAG_OPENNEWWIN
= 0x20,
166 DOCHOSTUIFLAG_DISABLE_OFFSCREEN
= 0x40,
167 DOCHOSTUIFLAG_FLAT_SCROLLBAR
= 0x80,
168 DOCHOSTUIFLAG_DIV_BLOCKDEFAULT
= 0x100,
169 DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY
= 0x200,
170 DOCHOSTUIFLAG_OVERRIDEBEHAVIORFACTORY
= 0x400,
171 DOCHOSTUIFLAG_CODEPAGELINKEDFONTS
= 0x800,
172 DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8
= 0x1000,
173 DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8
= 0x2000,
174 DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE
= 0x4000,
175 DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION
= 0x10000,
176 DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION
= 0x20000,
177 DOCHOSTUIFLAG_THEME
= 0x40000,
178 DOCHOSTUIFLAG_NOTHEME
= 0x80000,
179 DOCHOSTUIFLAG_NOPICS
= 0x100000,
180 DOCHOSTUIFLAG_NO3DOUTERBORDER
= 0x200000,
181 DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP
= 0x400000,
182 DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK
= 0x800000,
183 DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL
= 0x1000000
186 typedef struct _tagwxDOCHOSTUIINFO
195 class wxIDocHostUIHandler
: public IUnknown
198 virtual HRESULT wxSTDCALL
ShowContextMenu(DWORD dwID
, POINT
*ppt
,
199 IUnknown
*pcmdtReserved
,
200 IDispatch
*pdispReserved
) = 0;
202 virtual HRESULT wxSTDCALL
GetHostInfo(DOCHOSTUIINFO
*pInfo
) = 0;
204 virtual HRESULT wxSTDCALL
ShowUI(DWORD dwID
,
205 IOleInPlaceActiveObject
*pActiveObject
,
206 IOleCommandTarget
*pCommandTarget
,
207 IOleInPlaceFrame
*pFrame
,
208 IOleInPlaceUIWindow
*pDoc
) = 0;
210 virtual HRESULT wxSTDCALL
HideUI(void) = 0;
212 virtual HRESULT wxSTDCALL
UpdateUI(void) = 0;
214 virtual HRESULT wxSTDCALL
EnableModeless(BOOL fEnable
) = 0;
216 virtual HRESULT wxSTDCALL
OnDocWindowActivate(BOOL fActivate
) = 0;
218 virtual HRESULT wxSTDCALL
OnFrameWindowActivate(BOOL fActivate
) = 0;
220 virtual HRESULT wxSTDCALL
ResizeBorder(LPCRECT prcBorder
,
221 IOleInPlaceUIWindow
*pUIWindow
,
222 BOOL fRameWindow
) = 0;
224 virtual HRESULT wxSTDCALL
TranslateAccelerator(LPMSG lpMsg
,
225 const GUID
*pguidCmdGroup
,
228 virtual HRESULT wxSTDCALL
GetOptionKeyPath(LPOLESTR
*pchKey
,
231 virtual HRESULT wxSTDCALL
GetDropTarget(IDropTarget
*pDropTarget
,
232 IDropTarget
**ppDropTarget
) = 0;
234 virtual HRESULT wxSTDCALL
GetExternal(IDispatch
**ppDispatch
) = 0;
236 virtual HRESULT wxSTDCALL
TranslateUrl(DWORD dwTranslate
,
238 OLECHAR
**ppchURLOut
) = 0;
240 virtual HRESULT wxSTDCALL
FilterDataObject(IDataObject
*pDO
,
241 IDataObject
**ppDORet
) = 0;
244 /* END OF MSHTMHST.H implementation */
246 struct IHTMLDocument2
;
248 struct IMarkupPointer
;
252 class DocHostUIHandler
;
253 class wxFindPointers
;
255 class WXDLLIMPEXP_WEBVIEW wxWebViewIE
: public wxWebView
261 wxWebViewIE(wxWindow
* parent
,
263 const wxString
& url
= wxWebViewDefaultURLStr
,
264 const wxPoint
& pos
= wxDefaultPosition
,
265 const wxSize
& size
= wxDefaultSize
,
267 const wxString
& name
= wxWebViewNameStr
)
269 Create(parent
, id
, url
, pos
, size
, style
, name
);
274 bool Create(wxWindow
* parent
,
276 const wxString
& url
= wxWebViewDefaultURLStr
,
277 const wxPoint
& pos
= wxDefaultPosition
,
278 const wxSize
& size
= wxDefaultSize
,
280 const wxString
& name
= wxWebViewNameStr
);
282 virtual void LoadURL(const wxString
& url
);
283 virtual void LoadHistoryItem(wxSharedPtr
<wxWebViewHistoryItem
> item
);
284 virtual wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > GetBackwardHistory();
285 virtual wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > GetForwardHistory();
287 virtual bool CanGoForward() const;
288 virtual bool CanGoBack() const;
289 virtual void GoBack();
290 virtual void GoForward();
291 virtual void ClearHistory();
292 virtual void EnableHistory(bool enable
= true);
294 virtual void Reload(wxWebViewReloadFlags flags
= wxWEB_VIEW_RELOAD_DEFAULT
);
296 virtual wxString
GetPageSource() const;
297 virtual wxString
GetPageText() const;
299 virtual bool IsBusy() const;
300 virtual wxString
GetCurrentURL() const;
301 virtual wxString
GetCurrentTitle() const;
303 virtual void SetZoomType(wxWebViewZoomType
);
304 virtual wxWebViewZoomType
GetZoomType() const;
305 virtual bool CanSetZoomType(wxWebViewZoomType
) const;
307 virtual void Print();
309 virtual wxWebViewZoom
GetZoom() const;
310 virtual void SetZoom(wxWebViewZoom zoom
);
312 //Clipboard functions
313 virtual bool CanCut() const;
314 virtual bool CanCopy() const;
315 virtual bool CanPaste() const;
318 virtual void Paste();
320 //Undo / redo functionality
321 virtual bool CanUndo() const;
322 virtual bool CanRedo() const;
327 virtual long Find(const wxString
& text
, int flags
= wxWEB_VIEW_FIND_DEFAULT
);
330 virtual void SetEditable(bool enable
= true);
331 virtual bool IsEditable() const;
334 virtual void SelectAll();
335 virtual bool HasSelection() const;
336 virtual void DeleteSelection();
337 virtual wxString
GetSelectedText() const;
338 virtual wxString
GetSelectedSource() const;
339 virtual void ClearSelection();
341 virtual void RunScript(const wxString
& javascript
);
343 //Virtual Filesystem Support
344 virtual void RegisterHandler(wxSharedPtr
<wxWebViewHandler
> handler
);
346 virtual void* GetNativeBackend() const { return m_webBrowser
; }
348 // ---- IE-specific methods
350 // FIXME: I seem to be able to access remote webpages even in offline mode...
351 bool IsOfflineMode();
352 void SetOfflineMode(bool offline
);
354 wxWebViewZoom
GetIETextZoom() const;
355 void SetIETextZoom(wxWebViewZoom level
);
357 wxWebViewZoom
GetIEOpticalZoom() const;
358 void SetIEOpticalZoom(wxWebViewZoom level
);
360 void onActiveXEvent(wxActiveXEvent
& evt
);
361 void onEraseBg(wxEraseEvent
&) {}
363 DECLARE_EVENT_TABLE();
366 virtual void DoSetPage(const wxString
& html
, const wxString
& baseUrl
);
369 wxIEContainer
* m_container
;
370 wxAutomationObject m_ie
;
371 IWebBrowser2
* m_webBrowser
;
373 wxCOMPtr
<DocHostUIHandler
> m_uiHandler
;
375 //We store the current zoom type;
376 wxWebViewZoomType m_zoomType
;
378 /** The "Busy" property of IWebBrowser2 does not always return busy when
379 * we'd want it to; this variable may be set to true in cases where the
380 * Busy property is false but should be true.
383 //We manage our own history, the history list contains the history items
384 //which are added as documentcomplete events arrive, unless we are loading
385 //an item from the history. The position is stored as an int, and reflects
386 //where we are in the history list.
387 wxVector
<wxSharedPtr
<wxWebViewHistoryItem
> > m_historyList
;
388 wxVector
<ClassFactory
*> m_factories
;
389 int m_historyPosition
;
390 bool m_historyLoadingFromList
;
391 bool m_historyEnabled
;
393 //We store find flag, results and position.
394 wxVector
<wxFindPointers
> m_findPointers
;
399 //Generic helper functions
400 bool CanExecCommand(wxString command
) const;
401 void ExecCommand(wxString command
);
402 wxCOMPtr
<IHTMLDocument2
> GetDocument() const;
403 bool IsElementVisible(IHTMLElement
* elm
);
404 //Find helper functions.
405 void FindInternal(const wxString
& text
, int flags
, int internal_flag
);
406 long FindNext(int direction
= 1);
408 //Toggles control features see INTERNETFEATURELIST for values.
409 bool EnableControlFeature(long flag
, bool enable
= true);
411 wxDECLARE_DYNAMIC_CLASS(wxWebViewIE
);
414 class VirtualProtocol
: public wxIInternetProtocol
417 wxIInternetProtocolSink
* m_protocolSink
;
422 wxSharedPtr
<wxWebViewHandler
> m_handler
;
425 VirtualProtocol(wxSharedPtr
<wxWebViewHandler
> handler
);
426 ~VirtualProtocol() {}
429 DECLARE_IUNKNOWN_METHODS
;
431 //IInternetProtocolRoot
432 HRESULT STDMETHODCALLTYPE
Abort(HRESULT
WXUNUSED(hrReason
),
433 DWORD
WXUNUSED(dwOptions
))
434 { return E_NOTIMPL
; }
435 HRESULT STDMETHODCALLTYPE
Continue(wxPROTOCOLDATA
*WXUNUSED(pProtocolData
))
437 HRESULT STDMETHODCALLTYPE
Resume() { return S_OK
; }
438 HRESULT STDMETHODCALLTYPE
Start(LPCWSTR szUrl
,
439 wxIInternetProtocolSink
*pOIProtSink
,
440 wxIInternetBindInfo
*pOIBindInfo
,
442 HANDLE_PTR dwReserved
);
443 HRESULT STDMETHODCALLTYPE
Suspend() { return S_OK
; }
444 HRESULT STDMETHODCALLTYPE
Terminate(DWORD
WXUNUSED(dwOptions
)) { return S_OK
; }
447 HRESULT STDMETHODCALLTYPE
LockRequest(DWORD
WXUNUSED(dwOptions
))
449 HRESULT STDMETHODCALLTYPE
Read(void *pv
, ULONG cb
, ULONG
*pcbRead
);
450 HRESULT STDMETHODCALLTYPE
Seek(LARGE_INTEGER
WXUNUSED(dlibMove
),
451 DWORD
WXUNUSED(dwOrigin
),
452 ULARGE_INTEGER
* WXUNUSED(plibNewPosition
))
454 HRESULT STDMETHODCALLTYPE
UnlockRequest() { return S_OK
; }
457 class ClassFactory
: public IClassFactory
460 ClassFactory(wxSharedPtr
<wxWebViewHandler
> handler
) : m_handler(handler
) {}
463 HRESULT STDMETHODCALLTYPE
CreateInstance(IUnknown
* pUnkOuter
,
464 REFIID riid
, void** ppvObject
);
465 HRESULT STDMETHODCALLTYPE
LockServer(BOOL fLock
);
468 DECLARE_IUNKNOWN_METHODS
;
471 wxSharedPtr
<wxWebViewHandler
> m_handler
;
474 class wxIEContainer
: public wxActiveXContainer
477 wxIEContainer(wxWindow
*parent
, REFIID iid
, IUnknown
*pUnk
, DocHostUIHandler
* uiHandler
= NULL
);
478 virtual ~wxIEContainer();
479 virtual bool QueryClientSiteInterface(REFIID iid
, void **_interface
, const char *&desc
);
481 DocHostUIHandler
* m_uiHandler
;
484 class DocHostUIHandler
: public wxIDocHostUIHandler
487 DocHostUIHandler() {};
488 ~DocHostUIHandler() {};
489 virtual HRESULT wxSTDCALL
ShowContextMenu(DWORD dwID
, POINT
*ppt
,
490 IUnknown
*pcmdtReserved
,
491 IDispatch
*pdispReserved
);
493 virtual HRESULT wxSTDCALL
GetHostInfo(DOCHOSTUIINFO
*pInfo
);
495 virtual HRESULT wxSTDCALL
ShowUI(DWORD dwID
,
496 IOleInPlaceActiveObject
*pActiveObject
,
497 IOleCommandTarget
*pCommandTarget
,
498 IOleInPlaceFrame
*pFrame
,
499 IOleInPlaceUIWindow
*pDoc
);
501 virtual HRESULT wxSTDCALL
HideUI(void);
503 virtual HRESULT wxSTDCALL
UpdateUI(void);
505 virtual HRESULT wxSTDCALL
EnableModeless(BOOL fEnable
);
507 virtual HRESULT wxSTDCALL
OnDocWindowActivate(BOOL fActivate
);
509 virtual HRESULT wxSTDCALL
OnFrameWindowActivate(BOOL fActivate
);
511 virtual HRESULT wxSTDCALL
ResizeBorder(LPCRECT prcBorder
,
512 IOleInPlaceUIWindow
*pUIWindow
,
515 virtual HRESULT wxSTDCALL
TranslateAccelerator(LPMSG lpMsg
,
516 const GUID
*pguidCmdGroup
,
519 virtual HRESULT wxSTDCALL
GetOptionKeyPath(LPOLESTR
*pchKey
,
522 virtual HRESULT wxSTDCALL
GetDropTarget(IDropTarget
*pDropTarget
,
523 IDropTarget
**ppDropTarget
);
525 virtual HRESULT wxSTDCALL
GetExternal(IDispatch
**ppDispatch
);
527 virtual HRESULT wxSTDCALL
TranslateUrl(DWORD dwTranslate
,
529 OLECHAR
**ppchURLOut
);
531 virtual HRESULT wxSTDCALL
FilterDataObject(IDataObject
*pDO
,
532 IDataObject
**ppDORet
);
534 DECLARE_IUNKNOWN_METHODS
;
540 wxFindPointers(IMarkupPointer
*ptrBegin
, IMarkupPointer
*ptrEnd
)
545 //The two markup pointers.
546 IMarkupPointer
*begin
, *end
;
549 #endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE && defined(__WXMSW__)
551 #endif // wxWebViewIE_H