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 };