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]; |