#ifndef NULLSOFT_HTMLCONTAINERH #define NULLSOFT_HTMLCONTAINERH #include #include #include #include #include /************************************************************************** class definitions **************************************************************************/ #ifndef DOCHOSTUIFLAG_HOST_NAVIGATES #define DOCHOSTUIFLAG_HOST_NAVIGATES 0x02000000 #endif #ifndef DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION #define DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION 0x04000000 #endif #ifndef DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL #define DOCHOSTUIFLAG_USE_WINDOWLESS_SELECTCONTROL 0x08000000 #endif #ifndef DOCHOSTUIFLAG_USE_WINDOWED_SELECTCONTROL #define DOCHOSTUIFLAG_USE_WINDOWED_SELECTCONTROL 0x10000000 #endif #ifndef DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE #define DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 0x20000000 #endif class HTMLContainer2; typedef BOOL( CALLBACK *BROWSERCB )( HTMLContainer2 *pContiner, DISPID dispId, DISPPARAMS FAR *pDispParams, LPVOID pUser ); // return TRUE to block normal processing typedef enum tagCONTAINERSTYLE { CSTYLE_NORMAL = 0x00, // nothing CSTYLE_NAVIGATE2_NOCLICKSOUND = 0x01, // prevents click sound in Nvigate2 calls CSTYLE_NOCLICKSOUND = 0x02, // prevents all click sounds ( requires testing ) } CONTAINERSTYLE; BOOL HTMLContainer2_Initialize(); BOOL HTMLContainer2_Uninitialize(); class HTMLContainer2 : public IOleClientSite, public IOleInPlaceSite, public IOleInPlaceFrame, public IOleControlSite, public IDocHostUIHandler2, public IDocHostShowUI, public IOleCommandTarget, public IServiceProvider, public IDispatch { public: typedef enum { uiToolbar = 1, uiStatusbar = 2, uiMenubar = 3, uiAddressbar = 4, } uiElement; typedef enum { wndLeft = 0x0001, wndTop = 0x0002, wndWidth = 0x0004, wndHeight = 0x0008, wndRelative = 0x0010, } windowPosFlags; typedef enum { msgNavigate2 = 0, msgNavigateToName = 1, } redirectedMessage; protected: HTMLContainer2( HWND waWindow, HWND hwndParent ); virtual ~HTMLContainer2( void ); public: // *** IUnknown Methods *** STDMETHOD( QueryInterface )( REFIID riid, PVOID *ppvObject ); STDMETHOD_( ULONG, AddRef )( void ); STDMETHOD_( ULONG, Release )( void ); protected: // *** IOleInPlaceUIWindow Methods *** STDMETHOD( GetBorder )( LPRECT lprectBorder ); STDMETHOD( RequestBorderSpace )( LPCBORDERWIDTHS lpborderwidths ); STDMETHOD( SetBorderSpace )( LPCBORDERWIDTHS lpborderwidths ); STDMETHOD( SetActiveObject )( IOleInPlaceActiveObject *pActiveObject, LPCOLESTR lpszObjName ); // *** IOleClientSite Methods *** STDMETHOD( SaveObject )( ); STDMETHOD( GetMoniker )( DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMk ); STDMETHOD( GetContainer )( LPOLECONTAINER *ppContainer ); STDMETHOD( ShowObject )( ); STDMETHOD( OnShowWindow )( BOOL fShow ); STDMETHOD( RequestNewObjectLayout )( ); // *** IOleWindow Methods *** STDMETHOD( GetWindow ) ( HWND *phwnd ); STDMETHOD( ContextSensitiveHelp ) ( BOOL fEnterMode ); // *** IOleInPlaceSite Methods *** STDMETHOD( CanInPlaceActivate ) ( void ); STDMETHOD( OnInPlaceActivate ) ( void ); STDMETHOD( OnUIActivate ) ( void ); STDMETHOD( GetWindowContext ) ( IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo ); STDMETHOD( Scroll ) ( SIZE scrollExtent ); STDMETHOD( OnUIDeactivate ) ( BOOL fUndoable ); STDMETHOD( OnInPlaceDeactivate ) ( void ); STDMETHOD( DiscardUndoState ) ( void ); STDMETHOD( DeactivateAndUndo ) ( void ); STDMETHOD( OnPosRectChange ) ( LPCRECT lprcPosRect ); // *** IOleInPlaceFrame Methods *** STDMETHOD( InsertMenus )( HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths ); STDMETHOD( SetMenu )( HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject ); STDMETHOD( RemoveMenus )( HMENU hmenuShared ); STDMETHOD( SetStatusText )( LPCOLESTR pszStatusText ); STDMETHOD( EnableModeless )( BOOL fEnable ); STDMETHOD( TranslateAccelerator )( LPMSG lpmsg, WORD wID ); // *** IOleControlSite Methods *** STDMETHOD( OnControlInfoChanged )( void ); STDMETHOD( LockInPlaceActive )( BOOL fLock ); STDMETHOD( GetExtendedControl )( IDispatch **ppDisp ); STDMETHOD( TransformCoords )( POINTL *pptlHimetric, POINTF *pptfContainer, DWORD dwFlags ); STDMETHOD( TranslateAccelerator )( LPMSG pMsg, DWORD grfModifiers ); STDMETHOD( OnFocus )( BOOL fGotFocus ); STDMETHOD( ShowPropertyFrame )( void ); // *** IDispatch Methods *** STDMETHOD( GetIDsOfNames )( REFIID riid, OLECHAR FAR *FAR *rgszNames, unsigned int cNames, LCID lcid, DISPID FAR *rgdispid ); STDMETHOD( GetTypeInfo )( unsigned int itinfo, LCID lcid, ITypeInfo FAR *FAR *pptinfo ); STDMETHOD( GetTypeInfoCount )( unsigned int FAR *pctinfo ); STDMETHOD( Invoke )( DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR *pexecinfo, unsigned int FAR *puArgErr ); // *** IDocHostUIHandler Methods *** STDMETHOD( ShowContextMenu )( DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved ); STDMETHOD( GetHostInfo )( DOCHOSTUIINFO __RPC_FAR *pInfo ); STDMETHOD( ShowUI )( DWORD dwID, IOleInPlaceActiveObject __RPC_FAR *pActiveObject, IOleCommandTarget __RPC_FAR *pCommandTarget, IOleInPlaceFrame __RPC_FAR *pFrame, IOleInPlaceUIWindow __RPC_FAR *pDoc ); STDMETHOD( HideUI )( void ); STDMETHOD( UpdateUI )( void ); STDMETHOD( OnDocWindowActivate )( BOOL fActivate ); STDMETHOD( OnFrameWindowActivate )( BOOL fActivate ); STDMETHOD( ResizeBorder )( LPCRECT prcBorder, IOleInPlaceUIWindow __RPC_FAR *pUIWindow, BOOL fRameWindow ); STDMETHOD( TranslateAccelerator )( LPMSG lpMsg, const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID ); STDMETHOD( GetOptionKeyPath )( LPOLESTR __RPC_FAR *pchKey, DWORD dw ); STDMETHOD( GetDropTarget )( IDropTarget __RPC_FAR *pDropTarget, IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget ); STDMETHOD( GetExternal )( IDispatch __RPC_FAR *__RPC_FAR *ppDispatch ); STDMETHOD( TranslateUrl )( DWORD dwTranslate, OLECHAR __RPC_FAR *pchURLIn, OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut ); STDMETHOD( FilterDataObject )( IDataObject __RPC_FAR *pDO, IDataObject __RPC_FAR *__RPC_FAR *ppDORet ); // STDMETHOD (EnableModeless)(BOOL fEnable); // *** IDocHostUIHandler2 Methods *** STDMETHOD( GetOverrideKeyPath )( LPOLESTR __RPC_FAR *pchKey, DWORD dw ); // *** IDocHostShowUI *** STDMETHOD( ShowHelp )( HWND hwnd, LPOLESTR pszHelpFile, UINT uCommand, DWORD dwData, POINT ptMouse, IDispatch *pDispatchObjectHit ); STDMETHOD( ShowMessage )( HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption, DWORD dwType, LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT *plResult ); /*** IOleCommandTarget ***/ STDMETHOD( QueryStatus )( const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText ); STDMETHOD( Exec )( const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut ); /*** IServiceProvider ***/ STDMETHOD( QueryService )( REFGUID guidService, REFIID riid, void **ppv ); public: STDMETHOD( Initialize )( void ); STDMETHOD( Finish )( void ); STDMETHOD( UnadviseBrowserEvents )( void ); STDMETHOD( SetLocation )( int x, int y, int width, int height ); STDMETHOD( SetFocus )( BOOL fFocused ); virtual BOOL TranslateKey( LPMSG pMsg ); HWND GetHostHWND( void ); HWND GetParentHWND( void ); HRESULT NavigateEx( IWebBrowser2 *pWeb2, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers ); HRESULT Navigate2( VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers ); HRESULT PostNavigate2( VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers ); // navigate using postmessage API HRESULT NavigateToName( LPCWSTR pszUrl, UINT fFlags ); HRESULT NavigateToNameEx( IWebBrowser2 *pWeb2, LPCWSTR pszUrl, UINT fFlags ); HRESULT PostNavigateToName( LPCWSTR pszUrl, UINT fFlags ); HRESULT WriteHTML( LPCWSTR pszHTML ); HRESULT WriteDocument( BSTR data ); // if succeeded will free bstr HRESULT InvokeScriptFunction( LPCWSTR pszFuncName, LCID lcid, DISPPARAMS FAR *pDispParams, VARIANT FAR *pVarResult, EXCEPINFO FAR *pExcepInfo, UINT FAR *puArgErr ); HRESULT GetIDispatch( IDispatch **pDisp ); HRESULT GetIUnknown( IUnknown **pUnk ); HRESULT GetIWebBrowser2( IWebBrowser2 **pWeb2 ); // Registers cursors to use with browser// set hCurToUse = NULL to remove // hCurToUse will be destryoed using DestroyCursor, make sure that this is not shared resource (use CopyCursor) STDMETHOD( RegisterBrowserCursor )( INT nSysCurID, HCURSOR hCurToUse ); // used by MTBrowser BROWSERCB RegisterBrowserEventCB( BROWSERCB fnBrowserCB, LPVOID pUserData ); static HRESULT InternetSetFeatureEnabled( INTERNETFEATURELIST FeatureEntry, DWORD dwFlags, BOOL fEnable ); static HRESULT InternetIsFeatureEnabled( INTERNETFEATURELIST FeatureEntry, DWORD dwFlags ); protected: virtual void OnBeforeNavigate( IDispatch *pDispatch, VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers, VARIANT_BOOL *Cancel ); virtual void OnNavigateError( IDispatch *pDispatch, VARIANT *URL, VARIANT *TargetFrameName, VARIANT *StatusCode, VARIANT_BOOL *Cancel ){} virtual void OnNavigateComplete( IDispatch *pDispatch, VARIANT *URL ) {} virtual void OnDocumentComplete( IDispatch *pDispatch, VARIANT *URL ) {} virtual void OnDocumentReady( IDispatch *pDispatch, VARIANT *URL ) {} // top frame OnDocumentComplete virtual void OnDownloadBegin( void ) {} virtual void OnDownloadComplete( void ) {} virtual void OnFileDownload( VARIANT_BOOL *ActiveDocument, VARIANT_BOOL *Cancel ) {} virtual void OnNewWindow2( IDispatch **ppDisp, VARIANT_BOOL *Cancel ) {} virtual void OnNewWindow3( IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl ) {} virtual void OnProgressChange( long Progress, long ProgressMax ) {} virtual void OnStatusTextChange( LPCWSTR pszText ) {} virtual void OnCommandStateChange( LONG commandId, VARIANT_BOOL Enable ) {} virtual void OnSetSecureLockIcon( UINT secureLockIcon ) {} virtual void OnNavigateCancelled( LPCWSTR pszUrl, VARIANT_BOOL *Cancel ) {} virtual void OnTitleChange( BSTR pszText ) {} virtual void OnVisibleChange( VARIANT_BOOL fVisible ) {} virtual void OnWindowClosing( VARIANT_BOOL IsChildWindow, VARIANT_BOOL *Cancel ) {} virtual void OnShowUiElement( UINT elementId, VARIANT_BOOL fSHow ) {} virtual void OnWindowSetResizable( VARIANT_BOOL Enable ) {} virtual void OnClientToHostWindow( LONG *CX, LONG *CY ) {} virtual void OnSetWindowPos( UINT flags, LONG x, LONG y, LONG cx, LONG cy ) {} virtual void OnEnableFullscreen( VARIANT_BOOL Enable ) {} virtual COLORREF OnGetHostBkColor( void ); virtual DWORD OnGetHostInfoFlags( void ); virtual OLECHAR *OnGetHostCSS( void ); // use CoTaskMemAlloc to allocate string virtual OLECHAR *OnGetHostNamespace( void ); // use CoTaskMemAlloc to allocate string virtual DWORD OnGetDownlodFlags( void ); virtual LPCWSTR OnGetUserAgent( void ); virtual DWORD GetContainerStyle( void ); BOOL ValidateURLHost( LPCWSTR pszUrl ); HRESULT IsFrameset( IWebBrowser2 *pWeb2 ); HRESULT GetFramesCount( IWebBrowser2 *pWeb2, INT *frameCount ); HRESULT GetAppVersion( BSTR *p ); HRESULT GetUserAgent( BSTR *p ); virtual HANDLE InitializePopupHook( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { return NULL; } virtual void DeletePopupHook( HANDLE hHoook ) {} virtual void InitializeMenuPopup( HWND hwnd, HMENU hMenu, INT iPos, BOOL fWindowMenu ) {} virtual void ProcessRedirectedMessage( HWND hwnd, UINT messageId, LPARAM param ); HRESULT PostRedirectMessage( UINT messageId, LPARAM param ); virtual BOOL InputLangChangeRequest( HWND hwnd, UINT flags, HKL hkl ) { return FALSE; } virtual void InputLangChange( UINT charset, HKL hkl ) {} virtual void OnClosePopupInternal() {} private: /// helpers friend static HRESULT HTMLContainer2_OnShowUiElementHelper( HTMLContainer2 *instance, UINT elementId, DISPPARAMS *pDispParams ); protected: LONG ref; // ref count IUnknown *pUnk; // IUnknown of contained object RECT rect; // HWND hParent; // window handle of the container private: DWORD dwCookie; DWORD dwFlags; BROWSERCB fnBrwoserCB; LPVOID userData; BOOL bNavigating; VOID *hCursors; INT nCursors; BOOL ensureChakraLoaded; HWND winampWindow; friend static LRESULT SubclassControl_WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); }; #endif