diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-13 22:13:04 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-13 22:13:04 +0000 |
commit | b88ab037fc20ab5dfe0f35d71e78acc8499979a5 (patch) | |
tree | 7d0a9863885e4c70fe1a24f021a28da8a95a736b | |
parent | 5e26d9d482761e38a15f8cb987294d979bc58576 (diff) | |
download | chromium_src-b88ab037fc20ab5dfe0f35d71e78acc8499979a5.zip chromium_src-b88ab037fc20ab5dfe0f35d71e78acc8499979a5.tar.gz chromium_src-b88ab037fc20ab5dfe0f35d71e78acc8499979a5.tar.bz2 |
Do right-alignment of popups when WebKit indicates to do so.
BUG=http://crbug.com/23106
TEST=as in bug
Review URL: http://codereview.chromium.org/1992006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47204 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host.cc | 3 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view.h | 3 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_mac.h | 3 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_widget_host_view_mac.mm | 9 | ||||
-rw-r--r-- | chrome/browser/renderer_host/test/test_render_view_host.h | 3 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 9 | ||||
-rw-r--r-- | chrome/renderer/render_widget.cc | 1 | ||||
-rw-r--r-- | webkit/glue/webmenurunner_mac.h | 3 | ||||
-rw-r--r-- | webkit/glue/webmenurunner_mac.mm | 27 | ||||
-rw-r--r-- | webkit/tools/test_shell/mac/test_webview_delegate.mm | 4 |
10 files changed, 51 insertions, 14 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc index c53c7be..a0f3be7 100644 --- a/chrome/browser/renderer_host/render_widget_host.cc +++ b/chrome/browser/renderer_host/render_widget_host.cc @@ -917,7 +917,8 @@ void RenderWidgetHost::OnMsgShowPopup( params.item_height, params.item_font_size, params.selected_item, - params.popup_items); + params.popup_items, + params.right_aligned); } void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId view, diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h index 3a285c1..6d3f6e7 100644 --- a/chrome/browser/renderer_host/render_widget_host_view.h +++ b/chrome/browser/renderer_host/render_widget_host_view.h @@ -168,7 +168,8 @@ class RenderWidgetHostView { int item_height, double item_font_size, int selected_item, - const std::vector<WebMenuItem>& items) = 0; + const std::vector<WebMenuItem>& items, + bool right_aligned) = 0; // Get the view's position on the screen. virtual gfx::Rect GetWindowRect() = 0; diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h index d79b0f1..07f65e2 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.h +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h @@ -179,7 +179,8 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView { int item_height, double item_font_size, int selected_item, - const std::vector<WebMenuItem>& items); + const std::vector<WebMenuItem>& items, + bool right_aligned); virtual gfx::Rect GetWindowRect(); virtual gfx::Rect GetRootWindowRect(); virtual void SetActive(bool active); diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm index 104b346..ac130c9 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm @@ -464,7 +464,8 @@ void RenderWidgetHostViewMac::ShowPopupWithItems( int item_height, double item_font_size, int selected_item, - const std::vector<WebMenuItem>& items) { + const std::vector<WebMenuItem>& items, + bool right_aligned) { is_popup_menu_ = true; // Retain the Cocoa view for the duration of the pop-up so that it can't @@ -483,7 +484,8 @@ void RenderWidgetHostViewMac::ShowPopupWithItems( // Display the menu. scoped_nsobject<WebMenuRunner> menu_runner; menu_runner.reset([[WebMenuRunner alloc] initWithItems:items - fontSize:item_font_size]); + fontSize:item_font_size + rightAligned:right_aligned]); { // Make sure events can be pumped while the menu is up. @@ -1041,7 +1043,8 @@ bool RenderWidgetHostViewMac::ContainsNativeView( return; } - DCHECK(renderWidgetHostView_->render_widget_host_->process()->HasConnection()); + DCHECK( + renderWidgetHostView_->render_widget_host_->process()->HasConnection()); DCHECK(!renderWidgetHostView_->about_to_validate_and_paint_); renderWidgetHostView_->about_to_validate_and_paint_ = true; diff --git a/chrome/browser/renderer_host/test/test_render_view_host.h b/chrome/browser/renderer_host/test/test_render_view_host.h index 2725bb3..725bacf 100644 --- a/chrome/browser/renderer_host/test/test_render_view_host.h +++ b/chrome/browser/renderer_host/test/test_render_view_host.h @@ -76,7 +76,8 @@ class TestRenderWidgetHostView : public RenderWidgetHostView { int item_height, double item_font_size, int selected_item, - const std::vector<WebMenuItem>& items) {} + const std::vector<WebMenuItem>& items, + bool right_aligned) {} virtual gfx::Rect GetWindowRect(); virtual gfx::Rect GetRootWindowRect(); virtual void SetActive(bool active); diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index a2e4a81..e6dba64 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -492,6 +492,9 @@ struct ViewHostMsg_ShowPopup_Params { // The entire list of items in the popup menu. std::vector<WebMenuItem> popup_items; + + // Whether items should be right-aligned. + bool right_aligned; }; // Parameters for the IPC message ViewHostMsg_ScriptedPrint @@ -2076,6 +2079,7 @@ struct ParamTraits<ViewHostMsg_ShowPopup_Params> { WriteParam(m, p.item_font_size); WriteParam(m, p.selected_item); WriteParam(m, p.popup_items); + WriteParam(m, p.right_aligned); } static bool Read(const Message* m, void** iter, param_type* p) { return @@ -2083,7 +2087,8 @@ struct ParamTraits<ViewHostMsg_ShowPopup_Params> { ReadParam(m, iter, &p->item_height) && ReadParam(m, iter, &p->item_font_size) && ReadParam(m, iter, &p->selected_item) && - ReadParam(m, iter, &p->popup_items); + ReadParam(m, iter, &p->popup_items) && + ReadParam(m, iter, &p->right_aligned); } static void Log(const param_type& p, std::wstring* l) { l->append(L"("); @@ -2096,6 +2101,8 @@ struct ParamTraits<ViewHostMsg_ShowPopup_Params> { LogParam(p.selected_item, l); l->append(L", "); LogParam(p.popup_items, l); + l->append(L", "); + LogParam(p.right_aligned, l); l->append(L")"); } }; diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index d9fd8e7..395e87b 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -103,6 +103,7 @@ void RenderWidget::ConfigureAsExternalPopupMenu(const WebPopupMenuInfo& info) { popup_params_->selected_item = info.selectedIndex; for (size_t i = 0; i < info.items.size(); ++i) popup_params_->popup_items.push_back(WebMenuItem(info.items[i])); + popup_params_->right_aligned = info.rightAligned; } void RenderWidget::Init(int32 opener_id) { diff --git a/webkit/glue/webmenurunner_mac.h b/webkit/glue/webmenurunner_mac.h index 6f01daf..c56eeeb 100644 --- a/webkit/glue/webmenurunner_mac.h +++ b/webkit/glue/webmenurunner_mac.h @@ -37,7 +37,8 @@ // Initializes the MenuDelegate with a list of items sent from WebKit. - (id)initWithItems:(const std::vector<WebMenuItem>&)items - fontSize:(CGFloat)fontSize; + fontSize:(CGFloat)fontSize + rightAligned:(BOOL)rightAligned; // Returns YES if an item was selected from the menu, NO if the menu was // dismissed. diff --git a/webkit/glue/webmenurunner_mac.mm b/webkit/glue/webmenurunner_mac.mm index 6144376..e4c8a4b 100644 --- a/webkit/glue/webmenurunner_mac.mm +++ b/webkit/glue/webmenurunner_mac.mm @@ -26,7 +26,8 @@ BOOL gNewNSMenuAPI; @interface WebMenuRunner (PrivateAPI) // Worker function used during initialization. -- (void)addItem:(const WebMenuItem&)item; +- (void)addItem:(const WebMenuItem&)item + withAttributes:(NSDictionary*)attrs; // A callback for the menu controller object to call when an item is selected // from the menu. This is not called if the menu is dismissed without a @@ -38,7 +39,8 @@ BOOL gNewNSMenuAPI; @implementation WebMenuRunner - (id)initWithItems:(const std::vector<WebMenuItem>&)items - fontSize:(CGFloat)fontSize { + fontSize:(CGFloat)fontSize + rightAligned:(BOOL)rightAligned { static BOOL newNSMenuAPIInitialized = NO; if (!newNSMenuAPIInitialized) { newNSMenuAPIInitialized = YES; @@ -54,13 +56,24 @@ BOOL gNewNSMenuAPI; [menu_ setAutoenablesItems:NO]; index_ = -1; fontSize_ = fontSize; + scoped_nsobject<NSDictionary> attrs; + if (rightAligned) { + // NB: Right-aligning menu items in this manner is known to not work in + // Mac OS X 10.5. + scoped_nsobject<NSMutableParagraphStyle> paragraphStyle( + [[NSMutableParagraphStyle alloc] init]); + [paragraphStyle setAlignment:NSRightTextAlignment]; + attrs.reset([[NSDictionary alloc] initWithObjectsAndKeys: + paragraphStyle, NSParagraphStyleAttributeName, nil]); + } for (size_t i = 0; i < items.size(); ++i) - [self addItem:items[i]]; + [self addItem:items[i] withAttributes:attrs]; } return self; } -- (void)addItem:(const WebMenuItem&)item { +- (void)addItem:(const WebMenuItem&)item + withAttributes:(NSDictionary*)attrs { if (item.type == WebMenuItem::SEPARATOR) { [menu_ addItem:[NSMenuItem separatorItem]]; return; @@ -72,6 +85,12 @@ BOOL gNewNSMenuAPI; keyEquivalent:@""]; [menuItem setEnabled:(item.enabled && item.type != WebMenuItem::GROUP)]; [menuItem setTarget:self]; + if (attrs) { + scoped_nsobject<NSAttributedString> attrTitle( + [[NSAttributedString alloc] initWithString:title + attributes:attrs]); + [menuItem setAttributedTitle:attrTitle]; + } if (gNewNSMenuAPI) [menuItem setTag:[menu_ numberOfItems] - 1]; } diff --git a/webkit/tools/test_shell/mac/test_webview_delegate.mm b/webkit/tools/test_shell/mac/test_webview_delegate.mm index 83d0237..9e4d949 100644 --- a/webkit/tools/test_shell/mac/test_webview_delegate.mm +++ b/webkit/tools/test_shell/mac/test_webview_delegate.mm @@ -48,6 +48,7 @@ void TestWebViewDelegate::show(WebNavigationPolicy policy) { int item_height = popup_menu_info_->itemHeight; double font_size = popup_menu_info_->itemFontSize; int selected_index = popup_menu_info_->selectedIndex; + bool right_aligned = popup_menu_info_->rightAligned; popup_menu_info_.reset(); // No longer needed. const WebRect& bounds = popup_bounds_; @@ -62,7 +63,8 @@ void TestWebViewDelegate::show(WebNavigationPolicy policy) { // Display the menu. scoped_nsobject<WebMenuRunner> menu_runner; menu_runner.reset([[WebMenuRunner alloc] initWithItems:items - fontSize:font_size]); + fontSize:font_size + rightAligned:right_aligned]); [menu_runner runMenuInView:shell_->webViewWnd() withBounds:position |