tab_contents_view_mac.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_MAC_H_
6#define CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_MAC_H_
7#pragma once
8
9#import <Cocoa/Cocoa.h>
10
11#include <string>
12#include <vector>
13
14#include "base/memory/scoped_nsobject.h"
15#include "chrome/browser/ui/cocoa/base_view.h"
16#include "content/browser/tab_contents/tab_contents_view.h"
17#include "content/common/notification_observer.h"
18#include "content/common/notification_registrar.h"
19#include "ui/gfx/size.h"
20
21@class FocusTracker;
22@class SadTabController;
23class SkBitmap;
24class TabContentsViewMac;
25@class WebDragSource;
26@class WebDropTarget;
27namespace gfx {
28class Point;
29}
30
31@interface TabContentsViewCocoa : BaseView {
32 @private
33  TabContentsViewMac* tabContentsView_;  // WEAK; owns us
34  scoped_nsobject<WebDragSource> dragSource_;
35  scoped_nsobject<WebDropTarget> dropTarget_;
36}
37
38// Expose this, since sometimes one needs both the NSView and the TabContents.
39- (TabContents*)tabContents;
40@end
41
42// Mac-specific implementation of the TabContentsView. It owns an NSView that
43// contains all of the contents of the tab and associated child views.
44class TabContentsViewMac : public TabContentsView,
45                           public NotificationObserver {
46 public:
47  // The corresponding TabContents is passed in the constructor, and manages our
48  // lifetime. This doesn't need to be the case, but is this way currently
49  // because that's what was easiest when they were split.
50  explicit TabContentsViewMac(TabContents* web_contents);
51  virtual ~TabContentsViewMac();
52
53  // TabContentsView implementation --------------------------------------------
54
55  virtual void CreateView(const gfx::Size& initial_size);
56  virtual RenderWidgetHostView* CreateViewForWidget(
57      RenderWidgetHost* render_widget_host);
58  virtual gfx::NativeView GetNativeView() const;
59  virtual gfx::NativeView GetContentNativeView() const;
60  virtual gfx::NativeWindow GetTopLevelNativeWindow() const;
61  virtual void GetContainerBounds(gfx::Rect* out) const;
62  virtual void RenderViewCreated(RenderViewHost* host);
63  virtual void SetPageTitle(const std::wstring& title);
64  virtual void OnTabCrashed(base::TerminationStatus status,
65                            int error_code);
66  virtual void SizeContents(const gfx::Size& size);
67  virtual void Focus();
68  virtual void SetInitialFocus();
69  virtual void StoreFocus();
70  virtual void RestoreFocus();
71  virtual void UpdatePreferredSize(const gfx::Size& pref_size);
72  virtual RenderWidgetHostView* CreateNewWidgetInternal(
73      int route_id,
74      WebKit::WebPopupType popup_type);
75  virtual void ShowCreatedWidgetInternal(RenderWidgetHostView* widget_host_view,
76                                         const gfx::Rect& initial_pos);
77  virtual bool IsEventTracking() const;
78  virtual void CloseTabAfterEventTracking();
79  virtual void GetViewBounds(gfx::Rect* out) const;
80
81  // Backend implementation of RenderViewHostDelegate::View.
82  virtual void ShowContextMenu(const ContextMenuParams& params);
83  virtual void ShowPopupMenu(const gfx::Rect& bounds,
84                             int item_height,
85                             double item_font_size,
86                             int selected_item,
87                             const std::vector<WebMenuItem>& items,
88                             bool right_aligned);
89  virtual void StartDragging(const WebDropData& drop_data,
90                             WebKit::WebDragOperationsMask allowed_operations,
91                             const SkBitmap& image,
92                             const gfx::Point& image_offset);
93  virtual void UpdateDragCursor(WebKit::WebDragOperation operation);
94  virtual void GotFocus();
95  virtual void TakeFocus(bool reverse);
96
97  // NotificationObserver implementation ---------------------------------------
98
99  virtual void Observe(NotificationType type,
100                       const NotificationSource& source,
101                       const NotificationDetails& details);
102
103  // A helper method for closing the tab in the
104  // CloseTabAfterEventTracking() implementation.
105  void CloseTab();
106
107  int preferred_width() const { return preferred_width_; }
108
109 private:
110  // The Cocoa NSView that lives in the view hierarchy.
111  scoped_nsobject<TabContentsViewCocoa> cocoa_view_;
112
113  // Keeps track of which NSView has focus so we can restore the focus when
114  // focus returns.
115  scoped_nsobject<FocusTracker> focus_tracker_;
116
117  // Used to get notifications about renderers coming and going.
118  NotificationRegistrar registrar_;
119
120  // Used to render the sad tab. This will be non-NULL only when the sad tab is
121  // visible.
122  scoped_nsobject<SadTabController> sad_tab_;
123
124  // The page content's intrinsic width.
125  int preferred_width_;
126
127  DISALLOW_COPY_AND_ASSIGN(TabContentsViewMac);
128};
129
130#endif  // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_VIEW_MAC_H_
131