blob: 3037847e88a0350a128a322648cb09ffa1517fb2 [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 <vector>
#include "chrome/browser/tab_contents/tab_contents_delegate.h"
#include "chrome/common/notification_observer.h"
#include "chrome/common/notification_registrar.h"
#include "views/widget/widget_win.h"
class AutomationProvider;
class Profile;
class TabContentsContainer;
class RenderViewContextMenuExternalWin;
// 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.
// TODO(beng): Should override WidgetWin instead of Widget.
class ExternalTabContainer : public TabContentsDelegate,
public NotificationObserver,
public views::WidgetWin,
public views::KeystrokeListener {
public:
explicit ExternalTabContainer(AutomationProvider* automation);
~ExternalTabContainer();
TabContents* tab_contents() const { return tab_contents_; }
// Temporary hack so we can send notifications back
void set_tab_handle(int handle) { tab_handle_ = handle; }
bool Init(Profile* profile,
HWND parent,
const gfx::Rect& bounds,
DWORD style);
// 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);
// See TabContents::FocusThroughTabTraversal. Called from AutomationProvider.
void FocusThroughTabTraversal(bool reverse);
// 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);
// 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 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& message,
const std::string& origin,
const std::string& target);
virtual bool IsExternalTabContainer() const {
return true;
};
virtual bool TakeFocus(bool reverse);
// Overridden from NotificationObserver:
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// Overridden from views::KeystrokeListener:
virtual bool ProcessKeyStroke(HWND window, UINT message, WPARAM wparam,
LPARAM lparam);
// Handles the context menu display operation. This allows external
// hosts to customize the menu.
virtual bool HandleContextMenu(const ContextMenuParams& params);
// Executes the context menu command identified by the command
// parameter.
virtual bool ExecuteContextMenuCommand(int command);
protected:
// Overridden from views::WidgetWin:
virtual void OnDestroy();
private:
// Unhook the keystroke listener and notify about the closing TabContents.
// This function gets called from two places, which is fine.
// 1. OnFinalMessage
// 2. In the destructor.
void Uninitialize(HWND window);
TabContents* tab_contents_;
scoped_refptr<AutomationProvider> automation_;
NotificationRegistrar registrar_;
// The accelerator table of the external host.
HACCEL external_accel_table_;
unsigned int external_accel_entry_count_;
// A view to handle focus cycling
TabContentsContainer* tab_contents_container_;
int tab_handle_;
// A failed navigation like a 404 is followed in chrome with a success
// navigation for the 404 page. We need to ignore the next navigation
// to avoid confusing the clients of the external tab. This member variable
// is set when we need to ignore the next load notification.
bool ignore_next_load_notification_;
// Contains the list of disabled context menu identifiers.
std::vector<int> disabled_context_menu_ids_;
scoped_ptr<RenderViewContextMenuExternalWin> external_context_menu_;
DISALLOW_COPY_AND_ASSIGN(ExternalTabContainer);
};
#endif // CHROME_BROWSER_EXTERNAL_TAB_CONTAINER_H_