1/*
2 * Copyright (C) 2018 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 "WebKitDOMElement.h"
22
23#include "DOMObjectCache.h"
24#include "WebKitDOMElementPrivate.h"
25#include "WebKitDOMNodePrivate.h"
26#include "WebKitDOMPrivate.h"
27#include <WebCore/HTMLInputElement.h>
28#include <WebCore/HTMLTextAreaElement.h>
29
30#if PLATFORM(GTK)
31#include "WebKitDOMEventTarget.h"
32#endif
33
34namespace WebKit {
35
36WebKitDOMElement* kit(WebCore::Element* obj)
37{
38 return WEBKIT_DOM_ELEMENT(kit(static_cast<WebCore::Node*>(obj)));
39}
40
41WebCore::Element* core(WebKitDOMElement* element)
42{
43 return element ? static_cast<WebCore::Element*>(webkitDOMNodeGetCoreObject(WEBKIT_DOM_NODE(element))) : nullptr;
44}
45
46WebKitDOMElement* wrapElement(WebCore::Element* coreObject)
47{
48 ASSERT(coreObject);
49#if PLATFORM(GTK)
50 return WEBKIT_DOM_ELEMENT(g_object_new(WEBKIT_DOM_TYPE_ELEMENT, "core-object", coreObject, nullptr));
51#else
52 auto* element = WEBKIT_DOM_ELEMENT(g_object_new(WEBKIT_DOM_TYPE_ELEMENT, nullptr));
53 webkitDOMNodeSetCoreObject(WEBKIT_DOM_NODE(element), static_cast<WebCore::Node*>(coreObject));
54 return element;
55#endif
56}
57
58} // namespace WebKit
59
60#if PLATFORM(GTK)
61G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
62G_DEFINE_TYPE_WITH_CODE(WebKitDOMElement, webkit_dom_element, WEBKIT_DOM_TYPE_NODE, G_IMPLEMENT_INTERFACE(WEBKIT_DOM_TYPE_EVENT_TARGET, webkitDOMElementDOMEventTargetInit))
63G_GNUC_END_IGNORE_DEPRECATIONS;
64#else
65G_DEFINE_TYPE(WebKitDOMElement, webkit_dom_element, WEBKIT_DOM_TYPE_NODE)
66#endif
67
68static void webkit_dom_element_class_init(WebKitDOMElementClass* elementClass)
69{
70#if PLATFORM(GTK)
71 GObjectClass* gobjectClass = G_OBJECT_CLASS(elementClass);
72 webkitDOMElementInstallProperties(gobjectClass);
73#endif
74}
75
76static void webkit_dom_element_init(WebKitDOMElement*)
77{
78}
79
80/**
81 * webkit_dom_element_html_input_element_is_user_edited:
82 * @element: a #WebKitDOMElement
83 *
84 * Get whether @element is an HTML text input element that has been edited by a user action.
85 *
86 * Returns: whether @element has been edited by a user action.
87 *
88 * Since: 2.22
89 */
90gboolean webkit_dom_element_html_input_element_is_user_edited(WebKitDOMElement* element)
91{
92 g_return_val_if_fail(WEBKIT_DOM_IS_ELEMENT(element), FALSE);
93
94 auto* node = webkitDOMNodeGetCoreObject(WEBKIT_DOM_NODE(element));
95 if (is<WebCore::HTMLInputElement>(node))
96 return downcast<WebCore::HTMLInputElement>(*node).lastChangeWasUserEdit();
97
98 if (is<WebCore::HTMLTextAreaElement>(node))
99 return downcast<WebCore::HTMLTextAreaElement>(*node).lastChangeWasUserEdit();
100
101 return FALSE;
102}
103
104/**
105 * webkit_dom_element_is_html_input_element_auto_filled:
106 * @element: a #WebKitDOMElement
107 *
108 * Get whether the element is an HTML input element that has been filled automatically.
109 *
110 * Returns: whether @element has been filled automatically.
111 *
112 * Since: 2.22
113 */
114gboolean webkit_dom_element_html_input_element_get_auto_filled(WebKitDOMElement* element)
115{
116 g_return_val_if_fail(WEBKIT_DOM_IS_ELEMENT(element), FALSE);
117
118 auto* node = webkitDOMNodeGetCoreObject(WEBKIT_DOM_NODE(element));
119 if (!is<WebCore::HTMLInputElement>(node))
120 return false;
121
122 return downcast<WebCore::HTMLInputElement>(*node).isAutoFilled();
123}
124
125/**
126 * webkit_dom_element_html_input_element_set_auto_filled:
127 * @element: a #WebKitDOMElement
128 * @auto_filled: value to set
129 *
130 * Set whether the element is an HTML input element that has been filled automatically.
131 * If @element is not an HTML input element this function does nothing.
132 *
133 * Since: 2.22
134 */
135void webkit_dom_element_html_input_element_set_auto_filled(WebKitDOMElement* element, gboolean autoFilled)
136{
137 g_return_if_fail(WEBKIT_DOM_IS_ELEMENT(element));
138
139 auto* node = webkitDOMNodeGetCoreObject(WEBKIT_DOM_NODE(element));
140 if (!is<WebCore::HTMLInputElement>(node))
141 return;
142
143 downcast<WebCore::HTMLInputElement>(*node).setAutoFilled(autoFilled);
144}
145
146/**
147 * webkit_dom_element_html_input_element_set_editing_value:
148 * @element: a #WebKitDOMElement
149 * @value: the text to set
150 *
151 * Set the value of an HTML input element as if it had been edited by
152 * the user, triggering a change event. If @element is not an HTML input
153 * element this function does nothing.
154 *
155 * Since: 2.22
156 */
157void webkit_dom_element_html_input_element_set_editing_value(WebKitDOMElement* element, const char* value)
158{
159 g_return_if_fail(WEBKIT_DOM_IS_ELEMENT(element));
160
161 auto* node = webkitDOMNodeGetCoreObject(WEBKIT_DOM_NODE(element));
162 if (!is<WebCore::HTMLInputElement>(node))
163 return;
164
165 downcast<WebCore::HTMLInputElement>(*node).setValueForUser(String::fromUTF8(value));
166}
167