265 lines
8.7 KiB
C++
Raw Normal View History

2024-01-22 12:56:15 +08:00
// MWebBrowser.cpp --- simple Win32 Web Browser
// Copyright (C) 2019 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
// This file is public domain software.
#ifndef MWEB_BROWSER_HPP_
2024-12-22 01:02:46 +08:00
#define MWEB_BROWSER_HPP_ 13 // Version 13
2024-01-22 12:56:15 +08:00
#define INITGUID
2024-12-22 01:02:46 +08:00
class JSObject : public IDispatch
2024-01-22 12:56:15 +08:00
{
2024-12-22 01:02:46 +08:00
private:
typedef std::function<void(wchar_t **, int)> functiontype;
std::map<DISPID, functiontype> funcmap;
std::map<std::wstring, DISPID> funcnames;
long ref = 0;
2024-01-22 12:56:15 +08:00
public:
2024-12-22 01:02:46 +08:00
void bindfunction(const std::wstring &, functiontype);
// IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
// IDispatch
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid,
ITypeInfo **ppTInfo);
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
EXCEPINFO *pExcepInfo, UINT *puArgErr);
};
class MWebBrowser : public IDispatch,
public IOleClientSite,
public IOleInPlaceSite,
public IStorage,
public IServiceProvider,
public IHttpSecurity,
public IDocHostUIHandler
{
public:
JSObject *jsobj;
2024-01-22 12:56:15 +08:00
static MWebBrowser *Create(HWND hwndParent);
2024-12-22 01:02:46 +08:00
HRESULT OnCompleted(DISPPARAMS *args);
2024-05-18 17:53:33 +08:00
// ---------- IDispatch ----------
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(__RPC__out UINT *pctinfo) override;
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT, LCID, __RPC__deref_out_opt ITypeInfo **) override;
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(__RPC__in REFIID riid, __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames, __RPC__in_range(0, 16384) UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId) override;
2024-12-22 01:02:46 +08:00
virtual HRESULT STDMETHODCALLTYPE Invoke(_In_ DISPID dispIdMember, _In_ REFIID, _In_ LCID, _In_ WORD, _In_ DISPPARAMS *pDispParams, _Out_opt_ VARIANT *pVarResult, _Out_opt_ EXCEPINFO *, _Out_opt_ UINT *) override;
2024-05-18 17:53:33 +08:00
std::wstring htmlSource;
2024-12-22 01:02:46 +08:00
IConnectionPoint *callback;
2024-05-18 17:53:33 +08:00
DWORD eventCookie;
2024-01-22 12:56:15 +08:00
2024-12-22 01:02:46 +08:00
RECT PixelToHIMETRIC(const RECT &rc);
2024-01-22 12:56:15 +08:00
HWND GetControlWindow();
HWND GetIEServerWindow();
2024-12-22 01:02:46 +08:00
void MoveWindow(const RECT &rc);
2024-01-22 12:56:15 +08:00
void GoHome();
void GoBack();
void GoForward();
void Stop();
void StopDownload();
void Refresh();
HRESULT Navigate(const WCHAR *url = L"about:blank");
HRESULT Navigate2(const WCHAR *url, DWORD dwFlags = 0);
2024-12-22 01:02:46 +08:00
HRESULT SetHtml(const wchar_t *html);
2024-01-22 12:56:15 +08:00
void Print(BOOL bBang = FALSE);
void PrintPreview();
void PageSetup();
void Destroy();
BOOL TranslateAccelerator(LPMSG pMsg);
IWebBrowser2 *GetIWebBrowser2();
IHTMLDocument2 *GetIHTMLDocument2();
void AllowInsecure(BOOL bAllow);
HRESULT Quit();
HRESULT get_Application(IDispatch **ppApplication) const;
HRESULT get_LocationURL(BSTR *bstrURL) const;
HRESULT get_mimeType(BSTR *bstrMIME) const;
HRESULT put_Silent(VARIANT_BOOL bSilent);
BOOL is_busy() const;
HRESULT ZoomUp();
HRESULT ZoomDown();
HRESULT Zoom100();
HRESULT ZoomPercents(LONG percents);
// IUnknown interface
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
2024-12-22 01:02:46 +08:00
STDMETHODIMP_(ULONG)
AddRef();
STDMETHODIMP_(ULONG)
Release();
2024-01-22 12:56:15 +08:00
// IOleWindow interface
STDMETHODIMP GetWindow(HWND *phwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
// IOleInPlaceSite interface
STDMETHODIMP CanInPlaceActivate();
STDMETHODIMP OnInPlaceActivate();
STDMETHODIMP OnUIActivate();
STDMETHODIMP GetWindowContext(
IOleInPlaceFrame **ppFrame,
IOleInPlaceUIWindow **ppDoc,
LPRECT lprcPosRect,
LPRECT lprcClipRect,
LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHODIMP Scroll(SIZE scrollExtant);
STDMETHODIMP OnUIDeactivate(BOOL fUndoable);
STDMETHODIMP OnInPlaceDeactivate();
STDMETHODIMP DiscardUndoState();
STDMETHODIMP DeactivateAndUndo();
STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect);
// IOleClientSite interface
STDMETHODIMP SaveObject();
STDMETHODIMP GetMoniker(
DWORD dwAssign,
DWORD dwWhichMoniker,
IMoniker **ppmk);
STDMETHODIMP GetContainer(IOleContainer **ppContainer);
STDMETHODIMP ShowObject();
STDMETHODIMP OnShowWindow(BOOL fShow);
STDMETHODIMP RequestNewObjectLayout();
// IStorage interface
STDMETHODIMP CreateStream(
const OLECHAR *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStream **ppstm);
STDMETHODIMP OpenStream(
const OLECHAR *pwcsName,
void *reserved1,
DWORD grfMode,
DWORD reserved2,
IStream **ppstm);
STDMETHODIMP CreateStorage(
const OLECHAR *pwcsName,
DWORD grfMode,
DWORD reserved1,
DWORD reserved2,
IStorage **ppstg);
STDMETHODIMP OpenStorage(
const OLECHAR *pwcsName,
IStorage *pstgPriority,
DWORD grfMode,
SNB snbExclude,
DWORD reserved,
IStorage **ppstg);
STDMETHODIMP CopyTo(
DWORD ciidExclude,
const IID *rgiidExclude,
SNB snbExclude,
IStorage *pstgDest);
STDMETHODIMP MoveElementTo(
const OLECHAR *pwcsName,
IStorage *pstgDest,
const OLECHAR *pwcsNewName,
DWORD grfFlags);
STDMETHODIMP Commit(DWORD grfCommitFlags);
STDMETHODIMP Revert();
STDMETHODIMP EnumElements(
DWORD reserved1,
void *reserved2,
DWORD reserved3,
IEnumSTATSTG **ppenum);
STDMETHODIMP DestroyElement(const OLECHAR *pwcsName);
STDMETHODIMP RenameElement(
const OLECHAR *pwcsOldName,
const OLECHAR *pwcsNewName);
STDMETHODIMP SetElementTimes(
const OLECHAR *pwcsName,
const FILETIME *pctime,
const FILETIME *patime,
const FILETIME *pmtime);
STDMETHODIMP SetClass(REFCLSID clsid);
STDMETHODIMP SetStateBits(DWORD grfStateBits, DWORD grfMask);
STDMETHODIMP Stat(STATSTG *pstatstg, DWORD grfStatFlag);
// IServiceProvider interface
STDMETHODIMP QueryService(
REFGUID guidService,
REFIID riid,
void **ppvObject);
// IWindowForBindingUI interface
STDMETHODIMP GetWindow(REFGUID rguidReason, HWND *phwnd);
// IHttpSecurity interface
STDMETHODIMP OnSecurityProblem(DWORD dwProblem);
// IDocHostUIHandler interface
STDMETHODIMP ShowContextMenu(
DWORD dwID,
POINT *ppt,
IUnknown *pcmdtReserved,
IDispatch *pdispReserved);
STDMETHODIMP GetHostInfo(DOCHOSTUIINFO *pInfo);
STDMETHODIMP ShowUI(
DWORD dwID,
IOleInPlaceActiveObject *pActiveObject,
IOleCommandTarget *pCommandTarget,
IOleInPlaceFrame *pFrame,
IOleInPlaceUIWindow *pDoc);
STDMETHODIMP HideUI();
STDMETHODIMP UpdateUI();
STDMETHODIMP EnableModeless(BOOL fEnable);
STDMETHODIMP OnDocWindowActivate(BOOL fActivate);
STDMETHODIMP OnFrameWindowActivate(BOOL fActivate);
STDMETHODIMP ResizeBorder(
LPCRECT prcBorder,
IOleInPlaceUIWindow *pUIWindow,
BOOL fRameWindow);
STDMETHODIMP TranslateAccelerator(
LPMSG lpMsg,
const GUID *pguidCmdGroup,
DWORD nCmdID);
STDMETHODIMP GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw);
STDMETHODIMP GetDropTarget(
IDropTarget *pDropTarget,
IDropTarget **ppDropTarget);
STDMETHODIMP GetExternal(IDispatch **ppDispatch);
STDMETHODIMP TranslateUrl(
DWORD dwTranslate,
OLECHAR *pchURLIn,
OLECHAR **ppchURLOut);
STDMETHODIMP FilterDataObject(IDataObject *pDO, IDataObject **ppDORet);
protected:
LONG m_nRefCount;
HWND m_hwndParent;
HWND m_hwndCtrl;
HWND m_hwndIEServer;
IWebBrowser2 *m_web_browser2;
IOleObject *m_ole_object;
IOleInPlaceObject *m_ole_inplace_object;
IDocHostUIHandler *m_pDocHostUIHandler;
RECT m_rc;
HRESULT m_hr;
BOOL m_bAllowInsecure;
LONG m_nZoomPercents;
MWebBrowser(HWND hwndParent);
virtual ~MWebBrowser();
HRESULT CreateBrowser(HWND hwndParent);
BOOL IsCreated() const;
private:
2024-12-22 01:02:46 +08:00
MWebBrowser(const MWebBrowser &);
MWebBrowser &operator=(const MWebBrowser &);
2024-01-22 12:56:15 +08:00
};
2024-12-22 01:02:46 +08:00
#endif // ndef MWEB_BROWSER_HPP_