Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Unified Diff: content/browser/tab_contents/web_contents_view_mac.mm

Issue 10024066: TabContents -> WebContentsImpl, part 4. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/tab_contents/web_contents_view_mac.mm
diff --git a/content/browser/tab_contents/web_contents_view_mac.mm b/content/browser/tab_contents/web_contents_view_mac.mm
deleted file mode 100644
index 3e5e00550a34a13ccae75ae3c8f036f9c8307641..0000000000000000000000000000000000000000
--- a/content/browser/tab_contents/web_contents_view_mac.mm
+++ /dev/null
@@ -1,583 +0,0 @@
-// 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.
-
-#import <Carbon/Carbon.h>
-
-#import "content/browser/tab_contents/web_contents_view_mac.h"
-
-#include <string>
-
-#import "base/mac/scoped_sending_event.h"
-#import "base/message_pump_mac.h"
-#include "content/browser/renderer_host/render_view_host_factory.h"
-#include "content/browser/renderer_host/render_view_host_impl.h"
-#include "content/browser/renderer_host/render_widget_host_view_mac.h"
-#include "content/browser/tab_contents/popup_menu_helper_mac.h"
-#include "content/browser/tab_contents/tab_contents.h"
-#import "content/browser/web_contents/web_drag_dest_mac.h"
-#import "content/browser/web_contents/web_drag_source_mac.h"
-#include "content/common/view_messages.h"
-#include "content/public/browser/web_contents_delegate.h"
-#include "content/public/browser/web_contents_view_delegate.h"
-#include "skia/ext/skia_utils_mac.h"
-#import "third_party/mozilla/NSPasteboard+Utils.h"
-#import "ui/base/cocoa/focus_tracker.h"
-
-using WebKit::WebDragOperation;
-using WebKit::WebDragOperationsMask;
-using content::RenderWidgetHostView;
-using content::WebContents;
-
-// Ensure that the WebKit::WebDragOperation enum values stay in sync with
-// NSDragOperation constants, since the code below static_casts between 'em.
-#define COMPILE_ASSERT_MATCHING_ENUM(name) \
- COMPILE_ASSERT(int(NS##name) == int(WebKit::Web##name), enum_mismatch_##name)
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationNone);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationCopy);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationLink);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationGeneric);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationPrivate);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationMove);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationDelete);
-COMPILE_ASSERT_MATCHING_ENUM(DragOperationEvery);
-
-@interface WebContentsViewCocoa (Private)
-- (id)initWithWebContentsViewMac:(WebContentsViewMac*)w;
-- (void)registerDragTypes;
-- (void)setCurrentDragOperation:(NSDragOperation)operation;
-- (void)startDragWithDropData:(const WebDropData&)dropData
- dragOperationMask:(NSDragOperation)operationMask
- image:(NSImage*)image
- offset:(NSPoint)offset;
-- (void)cancelDeferredClose;
-- (void)clearTabContentsView;
-- (void)closeTabAfterEvent;
-- (void)viewDidBecomeFirstResponder:(NSNotification*)notification;
-@end
-
-namespace web_contents_view_mac {
-content::WebContentsView* CreateWebContentsView(
- TabContents* tab_contents,
- content::WebContentsViewDelegate* delegate) {
- return new WebContentsViewMac(tab_contents, delegate);
-}
-}
-
-WebContentsViewMac::WebContentsViewMac(
- WebContentsImpl* web_contents,
- content::WebContentsViewDelegate* delegate)
- : web_contents_(web_contents),
- delegate_(delegate) {
-}
-
-WebContentsViewMac::~WebContentsViewMac() {
- // This handles the case where a renderer close call was deferred
- // while the user was operating a UI control which resulted in a
- // close. In that case, the Cocoa view outlives the
- // WebContentsViewMac instance due to Cocoa retain count.
- [cocoa_view_ cancelDeferredClose];
- [cocoa_view_ clearTabContentsView];
-}
-
-void WebContentsViewMac::CreateView(const gfx::Size& initial_size) {
- WebContentsViewCocoa* view =
- [[WebContentsViewCocoa alloc] initWithWebContentsViewMac:this];
- cocoa_view_.reset(view);
-}
-
-RenderWidgetHostView* WebContentsViewMac::CreateViewForWidget(
- content::RenderWidgetHost* render_widget_host) {
- if (render_widget_host->GetView()) {
- // During testing, the view will already be set up in most cases to the
- // test view, so we don't want to clobber it with a real one. To verify that
- // this actually is happening (and somebody isn't accidentally creating the
- // view twice), we check for the RVH Factory, which will be set when we're
- // making special ones (which go along with the special views).
- DCHECK(RenderViewHostFactory::has_factory());
- return render_widget_host->GetView();
- }
-
- RenderWidgetHostViewMac* view = static_cast<RenderWidgetHostViewMac*>(
- RenderWidgetHostView::CreateViewForWidget(render_widget_host));
- if (delegate()) {
- NSObject<RenderWidgetHostViewMacDelegate>* rw_delegate =
- delegate()->CreateRenderWidgetHostViewDelegate(render_widget_host);
- view->SetDelegate(rw_delegate);
- }
-
- // Fancy layout comes later; for now just make it our size and resize it
- // with us. In case there are other siblings of the content area, we want
- // to make sure the content area is on the bottom so other things draw over
- // it.
- NSView* view_view = view->GetNativeView();
- [view_view setFrame:[cocoa_view_.get() bounds]];
- [view_view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
- // Add the new view below all other views; this also keeps it below any
- // overlay view installed.
- [cocoa_view_.get() addSubview:view_view
- positioned:NSWindowBelow
- relativeTo:nil];
- // For some reason known only to Cocoa, the autorecalculation of the key view
- // loop set on the window doesn't set the next key view when the subview is
- // added. On 10.6 things magically work fine; on 10.5 they fail
- // <http://crbug.com/61493>. Digging into Cocoa key view loop code yielded
- // madness; TODO(avi,rohit): look at this again and figure out what's really
- // going on.
- [cocoa_view_.get() setNextKeyView:view_view];
- return view;
-}
-
-gfx::NativeView WebContentsViewMac::GetNativeView() const {
- return cocoa_view_.get();
-}
-
-gfx::NativeView WebContentsViewMac::GetContentNativeView() const {
- RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
- if (!rwhv)
- return NULL;
- return rwhv->GetNativeView();
-}
-
-gfx::NativeWindow WebContentsViewMac::GetTopLevelNativeWindow() const {
- return [cocoa_view_.get() window];
-}
-
-void WebContentsViewMac::GetContainerBounds(gfx::Rect* out) const {
- // Convert bounds to window coordinate space.
- NSRect bounds =
- [cocoa_view_.get() convertRect:[cocoa_view_.get() bounds] toView:nil];
-
- // Convert bounds to screen coordinate space.
- NSWindow* window = [cocoa_view_.get() window];
- bounds.origin = [window convertBaseToScreen:bounds.origin];
-
- // Flip y to account for screen flip.
- NSScreen* screen = [[NSScreen screens] objectAtIndex:0];
- bounds.origin.y = [screen frame].size.height - bounds.origin.y
- - bounds.size.height;
- *out = gfx::Rect(NSRectToCGRect(bounds));
-}
-
-void WebContentsViewMac::StartDragging(
- const WebDropData& drop_data,
- WebDragOperationsMask allowed_operations,
- const SkBitmap& image,
- const gfx::Point& image_offset) {
- // By allowing nested tasks, the code below also allows Close(),
- // which would deallocate |this|. The same problem can occur while
- // processing -sendEvent:, so Close() is deferred in that case.
- // Drags from web content do not come via -sendEvent:, this sets the
- // same flag -sendEvent: would.
- base::mac::ScopedSendingEvent sending_event_scoper;
-
- // The drag invokes a nested event loop, arrange to continue
- // processing events.
- MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
- NSDragOperation mask = static_cast<NSDragOperation>(allowed_operations);
- NSPoint offset = NSPointFromCGPoint(image_offset.ToCGPoint());
- [cocoa_view_ startDragWithDropData:drop_data
- dragOperationMask:mask
- image:gfx::SkBitmapToNSImage(image)
- offset:offset];
-}
-
-void WebContentsViewMac::RenderViewCreated(content::RenderViewHost* host) {
- // We want updates whenever the intrinsic width of the webpage changes.
- // Put the RenderView into that mode. The preferred width is used for example
- // when the "zoom" button in the browser window is clicked.
- host->EnablePreferredSizeMode();
-}
-
-void WebContentsViewMac::SetPageTitle(const string16& title) {
- // Meaningless on the Mac; widgets don't have a "title" attribute
-}
-
-void WebContentsViewMac::OnTabCrashed(base::TerminationStatus /* status */,
- int /* error_code */) {
-}
-
-void WebContentsViewMac::SizeContents(const gfx::Size& size) {
- // TODO(brettw | japhet) This is a hack and should be removed.
- // See web_contents_view.h.
- gfx::Rect rect(gfx::Point(), size);
- WebContentsViewCocoa* view = cocoa_view_.get();
- [view setFrame:[view flipRectToNSRect:rect]];
-}
-
-void WebContentsViewMac::Focus() {
- [[cocoa_view_.get() window] makeFirstResponder:GetContentNativeView()];
- [[cocoa_view_.get() window] makeKeyAndOrderFront:GetContentNativeView()];
-}
-
-void WebContentsViewMac::SetInitialFocus() {
- if (web_contents_->FocusLocationBarByDefault())
- web_contents_->SetFocusToLocationBar(false);
- else
- [[cocoa_view_.get() window] makeFirstResponder:GetContentNativeView()];
-}
-
-void WebContentsViewMac::StoreFocus() {
- // We're explicitly being asked to store focus, so don't worry if there's
- // already a view saved.
- focus_tracker_.reset(
- [[FocusTracker alloc] initWithWindow:[cocoa_view_ window]]);
-}
-
-void WebContentsViewMac::RestoreFocus() {
- // TODO(avi): Could we be restoring a view that's no longer in the key view
- // chain?
- if (!(focus_tracker_.get() &&
- [focus_tracker_ restoreFocusInWindow:[cocoa_view_ window]])) {
- // Fall back to the default focus behavior if we could not restore focus.
- // TODO(shess): If location-bar gets focus by default, this will
- // select-all in the field. If there was a specific selection in
- // the field when we navigated away from it, we should restore
- // that selection.
- SetInitialFocus();
- }
-
- focus_tracker_.reset(nil);
-}
-
-bool WebContentsViewMac::IsDoingDrag() const {
- return false;
-}
-
-void WebContentsViewMac::CancelDragAndCloseTab() {
-}
-
-void WebContentsViewMac::UpdateDragCursor(WebDragOperation operation) {
- [cocoa_view_ setCurrentDragOperation: operation];
-}
-
-void WebContentsViewMac::GotFocus() {
- // This is only used in the views FocusManager stuff but it bleeds through
- // all subclasses. http://crbug.com/21875
-}
-
-// This is called when the renderer asks us to take focus back (i.e., it has
-// iterated past the last focusable element on the page).
-void WebContentsViewMac::TakeFocus(bool reverse) {
- if (reverse) {
- [[cocoa_view_ window] selectPreviousKeyView:cocoa_view_.get()];
- } else {
- [[cocoa_view_ window] selectNextKeyView:cocoa_view_.get()];
- }
-}
-
-void WebContentsViewMac::CreateNewWindow(
- int route_id,
- const ViewHostMsg_CreateWindow_Params& params) {
- tab_contents_view_helper_.CreateNewWindow(web_contents_, route_id, params);
-}
-
-void WebContentsViewMac::CreateNewWidget(
- int route_id, WebKit::WebPopupType popup_type) {
- RenderWidgetHostView* widget_view =
- tab_contents_view_helper_.CreateNewWidget(web_contents_,
- route_id,
- false,
- popup_type);
-
- // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it
- // to allow it to survive the trip without being hosted.
- RenderWidgetHostViewMac* widget_view_mac =
- static_cast<RenderWidgetHostViewMac*>(widget_view);
- [widget_view_mac->GetNativeView() retain];
-}
-
-void WebContentsViewMac::CreateNewFullscreenWidget(int route_id) {
- RenderWidgetHostView* widget_view =
- tab_contents_view_helper_.CreateNewWidget(web_contents_,
- route_id,
- true,
- WebKit::WebPopupTypeNone);
-
- // A RenderWidgetHostViewMac has lifetime scoped to the view. We'll retain it
- // to allow it to survive the trip without being hosted.
- RenderWidgetHostViewMac* widget_view_mac =
- static_cast<RenderWidgetHostViewMac*>(widget_view);
- [widget_view_mac->GetNativeView() retain];
-}
-
-void WebContentsViewMac::ShowCreatedWindow(int route_id,
- WindowOpenDisposition disposition,
- const gfx::Rect& initial_pos,
- bool user_gesture) {
- tab_contents_view_helper_.ShowCreatedWindow(
- web_contents_, route_id, disposition, initial_pos, user_gesture);
-}
-
-void WebContentsViewMac::ShowCreatedWidget(
- int route_id, const gfx::Rect& initial_pos) {
- RenderWidgetHostView* widget_host_view =
- tab_contents_view_helper_.ShowCreatedWidget(web_contents_,
- route_id,
- false,
- initial_pos);
-
- // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's
- // properly embedded (or purposefully ignored) we can release the retain we
- // took in CreateNewWidgetInternal().
- RenderWidgetHostViewMac* widget_view_mac =
- static_cast<RenderWidgetHostViewMac*>(widget_host_view);
- [widget_view_mac->GetNativeView() release];
-}
-
-void WebContentsViewMac::ShowCreatedFullscreenWidget(int route_id) {
- RenderWidgetHostView* widget_host_view =
- tab_contents_view_helper_.ShowCreatedWidget(web_contents_,
- route_id,
- true,
- gfx::Rect());
-
- // A RenderWidgetHostViewMac has lifetime scoped to the view. Now that it's
- // properly embedded (or purposely ignored) we can release the retain we took
- // in CreateNewFullscreenWidgetInternal().
- RenderWidgetHostViewMac* widget_view_mac =
- static_cast<RenderWidgetHostViewMac*>(widget_host_view);
- [widget_view_mac->GetNativeView() release];
-}
-
-void WebContentsViewMac::ShowContextMenu(
- const content::ContextMenuParams& params) {
- // Allow delegates to handle the context menu operation first.
- if (web_contents_->GetDelegate() &&
- web_contents_->GetDelegate()->HandleContextMenu(params)) {
- return;
- }
-
- if (delegate())
- delegate()->ShowContextMenu(params);
- else
- DLOG(ERROR) << "Cannot show context menus without a delegate.";
-}
-
-// Display a popup menu for WebKit using Cocoa widgets.
-void WebContentsViewMac::ShowPopupMenu(
- const gfx::Rect& bounds,
- int item_height,
- double item_font_size,
- int selected_item,
- const std::vector<WebMenuItem>& items,
- bool right_aligned) {
- PopupMenuHelper popup_menu_helper(web_contents_->GetRenderViewHost());
- popup_menu_helper.ShowPopupMenu(bounds, item_height, item_font_size,
- selected_item, items, right_aligned);
-}
-
-bool WebContentsViewMac::IsEventTracking() const {
- return base::MessagePumpMac::IsHandlingSendEvent();
-}
-
-// Arrange to call CloseTab() after we're back to the main event loop.
-// The obvious way to do this would be PostNonNestableTask(), but that
-// will fire when the event-tracking loop polls for events. So we
-// need to bounce the message via Cocoa, instead.
-void WebContentsViewMac::CloseTabAfterEventTracking() {
- [cocoa_view_ cancelDeferredClose];
- [cocoa_view_ performSelector:@selector(closeTabAfterEvent)
- withObject:nil
- afterDelay:0.0];
-}
-
-void WebContentsViewMac::GetViewBounds(gfx::Rect* out) const {
- // This method is not currently used on mac.
- NOTIMPLEMENTED();
-}
-
-void WebContentsViewMac::CloseTab() {
- web_contents_->Close(web_contents_->GetRenderViewHost());
-}
-
-@implementation WebContentsViewCocoa
-
-- (id)initWithWebContentsViewMac:(WebContentsViewMac*)w {
- self = [super initWithFrame:NSZeroRect];
- if (self != nil) {
- webContentsView_ = w;
- dragDest_.reset(
- [[WebDragDest alloc] initWithWebContentsImpl:[self webContents]]);
- [self registerDragTypes];
-
- [[NSNotificationCenter defaultCenter]
- addObserver:self
- selector:@selector(viewDidBecomeFirstResponder:)
- name:kViewDidBecomeFirstResponder
- object:nil];
-
- if (webContentsView_->delegate()) {
- [dragDest_ setDragDelegate:webContentsView_->delegate()->
- GetDragDestDelegate()];
- webContentsView_->delegate()->NativeViewCreated(self);
- }
- }
- return self;
-}
-
-- (void)dealloc {
- if (webContentsView_ && webContentsView_->delegate())
- webContentsView_->delegate()->NativeViewDestroyed(self);
-
- // Cancel any deferred tab closes, just in case.
- [self cancelDeferredClose];
-
- // This probably isn't strictly necessary, but can't hurt.
- [self unregisterDraggedTypes];
-
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- [super dealloc];
-}
-
-// Registers for the view for the appropriate drag types.
-- (void)registerDragTypes {
- NSArray* types = [NSArray arrayWithObjects:NSStringPboardType,
- NSHTMLPboardType, NSURLPboardType, nil];
- [self registerForDraggedTypes:types];
-}
-
-- (void)setCurrentDragOperation:(NSDragOperation)operation {
- [dragDest_ setCurrentOperation:operation];
-}
-
-- (WebContentsImpl*)webContents {
- if (webContentsView_ == NULL)
- return NULL;
- return webContentsView_->web_contents();
-}
-
-- (void)mouseEvent:(NSEvent*)theEvent {
- WebContentsImpl* webContents = [self webContents];
- if (webContents && webContents->GetDelegate()) {
- NSPoint location = [NSEvent mouseLocation];
- if ([theEvent type] == NSMouseMoved)
- webContents->GetDelegate()->ContentsMouseEvent(
- webContents, gfx::Point(location.x, location.y), true);
- if ([theEvent type] == NSMouseExited)
- webContents->GetDelegate()->ContentsMouseEvent(
- webContents, gfx::Point(location.x, location.y), false);
- }
-}
-
-- (BOOL)mouseDownCanMoveWindow {
- // This is needed to prevent mouseDowns from moving the window
- // around. The default implementation returns YES only for opaque
- // views. WebContentsViewCocoa does not draw itself in any way, but
- // its subviews do paint their entire frames. Returning NO here
- // saves us the effort of overriding this method in every possible
- // subview.
- return NO;
-}
-
-- (void)pasteboard:(NSPasteboard*)sender provideDataForType:(NSString*)type {
- [dragSource_ lazyWriteToPasteboard:sender
- forType:type];
-}
-
-- (void)startDragWithDropData:(const WebDropData&)dropData
- dragOperationMask:(NSDragOperation)operationMask
- image:(NSImage*)image
- offset:(NSPoint)offset {
- dragSource_.reset([[WebDragSource alloc]
- initWithContents:[self webContents]
- view:self
- dropData:&dropData
- image:image
- offset:offset
- pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard]
- dragOperationMask:operationMask]);
- [dragSource_ startDrag];
-}
-
-// NSDraggingSource methods
-
-// Returns what kind of drag operations are available. This is a required
-// method for NSDraggingSource.
-- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal {
- if (dragSource_.get())
- return [dragSource_ draggingSourceOperationMaskForLocal:isLocal];
- // No web drag source - this is the case for dragging a file from the
- // downloads manager. Default to copy operation. Note: It is desirable to
- // allow the user to either move or copy, but this requires additional
- // plumbing to update the download item's path once its moved.
- return NSDragOperationCopy;
-}
-
-// Called when a drag initiated in our view ends.
-- (void)draggedImage:(NSImage*)anImage
- endedAt:(NSPoint)screenPoint
- operation:(NSDragOperation)operation {
- [dragSource_ endDragAt:screenPoint operation:operation];
-
- // Might as well throw out this object now.
- dragSource_.reset();
-}
-
-// Called when a drag initiated in our view moves.
-- (void)draggedImage:(NSImage*)draggedImage movedTo:(NSPoint)screenPoint {
- [dragSource_ moveDragTo:screenPoint];
-}
-
-// Called when we're informed where a file should be dropped.
-- (NSArray*)namesOfPromisedFilesDroppedAtDestination:(NSURL*)dropDest {
- if (![dropDest isFileURL])
- return nil;
-
- NSString* file_name = [dragSource_ dragPromisedFileTo:[dropDest path]];
- if (!file_name)
- return nil;
-
- return [NSArray arrayWithObject:file_name];
-}
-
-// NSDraggingDestination methods
-
-- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
- return [dragDest_ draggingEntered:sender view:self];
-}
-
-- (void)draggingExited:(id<NSDraggingInfo>)sender {
- [dragDest_ draggingExited:sender];
-}
-
-- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
- return [dragDest_ draggingUpdated:sender view:self];
-}
-
-- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
- return [dragDest_ performDragOperation:sender view:self];
-}
-
-- (void)cancelDeferredClose {
- SEL aSel = @selector(closeTabAfterEvent);
- [NSObject cancelPreviousPerformRequestsWithTarget:self
- selector:aSel
- object:nil];
-}
-
-- (void)clearTabContentsView {
- webContentsView_ = NULL;
-}
-
-- (void)closeTabAfterEvent {
- webContentsView_->CloseTab();
-}
-
-- (void)viewDidBecomeFirstResponder:(NSNotification*)notification {
- NSView* view = [notification object];
- if (![[self subviews] containsObject:view])
- return;
-
- NSSelectionDirection direction =
- [[[notification userInfo] objectForKey:kSelectionDirection]
- unsignedIntegerValue];
- if (direction == NSDirectSelection)
- return;
-
- [self webContents]->
- FocusThroughTabTraversal(direction == NSSelectingPrevious);
-}
-
-@end
« no previous file with comments | « content/browser/tab_contents/web_contents_view_mac.h ('k') | content/browser/tab_contents/web_contents_view_mac_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698