[EFL] Share WebKit-Gtk's Accessibility implementation with others WebKit ports.
[WebKit-https.git] / Source / WebCore / accessibility / atk / WebKitAccessibleInterfaceDocument.cpp
1 /*
2  * Copyright (C) 2008 Nuanti Ltd.
3  * Copyright (C) 2009 Jan Alonzo
4  * Copyright (C) 2012 Igalia S.L.
5  *
6  * Portions from Mozilla a11y, copyright as follows:
7  *
8  * The Original Code is mozilla.org code.
9  *
10  * The Initial Developer of the Original Code is
11  * Sun Microsystems, Inc.
12  * Portions created by the Initial Developer are Copyright (C) 2002
13  * the Initial Developer. All Rights Reserved.
14  *
15  * This library is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU Library General Public
17  * License as published by the Free Software Foundation; either
18  * version 2 of the License, or (at your option) any later version.
19  *
20  * This library is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23  * Library General Public License for more details.
24  *
25  * You should have received a copy of the GNU Library General Public License
26  * along with this library; see the file COPYING.LIB.  If not, write to
27  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
28  * Boston, MA 02110-1301, USA.
29  */
30
31 #include "config.h"
32 #include "WebKitAccessibleInterfaceDocument.h"
33
34 #include "AccessibilityObject.h"
35 #include "Document.h"
36 #include "DocumentType.h"
37 #include "WebKitAccessibleUtil.h"
38 #include "WebKitAccessibleWrapperAtk.h"
39
40 using namespace WebCore;
41
42 static AccessibilityObject* core(AtkDocument* document)
43 {
44     if (!WEBKIT_IS_ACCESSIBLE(document))
45         return 0;
46
47     return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(document));
48 }
49
50 static const gchar* documentAttributeValue(AtkDocument* document, const gchar* attribute)
51 {
52     Document* coreDocument = core(document)->document();
53     if (!coreDocument)
54         return 0;
55
56     String value = String();
57     if (!g_ascii_strcasecmp(attribute, "DocType") && coreDocument->doctype())
58         value = coreDocument->doctype()->name();
59     else if (!g_ascii_strcasecmp(attribute, "Encoding"))
60         value = coreDocument->charset();
61     else if (!g_ascii_strcasecmp(attribute, "URI"))
62         value = coreDocument->documentURI();
63
64     if (!value.isEmpty())
65         return returnString(value);
66
67     return 0;
68 }
69
70 static const gchar* webkitAccessibleDocumentGetAttributeValue(AtkDocument* document, const gchar* attribute)
71 {
72     return documentAttributeValue(document, attribute);
73 }
74
75 static AtkAttributeSet* webkitAccessibleDocumentGetAttributes(AtkDocument* document)
76 {
77     AtkAttributeSet* attributeSet = 0;
78     const gchar* attributes[] = { "DocType", "Encoding", "URI" };
79
80     for (unsigned i = 0; i < G_N_ELEMENTS(attributes); i++) {
81         const gchar* value = documentAttributeValue(document, attributes[i]);
82         if (value)
83             attributeSet = addToAtkAttributeSet(attributeSet, attributes[i], value);
84     }
85
86     return attributeSet;
87 }
88
89 static const gchar* webkitAccessibleDocumentGetLocale(AtkDocument* document)
90 {
91     // TODO: Should we fall back on lang xml:lang when the following comes up empty?
92     String language = core(document)->language();
93     if (!language.isEmpty())
94         return returnString(language);
95
96     return 0;
97 }
98
99 void webkitAccessibleDocumentInterfaceInit(AtkDocumentIface* iface)
100 {
101     iface->get_document_attribute_value = webkitAccessibleDocumentGetAttributeValue;
102     iface->get_document_attributes = webkitAccessibleDocumentGetAttributes;
103     iface->get_document_locale = webkitAccessibleDocumentGetLocale;
104 }