summaryrefslogtreecommitdiffstats
path: root/content/shell/browser/shell_web_contents_view_delegate_mac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'content/shell/browser/shell_web_contents_view_delegate_mac.mm')
-rw-r--r--content/shell/browser/shell_web_contents_view_delegate_mac.mm277
1 files changed, 277 insertions, 0 deletions
diff --git a/content/shell/browser/shell_web_contents_view_delegate_mac.mm b/content/shell/browser/shell_web_contents_view_delegate_mac.mm
new file mode 100644
index 0000000..00196af
--- /dev/null
+++ b/content/shell/browser/shell_web_contents_view_delegate_mac.mm
@@ -0,0 +1,277 @@
+// Copyright 2013 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.
+
+#include "content/shell/browser/shell_web_contents_view_delegate.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/command_line.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_view.h"
+#include "content/public/common/context_menu_params.h"
+#include "content/shell/browser/shell.h"
+#include "content/shell/browser/shell_browser_context.h"
+#include "content/shell/browser/shell_browser_main_parts.h"
+#include "content/shell/browser/shell_content_browser_client.h"
+#include "content/shell/browser/shell_devtools_frontend.h"
+#include "content/shell/browser/shell_web_contents_view_delegate_creator.h"
+#include "content/shell/common/shell_switches.h"
+#include "third_party/WebKit/public/web/WebContextMenuData.h"
+
+using WebKit::WebContextMenuData;
+
+enum {
+ ShellContextMenuItemCutTag = 0,
+ ShellContextMenuItemCopyTag,
+ ShellContextMenuItemPasteTag,
+ ShellContextMenuItemDeleteTag,
+ ShellContextMenuItemOpenLinkTag,
+ ShellContextMenuItemBackTag,
+ ShellContextMenuItemForwardTag,
+ ShellContextMenuItemReloadTag,
+ ShellContextMenuItemInspectTag
+};
+
+@interface ShellContextMenuDelegate : NSObject<NSMenuDelegate> {
+ @private
+ content::ShellWebContentsViewDelegate* delegate_;
+}
+@end
+
+@implementation ShellContextMenuDelegate
+- (id)initWithDelegate:(content::ShellWebContentsViewDelegate*) delegate {
+ if ((self = [super init])) {
+ delegate_ = delegate;
+ }
+ return self;
+}
+
+- (void)itemSelected:(id)sender {
+ NSInteger tag = [sender tag];
+ delegate_->ActionPerformed(tag);
+}
+@end
+
+namespace {
+
+NSMenuItem* MakeContextMenuItem(NSString* title,
+ NSInteger tag,
+ NSMenu* menu,
+ BOOL enabled,
+ ShellContextMenuDelegate* delegate) {
+ NSMenuItem* menu_item =
+ [[NSMenuItem alloc] initWithTitle:title
+ action:@selector(itemSelected:)
+ keyEquivalent:@""];
+ [menu_item setTarget:delegate];
+ [menu_item setTag:tag];
+ [menu_item setEnabled:enabled];
+ [menu addItem:menu_item];
+
+ return menu_item;
+}
+
+} // namespace
+
+namespace content {
+
+WebContentsViewDelegate* CreateShellWebContentsViewDelegate(
+ WebContents* web_contents) {
+ return new ShellWebContentsViewDelegate(web_contents);
+}
+
+ShellWebContentsViewDelegate::ShellWebContentsViewDelegate(
+ WebContents* web_contents)
+ : web_contents_(web_contents) {
+}
+
+ShellWebContentsViewDelegate::~ShellWebContentsViewDelegate() {
+}
+
+void ShellWebContentsViewDelegate::ShowContextMenu(
+ const ContextMenuParams& params) {
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
+ return;
+
+ params_ = params;
+ bool has_link = !params_.unfiltered_link_url.is_empty();
+ bool has_selection = ! params_.selection_text.empty();
+
+ NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
+ ShellContextMenuDelegate* delegate =
+ [[ShellContextMenuDelegate alloc] initWithDelegate:this];
+ [menu setDelegate:delegate];
+ [menu setAutoenablesItems:NO];
+
+ if (params.media_type == WebContextMenuData::MediaTypeNone &&
+ !has_link &&
+ !has_selection &&
+ !params_.is_editable) {
+ BOOL back_menu_enabled =
+ web_contents_->GetController().CanGoBack() ? YES : NO;
+ MakeContextMenuItem(@"Back",
+ ShellContextMenuItemBackTag,
+ menu,
+ back_menu_enabled,
+ delegate);
+
+ BOOL forward_menu_enabled =
+ web_contents_->GetController().CanGoForward() ? YES : NO;
+ MakeContextMenuItem(@"Forward",
+ ShellContextMenuItemForwardTag,
+ menu,
+ forward_menu_enabled,
+ delegate);
+
+ MakeContextMenuItem(@"Reload",
+ ShellContextMenuItemReloadTag,
+ menu,
+ YES,
+ delegate);
+
+ NSMenuItem* separator = [NSMenuItem separatorItem];
+ [menu addItem:separator];
+ }
+
+ if (has_link) {
+ MakeContextMenuItem(@"Open In New Window",
+ ShellContextMenuItemOpenLinkTag,
+ menu,
+ YES,
+ delegate);
+
+ NSMenuItem* separator = [NSMenuItem separatorItem];
+ [menu addItem:separator];
+ }
+
+ if (params_.is_editable) {
+ BOOL cut_menu_enabled =
+ (params_.edit_flags & WebContextMenuData::CanCut) ? YES : NO;
+ MakeContextMenuItem(@"Cut",
+ ShellContextMenuItemCutTag,
+ menu,
+ cut_menu_enabled,
+ delegate);
+
+ BOOL copy_menu_enabled =
+ (params_.edit_flags & WebContextMenuData::CanCopy) ? YES : NO;
+ MakeContextMenuItem(@"Copy",
+ ShellContextMenuItemCopyTag,
+ menu,
+ copy_menu_enabled,
+ delegate);
+
+ BOOL paste_menu_enabled =
+ (params_.edit_flags & WebContextMenuData::CanPaste) ? YES : NO;
+ MakeContextMenuItem(@"Paste",
+ ShellContextMenuItemPasteTag,
+ menu,
+ paste_menu_enabled,
+ delegate);
+
+ BOOL delete_menu_enabled =
+ (params_.edit_flags & WebContextMenuData::CanDelete) ? YES : NO;
+ MakeContextMenuItem(@"Delete",
+ ShellContextMenuItemDeleteTag,
+ menu,
+ delete_menu_enabled,
+ delegate);
+
+ NSMenuItem* separator = [NSMenuItem separatorItem];
+ [menu addItem:separator];
+ } else if (has_selection) {
+ MakeContextMenuItem(@"Copy",
+ ShellContextMenuItemCopyTag,
+ menu,
+ YES,
+ delegate);
+
+ NSMenuItem* separator = [NSMenuItem separatorItem];
+ [menu addItem:separator];
+ }
+
+ MakeContextMenuItem(@"Inspect",
+ ShellContextMenuItemInspectTag,
+ menu,
+ YES,
+ delegate);
+
+ NSView* parent_view = web_contents_->GetView()->GetContentNativeView();
+ NSEvent* currentEvent = [NSApp currentEvent];
+ NSWindow* window = [parent_view window];
+ NSPoint position = [window mouseLocationOutsideOfEventStream];
+ NSTimeInterval eventTime = [currentEvent timestamp];
+ NSEvent* clickEvent = [NSEvent mouseEventWithType:NSRightMouseDown
+ location:position
+ modifierFlags:NSRightMouseDownMask
+ timestamp:eventTime
+ windowNumber:[window windowNumber]
+ context:nil
+ eventNumber:0
+ clickCount:1
+ pressure:1.0];
+
+ [NSMenu popUpContextMenu:menu
+ withEvent:clickEvent
+ forView:parent_view];
+}
+
+void ShellWebContentsViewDelegate::ActionPerformed(int tag) {
+ switch (tag) {
+ case ShellContextMenuItemCutTag:
+ web_contents_->GetRenderViewHost()->Cut();
+ break;
+ case ShellContextMenuItemCopyTag:
+ web_contents_->GetRenderViewHost()->Copy();
+ break;
+ case ShellContextMenuItemPasteTag:
+ web_contents_->GetRenderViewHost()->Paste();
+ break;
+ case ShellContextMenuItemDeleteTag:
+ web_contents_->GetRenderViewHost()->Delete();
+ break;
+ case ShellContextMenuItemOpenLinkTag: {
+ ShellBrowserContext* browser_context =
+ ShellContentBrowserClient::Get()->browser_context();
+ Shell::CreateNewWindow(browser_context,
+ params_.link_url,
+ NULL,
+ MSG_ROUTING_NONE,
+ gfx::Size());
+ break;
+ }
+ case ShellContextMenuItemBackTag:
+ web_contents_->GetController().GoToOffset(-1);
+ web_contents_->GetView()->Focus();
+ break;
+ case ShellContextMenuItemForwardTag:
+ web_contents_->GetController().GoToOffset(1);
+ web_contents_->GetView()->Focus();
+ break;
+ case ShellContextMenuItemReloadTag: {
+ web_contents_->GetController().Reload(false);
+ web_contents_->GetView()->Focus();
+ break;
+ }
+ case ShellContextMenuItemInspectTag: {
+ ShellDevToolsFrontend::Show(web_contents_);
+ break;
+ }
+ }
+}
+
+WebDragDestDelegate* ShellWebContentsViewDelegate::GetDragDestDelegate() {
+ return NULL;
+}
+
+NSObject<RenderWidgetHostViewMacDelegate>*
+ShellWebContentsViewDelegate::CreateRenderWidgetHostViewDelegate(
+ content::RenderWidgetHost* render_widget_host) {
+ return NULL;
+}
+
+} // namespace content