diff options
Diffstat (limited to 'chrome/browser/external_tab_container.cc')
-rw-r--r-- | chrome/browser/external_tab_container.cc | 233 |
1 files changed, 81 insertions, 152 deletions
diff --git a/chrome/browser/external_tab_container.cc b/chrome/browser/external_tab_container.cc index 608b34e..24fb0c0 100644 --- a/chrome/browser/external_tab_container.cc +++ b/chrome/browser/external_tab_container.cc @@ -18,8 +18,6 @@ #include "chrome/common/chrome_constants.h" #include "chrome/common/notification_service.h" #include "chrome/test/automation/automation_messages.h" -// Included for SetRootViewForHWND. -#include "views/widget/widget_win.h" static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject"; @@ -29,7 +27,6 @@ static const wchar_t kWindowObjectKey[] = L"ChromeWindowObject"; ExternalTabContainer::ExternalTabContainer( AutomationProvider* automation) : automation_(automation), - root_view_(this), tab_contents_(NULL), external_accel_table_(NULL), external_accel_entry_count_(0), @@ -39,34 +36,27 @@ ExternalTabContainer::ExternalTabContainer( } ExternalTabContainer::~ExternalTabContainer() { - Uninitialize(m_hWnd); + Uninitialize(GetNativeView()); } -bool ExternalTabContainer::Init(Profile* profile, HWND parent, - const gfx::Rect& dimensions, - unsigned int style) { +bool ExternalTabContainer::Init(Profile* profile, + HWND parent, + const gfx::Rect& bounds, + DWORD style) { if (IsWindow()) { NOTREACHED(); return false; } - // First create the container window - if (!Create(NULL, dimensions.ToRECT())) { - NOTREACHED(); - return false; - } + set_window_style(WS_POPUP); + views::WidgetWin::Init(parent, bounds, true); // We don't ever remove the prop because the lifetime of this object // is the same as the lifetime of the window - SetProp(*this, kWindowObjectKey, this); + SetProp(GetNativeView(), kWindowObjectKey, this); - views::SetRootViewForHWND(m_hWnd, &root_view_); - // CreateFocusManager will subclass this window and delete the FocusManager - // instance when this window goes away. views::FocusManager* focus_manager = - views::FocusManager::CreateFocusManager(m_hWnd, GetRootView()); - - DCHECK(focus_manager); + views::FocusManager::GetFocusManager(GetNativeView()); focus_manager->AddKeystrokeListener(this); tab_contents_ = new TabContents(profile, NULL, MSG_ROUTING_NONE, NULL); @@ -76,7 +66,8 @@ bool ExternalTabContainer::Init(Profile* profile, HWND parent, // Create a TabContentsContainer to handle focus cycling using Tab and // Shift-Tab. tab_contents_container_ = new TabContentsContainer; - root_view_.AddChildView(tab_contents_container_); + SetContentsView(tab_contents_container_); + // Note that SetTabContents must be called after AddChildView is called tab_contents_container_->ChangeTabContents(tab_contents_); @@ -98,58 +89,62 @@ bool ExternalTabContainer::Init(Profile* profile, HWND parent, // Note that it's important to do this before we call SetParent since // during the SetParent call we will otherwise get a WA_ACTIVATE call // that causes us to steal the current focus. - ModifyStyle(WS_POPUP, style, 0); + SetWindowLong(GWL_STYLE, (GetWindowLong(GWL_STYLE) & ~WS_POPUP) | style); // Now apply the parenting and style if (parent) - SetParent(parent); + SetParent(GetNativeView(), parent); ::ShowWindow(tab_contents_->GetNativeView(), SW_SHOWNA); return true; } -bool ExternalTabContainer::Uninitialize(HWND window) { - if (::IsWindow(window)) { - views::FocusManager* focus_manager = - views::FocusManager::GetFocusManager(window); - if (focus_manager) { - focus_manager->RemoveKeystrokeListener(this); - } - } +void ExternalTabContainer::SetAccelerators(HACCEL accel_table, + int accel_table_entry_count) { + external_accel_table_ = accel_table; + external_accel_entry_count_ = accel_table_entry_count; +} - root_view_.RemoveAllChildViews(true); - if (tab_contents_) { - NotificationService::current()->Notify( - NotificationType::EXTERNAL_TAB_CLOSED, - Source<NavigationController>(&tab_contents_->controller()), - Details<ExternalTabContainer>(this)); +void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) { + // We just received an accelerator key that we had sent to external host + // back. Since the external host was not interested in handling this, we + // need to dispatch this message as if we had just peeked this out. (we + // also need to call TranslateMessage to generate a WM_CHAR if needed). + TranslateMessage(&msg); + DispatchMessage(&msg); +} - delete tab_contents_; - tab_contents_ = NULL; +void ExternalTabContainer::SetInitialFocus(bool reverse) { + DCHECK(tab_contents_); + if (tab_contents_) { + static_cast<TabContents*>(tab_contents_)->Focus(); + static_cast<TabContents*>(tab_contents_)->SetInitialFocus(reverse); } - - return true; } -void ExternalTabContainer::OnFinalMessage(HWND window) { - delete this; +// static +bool ExternalTabContainer::IsExternalTabContainer(HWND window) { + std::wstring class_name = win_util::GetClassName(window); + return _wcsicmp(class_name.c_str(), chrome::kExternalTabWindowClass) == 0; } -LRESULT ExternalTabContainer::OnSize(UINT, WPARAM, LPARAM, BOOL& handled) { - if (tab_contents_) { - RECT client_rect = {0}; - GetClientRect(&client_rect); - ::SetWindowPos(tab_contents_->GetNativeView(), NULL, client_rect.left, - client_rect.top, client_rect.right - client_rect.left, - client_rect.bottom - client_rect.top, SWP_NOZORDER); +// static +ExternalTabContainer* ExternalTabContainer::GetContainerForTab( + HWND tab_window) { + HWND parent_window = ::GetParent(tab_window); + if (!::IsWindow(parent_window)) { + return NULL; } - return 0; + if (!IsExternalTabContainer(parent_window)) { + return NULL; + } + ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>( + GetProp(parent_window, kWindowObjectKey)); + return container; } -LRESULT ExternalTabContainer::OnDestroy(UINT, WPARAM, LPARAM, BOOL& handled) { - Uninitialize(m_hWnd); - return 0; -} +//////////////////////////////////////////////////////////////////////////////// +// ExternalTabContainer, TabContentsDelegate implementation: void ExternalTabContainer::OpenURLFromTab(TabContents* source, const GURL& url, @@ -241,6 +236,12 @@ void ExternalTabContainer::ForwardMessageToExternalHost( } } +ExtensionFunctionDispatcher* ExternalTabContainer:: + CreateExtensionFunctionDispatcher(RenderViewHost* render_view_host, + const std::string& extension_id) { + return new ExtensionFunctionDispatcher(render_view_host, NULL, extension_id); +} + bool ExternalTabContainer::TakeFocus(bool reverse) { if (automation_) { views::FocusManager* focus_manager = @@ -256,6 +257,9 @@ bool ExternalTabContainer::TakeFocus(bool reverse) { return true; } +//////////////////////////////////////////////////////////////////////////////// +// ExternalTabContainer, NotificationObserver implementation: + void ExternalTabContainer::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { @@ -316,64 +320,16 @@ void ExternalTabContainer::Observe(NotificationType type, } } -void ExternalTabContainer::GetBounds(gfx::Rect* out, - bool including_frame) const { - CRect crect; - GetWindowRect(&crect); - *out = gfx::Rect(crect); -} - -void ExternalTabContainer::SetBounds(const gfx::Rect& bounds) { - SetBounds(bounds, NULL); -} - -void ExternalTabContainer::SetBounds(const gfx::Rect& bounds, - gfx::NativeView other_window) { - NOTIMPLEMENTED(); -} +//////////////////////////////////////////////////////////////////////////////// +// ExternalTabContainer, views::WidgetWin overrides: -void ExternalTabContainer::Close() { - NOTIMPLEMENTED(); +void ExternalTabContainer::OnDestroy() { + Uninitialize(GetNativeView()); + WidgetWin::OnDestroy(); } -void ExternalTabContainer::CloseNow() { - NOTIMPLEMENTED(); -} - -void ExternalTabContainer::Show() { - NOTIMPLEMENTED(); -} - -void ExternalTabContainer::Hide() { - NOTIMPLEMENTED(); -} - -gfx::NativeView ExternalTabContainer::GetNativeView() const { - return m_hWnd; -} - -void ExternalTabContainer::PaintNow(const gfx::Rect& update_rect) { - RECT native_update_rect = update_rect.ToRECT(); - RedrawWindow(&native_update_rect, - NULL, - RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_NOERASE); -} - -void ExternalTabContainer::SetOpacity(unsigned char opacity) { - NOTIMPLEMENTED(); -} - -views::RootView* ExternalTabContainer::GetRootView() { - return const_cast<views::RootView*>(&root_view_); -} - -bool ExternalTabContainer::IsVisible() const { - return !!::IsWindowVisible(*this); -} - -bool ExternalTabContainer::IsActive() const { - return win_util::IsWindowActive(*this); -} +//////////////////////////////////////////////////////////////////////////////// +// ExternalTabContainer, views::KeystrokeListener implementation: bool ExternalTabContainer::ProcessKeyStroke(HWND window, UINT message, WPARAM wparam, LPARAM lparam) { @@ -412,52 +368,25 @@ bool ExternalTabContainer::ProcessKeyStroke(HWND window, UINT message, return false; } -void ExternalTabContainer::SetAccelerators(HACCEL accel_table, - int accel_table_entry_count) { - external_accel_table_ = accel_table; - external_accel_entry_count_ = accel_table_entry_count; -} +//////////////////////////////////////////////////////////////////////////////// +// ExternalTabContainer, private: -void ExternalTabContainer::ProcessUnhandledAccelerator(const MSG& msg) { - // We just received an accelerator key that we had sent to external host - // back. Since the external host was not interested in handling this, we - // need to dispatch this message as if we had just peeked this out. (we - // also need to call TranslateMessage to generate a WM_CHAR if needed). - TranslateMessage(&msg); - DispatchMessage(&msg); -} - -void ExternalTabContainer::SetInitialFocus(bool reverse) { - DCHECK(tab_contents_); - if (tab_contents_) { - static_cast<TabContents*>(tab_contents_)->Focus(); - static_cast<TabContents*>(tab_contents_)->SetInitialFocus(reverse); +void ExternalTabContainer::Uninitialize(HWND window) { + if (::IsWindow(window)) { + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManager(window); + if (focus_manager) + focus_manager->RemoveKeystrokeListener(this); } -} - -// static -bool ExternalTabContainer::IsExternalTabContainer(HWND window) { - std::wstring class_name = win_util::GetClassName(window); - return _wcsicmp(class_name.c_str(), chrome::kExternalTabWindowClass) == 0; -} -ExtensionFunctionDispatcher* ExternalTabContainer:: - CreateExtensionFunctionDispatcher(RenderViewHost* render_view_host, - const std::string& extension_id) { - return new ExtensionFunctionDispatcher(render_view_host, NULL, extension_id); -} + if (tab_contents_) { + NotificationService::current()->Notify( + NotificationType::EXTERNAL_TAB_CLOSED, + Source<NavigationController>(&tab_contents_->controller()), + Details<ExternalTabContainer>(this)); -// static -ExternalTabContainer* ExternalTabContainer::GetContainerForTab( - HWND tab_window) { - HWND parent_window = ::GetParent(tab_window); - if (!::IsWindow(parent_window)) { - return NULL; - } - if (!IsExternalTabContainer(parent_window)) { - return NULL; + delete tab_contents_; + tab_contents_ = NULL; } - ExternalTabContainer* container = reinterpret_cast<ExternalTabContainer*>( - GetProp(parent_window, kWindowObjectKey)); - return container; } + |