diff options
Diffstat (limited to 'ceee/ie/plugin/bho/infobar_manager.cc')
-rw-r--r-- | ceee/ie/plugin/bho/infobar_manager.cc | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/ceee/ie/plugin/bho/infobar_manager.cc b/ceee/ie/plugin/bho/infobar_manager.cc index 6b969f6..30ff9a9 100644 --- a/ceee/ie/plugin/bho/infobar_manager.cc +++ b/ceee/ie/plugin/bho/infobar_manager.cc @@ -31,7 +31,9 @@ namespace infobar_api { // WM_NCCALCSIZE to resize its client area. It also handles WM_SIZE and WM_MOVE // messages to make infobars consistent with IE content window's size and // position. -class InfobarManager::ContainerWindow : public CWindowImpl<ContainerWindow> { +class InfobarManager::ContainerWindow + : public InfobarManager::ContainerWindowInterface, + public CWindowImpl<ContainerWindow> { public: ContainerWindow(HWND container, InfobarManager* manager) : infobar_manager_(manager) { @@ -44,10 +46,18 @@ class InfobarManager::ContainerWindow : public CWindowImpl<ContainerWindow> { UnsubclassWindow(); } - bool destroyed() const { + virtual bool IsDestroyed() const { return destroyed_; } + virtual HWND GetWindowHandle() const { + return IsWindow() ? m_hWnd : NULL; + } + + virtual bool PostWindowsMessage(UINT msg, WPARAM wparam, LPARAM lparam) { + return PostMessage(msg, wparam, lparam) != 0; + } + BEGIN_MSG_MAP_EX(ContainerWindow) MSG_WM_NCCALCSIZE(OnNcCalcSize) MSG_WM_SIZE(OnSize) @@ -135,17 +145,11 @@ class InfobarManager::ContainerWindow : public CWindowImpl<ContainerWindow> { InfobarManager::InfobarManager(HWND tab_window) : tab_window_(tab_window) { - for (int index = 0; index < END_OF_INFOBAR_TYPE; ++index) { - // Note that when InfobarManager is being initialized the IE has not created - // the tab. Therefore we cannot find the container window here and have to - // pass interface for a function that finds windows to be called later. - infobars_[index].reset( - InfobarWindow::CreateInfobar(static_cast<InfobarType>(index), this)); - } } HRESULT InfobarManager::Show(InfobarType type, int max_height, const std::wstring& url, bool slide) { + LazyInitialize(type); if (type < FIRST_INFOBAR_TYPE || type >= END_OF_INFOBAR_TYPE || infobars_[type] == NULL) { return E_INVALIDARG; @@ -155,8 +159,7 @@ HRESULT InfobarManager::Show(InfobarType type, int max_height, infobars_[type]->Navigate(url); // Create the window if not created. if (!infobars_[type]->IsWindow()) { - infobars_[type]->Create(tab_window_, NULL, NULL, - WS_CHILD | WS_CLIPCHILDREN); + infobars_[type]->InternalCreate(tab_window_, WS_CHILD | WS_CLIPCHILDREN); } if (!infobars_[type]->IsWindow()) return E_UNEXPECTED; @@ -166,10 +169,12 @@ HRESULT InfobarManager::Show(InfobarType type, int max_height, } HRESULT InfobarManager::Hide(InfobarType type) { - if (type < FIRST_INFOBAR_TYPE || type >= END_OF_INFOBAR_TYPE || - infobars_[type] == NULL) { + if (type < FIRST_INFOBAR_TYPE || type >= END_OF_INFOBAR_TYPE) return E_INVALIDARG; - } + // No lazy initialization here - if the infobar has not been created just + // return; + if (infobars_[type] == NULL) + return E_UNEXPECTED; // There is a choice either to hide or to destroy the infobar window. // This implementation destroys the infobar to save resources and stop all // scripts that possibly still run in the window. If we want to just hide the @@ -208,7 +213,7 @@ static BOOL CALLBACK FindContentParentWindowsProc(HWND hwnd, LPARAM lparam) { } HWND InfobarManager::GetContainerWindow() { - if (container_window_ != NULL && container_window_->destroyed()) + if (container_window_ != NULL && container_window_->IsDestroyed()) container_window_.reset(NULL); if (container_window_ == NULL) { @@ -221,12 +226,13 @@ HWND InfobarManager::GetContainerWindow() { DCHECK(content_parent_window); if (content_parent_window != NULL) { container_window_.reset( - new ContainerWindow(content_parent_window, this)); + CreateContainerWindow(content_parent_window, this)); } } } - DCHECK(container_window_ != NULL && container_window_->IsWindow()); - return container_window_->m_hWnd; + DCHECK(container_window_ != NULL && + container_window_->GetWindowHandle() != NULL); + return container_window_->GetWindowHandle(); } void InfobarManager::OnWindowClose(InfobarType type) { @@ -234,8 +240,8 @@ void InfobarManager::OnWindowClose(InfobarType type) { // infobar window right away as it may result on deleting the object that // started this callback. So instead we post ourtselves the message. if (container_window_ != NULL) - container_window_->PostMessage(TM_DELAYED_CLOSE_INFOBAR, - static_cast<WPARAM>(type), 0); + container_window_->PostWindowsMessage(TM_DELAYED_CLOSE_INFOBAR, + static_cast<WPARAM>(type), 0); } void InfobarManager::OnContainerWindowNcCalcSize(RECT* rect) { @@ -267,4 +273,23 @@ void InfobarManager::OnContainerWindowDestroy() { } } +void InfobarManager::LazyInitialize(InfobarType type) { + DCHECK(type >= FIRST_INFOBAR_TYPE && type < END_OF_INFOBAR_TYPE); + if (type < FIRST_INFOBAR_TYPE || type >= END_OF_INFOBAR_TYPE) + return; + + if (infobars_[type] != NULL) + return; + + // Note that when InfobarManager is being initialized the IE has not created + // the tab. Therefore we cannot find the container window here and have to + // pass interface for a function that finds windows to be called later. + infobars_[type].reset(InfobarWindow::CreateInfobar(type, this)); +} + +InfobarManager::ContainerWindowInterface* InfobarManager::CreateContainerWindow( + HWND container, InfobarManager* manager) { + return new ContainerWindow(container, manager); +} + } // namespace infobar_api |