Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
| diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| index 9be444373761950e79c04cdcbabb99daba1ee991..f2f4a9a9c8440e2d41254bafb3941fd92e0ee3a5 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
| @@ -166,6 +166,7 @@ static BOOL SupportsBackingPropertiesChangedNotification() { |
| - (void)updateScreenProperties; |
| - (void)setResponderDelegate: |
| (NSObject<RenderWidgetHostViewMacDelegate>*)delegate; |
| +- (void)speakText:(NSString*)text; |
| @end |
| // A window subclass that allows the fullscreen window to become main and gain |
| @@ -734,6 +735,8 @@ bool RenderWidgetHostViewMac::OnMessageReceived(const IPC::Message& message) { |
| IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewMac, message) |
| IPC_MESSAGE_HANDLER(ViewHostMsg_PluginFocusChanged, OnPluginFocusChanged) |
| IPC_MESSAGE_HANDLER(ViewHostMsg_StartPluginIme, OnStartPluginIme) |
| + IPC_MESSAGE_HANDLER(ViewMsg_GetRenderedTextCompleted, |
| + OnGetRenderedTextCompleted) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| @@ -1183,8 +1186,19 @@ bool RenderWidgetHostViewMac::SupportsSpeech() const { |
| } |
| void RenderWidgetHostViewMac::SpeakSelection() { |
| - if ([NSApp respondsToSelector:@selector(speakString:)]) |
| - [NSApp speakString:base::SysUTF8ToNSString(selected_text_)]; |
| + if (![NSApp respondsToSelector:@selector(speakString:)]) |
| + return; |
| + |
| + if (selected_text_.empty() && render_widget_host_) { |
| + // If there's no selection, speak all text. Send an asynchronous IPC |
| + // request for all the text in the webcontents. |
| + // ViewMsg_GetRenderedTextCompleted is sent back to IPC Message receiver. |
| + render_widget_host_->Send(new ViewMsg_GetRenderedText( |
| + render_widget_host_->GetRoutingID())); |
| + return; |
| + } |
| + |
| + [cocoa_view_ speakText:base::SysUTF8ToNSString(selected_text_)]; |
| } |
| bool RenderWidgetHostViewMac::IsSpeaking() const { |
| @@ -2160,6 +2174,11 @@ void RenderWidgetHostViewMac::OnStartPluginIme() { |
| [cocoa_view_ setPluginImeActive:YES]; |
| } |
| +void RenderWidgetHostViewMac::OnGetRenderedTextCompleted( |
| + const std::string& text) { |
| + [cocoa_view_ speakText:base::SysUTF8ToNSString(text)]; |
| +} |
| + |
| gfx::Rect RenderWidgetHostViewMac::GetScaledOpenGLPixelRect( |
| const gfx::Rect& rect) { |
| gfx::Rect src_gl_subrect = rect; |
| @@ -3027,6 +3046,10 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( |
| } |
| } |
| +- (void)speakText:(NSString*) text { |
|
dcheng
2014/08/12 20:55:27
Nit: not really sure why this is currently it's ow
sarka
2014/08/12 21:03:16
I think [NSApp speakString] is decided at runtime
|
| + [NSApp speakString:text]; |
| +} |
| + |
| - (void)viewWillMoveToWindow:(NSWindow*)newWindow { |
| NSWindow* oldWindow = [self window]; |