summaryrefslogtreecommitdiffstats
path: root/chrome/browser/external_tab_container.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/external_tab_container.cc')
-rw-r--r--chrome/browser/external_tab_container.cc233
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;
}
+