blob: bb8b21f7f025e7dea3a7ba440f26660392a02966 [file] [log] [blame]
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTERNAL_TAB_CONTAINER_H_
#define CHROME_BROWSER_EXTERNAL_TAB_CONTAINER_H_
#include <atlbase.h>
#include <atlapp.h>
#include <atlcrack.h>
#include <atlmisc.h>
#include "base/basictypes.h"
#include "chrome/browser/tab_contents_delegate.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/notification_registrar.h"
#include "chrome/common/notification_service.h"
#include "chrome/views/container.h"
#include "chrome/views/focus_manager.h"
#include "chrome/views/root_view.h"
class AutomationProvider;
class TabContents;
class Profile;
class TabContentsContainerView;
// This class serves as the container window for an external tab.
// An external tab is a Chrome tab that is meant to displayed in an
// external process. This class provides the FocusManger needed by the
// TabContents as well as an implementation of TabContentsDelagate.
// It also implements Container
class ExternalTabContainer : public TabContentsDelegate,
public NotificationObserver,
public views::Container,
public views::KeystrokeListener,
public CWindowImpl<ExternalTabContainer,
CWindow,
CWinTraits<WS_POPUP |
WS_CLIPCHILDREN>> {
public:
BEGIN_MSG_MAP(ExternalTabContainer)
MESSAGE_HANDLER(WM_SIZE, OnSize)
MSG_WM_DESTROY(OnDestroy)
END_MSG_MAP()
DECLARE_WND_CLASS(chrome::kExternalTabWindowClass)
ExternalTabContainer(AutomationProvider* automation);
~ExternalTabContainer();
TabContents* tab_contents() const {
return tab_contents_;
}
bool Init(Profile* profile);
// Overridden from TabContentsDelegate:
virtual void OpenURLFromTab(TabContents* source,
const GURL& url,
const GURL& referrer,
WindowOpenDisposition disposition,
PageTransition::Type transition);
virtual void NavigationStateChanged(const TabContents* source,
unsigned changed_flags);
virtual void ReplaceContents(TabContents* source, TabContents* new_contents);
virtual void AddNewContents(TabContents* source,
TabContents* new_contents,
WindowOpenDisposition disposition,
const gfx::Rect& initial_pos,
bool user_gesture);
virtual void ActivateContents(TabContents* contents);
virtual void LoadingStateChanged(TabContents* source);
virtual void CloseContents(TabContents* source);
virtual void MoveContents(TabContents* source, const gfx::Rect& pos);
virtual bool IsPopup(TabContents* source);
virtual void URLStarredChanged(TabContents* source, bool starred);
virtual void UpdateTargetURL(TabContents* source, const GURL& url);
virtual void ContentsZoomChange(bool zoom_in);
virtual void ToolbarSizeChanged(TabContents* source, bool is_animating);
virtual void ForwardMessageToExternalHost(const std::string& receiver,
const std::string& message);
// Notification service callback.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
////////////////////////////////////////////////////////////////////////////////
// views::Container
////////////////////////////////////////////////////////////////////////////////
virtual void GetBounds(CRect *out, bool including_frame) const;
virtual void MoveToFront(bool should_activate);
virtual HWND GetHWND() const;
virtual void PaintNow(const gfx::Rect& update_rect);
virtual views::RootView* GetRootView();
virtual bool IsVisible();
virtual bool IsActive();
virtual bool GetAccelerator(int cmd_id,
views::Accelerator* accelerator) {
return false;
}
// views::KeystrokeListener implementation
// This method checks whether this keydown message is needed by the
// external host. If so, it sends it over to the external host
virtual bool ProcessKeyDown(HWND window, UINT message, WPARAM wparam,
LPARAM lparam);
// Sets the keyboard accelerators needed by the external host
void SetAccelerators(HACCEL accel_table, int accel_table_entry_count);
// This is invoked when the external host reflects back to us a keyboard
// message it did not process
void ProcessUnhandledAccelerator(const MSG& msg);
// A helper method that tests whether the given window is an
// ExternalTabContainer window
static bool IsExternalTabContainer(HWND window);
// A helper method that retrieves the ExternalTabContainer object that
// hosts the given tab window.
static ExternalTabContainer* GetContainerForTab(HWND tab_window);
protected:
LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL& handled);
void OnDestroy();
void OnFinalMessage(HWND window);
protected:
TabContents *tab_contents_;
AutomationProvider* automation_;
NotificationRegistrar registrar_;
// Root view
views::RootView root_view_;
// The accelerator table of the external host.
HACCEL external_accel_table_;
unsigned int external_accel_entry_count_;
// A view to handle focus cycling
TabContentsContainerView* tab_contents_container_;
private:
DISALLOW_COPY_AND_ASSIGN(ExternalTabContainer);
};
#endif // CHROME_BROWSER_EXTERNAL_TAB_CONTAINER_H__