1 | /* |
2 | * Copyright (C) 2015 Red Hat Inc. |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2,1 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 "WebKitWebEditor.h" |
22 | |
23 | #include "WebKitWebEditorPrivate.h" |
24 | #include "WebKitWebPagePrivate.h" |
25 | #include <wtf/glib/WTFGType.h> |
26 | |
27 | using namespace WebKit; |
28 | using namespace WebCore; |
29 | |
30 | /** |
31 | * SECTION: WebKitWebEditor |
32 | * @Short_description: Access to editing capabilities of a #WebKitWebPage |
33 | * @Title: WebKitWebEditor |
34 | * @See_also: #WebKitWebPage |
35 | * |
36 | * The WebKitWebEditor provides access to various editing capabilities of |
37 | * a #WebKitWebPage such as a possibility to react to the current selection in |
38 | * #WebKitWebPage. |
39 | * |
40 | * Since: 2.10 |
41 | */ |
42 | enum { |
43 | SELECTION_CHANGED, |
44 | |
45 | LAST_SIGNAL |
46 | }; |
47 | |
48 | struct _WebKitWebEditorPrivate { |
49 | WebKitWebPage* webPage; |
50 | }; |
51 | |
52 | static guint signals[LAST_SIGNAL] = { 0, }; |
53 | |
54 | WEBKIT_DEFINE_TYPE(WebKitWebEditor, webkit_web_editor, G_TYPE_OBJECT) |
55 | |
56 | static void webkit_web_editor_class_init(WebKitWebEditorClass* klass) |
57 | { |
58 | /** |
59 | * WebKitWebEditor::selection-changed: |
60 | * @editor: the #WebKitWebEditor on which the signal is emitted |
61 | * |
62 | * This signal is emitted for every selection change inside a #WebKitWebPage |
63 | * as well as for every caret position change as the caret is a collapsed |
64 | * selection. |
65 | * |
66 | * Since: 2.10 |
67 | */ |
68 | signals[SELECTION_CHANGED] = g_signal_new( |
69 | "selection-changed" , |
70 | G_TYPE_FROM_CLASS(klass), |
71 | G_SIGNAL_RUN_LAST, |
72 | 0, nullptr, nullptr, |
73 | g_cclosure_marshal_VOID__VOID, |
74 | G_TYPE_NONE, 0); |
75 | } |
76 | |
77 | class PageEditorClient final : public API::InjectedBundle::EditorClient { |
78 | public: |
79 | explicit PageEditorClient(WebKitWebEditor* editor) |
80 | : m_editor(editor) |
81 | { |
82 | } |
83 | |
84 | private: |
85 | void didChangeSelection(WebPage&, StringImpl*) override |
86 | { |
87 | g_signal_emit(m_editor, signals[SELECTION_CHANGED], 0); |
88 | } |
89 | |
90 | WebKitWebEditor* m_editor; |
91 | }; |
92 | |
93 | WebKitWebEditor* webkitWebEditorCreate(WebKitWebPage* webPage) |
94 | { |
95 | WebKitWebEditor* editor = WEBKIT_WEB_EDITOR(g_object_new(WEBKIT_TYPE_WEB_EDITOR, nullptr)); |
96 | editor->priv->webPage = webPage; |
97 | webkitWebPageGetPage(webPage)->setInjectedBundleEditorClient(std::make_unique<PageEditorClient>(editor)); |
98 | return editor; |
99 | } |
100 | |
101 | /** |
102 | * webkit_web_editor_get_page: |
103 | * @editor: a #WebKitWebEditor |
104 | * |
105 | * Gets the #WebKitWebPage that is associated with the #WebKitWebEditor that can |
106 | * be used to access the #WebKitDOMDocument currently loaded into it. |
107 | * |
108 | * Returns: (transfer none): the associated #WebKitWebPage |
109 | * |
110 | * Since: 2.10 |
111 | */ |
112 | WebKitWebPage* webkit_web_editor_get_page(WebKitWebEditor* editor) |
113 | { |
114 | g_return_val_if_fail(WEBKIT_IS_WEB_EDITOR(editor), nullptr); |
115 | |
116 | return editor->priv->webPage; |
117 | } |
118 | |