[GTK] REGRESSION(r116135): Keys that confirm composition trigger a default action
[WebKit-https.git] / Source / WebKit / gtk / WebCoreSupport / WebViewInputMethodFilter.cpp
1 /*
2  * Copyright (C) 2012 Igalia S.L.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "WebViewInputMethodFilter.h"
22
23 #include "FocusController.h"
24 #include "Frame.h"
25 #include "PlatformKeyboardEvent.h"
26 #include "webkitwebviewprivate.h"
27 #include <wtf/text/CString.h>
28
29 using namespace WebCore;
30
31 namespace WebKit {
32
33 Frame* WebViewInputMethodFilter::focusedOrMainFrame()
34 {
35     ASSERT(m_webView);
36     Page* page = core(m_webView);
37     if (!page)
38         return 0;
39
40     return page->focusController()->focusedOrMainFrame();
41 }
42
43 void WebViewInputMethodFilter::setWebView(WebKitWebView* webView)
44 {
45     m_webView = webView;
46     GtkInputMethodFilter::setWidget(GTK_WIDGET(webView));
47 }
48
49 bool WebViewInputMethodFilter::canEdit()
50 {
51     Frame* frame = focusedOrMainFrame();
52     return frame && frame->editor()->canEdit();
53 }
54
55 bool WebViewInputMethodFilter::sendSimpleKeyEvent(GdkEventKey* event, WTF::String simpleString)
56 {
57     PlatformKeyboardEvent platformEvent(event, CompositionResults(simpleString));
58     return focusedOrMainFrame()->eventHandler()->keyEvent(platformEvent);
59 }
60
61 bool WebViewInputMethodFilter::sendKeyEventWithCompositionResults(GdkEventKey* event, ResultsToSend resultsToSend)
62 {
63     PlatformKeyboardEvent platformEvent(event, CompositionResults(CompositionResults::WillSendCompositionResultsSoon));
64     if (!focusedOrMainFrame()->eventHandler()->keyEvent(platformEvent))
65         return false;
66
67     if (resultsToSend & Composition && !m_confirmedComposition.isNull())
68         confirmCompositionText(m_confirmedComposition);
69     if (resultsToSend & Preedit && !m_preedit.isNull())
70         setPreedit(m_preedit, m_cursorOffset);
71     return true;
72 }
73
74 void WebViewInputMethodFilter::confirmCompositionText(String text)
75 {
76     Frame* frame = focusedOrMainFrame();
77     if (!frame || !frame->editor()->canEdit())
78         return;
79
80     if (text.isNull()) {
81         confirmCurrentComposition();
82         return;
83     }
84     frame->editor()->confirmComposition(m_confirmedComposition);
85 }
86
87 void WebViewInputMethodFilter::confirmCurrentComposition()
88 {
89     Frame* frame = focusedOrMainFrame();
90     if (!frame || !frame->editor()->canEdit())
91         return;
92     frame->editor()->confirmComposition();
93 }
94
95 void WebViewInputMethodFilter::cancelCurrentComposition()
96 {
97     Frame* frame = focusedOrMainFrame();
98     if (!frame || !frame->editor()->canEdit())
99         return;
100     frame->editor()->cancelComposition();
101 }
102
103 void WebViewInputMethodFilter::setPreedit(String newPreedit, int cursorOffset)
104 {
105     Frame* frame = focusedOrMainFrame();
106     if (!frame || !frame->editor()->canEdit())
107         return;
108
109     // TODO: We should parse the PangoAttrList that we get from the IM context here.
110     Vector<CompositionUnderline> underlines;
111     underlines.append(CompositionUnderline(0, newPreedit.length(), Color(1, 1, 1), false));
112     frame->editor()->setComposition(newPreedit, underlines, m_cursorOffset, m_cursorOffset);
113 }
114
115 } // namespace WebKit