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

Unified Diff: chrome/browser/renderer_host/render_widget_host_view_mac.mm

Issue 125133: Make tooltips work correctly, allowing for multiple tooltips w/out the mouse ... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 11 years, 6 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: chrome/browser/renderer_host/render_widget_host_view_mac.mm
===================================================================
--- chrome/browser/renderer_host/render_widget_host_view_mac.mm (revision 18390)
+++ chrome/browser/renderer_host/render_widget_host_view_mac.mm (working copy)
@@ -12,6 +12,7 @@
#include "chrome/browser/renderer_host/render_widget_host.h"
#include "chrome/common/native_web_keyboard_event.h"
#include "skia/ext/platform_canvas.h"
+#import "third_party/mozilla/include/ToolTip.h"
#include "webkit/api/public/mac/WebInputEventFactory.h"
#include "webkit/api/public/WebInputEvent.h"
#include "webkit/glue/webmenurunner_mac.h"
@@ -51,6 +52,7 @@
parent_view_(NULL) {
cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc]
initWithRenderWidgetHostViewMac:this] autorelease];
+ tooltip_.reset([[ToolTip alloc] init]);
render_widget_host_->set_view(this);
}
@@ -251,17 +253,41 @@
[cocoa_view_ autorelease];
}
+// Called from the renderer to tell us what the tooltip text should be. It
+// calls us frequently so we need to cache the value to prevent doing a lot
+// of repeat work. We cannot simply use [-NSView setToolTip:] because NSView
+// can't handle the case where the tooltip text changes while the mouse is
+// still inside the view. Since the page elements that get tooltips are all
stuartmorgan 2009/06/15 16:52:26 s/the view/a region/
+// contained within this view (and are unknown to the NSView system), we
+// are forced to implement our own tooltips with child windows.
+// TODO(pinkerton): Do we want these tooltips to time out after a certain time?
+// Gecko does this automatically in the back-end, hence the ToolTip class not
+// needing that functionality. We can either modify ToolTip or add this
+// functionality here with a timer.
void RenderWidgetHostViewMac::SetTooltipText(const std::wstring& tooltip_text) {
if (tooltip_text != tooltip_text_) {
tooltip_text_ = tooltip_text;
// Clamp the tooltip length to kMaxTooltipLength. It's a DOS issue on
- // Windows; we're just trying to be polite.
+ // Windows; we're just trying to be polite. Don't persist the trimmed
+ // string, as then the comparison above will always fail and we'll try to
+ // set it again every single time the mouse moves.
+ std::wstring display_text = tooltip_text_;
if (tooltip_text_.length() > kMaxTooltipLength)
- tooltip_text_ = tooltip_text_.substr(0, kMaxTooltipLength);
+ display_text = tooltip_text_.substr(0, kMaxTooltipLength);
- NSString* tooltip_nsstring = base::SysWideToNSString(tooltip_text_);
- [cocoa_view_ setToolTip:tooltip_nsstring];
+ NSString* tooltip_nsstring = base::SysWideToNSString(display_text);
+ if ([tooltip_nsstring length] == 0) {
+ [tooltip_ closeToolTip];
+ } else {
+ // Get the current mouse location in the window's coordinate system and
+ // use that as the point for displaying the tooltip.
+ NSPoint event_point =
+ [[cocoa_view_ window] mouseLocationOutsideOfEventStream];
+ [tooltip_ showToolTipAtPoint:event_point
+ withString:tooltip_nsstring
+ overWindow:[cocoa_view_ window]];
+ }
}
}
@@ -459,7 +485,7 @@
// We're dead, so becoming first responder is probably a bad idea.
return NO;
}
-
+
renderWidgetHostView_->render_widget_host_->Focus();
return YES;
}
@@ -470,7 +496,7 @@
// idea.
return YES;
}
-
+
if (closeOnDeactivate_)
renderWidgetHostView_->KillSelf();

Powered by Google App Engine
This is Rietveld 408576698