1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
// Copyright (c) 2012 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 CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_MAC_H_
#define CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_MAC_H_
#import <Cocoa/Cocoa.h>
#include <string>
#include <vector>
#include "base/mac/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"
#include "content/browser/renderer_host/render_view_host_delegate_view.h"
#include "content/browser/web_contents/web_contents_view.h"
#include "content/common/content_export.h"
#include "content/common/drag_event_source_info.h"
#include "ui/base/cocoa/base_view.h"
#include "ui/gfx/geometry/size.h"
@class FocusTracker;
class SkBitmap;
@class WebDragDest;
@class WebDragSource;
namespace content {
class PopupMenuHelper;
class WebContentsImpl;
class WebContentsViewDelegate;
class WebContentsViewMac;
}
namespace gfx {
class Vector2d;
}
CONTENT_EXPORT
@interface WebContentsViewCocoa : BaseView {
@private
content::WebContentsViewMac* webContentsView_; // WEAK; owns us
base::scoped_nsobject<WebDragSource> dragSource_;
base::scoped_nsobject<WebDragDest> dragDest_;
BOOL mouseDownCanMoveWindow_;
}
- (void)setMouseDownCanMoveWindow:(BOOL)canMove;
// Expose this, since sometimes one needs both the NSView and the
// WebContentsImpl.
- (content::WebContentsImpl*)webContents;
@end
namespace content {
// Mac-specific implementation of the WebContentsView. It owns an NSView that
// contains all of the contents of the tab and associated child views.
class WebContentsViewMac : public WebContentsView,
public RenderViewHostDelegateView {
public:
// The corresponding WebContentsImpl is passed in the constructor, and manages
// our lifetime. This doesn't need to be the case, but is this way currently
// because that's what was easiest when they were split.
WebContentsViewMac(WebContentsImpl* web_contents,
WebContentsViewDelegate* delegate);
~WebContentsViewMac() override;
// WebContentsView implementation --------------------------------------------
gfx::NativeView GetNativeView() const override;
gfx::NativeView GetContentNativeView() const override;
gfx::NativeWindow GetTopLevelNativeWindow() const override;
void GetContainerBounds(gfx::Rect* out) const override;
void SizeContents(const gfx::Size& size) override;
void Focus() override;
void SetInitialFocus() override;
void StoreFocus() override;
void RestoreFocus() override;
DropData* GetDropData() const override;
gfx::Rect GetViewBounds() const override;
void SetAllowOtherViews(bool allow) override;
bool GetAllowOtherViews() const override;
void CreateView(const gfx::Size& initial_size,
gfx::NativeView context) override;
RenderWidgetHostViewBase* CreateViewForWidget(
RenderWidgetHost* render_widget_host,
bool is_guest_view_hack) override;
RenderWidgetHostViewBase* CreateViewForPopupWidget(
RenderWidgetHost* render_widget_host) override;
void SetPageTitle(const base::string16& title) override;
void RenderViewCreated(RenderViewHost* host) override;
void RenderViewSwappedIn(RenderViewHost* host) override;
void SetOverscrollControllerEnabled(bool enabled) override;
bool IsEventTracking() const override;
void CloseTabAfterEventTracking() override;
// Backend implementation of RenderViewHostDelegateView.
void ShowContextMenu(RenderFrameHost* render_frame_host,
const ContextMenuParams& params) override;
void ShowPopupMenu(RenderFrameHost* render_frame_host,
const gfx::Rect& bounds,
int item_height,
double item_font_size,
int selected_item,
const std::vector<MenuItem>& items,
bool right_aligned,
bool allow_multiple_selection) override;
void HidePopupMenu() override;
void StartDragging(const DropData& drop_data,
blink::WebDragOperationsMask allowed_operations,
const gfx::ImageSkia& image,
const gfx::Vector2d& image_offset,
const DragEventSourceInfo& event_info) override;
void UpdateDragCursor(blink::WebDragOperation operation) override;
void GotFocus() override;
void TakeFocus(bool reverse) override;
// A helper method for closing the tab in the
// CloseTabAfterEventTracking() implementation.
void CloseTab();
WebContentsImpl* web_contents() { return web_contents_; }
WebContentsViewDelegate* delegate() { return delegate_.get(); }
private:
// Returns the fullscreen view, if one exists; otherwise, returns the content
// native view. This ensures that the view currently attached to a NSWindow is
// being used to query or set first responder state.
gfx::NativeView GetNativeViewForFocus() const;
// The WebContentsImpl whose contents we display.
WebContentsImpl* web_contents_;
// The Cocoa NSView that lives in the view hierarchy.
base::scoped_nsobject<WebContentsViewCocoa> cocoa_view_;
// Keeps track of which NSView has focus so we can restore the focus when
// focus returns.
base::scoped_nsobject<FocusTracker> focus_tracker_;
// Our optional delegate.
scoped_ptr<WebContentsViewDelegate> delegate_;
// Whether to allow other views.
bool allow_other_views_;
scoped_ptr<PopupMenuHelper> popup_menu_helper_;
DISALLOW_COPY_AND_ASSIGN(WebContentsViewMac);
};
} // namespace content
#endif // CONTENT_BROWSER_WEB_CONTENTS_WEB_CONTENTS_VIEW_MAC_H_
|