| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <QuartzCore/QuartzCore.h> | 5 #include <QuartzCore/QuartzCore.h> |
| 6 | 6 |
| 7 #include "chrome/browser/renderer_host/render_widget_host_view_mac.h" | 7 #include "chrome/browser/renderer_host/render_widget_host_view_mac.h" |
| 8 | 8 |
| 9 #include "app/surface/io_surface_support_mac.h" | 9 #include "app/surface/io_surface_support_mac.h" |
| 10 #import "base/chrome_application_mac.h" | 10 #import "base/chrome_application_mac.h" |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 NOTIMPLEMENTED(); | 457 NOTIMPLEMENTED(); |
| 458 return NULL; | 458 return NULL; |
| 459 } | 459 } |
| 460 | 460 |
| 461 // Display a popup menu for WebKit using Cocoa widgets. | 461 // Display a popup menu for WebKit using Cocoa widgets. |
| 462 void RenderWidgetHostViewMac::ShowPopupWithItems( | 462 void RenderWidgetHostViewMac::ShowPopupWithItems( |
| 463 gfx::Rect bounds, | 463 gfx::Rect bounds, |
| 464 int item_height, | 464 int item_height, |
| 465 double item_font_size, | 465 double item_font_size, |
| 466 int selected_item, | 466 int selected_item, |
| 467 const std::vector<WebMenuItem>& items) { | 467 const std::vector<WebMenuItem>& items, |
| 468 bool right_aligned) { |
| 468 is_popup_menu_ = true; | 469 is_popup_menu_ = true; |
| 469 | 470 |
| 470 // Retain the Cocoa view for the duration of the pop-up so that it can't | 471 // Retain the Cocoa view for the duration of the pop-up so that it can't |
| 471 // be dealloced if my Destroy() method is called while the pop-up's up | 472 // be dealloced if my Destroy() method is called while the pop-up's up |
| 472 // (which would in turn delete me, causing a crash once the -runMenuInView | 473 // (which would in turn delete me, causing a crash once the -runMenuInView |
| 473 // call returns. That's what was happening in <http://crbug.com/33250>). | 474 // call returns. That's what was happening in <http://crbug.com/33250>). |
| 474 scoped_nsobject<RenderWidgetHostViewCocoa> retainedCocoaView | 475 scoped_nsobject<RenderWidgetHostViewCocoa> retainedCocoaView |
| 475 ([cocoa_view_ retain]); | 476 ([cocoa_view_ retain]); |
| 476 | 477 |
| 477 NSRect view_rect = [cocoa_view_ bounds]; | 478 NSRect view_rect = [cocoa_view_ bounds]; |
| 478 NSRect parent_rect = [parent_view_ bounds]; | 479 NSRect parent_rect = [parent_view_ bounds]; |
| 479 int y_offset = bounds.y() + bounds.height(); | 480 int y_offset = bounds.y() + bounds.height(); |
| 480 NSRect position = NSMakeRect(bounds.x(), parent_rect.size.height - y_offset, | 481 NSRect position = NSMakeRect(bounds.x(), parent_rect.size.height - y_offset, |
| 481 bounds.width(), bounds.height()); | 482 bounds.width(), bounds.height()); |
| 482 | 483 |
| 483 // Display the menu. | 484 // Display the menu. |
| 484 scoped_nsobject<WebMenuRunner> menu_runner; | 485 scoped_nsobject<WebMenuRunner> menu_runner; |
| 485 menu_runner.reset([[WebMenuRunner alloc] initWithItems:items | 486 menu_runner.reset([[WebMenuRunner alloc] initWithItems:items |
| 486 fontSize:item_font_size]); | 487 fontSize:item_font_size |
| 488 rightAligned:right_aligned]); |
| 487 | 489 |
| 488 { | 490 { |
| 489 // Make sure events can be pumped while the menu is up. | 491 // Make sure events can be pumped while the menu is up. |
| 490 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); | 492 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
| 491 | 493 |
| 492 // One of the events that could be pumped is |window.close()|. | 494 // One of the events that could be pumped is |window.close()|. |
| 493 // User-initiated event-tracking loops protect against this by | 495 // User-initiated event-tracking loops protect against this by |
| 494 // setting flags in -[CrApplication sendEvent:], but since | 496 // setting flags in -[CrApplication sendEvent:], but since |
| 495 // web-content menus are initiated by IPC message the setup has to | 497 // web-content menus are initiated by IPC message the setup has to |
| 496 // be done manually. | 498 // be done manually. |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 } | 1036 } |
| 1035 | 1037 |
| 1036 - (void)drawRect:(NSRect)dirtyRect { | 1038 - (void)drawRect:(NSRect)dirtyRect { |
| 1037 if (!renderWidgetHostView_->render_widget_host_) { | 1039 if (!renderWidgetHostView_->render_widget_host_) { |
| 1038 // TODO(shess): Consider using something more noticable? | 1040 // TODO(shess): Consider using something more noticable? |
| 1039 [[NSColor whiteColor] set]; | 1041 [[NSColor whiteColor] set]; |
| 1040 NSRectFill(dirtyRect); | 1042 NSRectFill(dirtyRect); |
| 1041 return; | 1043 return; |
| 1042 } | 1044 } |
| 1043 | 1045 |
| 1044 DCHECK(renderWidgetHostView_->render_widget_host_->process()->HasConnection())
; | 1046 DCHECK( |
| 1047 renderWidgetHostView_->render_widget_host_->process()->HasConnection()); |
| 1045 DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); | 1048 DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); |
| 1046 | 1049 |
| 1047 renderWidgetHostView_->about_to_validate_and_paint_ = true; | 1050 renderWidgetHostView_->about_to_validate_and_paint_ = true; |
| 1048 BackingStoreMac* backing_store = static_cast<BackingStoreMac*>( | 1051 BackingStoreMac* backing_store = static_cast<BackingStoreMac*>( |
| 1049 renderWidgetHostView_->render_widget_host_->GetBackingStore(true)); | 1052 renderWidgetHostView_->render_widget_host_->GetBackingStore(true)); |
| 1050 renderWidgetHostView_->about_to_validate_and_paint_ = false; | 1053 renderWidgetHostView_->about_to_validate_and_paint_ = false; |
| 1051 | 1054 |
| 1052 if (backing_store) { | 1055 if (backing_store) { |
| 1053 NSRect view_bounds = [self bounds]; | 1056 NSRect view_bounds = [self bounds]; |
| 1054 gfx::Rect damaged_rect([self NSRectToRect:dirtyRect]); | 1057 gfx::Rect damaged_rect([self NSRectToRect:dirtyRect]); |
| (...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1815 // doesn't call any NSTextInput functions, such as setMarkedText or | 1818 // doesn't call any NSTextInput functions, such as setMarkedText or |
| 1816 // insertText. So, we need to send an IPC message to a renderer so it can | 1819 // insertText. So, we need to send an IPC message to a renderer so it can |
| 1817 // delete the composition node. | 1820 // delete the composition node. |
| 1818 NSInputManager *currentInputManager = [NSInputManager currentInputManager]; | 1821 NSInputManager *currentInputManager = [NSInputManager currentInputManager]; |
| 1819 [currentInputManager markedTextAbandoned:self]; | 1822 [currentInputManager markedTextAbandoned:self]; |
| 1820 | 1823 |
| 1821 [self unmarkText]; | 1824 [self unmarkText]; |
| 1822 } | 1825 } |
| 1823 | 1826 |
| 1824 @end | 1827 @end |
| OLD | NEW |