| // Licensed to the Software Freedom Conservancy (SFC) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The SFC licenses this file |
| // to you under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef WEBDRIVER_IE_BROWSER_H_ |
| #define WEBDRIVER_IE_BROWSER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include <exdispid.h> |
| #include <mshtml.h> |
| |
| #include "DocumentHost.h" |
| |
| namespace webdriver { |
| |
| struct BrowserReattachInfo { |
| DWORD current_process_id; |
| std::vector<DWORD> known_process_ids; |
| std::string browser_id; |
| }; |
| |
| struct NewWindowInfo { |
| std::string target_url; |
| LPSTREAM browser_stream; |
| }; |
| |
| // Forward declaration of classes to avoid |
| // circular include files. |
| class ElementRepository; |
| |
| class Browser : public DocumentHost, public IDispEventSimpleImpl<1, Browser, &DIID_DWebBrowserEvents2> { |
| public: |
| Browser(IWebBrowser2* browser, HWND hwnd, HWND session_handle, bool isEdgeChrome = false); |
| virtual ~Browser(void); |
| |
| static inline _ATL_FUNC_INFO* BeforeNavigate2Info() { |
| static _ATL_FUNC_INFO kBeforeNavigate2 = { CC_STDCALL, |
| VT_EMPTY, |
| 7, |
| { VT_DISPATCH, |
| VT_VARIANT | VT_BYREF, |
| VT_VARIANT | VT_BYREF, |
| VT_VARIANT | VT_BYREF, |
| VT_VARIANT | VT_BYREF, |
| VT_VARIANT | VT_BYREF, |
| VT_BOOL | VT_BYREF } }; |
| return &kBeforeNavigate2; |
| } |
| |
| static inline _ATL_FUNC_INFO* DocumentCompleteInfo() { |
| static _ATL_FUNC_INFO kDocumentComplete = { CC_STDCALL, |
| VT_EMPTY, |
| 2, |
| { VT_DISPATCH, |
| VT_VARIANT|VT_BYREF } }; |
| return &kDocumentComplete; |
| } |
| |
| static inline _ATL_FUNC_INFO* NoArgumentsInfo() { |
| static _ATL_FUNC_INFO kNoArguments = { CC_STDCALL, VT_EMPTY, 0 }; |
| return &kNoArguments; |
| } |
| |
| static inline _ATL_FUNC_INFO* NewWindow3Info() { |
| static _ATL_FUNC_INFO kNewWindow3 = { CC_STDCALL, VT_EMPTY, 5, |
| { VT_DISPATCH | VT_BYREF, |
| VT_BOOL | VT_BYREF, |
| VT_I4, |
| VT_BSTR, |
| VT_BSTR } }; |
| return &kNewWindow3; |
| } |
| |
| static inline _ATL_FUNC_INFO* NewProcessInfo() { |
| static _ATL_FUNC_INFO kNewProcess = { CC_STDCALL, VT_EMPTY, 3, |
| { VT_I4, |
| VT_DISPATCH, |
| VT_BOOL | VT_BYREF } }; |
| return &kNewProcess; |
| } |
| |
| BEGIN_SINK_MAP(Browser) |
| SINK_ENTRY_INFO(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2, BeforeNavigate2Info()) |
| SINK_ENTRY_INFO(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, DocumentComplete, DocumentCompleteInfo()) |
| SINK_ENTRY_INFO(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit, NoArgumentsInfo()) |
| SINK_ENTRY_INFO(1, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW3, NewWindow3, NewWindow3Info()) |
| SINK_ENTRY_INFO(1, DIID_DWebBrowserEvents2, DISPID_NEWPROCESS, NewProcess, NewProcessInfo()) |
| END_SINK_MAP() |
| |
| STDMETHOD_(void, BeforeNavigate2)(IDispatch* pObject, VARIANT* pvarUrl, VARIANT* pvarFlags, |
| VARIANT* pvarTargetFrame, VARIANT* pvarData, VARIANT* pvarHeaders, VARIANT_BOOL* pbCancel); |
| STDMETHOD_(void, DocumentComplete)(IDispatch* pDisp, VARIANT* URL); |
| STDMETHOD_(void, OnQuit)(); |
| STDMETHOD_(void, NewWindow3)(IDispatch** ppDisp, VARIANT_BOOL* pbCancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl); |
| STDMETHOD_(void, NewProcess)(DWORD lCauseFlag, IDispatch* pWB2, VARIANT_BOOL* pbCancel); |
| |
| bool Wait(const std::string& page_load_strategy); |
| void Close(void); |
| bool IsBusy(void); |
| void GetDocument(const bool force_top_level_document, |
| IHTMLDocument2** doc); |
| void GetDocument(IHTMLDocument2** doc); |
| std::string GetWindowName(void); |
| std::string GetTitle(void); |
| std::string GetBrowserUrl(void); |
| HWND GetContentWindowHandle(void); |
| HWND GetBrowserWindowHandle(void); |
| HWND GetTopLevelWindowHandle(void); |
| HWND GetActiveDialogWindowHandle(void); |
| |
| long GetWidth(void); |
| long GetHeight(void); |
| void SetWidth(long width); |
| void SetHeight(long height); |
| |
| int NavigateToUrl(const std::string& url, std::string* error_message); |
| int NavigateBack(void); |
| int NavigateForward(void); |
| int Refresh(void); |
| |
| bool IsValidWindow(void); |
| |
| bool IsFullScreen(void); |
| bool SetFullScreen(bool is_full_screen); |
| |
| void InitiateBrowserReattach(void); |
| void ReattachBrowser(IWebBrowser2* browser); |
| |
| bool is_explicit_close_requested(void) const { |
| return this->is_explicit_close_requested_; |
| } |
| IWebBrowser2* browser(void) { return this->browser_; } |
| |
| private: |
| void AttachEvents(void); |
| void DetachEvents(void); |
| bool IsDocumentNavigating(const std::string& page_load_strategy, |
| IHTMLDocument2* doc); |
| bool GetDocumentFromWindow(IHTMLWindow2* window, IHTMLDocument2** doc); |
| void CheckDialogType(HWND dialog_window_handle); |
| |
| static unsigned int WINAPI GoBackThreadProc(LPVOID param); |
| static unsigned int WINAPI GoForwardThreadProc(LPVOID param); |
| |
| CComPtr<IWebBrowser2> browser_; |
| bool is_navigation_started_; |
| bool is_explicit_close_requested_; |
| std::vector<DWORD> known_process_ids_; |
| }; |
| |
| } // namespace webdriver |
| |
| #endif // WEBDRIVER_IE_BROWSER_H_ |