1 // This Source Code Form is subject to the terms of the Mozilla Public
2 // License, v. 2.0.If a copy of the MPL was not distributed with this
3 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
4 
5 #include <exdisp.h>
6 #include <mshtmhst.h>
7 
8 #include <vector>
9 #include <string>
10 
11 class WebBrowser final :
12     /* public IUnknown, */
13     /* public IOleWindow, */
14     public IOleInPlaceSite,
15     public IOleClientSite,
16     public IDropTarget,
17     public IStorage,
18     public IDocHostUIHandler,
19     public IDocHostShowUI,
20     public IDispatch {
21  public:
22   /////////////////////////////////////////////////////////////////////////////
23   // Our own methods
24   /////////////////////////////////////////////////////////////////////////////
25   WebBrowser(HWND hWndParent);
26   ~WebBrowser();
27 
28   WebBrowser(const WebBrowser&) = delete;
29   WebBrowser& operator=(const WebBrowser&) = delete;
30 
31   void Shutdown();
32 
33   bool IsInitialized();
34 
35   HRESULT ActiveObjectTranslateAccelerator(bool tab, LPMSG lpmsg);
36   void SetRect(const RECT& _rc);
37   void Resize(DWORD width, DWORD height);
38   void Navigate(wchar_t* szUrl);
39 
40   using CustomFunction = void (*)(void* context, VARIANT parameter,
41                                   VARIANT* retVal);
42   void AddCustomFunction(wchar_t* name, CustomFunction function, void* arg);
43 
44   /////////////////////////////////////////////////////////////////////////////
45   // Data members
46   /////////////////////////////////////////////////////////////////////////////
47  private:
48   IOleObject* mOleObject = nullptr;
49   IOleInPlaceObject* mOleInPlaceObject = nullptr;
50   IOleInPlaceActiveObject* mOleInPlaceActiveObject = nullptr;
51   IWebBrowser2* mWebBrowser2 = nullptr;
52 
53   LONG mComRefCount = 0;
54 
55   RECT mRect = {0, 0, 0, 0};
56 
57   HWND mHwndParent = nullptr;
58 
59   struct CustomFunctionRecord {
60     std::wstring mName;
61     CustomFunction mFunction;
62     void* mArg;
63   };
64   std::vector<CustomFunctionRecord> mCustomFunctions;
65 
66   //////////////////////////////////////////////////////////////////////////////
67   // COM interface methods
68   //////////////////////////////////////////////////////////////////////////////
69  public:
70   // IUnknown
71   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,
72                                            void** ppvObject) override;
73   ULONG STDMETHODCALLTYPE AddRef() override;
74   ULONG STDMETHODCALLTYPE Release() override;
75 
76   // IOleWindow
77   HRESULT STDMETHODCALLTYPE
78   GetWindow(__RPC__deref_out_opt HWND* phwnd) override;
79   HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode) override;
80 
81   // IOleInPlaceSite
82   HRESULT STDMETHODCALLTYPE CanInPlaceActivate() override;
83   HRESULT STDMETHODCALLTYPE OnInPlaceActivate() override;
84   HRESULT STDMETHODCALLTYPE OnUIActivate() override;
85   HRESULT STDMETHODCALLTYPE GetWindowContext(
86       __RPC__deref_out_opt IOleInPlaceFrame** ppFrame,
87       __RPC__deref_out_opt IOleInPlaceUIWindow** ppDoc,
88       __RPC__out LPRECT lprcPosRect, __RPC__out LPRECT lprcClipRect,
89       __RPC__inout LPOLEINPLACEFRAMEINFO lpFrameInfo) override;
90   HRESULT STDMETHODCALLTYPE Scroll(SIZE scrollExtant) override;
91   HRESULT STDMETHODCALLTYPE OnUIDeactivate(BOOL fUndoable) override;
92   HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate() override;
93   HRESULT STDMETHODCALLTYPE DiscardUndoState() override;
94   HRESULT STDMETHODCALLTYPE DeactivateAndUndo() override;
95   HRESULT STDMETHODCALLTYPE
96   OnPosRectChange(__RPC__in LPCRECT lprcPosRect) override;
97 
98   // IOleClientSite
99   HRESULT STDMETHODCALLTYPE SaveObject() override;
100   HRESULT STDMETHODCALLTYPE
101   GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,
102              __RPC__deref_out_opt IMoniker** ppmk) override;
103   HRESULT STDMETHODCALLTYPE
104   GetContainer(__RPC__deref_out_opt IOleContainer** ppContainer) override;
105   HRESULT STDMETHODCALLTYPE ShowObject() override;
106   HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL fShow) override;
107   HRESULT STDMETHODCALLTYPE RequestNewObjectLayout() override;
108 
109   // IDropTarget
110   HRESULT STDMETHODCALLTYPE DragEnter(__RPC__in_opt IDataObject* pDataObj,
111                                       DWORD grfKeyState, POINTL pt,
112                                       __RPC__inout DWORD* pdwEffect) override;
113   HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt,
114                                      __RPC__inout DWORD* pdwEffect) override;
115   HRESULT STDMETHODCALLTYPE DragLeave() override;
116   HRESULT STDMETHODCALLTYPE Drop(__RPC__in_opt IDataObject* pDataObj,
117                                  DWORD grfKeyState, POINTL pt,
118                                  __RPC__inout DWORD* pdwEffect) override;
119 
120   // IStorage
121   HRESULT STDMETHODCALLTYPE CreateStream(
122       __RPC__in_string const OLECHAR* pwcsName, DWORD grfMode, DWORD reserved1,
123       DWORD reserved2, __RPC__deref_out_opt IStream** ppstm) override;
124   HRESULT STDMETHODCALLTYPE OpenStream(const OLECHAR* pwcsName, void* reserved1,
125                                        DWORD grfMode, DWORD reserved2,
126                                        IStream** ppstm) override;
127   HRESULT STDMETHODCALLTYPE CreateStorage(
128       __RPC__in_string const OLECHAR* pwcsName, DWORD grfMode, DWORD reserved1,
129       DWORD reserved2, __RPC__deref_out_opt IStorage** ppstg) override;
130   HRESULT STDMETHODCALLTYPE
131   OpenStorage(__RPC__in_opt_string const OLECHAR* pwcsName,
132               __RPC__in_opt IStorage* pstgPriority, DWORD grfMode,
133               __RPC__deref_opt_in_opt SNB snbExclude, DWORD reserved,
134               __RPC__deref_out_opt IStorage** ppstg) override;
135   HRESULT STDMETHODCALLTYPE CopyTo(DWORD ciidExclude, const IID* rgiidExclude,
136                                    __RPC__in_opt SNB snbExclude,
137                                    IStorage* pstgDest) override;
138   HRESULT STDMETHODCALLTYPE MoveElementTo(
139       __RPC__in_string const OLECHAR* pwcsName,
140       __RPC__in_opt IStorage* pstgDest,
141       __RPC__in_string const OLECHAR* pwcsNewName, DWORD grfFlags) override;
142   HRESULT STDMETHODCALLTYPE Commit(DWORD grfCommitFlags) override;
143   HRESULT STDMETHODCALLTYPE Revert(void) override;
144   HRESULT STDMETHODCALLTYPE EnumElements(DWORD reserved1, void* reserved2,
145                                          DWORD reserved3,
146                                          IEnumSTATSTG** ppenum) override;
147   HRESULT STDMETHODCALLTYPE
148   DestroyElement(__RPC__in_string const OLECHAR* pwcsName) override;
149   HRESULT STDMETHODCALLTYPE
150   RenameElement(__RPC__in_string const OLECHAR* pwcsOldName,
151                 __RPC__in_string const OLECHAR* pwcsNewName) override;
152   HRESULT STDMETHODCALLTYPE
153   SetElementTimes(__RPC__in_opt_string const OLECHAR* pwcsName,
154                   __RPC__in_opt const FILETIME* pctime,
155                   __RPC__in_opt const FILETIME* patime,
156                   __RPC__in_opt const FILETIME* pmtime) override;
157   HRESULT STDMETHODCALLTYPE SetClass(__RPC__in REFCLSID clsid) override;
158   HRESULT STDMETHODCALLTYPE SetStateBits(DWORD grfStateBits,
159                                          DWORD grfMask) override;
160   HRESULT STDMETHODCALLTYPE Stat(__RPC__out STATSTG* pstatstg,
161                                  DWORD grfStatFlag) override;
162 
163   // IDocHostUIHandler
164   HRESULT STDMETHODCALLTYPE ShowContextMenu(
165       _In_ DWORD dwID, _In_ POINT* ppt, _In_ IUnknown* pcmdtReserved,
166       _In_ IDispatch* pdispReserved) override;
167   HRESULT STDMETHODCALLTYPE GetHostInfo(_Inout_ DOCHOSTUIINFO* pInfo) override;
168   HRESULT STDMETHODCALLTYPE ShowUI(_In_ DWORD dwID,
169                                    _In_ IOleInPlaceActiveObject* pActiveObject,
170                                    _In_ IOleCommandTarget* pCommandTarget,
171                                    _In_ IOleInPlaceFrame* pFrame,
172                                    _In_ IOleInPlaceUIWindow* pDoc) override;
173   HRESULT STDMETHODCALLTYPE HideUI() override;
174   HRESULT STDMETHODCALLTYPE UpdateUI() override;
175   HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable) override;
176   HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate) override;
177   HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate) override;
178   HRESULT STDMETHODCALLTYPE ResizeBorder(_In_ LPCRECT prcBorder,
179                                          _In_ IOleInPlaceUIWindow* pUIWindow,
180                                          _In_ BOOL fRameWindow) override;
181   HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpMsg,
182                                                  const GUID* pguidCmdGroup,
183                                                  DWORD nCmdID) override;
184   HRESULT STDMETHODCALLTYPE GetOptionKeyPath(_Out_ LPOLESTR* pchKey,
185                                              DWORD dw) override;
186   HRESULT STDMETHODCALLTYPE
187   GetDropTarget(_In_ IDropTarget* pDropTarget,
188                 _Outptr_ IDropTarget** ppDropTarget) override;
189   HRESULT STDMETHODCALLTYPE
190   GetExternal(_Outptr_result_maybenull_ IDispatch** ppDispatch) override;
191   HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate,
192                                          _In_ LPWSTR pchURLIn,
193                                          _Outptr_ LPWSTR* ppchURLOut) override;
194   HRESULT STDMETHODCALLTYPE
195   FilterDataObject(_In_ IDataObject* pDO,
196                    _Outptr_result_maybenull_ IDataObject** ppDORet) override;
197 
198   // IDocHostShowUI
199   HRESULT STDMETHODCALLTYPE ShowMessage(
200       /* [in] */ HWND hwnd,
201       /* [annotation][in] */
202       _In_ LPOLESTR lpstrText,
203       /* [annotation][in] */
204       _In_ LPOLESTR lpstrCaption,
205       /* [in] */ DWORD dwType,
206       /* [annotation][in] */
207       _In_ LPOLESTR lpstrHelpFile,
208       /* [in] */ DWORD dwHelpContext,
209       /* [out] */ LRESULT* plResult) override;
210   HRESULT STDMETHODCALLTYPE ShowHelp(
211       /* [in] */ HWND hwnd,
212       /* [annotation][in] */
213       _In_ LPOLESTR pszHelpFile,
214       /* [in] */ UINT uCommand,
215       /* [in] */ DWORD dwData,
216       /* [in] */ POINT ptMouse,
217       /* [out] */ IDispatch* pDispatchObjectHit) override;
218 
219   // IDispatch
220   HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
221       /* [out] */ __RPC__out UINT* pctinfo) override;
222   HRESULT STDMETHODCALLTYPE GetTypeInfo(
223       /* [in] */ UINT iTInfo,
224       /* [in] */ LCID lcid,
225       /* [out] */ __RPC__deref_out_opt ITypeInfo** ppTInfo) override;
226   HRESULT STDMETHODCALLTYPE GetIDsOfNames(
227       /* [in] */ __RPC__in REFIID riid,
228       /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR* rgszNames,
229       /* [range][in] */ __RPC__in_range(0, 16384) UINT cNames,
230       /* [in] */ LCID lcid,
231       /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID* rgDispId)
232       override;
233   /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(
234       /* [annotation][in] */
235       _In_ DISPID dispIdMember,
236       /* [annotation][in] */
237       _In_ REFIID riid,
238       /* [annotation][in] */
239       _In_ LCID lcid,
240       /* [annotation][in] */
241       _In_ WORD wFlags,
242       /* [annotation][out][in] */
243       _In_ DISPPARAMS* pDispParams,
244       /* [annotation][out] */
245       _Out_opt_ VARIANT* pVarResult,
246       /* [annotation][out] */
247       _Out_opt_ EXCEPINFO* pExcepInfo,
248       /* [annotation][out] */
249       _Out_opt_ UINT* puArgErr) override;
250 };