blob: 1494ebba841e203db3e466d937e48e9ade92fb6b [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/text_input_client_observer.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "content/common/text_input_client_messages.h"
9#include "content/renderer/render_view_impl.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010010#include "third_party/WebKit/public/platform/WebPoint.h"
11#include "third_party/WebKit/public/platform/WebRect.h"
12#include "third_party/WebKit/public/platform/WebString.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010013#include "third_party/WebKit/public/web/mac/WebSubstringUtil.h"
14#include "third_party/WebKit/public/web/WebFrame.h"
15#include "third_party/WebKit/public/web/WebView.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000016#include "ui/gfx/rect.h"
17
18namespace content {
19
20TextInputClientObserver::TextInputClientObserver(RenderViewImpl* render_view)
21 : RenderViewObserver(render_view),
22 render_view_impl_(render_view) {
23}
24
25TextInputClientObserver::~TextInputClientObserver() {
26}
27
28bool TextInputClientObserver::OnMessageReceived(const IPC::Message& message) {
29 bool handled = true;
30 IPC_BEGIN_MESSAGE_MAP(TextInputClientObserver, message)
31 IPC_MESSAGE_HANDLER(TextInputClientMsg_CharacterIndexForPoint,
32 OnCharacterIndexForPoint)
33 IPC_MESSAGE_HANDLER(TextInputClientMsg_FirstRectForCharacterRange,
34 OnFirstRectForCharacterRange)
35 IPC_MESSAGE_HANDLER(TextInputClientMsg_StringForRange, OnStringForRange)
36 IPC_MESSAGE_UNHANDLED(handled = false)
37 IPC_END_MESSAGE_MAP()
38 return handled;
39}
40
41WebKit::WebView* TextInputClientObserver::webview() {
42 return render_view()->GetWebView();
43}
44
45void TextInputClientObserver::OnCharacterIndexForPoint(gfx::Point point) {
46 WebKit::WebPoint web_point(point);
47 size_t index = webview()->focusedFrame()->characterIndexForPoint(web_point);
48 Send(new TextInputClientReplyMsg_GotCharacterIndexForPoint(routing_id(),
49 index));
50}
51
52void TextInputClientObserver::OnFirstRectForCharacterRange(ui::Range range) {
53 gfx::Rect rect;
Ben Murdoch32409262013-08-07 11:04:47 +010054#if defined(ENABLE_PLUGINS)
55 if (!render_view_impl_->GetPepperCaretBounds(&rect))
56#endif
57 {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000058 WebKit::WebFrame* frame = webview()->focusedFrame();
Ben Murdochbb1529c2013-08-08 10:24:53 +010059 if (frame) {
60 WebKit::WebRect web_rect;
61 frame->firstRectForCharacterRange(range.start(), range.length(),
62 web_rect);
63 rect = web_rect;
64 }
Torne (Richard Coles)58218062012-11-14 11:43:16 +000065 }
66 Send(new TextInputClientReplyMsg_GotFirstRectForRange(routing_id(), rect));
67}
68
69void TextInputClientObserver::OnStringForRange(ui::Range range) {
70#if defined(OS_MACOSX)
Ben Murdochbb1529c2013-08-08 10:24:53 +010071 NSAttributedString* string = nil;
72 WebKit::WebFrame* frame = webview()->focusedFrame();
73 if (frame) {
74 string = WebKit::WebSubstringUtil::attributedSubstringInRange(
75 frame, range.start(), range.length());
76 }
Torne (Richard Coles)58218062012-11-14 11:43:16 +000077 scoped_ptr<const mac::AttributedStringCoder::EncodedString> encoded(
78 mac::AttributedStringCoder::Encode(string));
79 Send(new TextInputClientReplyMsg_GotStringForRange(routing_id(),
80 *encoded.get()));
81#else
82 NOTIMPLEMENTED();
83#endif
84}
85
86} // namespace content